diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000..a0a71a3c --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,27 @@ +# Default code owners for entire repository +* @hashgraph/hedera-docs + +######################### +##### Core Files ###### +######################### + +# NOTE: Must be placed last to ensure enforcement over all other rules + +# Protection Rules for Github Configuration Files and Actions Workflows +/.github/ @hashgraph/platform-ci @hashgraph/platform-ci-committers @hashgraph/release-engineering-managers @hashgraph/hedera-docs +/.github/workflows/ @hashgraph/platform-ci @hashgraph/platform-ci-committers @hashgraph/release-engineering-managers +/.github/CODEOWNERS @hashgraph/platform-ci @hashgraph/platform-ci-committers @hashgraph/release-engineering-managers + +# Self-protection for root CODEOWNERS files (this file should not exist and should definitely require approval) +/CODEOWNERS @hashgraph/release-engineering-managers + +# Protect the repository root files +/README.md @hashgraph/platform-ci @hashgraph/release-engineering-managers @hashgraph/hedera-docs +**/LICENSE @hashgraph/release-engineering-managers + +# CodeCov configuration +**/codecov.yml @hashgraph/platform-ci @hashgraph/release-engineering-managers @hashgraph/hedera-docs + +# Git Ignore definitions +**/.gitignore @hashgraph/platform-ci @hashgraph/release-engineering-managers @hashgraph/hedera-docs +**/.gitignore.* @hashgraph/platform-ci @hashgraph/release-engineering-managers @hashgraph/hedera-docs \ No newline at end of file diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..5ace4600 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,6 @@ +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" diff --git a/.github/example-status/java-status.md b/.github/example-status/java-status.md index 82e3578c..b89d5ed2 100644 --- a/.github/example-status/java-status.md +++ b/.github/example-status/java-status.md @@ -1,40 +1,14 @@ ## ✅ Java example passed -- Timestamp (UTC): 2026-01-29 17:40:29Z +- Timestamp (UTC): 2026-03-03 22:14:28Z - Network: local
Output === Java Examples Runner === -Timestamp (UTC): 2026-01-29 17:39:47Z +Timestamp (UTC): 2026-03-03 22:14:19Z Network: local Mirror: http://localhost:8080/api/v1 ▶️ Running all examples… -Hedera account created: 0.0.1032 -EVM Address: 0x1106feae7443bac61ae4d056c73a9441b92d9fd7 - - -Waiting for Mirror Node to update... - -Account balance: 20.0 ? - -0.0.1012 - -Fungible token created: 0.0.1033 - -Waiting for Mirror Node to update... - -Treasury holds: 100000 DEMO - - -Topic created: 0.0.1034 - -Message submitted: Hello, Hedera! - -Waiting for Mirror Node to update... - -Latest message: Hello, Hedera! - - -✅ All examples passed. +❌ One or more examples failed.
diff --git a/.github/workflows/pr-formatting.yml b/.github/workflows/pr-formatting.yml new file mode 100644 index 00000000..78b400d2 --- /dev/null +++ b/.github/workflows/pr-formatting.yml @@ -0,0 +1,55 @@ +name: "PR Formatting" +on: + pull_request_target: + types: + - assigned + - unassigned + - labeled + - unlabeled + - opened + - reopened + - edited + - converted_to_draft + - ready_for_review + - review_requested + - review_request_removed + - locked + - unlocked + - synchronize + +defaults: + run: + shell: bash + +permissions: + statuses: write + +jobs: + title-check: + name: Title Check + runs-on: hashgraph-docs-linux-medium + steps: + - name: Harden Runner + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + + - name: Check PR Title + uses: step-security/action-semantic-pull-request@bc0cf74f5be4ce34accdec1ae908dff38dc5def1 # v6.1.1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + assignee-check: + name: Assignee Check + runs-on: hashgraph-docs-linux-medium + steps: + - name: Harden Runner + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + with: + egress-policy: audit + + - name: Check Assignee + if: ${{ github.event.pull_request.assignees == null || github.event.pull_request.assignees[0] == null }} + run: | + echo "Assignee is not set. Failing the workflow." + exit 1 \ No newline at end of file diff --git a/docs.json b/docs.json index 4bc02d3d..b7952aa1 100644 --- a/docs.json +++ b/docs.json @@ -62,16 +62,16 @@ }, "fonts": { "heading": { - "family": "Styrene A", - "source": "/public/fonts/styrene/StyreneA-Regular-Web.woff2", + "family": "Styrene A Medium", + "source": "/public/fonts/styrene/StyreneA-Medium-Web.woff2", "format": "woff2", - "weight": 400 + "weight": 700 }, "body": { - "family": "Styrene A", - "source": "/public/fonts/styrene/StyreneA-Regular-Web.woff2", + "family": "Styrene Light Web", + "source": "/public/fonts/styrene/StyreneA-Light-Web.woff2", "format": "woff2", - "weight": 400 + "weight": 500 } }, "background": { @@ -90,9 +90,16 @@ "perplexity", "mcp", "cursor", - "vscode" + "vscode", + "add-mcp", + "grok" ] }, + "integrations": { + "gtm": { + "tagId": "GTM-NHLK548" + } + }, "navigation": { "global": { "anchors": [ @@ -228,6 +235,7 @@ "group": "More Tutorials", "pages": [ "hedera/tutorials/more-tutorials", + "hedera/tutorials/more-tutorials/hedera-mcp-server-setup-guide", "hedera/tutorials/more-tutorials/create-and-fund-your-hedera-testnet-account", "hedera/tutorials/more-tutorials/how-to-create-a-personal-access-token-api-key-on-the-hedera-portal", "hedera/tutorials/more-tutorials/how-to-auto-create-hedera-accounts-with-hbar-and-token-transfers", @@ -241,7 +249,16 @@ ] }, "hedera/tutorials/more-tutorials/schedule-your-first-transaction", - "hedera/tutorials/more-tutorials/javascript-testing" + "hedera/tutorials/more-tutorials/javascript-testing", + { + "group": "HSM/KMS Signing Solutions", + "pages": [ + "hedera/tutorials/more-tutorials/HSM-signing", + "hedera/tutorials/more-tutorials/HSM-signing/aws-kms", + "hedera/tutorials/more-tutorials/HSM-signing/azure-key-vault", + "hedera/tutorials/more-tutorials/HSM-signing/gcp-kms" + ] + } ] }, "hedera/tutorials/demo-applications", @@ -318,7 +335,8 @@ "hedera/core-concepts/accounts", "hedera/core-concepts/accounts/account-creation", "hedera/core-concepts/accounts/auto-account-creation", - "hedera/core-concepts/accounts/account-properties" + "hedera/core-concepts/accounts/account-properties", + "hedera/core-concepts/accounts/network-accounts" ] }, "hedera/core-concepts/keys-and-signatures", @@ -485,6 +503,31 @@ ] }, + { + "group": "Hiero CLI", + "pages": [ + "hedera/open-source-solutions/hiero-cli/overview", + { + "group": "Plugins", + "pages": [ + "/hedera/open-source-solutions/hiero-cli/plugins/credentials-plugin", + "/hedera/open-source-solutions/hiero-cli/plugins/network-plugin", + "/hedera/open-source-solutions/hiero-cli/plugins/hbar-plugin", + "/hedera/open-source-solutions/hiero-cli/plugins/account-plugin", + "/hedera/open-source-solutions/hiero-cli/plugins/token-plugin", + "/hedera/open-source-solutions/hiero-cli/plugins/topic-plugin", + "/hedera/open-source-solutions/hiero-cli/plugins/config-plugin", + "/hedera/open-source-solutions/hiero-cli/plugins/plugin-management-plugin" + ] + }, + { + "group": "Scripting", + "pages": [ + "/hedera/open-source-solutions/hiero-cli/scripting/quickstart" + ] + } + ] + }, { "group": "AI Tools for Developers", "pages": [ @@ -512,7 +555,6 @@ "hedera/open-source-solutions/hashiodao/local-environment-setup" ] }, - "hedera/open-source-solutions/hedera-cli", "hedera/open-source-solutions/hedera-contract-builder", { "group": "Hedera Custodians Library", @@ -1144,6 +1186,14 @@ "href": "https://hedera.com/" }, "navbar": { + "links": [ + { + "label": "Join Hackathon", + "href": "https://hedera.com/hackathon", + "target": "_blank", + "icon": "code" + } + ], "primary": { "type": "button", "label": "Dev Portal", diff --git a/hedera/core-concepts/accounts.mdx b/hedera/core-concepts/accounts.mdx index 394d902f..ef2817d1 100644 --- a/hedera/core-concepts/accounts.mdx +++ b/hedera/core-concepts/accounts.mdx @@ -27,7 +27,7 @@ You interact with the network by submitting transactions that modify the ledger' > -## FAQ +## FAQs @@ -53,3 +53,4 @@ A Hedera account is a unique entity in the Hedera Network that can hold tokens. If an account is created with an [EVM address](/hedera/core-concepts/accounts/auto-account-creation#evm-address) via [Auto Account Creation](/hedera/core-concepts/accounts/auto-account-creation), it results in a "hollow" account. This account has an account number and alias but no account key. It can accept token transfers but cannot transfer tokens or modify account properties until the account key has been added, completing the account. + diff --git a/hedera/core-concepts/accounts/network-accounts.mdx b/hedera/core-concepts/accounts/network-accounts.mdx new file mode 100644 index 00000000..2a3a82c9 --- /dev/null +++ b/hedera/core-concepts/accounts/network-accounts.mdx @@ -0,0 +1,32 @@ +--- +title: "Network Accounts" +--- + +The Hedera network uses several special, network-controlled accounts for its operations. These accounts are fundamental to the network's fee structure, staking rewards, and overall economic model. + +### Special Accounts Comparison + +| Account ID | Name | Purpose | Accepts Deposits? | Has Keys? | +| :--- | :--- | :--- | :--- | :--- | +| `0.0.98` | Network Admin Fee Account | Receives the majority of network transaction fees (typically 80%). | Yes | Yes | +| `0.0.800` | Staking Rewards Account | Holds funds for staking reward distribution. Receives a portion of daily fees (typically 10%). | Yes (donations) | No | +| `0.0.801` | Node Rewards Account | Holds funds for node reward distribution. Receives a portion of daily fees (typically 10%). | No | No | +| `0.0.802` | Fee Collection Account | Consolidates all transaction fees before daily distribution. | No | No | + +### Account Details + +#### Fee Collection Account (`0.0.802`) + +Introduced in [HIP-1259](https://hips.hedera.com/hip/hip-1259), this account serves as a temporary holding account for all transaction fees. It is fully code-controlled, has no keys, and cannot accept HBAR deposits from users. This design simplifies transaction records and improves network efficiency. + +#### Staking Rewards Account (`0.0.800`) + +This account holds the HBAR that will be distributed to users who are staking their tokens. It receives a portion of the daily accumulated fees from the Fee Collection Account. While it does not have keys, it can accept HBAR donations from the community. + +#### Node Rewards Account (`0.0.801`) + +This account holds the HBAR that will be distributed to node operators for their services. It receives a portion of the daily accumulated fees from the Fee Collection Account. It does not have keys and cannot accept HBAR deposits. + +#### Network Admin Fee Account (`0.0.98`) + +This account receives the largest portion of the daily accumulated fees from the Fee Collection Account (typically 80%). These funds are used to support the long-term growth and development of the Hedera network. Unlike the other special fee accounts, this account has keys and can accept HBAR deposits. diff --git a/hedera/core-concepts/mirror-nodes.mdx b/hedera/core-concepts/mirror-nodes.mdx index f4ff6251..af484f59 100644 --- a/hedera/core-concepts/mirror-nodes.mdx +++ b/hedera/core-concepts/mirror-nodes.mdx @@ -33,6 +33,40 @@ Once a record file is closed, the consensus nodes generate a signature file. The Hedera consensus nodes push new record files and signature files to the cloud storage provider – currently AWS S3 and Google File Storage are supported. Mirror nodes download these files, verify their signatures based on their hashes, and only then make them available to be processed. + +## Understanding Block Streams After [`HIP-1259`](https://hips.hedera.com/hip/hip-1259) + +For Mirror Node and [block stream](/hedera/support-and-community/glossary#block-stream) consumers, [HIP-1259](https://hips.hedera.com/hip/hip-1259) significantly simplifies the data related to transaction fees, leading to smaller block stream files and reduced data ingestion costs. + +### Simplified Fee Structure + +The primary change is the consolidation of all transaction fees into a single transfer to the **Fee Collection Account (`0.0.802`)**. + +- **Before HIP-1259:** Each transaction record contained multiple fee-related transfers, increasing the size and complexity of the block stream. +- **After HIP-1259:** Each transaction record now contains only a single, clear fee transfer to `0.0.802`. This reduces the amount of data per transaction, making block streams more efficient. + +### The Daily Synthetic Transaction + +A new pattern to be aware of is the **daily synthetic distribution transaction**. This is a network-generated transaction that occurs once per day at the end of each staking period. It is responsible for distributing the fees accumulated in `0.0.802`. + +As a block stream consumer, you can identify this transaction by the following characteristics: + +- It will contain a single large debit from account `0.0.802`. +- It will have a long list of credit transfers to node operator accounts, the staking rewards account (`0.0.800`), the node rewards account (`0.0.801`), and the network treasury (`0.0.98`). +- It appears in the block stream like any other transaction. + + + This synthetic transaction is the **only** time you will see funds being transferred out of the [Fee Collection Account](/hedera/support-and-community/glossary#fee-collection-account). All other transactions involving [`0.0.802`](https://hashscan.io/mainnet/account/0.0.802) will be credit transfers into the account. + + +### Benefits for Mirror Node Operators + +- **Reduced Storage Costs:** Smaller block stream files mean lower storage requirements for running a mirror node. +- **Faster Data Ingestion:** Simpler transaction records can be processed more quickly, improving the speed of data ingestion and synchronization. +- **Easier Data Analysis:** The fee structure is more straightforward, making it easier to analyze transaction costs and network revenue. + + + ### Smart Contract Synthetic Logs Starting with [v0.79](/hedera/networks/release-notes/mirror-node#v0.79) of Hedera Mirror Node release, synthetic event logs for Hedera Token Service (HTS) token transactions have been introduced to mimic the behavior of smart contract tokens. Synthetic events are generated for transactions such as: diff --git a/hedera/core-concepts/staking/stake-hbar.mdx b/hedera/core-concepts/staking/stake-hbar.mdx index 2290cf41..839ac3d5 100644 --- a/hedera/core-concepts/staking/stake-hbar.mdx +++ b/hedera/core-concepts/staking/stake-hbar.mdx @@ -12,79 +12,60 @@ To view network nodes, their current stake, and reward rate, please visit [HashS **Supported Wallets:** - - - - - - - - **Exchanges:** + - - - - + **Custodians:** - + + ### **Staking Reward Distribution** diff --git a/hedera/core-concepts/staking/staking.mdx b/hedera/core-concepts/staking/staking.mdx index 55f42ad0..6c61588c 100644 --- a/hedera/core-concepts/staking/staking.mdx +++ b/hedera/core-concepts/staking/staking.mdx @@ -2,75 +2,61 @@ title: "Staking Program" --- +The Hedera staking program allows you to earn rewards by staking your HBAR to a network node. Staking helps secure the network by contributing to the node's consensus weight (voting power). -The staking feature will be rolled out in four phases. The first two phases are described below, and the final two phases will be available at the start of Phase I. +## Staking Nodes -## **Phase I: Technical Availability \[Complete]** +All consensus nodes run by the Hedera Council distribute rewards to the accounts staked to them. You can find information about each node by visiting a Hedera network explorer or by getting the network [address book](/hedera/sdks-and-apis/rest-api#api-v1-network-nodes). -The staking functionality is now available and live on both the Hedera Testnet and Mainnet as of July 21, 2022. In phase I, users will technically be able to stake their account to mainnet nodes but this will not contribute to a node’s consensus weight (voting power). This initial technical availability release does not reward participants for staking but enables a level playing field whereby all market participants have the possibility to join the staking program and avoids giving an unfair advantage to the first few who stake. +Nodes have a minimum stake and maximum stake. The node's **minimum stake is $0**, meaning there is no minimum HBAR amount required for a node to be eligible for rewards. However, staked HBAR that exceeds the maximum stake does not increase the proportion of rewards returned. The maximum stake for each node is the total number of HBAR divided by the total number of nodes, and this value changes as more nodes join the network. +## Lockup Period -## **Phase II: Ecosystem Development \[Complete]** +There is **no lock-up period** when you stake your account. Your account's entire balance is automatically staked to the selected node or account, and your HBAR remains liquid at all times. There is no "bonding" or "slashing." -During this phase, supported exchanges and wallets will be able to integrate the staking functionality to provide account holders an easy way to stake their HBAR, but will not distribute rewards. In addition, web applications for delegating stake will likely be built for utilization by the retail ecosystem. During this phase, there will be visibility of stake per node, and staking to a node will affect its consensus weight (voting power) with monthly updates. +## Staking Reward Account -## **Phase III: Staking Rewards Program Launch \[Complete]** +The staking reward account [(`0.0.800`)](https://hashscan.io/#/mainnet/account/0.0.800) distributes rewards to eligible staked accounts. Its primary funding comes from the daily distribution from the [Fee Collection Account](/hedera/support-and-community/glossary#fee-collection-account) [(`0.0.802`)](https://hashscan.io/mainnet/account/0.0.802). -The Hedera Council will determine when the Hedera ecosystem has reached a minimum viable set of integrations to enable staking rewards. Once this is determined, the council (through CoinCom) will vote to update the reward rate, and subsequently, the mainnet will be updated with the agreed-upon reward rate. The latest staking reward rate voted on by CoinComm can be found [here](https://hedera.com/blog/hedera-governing-council-votes-to-approve-changes-to-staking-algorithm). +Anyone in the community can also contribute to the rewards pool by transferring HBAR into this account. This account has no keys; any HBAR transferred into it cannot be returned. -Once updated, the staking reward account (0.0.800) will be eligible to distribute rewards earned by stakers, once the rewards threshold of 250M total HBAR has been met. Rewards will continue to be distributed even if, after this time, the balance of account 0.0.800 goes below 250M. +The account must meet a minimum balance before rewards can be distributed. Once this threshold is met, rewards will continue to be paid out as long as there is a balance in the account. -## Phase IV: Complete Staking Implementation +### Staking Rewards -In this phase, 24-hour updates will be released for visibility into the stake per node, and the node uptime feature will be released. This means that instead of updating node stake visibility on a monthly basis, node stake visibility will be updated on a 24-hour epoch interval. When the uptime feature takes effect, staked accounts will not earn rewards when nodes cannot participate in consensus (unavailable or offline). +To be eligible for rewards, your account must be staked for a minimum of **one full staking period (24 hours)**, which begins and ends at midnight UTC. -## **Staking Nodes** +For a staked account to earn rewards, the following must be true: - -The Hedera Council voted to change the min stake value from half of the max node stake value to 1/4 of the max node stake value. - - -All consensus nodes run by the Hedera Council distribute rewards to the accounts staked to them. You can find information about each node in the network by visiting one of the Hedera network explorers or getting the network [address book](/hedera/sdks-and-apis/rest-api#api-v1-network-nodes). In the future, network participation will open up to community nodes and eventually to the public as part of Hedera’s decentralization efforts. - -Nodes have a **minimum stake** and **maximum stake**. The node's minimum stake must be met for the accounts staked to that node to be eligible to earn staking rewards. Staked tokens that go over the maximum stake will no longer impact the proportion of rewards returned. The maximum stake threshold for each node will be the total number of HBAR divided by the total number of nodes in the network. The minimum node stake threshold value will be 1/4 of the maximum node stake value. These values will change as more nodes are added to the network or can change by vote of the Hedera Council. - -#### Example: - -Minimum Stake: ​50,000,000,000 hbars\*(1/26nodes)\*(1/4) +* The staking reward account (`0.0.800`) must have met its initial threshold balance. +* The node the account is staked to must meet the minimum node stake threshold. +* The account must be staked for the entire 24-hour staking period. -Maximum Stake: ​50,000,000,000 hbars\*(1/26nodes) +### Staking Reward Distribution -## **Lockup Period** +With the implementation of [HIP-1259](https://hips.hedera.com/hip/hip-1259), the mechanism for handling fees and distributing rewards has been significantly streamlined to improve network efficiency and simplify transaction records. -There is **no lock-up period** when accounts are staked to a node. Stakers do not need to choose an amount of HBAR to stake from their account. The account's entire balance is staked automatically to the selected node or account. There is no concept of “bonding” or “slashing” of your tokens. The staked account balance is liquid at all times. +Previously, transaction fees were immediately split and distributed to multiple accounts. The new system introduces the **[Fee Collection Account](/hedera/support-and-community/glossary#fee-collector-account) (`0.0.802`)**, a network-controlled account that consolidates all transaction fees. -## **Staking Reward Account** +**How it Works:** -The staking reward account distributes rewards to eligible staked accounts. The staking reward account ID is [0.0.800](https://hashscan.io/#/mainnet/account/0.0.800?type=) on mainnet. Anyone in the community can contribute to the rewards pool by transferring HBAR into that account. This account has no keys, and therefore, any HBAR transferred into this account cannot be returned to the owner. If you choose to contribute to the rewards pool, please make sure to double-check your transfer transaction details. +1. **Collection**: When a transaction is processed, the entire fee is transferred in a single payment to the [Fee Collection Account](/hedera/support-and-community/glossary#fee-collection-account) (`0.0.802`). +2. **Distribution**: Once per day, at the end of each staking period, a single, large synthetic transaction distributes the accumulated fees from the `0.0.802` account to their appropriate destinations, including the Staking Rewards account (`0.0.800`). -The staking reward account needs to meet a minimum balance before rewards can begin to distribute rewards earned to the eligible staked accounts. The minimum HBAR balance threshold for the reward account is 250 million HBAR voted on by the Hedera Council. If this balance is not met staking rewards will not be distributed. You can view the balance of this account by visiting any of the Hedera network explorers. + + + -Once the minimum threshold is met, rewards will continue to be distributed to staked accounts as long as there is a balance in the rewards account even if it falls below the initial minimum threshold. The reward rate will initially be set to zero. The Hedera Council will vote and update the reward rate when the Hedera Staking Reward Program goes live. The latest reward rate can be found [here](https://hedera.com/blog/hedera-governing-council-votes-to-approve-changes-to-staking-algorithm). - -## **Staking Rewards** - -In Phase I, the staking reward rate will initially be zero. The Hedera Council will determine when the Hedera ecosystem has reached a minimum viable set of integrations to enable staking rewards. Once this is determined, the council (through CoinCom) will vote to update the reward rate, and subsequently, the mainnet will be updated with the agreed-upon reward rate. - -Any account can elect to stake to a node or another account. The **minimum staking period** is the minimum amount of time an account needs to be staked to a consensus node before the account is eligible to earn rewards. The minimum staking period is **one day (24 hours).** The staking period begins at midnight UTC and ends at midnight UTC. The Hedera Council defines the staking period. The earned rewards are not transferred to the staked account immediately after an account has been staked for one full staking period. Please see the Staking Reward Distribution section for what scenarios trigger the payment of a reward. - -Accounts staked for less than the defined minimum staking period are not eligible to earn rewards for that period. Nodes and accounts accumulate stake and rewards per whole HBAR. Fractions are rounded down. When a node is deleted, it returns zero rewards. + + #### **Key Takeaway** -For a staked account to be eligible to earn rewards, the following must be true: + This enhancement **does not change the amount you pay** for transactions. It only optimizes how the network processes the fees behind the scenes, resulting in a cleaner experience for users and a more efficient network for everyone. + -* The staking reward account needs to have met the initial threshold balance of HBAR - * Once the minimum threshold value has been met, the rewards account will continue to reward staked accounts even if the balance falls below the initial threshold -* The account the node is staked to meets the minimum node stake threshold value -* The account needs to be staked for the minimum staking period -* The reward rate is voted on by the Hedera Council and updated on mainnet +### Indirect Staking -Rewards will continue to be earned when a node is down or inactive in the first phase. The Council (through CoinCom) has voted to implement a maximum cap of [2.5% annual reward rate](https://hedera.com/blog/hedera-governing-council-votes-to-approve-changes-to-staking-algorithm). The actual reward rate will vary depending on how many HBAR are staked for rewards, but the rate will not exceed the cap. In the future, when nodes are down or inactive the staked account will not be eligible to earn rewards. +Hedera offers a unique feature: **indirect staking**. If account A stakes to account B, and account B stakes to a node, the stake from both A and B increases the node's consensus weight. However, the rewards for both accounts are paid to account B. -This staking system offers an additional unique functionality: **indirect staking**. If account A stakes to node N, then the stake increases the consensus weight of N, and account A is rewarded for every 24-hour period that it stakes. If account A stakes to account B, and account B stakes to node N, then the stake from both A and B will increase the consensus weight of N, but the rewards for both A and B will be received by B. +An account can also optionally decline to earn rewards, though its balance will still contribute to the node's stake. -An account can optionally decline to earn rewards when staked. The account will still be counted towards meeting the node’s minimum stake value. **📣 If you're interested in checking out the wallets and exchanges supporting staking HBAR, head to the** [**Stake HBAR**](/hedera/core-concepts/staking/stake-hbar) **page.** diff --git a/hedera/core-concepts/transactions-and-queries.mdx b/hedera/core-concepts/transactions-and-queries.mdx index 744c09c1..3141dbab 100644 --- a/hedera/core-concepts/transactions-and-queries.mdx +++ b/hedera/core-concepts/transactions-and-queries.mdx @@ -36,6 +36,86 @@ The lifecycle of a transaction in the Hedera ecosystem begins when a client crea The receiving node validates (for instance, confirms the paying account has sufficient balance to pay the fee) the transaction and, if validation is successful, submits the transaction to the Hedera network for consensus by adding the transaction to an event and gossiping that event to another node. Quickly, that event flows out to all the other nodes. The network receives this transaction exponentially fast via the [gossip about gossip protocol](/hedera/core-concepts/hashgraph-consensus-algorithms/gossip-about-gossip). The consensus timestamp for an event (and so the transactions within) is calculated by each node independently calculating the median of the times that the network nodes received that event. You may find more information on how the consensus timestamp is calculated [here](https://docs.hedera.com/docs/hashgraph-overview#section-fair-timestamps). The hashgraph algorithm delivers the finality of consensus. Once assigned a consensus timestamp the transaction is then applied to the consensus state in the order determined by each transaction’s consensus timestamp. At that point, the transaction fees are also processed. In this manner, every node in the network maintains a consensus state because they all apply the same transactions in the same order. Each node also creates and temporarily stores receipts/records in support of the client, subsequently querying for the status of a transaction. + +## Transaction Fees + +Every transaction on the Hedera network has an associated fee to compensate the network for processing and state storage. With the implementation of **[HIP-1259](https://hips.hedera.com/hip/hip-1259)**, the mechanism for handling these fees has been significantly streamlined to improve network efficiency and simplify transaction records for users. + +### Fee Collection and Distribution ([HIP-1259](https://hips.hedera.com/hip/hip-1259)) + +Previously, transaction fees were immediately split and distributed to multiple accounts with every transaction. This immediate distribution created challenges. For a simple crypto transfer between two accounts, the system must read and update up to six accounts: the sender, receiver, submitting node, `0.0.98`, `0.0.800`, and `0.0.801`. This increases processing overhead and slows performance. In the [block stream](/hedera/support-and-community/glossary#block-stream), every transaction must record balance changes for all these accounts, inflating data size and storage costs. Users viewing transactions on explorers like HashScan see a complex web of transfers, which can be confusing even with visualizations. + +The new system introduces the **Fee Collection Account (`0.0.802`)**, a network-controlled account that consolidates all transaction fees. + +**How it Works:** + +1. **Collection**: When a transaction is processed, the entire fee is transferred in a single payment to the Fee Collection Account (`0.0.802`). +2. **Distribution**: Once per day, at the end of each staking period, a single, large synthetic transaction distributes the accumulated fees from the `0.0.802` account to the appropriate destinations. + + + #### **Key Takeaway** + + This enhancement **does not change the amount you pay** for transactions. It only optimizes how the network processes the fees behind the scenes, resulting in a cleaner experience for users and a more efficient network for everyone. + + +These destinations include: +- **Node Operator Rewards**: Payments to individual nodes for their services. +- **Staking Rewards (`0.0.800`)**: Funds allocated to accounts participating in staking. +- **Node Rewards (`0.0.801`)**: Rewards distributed to nodes. +- **Network Treasury (`0.0.98`)**: The account that receives network fees. + + + + + +### Example 1: Fee Collection in Action (Crypto Transfer) + +Let's look at a standard `CRYPTO TRANSFER` transaction to see how the fee is collected. + +**Transaction Link:** [https://hashscan.io/mainnet/transaction/1771485699.125401461](https://hashscan.io/mainnet/transaction/1771485699.125401461) + +In this transaction, account `0.0.10231006` sends a small amount of HBAR to `0.0.37`. The HBAR transfers clearly show the fee consolidation: + +| Account | Amount | Description | +| :--- | :--- | :--- | +| `0.0.10231006` | **-0.00102456ℏ** | Payer (Sent transfer + fee) | +| `0.0.37` | **+0.00000009ℏ** | Receiver (Node 34) | +| **`0.0.802`** | **+0.00102447ℏ** | **Fee Collection Account** | + + +### Example 2: Fee Collection Across All Transaction Types + +The HIP-1259 fee collection mechanism applies to all transaction types, not just crypto transfers. Let's look at a `SUBMIT MESSAGE` transaction to see the same streamlined process. + +**Transaction Link:** [https://hashscan.io/mainnet/transaction/1771486013.122401000](https://hashscan.io/mainnet/transaction/1771486013.122401000) + +#### Transaction Details + +- **ID:** `0.0.85243@1771485974.183471116` +- **Type:** `SUBMIT MESSAGE` +- **Fee:** `0.00902194ℏ` + +#### HBAR Transfers Breakdown + +This transaction submitted a message to the Hedera Consensus Service. Notice how simple the HBAR transfers are: + +| Account | Amount | Description | +| :--- | :--- | :--- | +| `0.0.85243` | **-0.00902194ℏ** | Payer (Paid the transaction fee) | +| **`0.0.802`** | **+0.00902194ℏ** | **Fee Collection Account** | + +That's it. The entire fee is cleanly transferred to account `0.0.802`. There are no other transfers related to the fee in this transaction, making the record simple and easy to understand. + +### Before vs. After HIP-1259 + +| Aspect | Before HIP-1259 | After HIP-1259 | +| :--- | :--- | :--- | +| **Fee Distribution** | Immediate, per-transaction splits to multiple accounts. | Consolidated into a single account (`0.0.802`) and distributed daily. | +| **Transaction Record** | Shows multiple fee-related transfers. | Shows a single, clear fee transfer to `0.0.802`. | +| **Network Overhead** | Higher, due to multiple balance updates per transaction. | Lower, improving overall network throughput. | +| **Block Stream** | Larger and more complex. | Smaller and more efficient, reducing costs for mirror nodes. | + + ## Transaction Types ### Standard Transactions @@ -175,7 +255,7 @@ Once a transaction has been submitted to the network, clients may seek confirmat For a more detailed review of the confirmation methods, please check out this [blog post](https://www.hedera.com/blog/transaction-confirmation-methods-in-hedera). -## FAQ +## FAQs @@ -226,14 +306,14 @@ Batch transactions have a specific fee structure: This means different accounts can pay for different parts of the batch, allowing for flexible payment arrangements. - -A BatchKey is a key that must sign the outer batch transaction and is set on each inner transaction. It serves several critical purposes: + +A `BatchKey` is a key that must sign the outer batch transaction and is set on each inner transaction. It serves several critical purposes: * **Security**: Ensures that batch transactions can only be submitted as a whole and prevents tampering with the batch * **Authorization**: Signals the trusted entity who can finalize the batch * **Integrity**: Guarantees that the inner transactions haven't been modified after being prepared for the batch -Every inner transaction must have a BatchKey set, and the outer batch transaction must be signed by all BatchKeys specified in the inner transactions. +Every inner transaction must have a `BatchKey` set, and the outer batch transaction must be signed by all BatchKeys specified in the inner transactions. @@ -270,6 +350,26 @@ Learn more [here](/hedera/sdks-and-apis/sdks/transactions/create-a-batch-transac -
ErrorCodeCauseSolution
BATCH_LIST_EMPTY388Submitting a batch with no inner transactionsAdd at least one inner transaction to the batch
BATCH_LIST_CONTAINS_DUPLICATES389The batch contains duplicate inner transactionsEnsure each inner transaction in the batch is unique
BATCH_TRANSACTION_IN_BLACKLIST390An inner transaction is of a type that's not allowed in batchesOnly use allowed transaction types in batches
INNER_TRANSACTION_FAILED391One or more inner transactions failed during executionCheck the specific error for the inner transaction and fix the issue
BATCH_KEY_SET_ON_NON_INNER_TRANSACTION393BatchKey is set on the outer transactionOnly set BatchKey on inner transactions, not on the outer batch transaction
INVALID_BATCH_KEY394The BatchKey is missing or invalidEnsure all inner transactions have a valid BatchKey set
INVALID_NODE_ACCOUNT_ID341Inner transaction has a nodeAccountID other than 0.0.0Use the batchify() method which automatically sets nodeAccountID to 0.0.0
+
ErrorCodeCauseSolution
BATCH_LIST_EMPTY388Submitting a batch with no inner transactionsAdd at least one inner transaction to the batch
BATCH_LIST_CONTAINS_DUPLICATES389The batch contains duplicate inner transactionsEnsure each inner transaction in the batch is unique
BATCH_TRANSACTION_IN_BLACKLIST390An inner transaction is of a type that's not allowed in batchesOnly use allowed transaction types in batches
INNER_TRANSACTION_FAILED391One or more inner transactions failed during executionCheck the specific error for the inner transaction and fix the issue
BATCH_KEY_SET_ON_NON_INNER_TRANSACTION393`BatchKey` is set on the outer transactionOnly set BatchKey on inner transactions, not on the outer batch transaction
INVALID_BATCH_KEY394The `BatchKey` is missing or invalidEnsure all inner transactions have a valid `BatchKey` set
INVALID_NODE_ACCOUNT_ID341Inner transaction has a nodeAccountID other than 0.0.0Use the batchify() method which automatically sets nodeAccountID to 0.0.0
+ +> #### HIP-1259 FAQs +> +> +> +> This is part of a network enhancement called HIP-1259, which introduced the **Fee Collection Account (0.0.802)**. Instead of splitting fees across multiple accounts with every transaction, all fees are now sent to this single, network-controlled account. This simplifies transaction records and improves network performance. +> +> +> Staking rewards are distributed to individual stakers at the end of each 24-hour staking period. The funds for these rewards are moved into the staking rewards account (`0.0.800`) once per day at the **beginning** of the staking period from the Fee Collection Account (`0.0.802`). +> +> +> No. The Fee Collection Account (`0.0.802`) is a special, network-controlled account that **does not accept HBAR deposits** from users. It has no keys and is designed to only receive network fees. Any direct transfer attempts will be rejected. +> +> +> No. This enhancement **does not change the amount you pay** for transactions. It only optimizes how the network processes fees behind the scenes. The cost of transactions remains the same. +> +> +> The daily synthetic transaction is a single, large, network-generated transaction that occurs once per day at the start of each staking period. It distributes all the fees accumulated in the Fee Collection Account (`0.0.802`) to their final destinations, including the staking rewards account (`0.0.800`), node reward account (`0.0.801`), and the network treasury (`0.0.98`). +> +> \ No newline at end of file diff --git a/hedera/faqs/getting-started.mdx b/hedera/faqs/getting-started.mdx index 54ef382f..042b7211 100644 --- a/hedera/faqs/getting-started.mdx +++ b/hedera/faqs/getting-started.mdx @@ -41,8 +41,12 @@ title: "Getting Started" * Gain access to the Hedera testnet or previewnet for application development, via public/private key generation. + + ## Mainnet Account Creation + + **DEVELOPMENT ACCOUNT:** @@ -93,8 +97,12 @@ title: "Getting Started" The status of Hedera's mainnet and testnets is publicly available at https://status.hedera.com/ + + ## Testnet Account Creation + + To start building and testing your application on the Hedera testnet, you'll need to create a Hedera account. @@ -127,8 +135,13 @@ title: "Getting Started" Fees on the Hedera testnet are the same as the mainnet; you can find the fee schedule and estimator, here: https://www.hedera.com/fees/ + + ## Previewnet Account Creation + + + The Hedera developer community and our ecosystem partners have expressed interest in early access to Hedera codebase features and functionality, prior to their release on the Hedera testnet and mainnet. In response to this feedback, we started looking into the idea of a second testnet — the "previewnet" — which would run a development version of the Hedera codebase. diff --git a/hedera/getting-started-hedera-native-developers.mdx b/hedera/getting-started-hedera-native-developers.mdx index 61da7f25..37af2ad0 100644 --- a/hedera/getting-started-hedera-native-developers.mdx +++ b/hedera/getting-started-hedera-native-developers.mdx @@ -27,6 +27,9 @@ Hedera Developer Playground - **Have questions?** Join the [Hedera Discord](https://hedera.com/discord) and post them in the [`developer-general`](https://discord.com/channels/373889138199494658/373889138199494660) channel or ask on [Stack + **Have questions?** Join the [Hedera Discord](https://hedera.com/discord) and + post them in the + [`developer-general`](https://discord.com/channels/373889138199494658/373889138199494660) + channel or ask on [Stack Overflow](https://stackoverflow.com/questions/tagged/hedera-hashgraph). \ No newline at end of file diff --git a/hedera/networks/localnet.mdx b/hedera/networks/localnet.mdx index 6485bfab..036c29f9 100644 --- a/hedera/networks/localnet.mdx +++ b/hedera/networks/localnet.mdx @@ -2,6 +2,11 @@ title: Localnet sidebarTitle: Overview --- + +import LocalNodeDeprecation from '/snippets/local-node-deprecation.mdx'; + + + ## Introduction The Hedera Localnet provides developers with a comprehensive framework for locally testing and refining Hedera-based applications. By operating outside the public networks, Localnet is crucial in the software development lifecycle, eliminating network I/O bottlenecks, minimizing shared resource conflicts, and offering complete control over network configurations. This local network comprises of two primary product offerings, [Local Node](https://github.com/hashgraph/hedera-local-node) and [Solo](https://github.com/hashgraph/solo), each serving distinct purposes in the development and testing process. For developers just getting started with Local Node, here is the recommended path for testing: diff --git a/hedera/networks/localnet/multinode-configuration.mdx b/hedera/networks/localnet/multinode-configuration.mdx index 8244c854..240c55a1 100644 --- a/hedera/networks/localnet/multinode-configuration.mdx +++ b/hedera/networks/localnet/multinode-configuration.mdx @@ -2,6 +2,9 @@ title: "Multinode Configuration" --- +import LocalNodeDeprecation from '/snippets/local-node-deprecation.mdx'; + + ## Using Multinode Configuration diff --git a/hedera/networks/localnet/single-node-configuration.mdx b/hedera/networks/localnet/single-node-configuration.mdx index 3a77c2af..858cc76e 100644 --- a/hedera/networks/localnet/single-node-configuration.mdx +++ b/hedera/networks/localnet/single-node-configuration.mdx @@ -2,6 +2,9 @@ title: "Single Node Configuration" --- +import LocalNodeDeprecation from '/snippets/local-node-deprecation.mdx'; + + ## Using Single Node Configuration diff --git a/hedera/networks/mainnet/fees.mdx b/hedera/networks/mainnet/fees.mdx index 9cfbad75..be5b99ca 100644 --- a/hedera/networks/mainnet/fees.mdx +++ b/hedera/networks/mainnet/fees.mdx @@ -50,13 +50,6 @@ All fees are subject to change. The fees below reflect a base price for the tran ### Consensus Service - - **⚠️ Upcoming Price Change – ConsensusSubmitMessage** - -Starting **January 2026**, the price for the ConsensusSubmitMessage transaction will increase from `$0.0001` to `$0.0008` USD. This change will take effect with the **v0.69 mainnet release** and applies only to **`ConsensusSubmitMessage`** transactions. This update improves the long-term economic sustainability of the Hedera network while preserving predictable and USD-fixed pricing for developers. Read [this blog article](http://hedera.com/blog/price-update-to-consensussubmitmessage-in-consensus-service-january-2026) for more information. - - - | Operations | USD ($) | | ----------------------------------------- | -------- | | ConsensusCreateTopic | $0.01 | diff --git a/hedera/networks/mainnet/mainnet-nodes.mdx b/hedera/networks/mainnet/mainnet-nodes.mdx index af4fab3a..f3318345 100644 --- a/hedera/networks/mainnet/mainnet-nodes.mdx +++ b/hedera/networks/mainnet/mainnet-nodes.mdx @@ -36,4 +36,4 @@ For the most up-to-date node list: Below you will find the mainnet node public keys found in the mainnet address book file `0.0.102`. You can also access the address book by using the [state proof alpha API](/hedera/sdks-and-apis/rest-api) or [SDKs](/hedera/sdks-and-apis/sdks/address-book) as well. The public keys stored in the address book are hex-encoded keys (x509). -
Node Account IDPublic Key
0.0.30x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100b8f44cd507abbf5ca06d4acd531821e782dc8e51f977758062bae02bbd13e7cb60396d6792bf8a43f1116495e66aebd93d7938c7b133fdfe3ffe0e0cd19a7a6f33e35c389b4781fc78dac41c3a300fa547c4b4b7c73c8479f9b20da76d4ff9331af037941c63b01bca0a0bfa32a08d9ecd26090bbd4b67fa4c98d2c2dd5cf0a981a9d6ea1bf9b4a9f7af3aeb4916e165e024f08fe11111e2ab86f044b508f793f3ce742ff8cff470afaba11a66de82184461138c7c1688ab3d1e9084a3c8a529942ff716440bd91404b0c6ba86ad6c8ad7f8eb1549a29184ca3302ccd22af815d862fe99994fe3fda4faf67b78a5413408e72de6dd4964a4bb2f25a3f5f870775a9ccc8dd16c02f74f67cde449076920fdd3ce83a3cde1917312f9978c583e3969d580d178f3db518073d535e0c605f85d366a789959c999c94c7d3a44888f084c12e942e7453bfa5a13b33c16a32c2bbb197a1d1217dea5b68b0e16d1d0ad8c0923af801e82eb022c8dc683cd0d2c44d536953e2e15709caca58c416996d5070203010001
0.0.40x308201a2300d06092a864886f70d01010105000382018f003082018a02820181009131aa368f9345229f97b6259cccaffea23e00cd5ead02e3f696c1e714ee3939dad860e38bf95a2974f9eb48e9343f8aac405ea955d05323e117b3b1c94813a3af42fe8082c3d43baf1bd4d8367e93db00ad696e627a1036ae534f011ead5e56f37a6ffe44b6b9e099401192ad560a0346b41a810095f5f2d7fd32d6eeb655ba758c6b526c129386af7197c7a53ae603d622832254961f16d0efa8079a768561888be733492217956bbcafaebb6135c5fbb2484d5b4a5fdf0336ac02e26c1652c1bd8eaf30dae1d6d3eb00f7b4fab8d6478fe8d95eb911df966a0dea4e522db76b8966570ecc5af09516424f0af5f8ee66e386d5650713997169ac37573bf52fd058de95ab2ff68e68111ab23405ea964b2bb88d02c0f1caed71ecdd4e4e408594876fdb8500bc55c7ba02066e05ab98d9f7e0466d9702eb57ee3722f8fcc85a75505ff3262170288b788723adb97e4de5620cc90ead1382fcd7571889fefb11e6771bc3f6f3feb19c7ac542878d03a90270526c3eed2494eff54e153ca9f6890203010001
0.0.60x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100900452b7e82812fa0c481495a96e2b02f9e5b176c9df4678f7157e84f9817514cc6e87df2ddf31c9b4cfcb12b5f857f372451282b3cd66f8ebce4af15d595c6beb70661320adb8b07e2d523c2587b709796b4a660c821d199f57dd18d6671c02a3051a730c7445fc4497ff941bec4e5084f2f591ae265d48dd9d6de474666bd7bbc53eae878735b32604644bf23dad5ee1d6a14bb366c1664d700c4db649970434e81321f977ae442b7a541fd55fc9e03342ef4e116d587496a22920d1d0d9de76320d46459ffeb104264eec5d6b1cac5cdb6de3972b28d87e8c71ef1845511555d8bec88e2d6b0df70c18b611d8539427b6488b34fffe9e6759f654d6968a094346bd9e8ab051f8b9385903874e373a21a2cfcb0b224645140471fc8ddee0015fa88f9a7864d0ee913684f6afb361e06b4cacc845c9c0f6d91ff480f08cec4027c9736d1263ccc8156f4723dbd2186cba515873442f211eb160db9f6bc724c20e6c473ad91e9e70b4fadffed33d5d90eb326b1c404a230595401439584ed2d50203010001
0.0.70x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100c321bcc49c90a52b67b8c0b817caa3f11e989845236548d8adf341b4132ce171a7a440c889330445058e809d9a90450ed748d0ce51fa726481a5b91c26f4b14f56052471388dd18e8fe95bf1e4ead9293cfe2ab893f25e666aca92379593ece2d137b55754c6791f649df8e2538e1b6116c32dac05eb62b17a7727d8a6fdfea712d7c1ea39778ab863fc5b06ed2c0db18cedbe395c9c4b2d82816a1810393f7e3b34c085fd337dc22666e8cf3958756708403122f10e6e71b830617785e07732ae97cef1f489fe718d07e929f5971d9ee660b3ca70099f6d86b0514078e5b04434f62c0a5d42e77334830523e11788acfcd894f9c2f75709edf7a53504359724e4884d0ee48a8033eab8e8f268c3451edba200b76c65ffb3c3309e522ee7a01a5af59a1f8f0a8dc9551c2e51ef3292e57a10f27e05fd5dc19c0f4950b36bd8cb56e0085b75facd27aba5b80a6f65de802e05b18dd198d068403483acddbca9ee915d93e08f9eaa8989ba920e0e251b2ccda428da1d725565d74533f96771d64d0203010001
0.0.80x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100a1c4077154303cc72c4fb7692c3f94251bdec1239a1f7a8972abe91a35323fbeca625a7ffae6406c855dc2af2110900b0df0e6e6db76364dfa1ffe85eda567936e2985b85634a32aa52a6599dd6c30be1f7a6c5b8f5eecaf2621d8a459682fcd2dbaad1561d11f33fccb7f5500ac568d165dbeaace3286d2894f64129d781d6c72fd7d599c9e1d3af4aa433c23b910fae4c4841641f61526ad787ebea539874167e9d3a73cc0fb156429d15ec763a6d0f06115a79b9af783d77b98d83096aa4743f97408d9e14bcf4ddffe4591768847b40cb8da7ca375256d2b935d095fe252fae81ff6e37f84d7a90d7e570a4f8ef3c7d766eeda472f0920199015a8908259a873c5454fcbbdcad2e528de85455b4083c7dc4adc5a988e0cddfdc159d5d712abd544aa73ec029089814c98a44f26fc0644659c183e3184aa272f8d1dc0bfa3e0a560484cb055ba4dbb5cc339ec80bd11d642dc3a702e8c703ab2193084d9bd63f0dfe12a433c2576eaf781cfad867ef70bda61768b2bef14f50c6c3b8b096f0203010001
0.0.90x308201a2300d06092a864886f70d01010105000382018f003082018a028201810093a215cc4a7a722cae9c13abd636df99cceec6af9db46b69fa516716ef50ce2490a981e09ab019ca2cb46811b5b619d1bd1d5ee6f46a42c777cbdee642a1484ecdf5ddd3729642c38c6d43a8858874475f5824443664c04dfed9b89045fb085e25c3efcb4841733eff7c529c139e69350c2cd79b2c8d19679a712e4e8cafd3267541b832b3e10a01255def69df1e9d3b8d8eaf0311de67d5e12b26dd01dbbd9d3e42d35d9de271302e0f1f69d87cbc7aca9e8867e9d428d3cab0666eb490d5fbab30bff3f785d03f2072a43bb9b5e54656a592cb61eafd5a5ef284c7caec66f7f47325cc0d4c1d27f661d8a748ca5071c06ef134dff96f4086688366d468a24780017e0b56aba7fab43b3b7c0b77906fae5482f32811c292e6b14454e14b894801a86a03cc47794dd0d74527a72e424ed3afa04899ecb9a63f2a9ae72be7fa989adf0d65a32c851d9801fc41048df33564fc7b31707ec8fb80140fe7b7a1fa120ba1cb660324ceffb4bcc2d9bb7de0cf54c819f2dd3bceadec9c25f5e19dc9b10203010001
0.0.100x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100c57edb9ff276e023b28021cb1d87cdf1966b698cf48e4eaaa7c692077ceee8ccb239a4c921597e8e89f7cc05d3f3131578976c4e314405d4a4e03a72410c5c09ca527ad5a85b998637e72a32e1fbc0d5546b2465e9e806c2dd509eb050ab5fb27063fd92815b1dd2689e2111caeb6f549e94a9f00f0821d4ca6c6a6117f5a533c9263bf074a30d5cbef50d1c8c2387bca972ededa0983b5d0a6b57dcb0020006828b40e4076b4870b24bad84056ee52b5f422e8840028c25006382d8e9c661225f4f76ea72e340607e9fc6f3c20433076a1ca8cb15ed03ac8966d0507bcde681e4e0231ee9f87d111e7b48ac8f94d2d842b52df73f573cc5414964797c626968ffae7418f3b6109b5a0f09e3223f4a4d5e3509dd250138f6bc17bf6cece17594430df180a38e90adf2affbfad0c6b8c1b87f178a061dcfbff8b92c9166d874c1ff5af4fbcdbfe8e9d099370ddf60be747633d36ee4eb5cd51f6e3c339e151e41bdb5a5ce2c8c97a0a43b3cd4cc081884c879f9d2f3748428c8573f17c90f3cbd0203010001
0.0.120x308201a2300d06092a864886f70d01010105000382018f003082018a028201810090259f4e3d9f0f394256548e9c7308b10b73403cc9094d97ad151b7706170b9772ceb64d662ecef901a8d7d15d319a59c8b71071accd895b7c93610dc6976f67c4e1729ba8373ab7e52a3f3c8f265491dde69d6e0999470e7445981131bd96c36e6865203fb2ebd5d50eadafb726396dec1d9174898b4e9be04c74d304feadd9cbd3234c3b7f3306c99cb0c339fc25969b41d58a2b7cfc1832e226d81c1963993e2255a087d1698c03d4210bd64580644d095ca76aa1794edd40c1c87b5f82a8e39f603e97116ba04578e7e80346495d785d4ef7cf7714b9eb6f5f9e0b9a94f4b73884619b9274d4a95ef15754a89d97ef5c1a88b6d693e0a80ebd537fc9cf0ca91d1c62d915de7ed818b952e64c200293ee8e284a416a72a3e12fc7d423b158f9b49660cbc2466fbed0fed2e24e102fde942eb4cfd94bec46d3d90fc08c39fecba03e0ca2464ae664b979515ba29e1f702c3fe702be793796d8edb17aa48c09290b024549f0611f5ae23ed7e16442df7d1dad2286c2bb09d5522dd3ed698c2f0203010001
0.0.130x308201a2300d06092a864886f70d01010105000382018f003082018a028201810082de73065f34ffc29340d5949d2220b1e4366ed5cf7c6ebd616cf9416a53ea0017f6bb116bfd3f3defcc15b7a4ddf0e44d02fe695688053e79a770e201bcf7193390039ee8f086d4fa746c7e056918301f9b5e84e39262828085a79b322bca0b5d85fe97221a26bbde258c620f0dcea02ab1edd16cc49a3f2ab9288e3dd1f37dc4b6a6f7133ff92e541c71b70d2a2f66d55725ab18bf86d009ec3d24f5d12e0b5e6802d1151372d4b764ebecb4af82f649485ec57b5a01dc67958f5a03ccaab7cba9354a17372c1316ba47c953aaf94901b3f8c24e6a3afd6758e7f3b143ce2dd3cb071b2a74c921cee949a4b5a6be879f1c790a6b8d63b192d7ee29a9491fdd689a98c0a7c3d60320f1b4ac2d6229dfd94e42f3a6048a76be1eb958c8a1873be8d338aec9fc59ab7f37626789402c1fd595f19087575e0be827fc4c0a4fb3d393ad74a949cc986bfb64cabddae53935f6dc56074db93d77ea3b816bdd6be534497272289859ff34ce51860affb621d10487dc3843f1f86d54034a63e48a1a0d0203010001
0.0.140x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100bdd1fa36dca8eda4d53111f5ff7588439eecaa0fb0ff589625e21e5e1ec7f6eb9b10b842e058f7b6200c5ed98fa511c8ee75df16cc22b6d4d6c17f05b429fea572bf2e40652cb3bba7c7cd40ca1865cbf686a91376e74a52e3d7189e5967f01c1c342fd1587d601921822e0c7b258caa812592ebe89002fa481ef3e28bb392b38380ec0eeb5454dcc76ecd3eb62125f0848c13d162a48dfe4e9b0a7e7de02375686945fc4493437a9ab20cead33b1ca441c8cea7ba2f513c70dc7e01290d7873826a044d031e7ebefcfe04995b98fe2271a596bfdb87fe56791617e5aa869d22176a5aa783051b5ab641d6f358e0d4b6c98f4052ce6282f225591ef7dd1132d6e7c88cda81f49c9699b84a336ee7ee77fee3907d41a4d7b82e6094dc0cc6c1f7f0c183f502d7389f21be71e278646e77fcec4e62d39369fa8887af5acbdb009abe9df78b3b40744247a8b8f341e323e2d4022a15760edb3b121254fb3176c6e5992fbb15e58bcc71a1d67b103b3adcbdfe24a40f124933c9c4094708dafaaa8f0203010001
0.0.150x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100a8201a6e1ebd55747695ea77179da3694c4e28090b807dd51c1a86a0eaaeccb7fc6977e57b5a07a56c3bc02d304f48458926185cb18d005577657f1b61e040d2d345abc6ec381c77464aa87a0f44c437096755ec1880b4da201ebc7ad9b0ea44e2080d57c1d3bcdfe94348cc8e5c245a7699d57a3a18c2a1f529ba3d34716e299957bfd80bd8d014ca5b79f4720320b6bff944826f9ea646d35403981f2bd40ecde727171e86c04475406f87b52d8a64dfbb40646a8d65f5d343776d3874fa43db2e7b54d3d7aed0b89a43d6204ed9100e7a2b6173d30a1b82f2f2648a2a3431f25a813f3f01838b716ba4a8d9d6dc408ecba390e8f4acbab56a72a2691b730495adbc63d74fa8f5c01460077947939c5e2036d746c54fcf347b90ebbdc81c0526affcf88a91ddb0d1a68db7de8a634a831e1e580d960ab1ae2be55d9860f1cdc65cf576fef4c1bfecb4fd03a0e4d00d62a55a6e6e165e93d97c55d078c1af84dcf77e1ef3f0c34419366da78e5b7f36132a1134ee56824731b5e127818e15370203010001
0.0.170x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100aa1eca514bdc4a9044f200dd8bb20065310773741dd8da42e0e4c1593d98b0e232d04c9dc7c512f4d7658cb297c186b1d41b77fd78fd3c36da9652af245e03f6e0c1f4e6f80d51a530dec2cf73840ce3b323af627194540c2dbb0f60803e9fefbede949016683969ce7818f08e62744453c2938d42b7a1e87b919e289064381aa9f76d629e08a1866b0b6ecf71599e1c18587cdaff58801536eb9371c5ccb142523cfd78022e4b01ba55e30d0450872d7a485d1cc902414eecf691e153f3126ea20f019b3d72d64987fd6955cd50320a05b01cc9b4f7dfb8619cf4f8a7ab5785c050fa7c8f87cba9e839ce1d6665a10890f93e8fe4762f578b30469ce1f21fa33118b5753e454bbf0c1d28bb3e26162a7219f6b6af150d7889149a0f8f767a043d37d2e7b1d4403709a96683c88e714d2ee705c6d2889b8b944af6ab51cbf4be5f9e83f2a22f4b74bafed82d7878cae8d8e40338b7b54ee80b0517534b2ae098f3cf3e00371a41e8d0e57e784fffe4a62e8feea9db55f0907be3d5bed53994550203010001
0.0.180x308201a2300d06092a864886f70d01010105000382018f003082018a02820181009da3ac1deb4c13b0ee06ff4bec73f391a325046c24b14e1212f60c813c6efbda6ebebe458b8058e433cba237244dd590964c3a6822fd27cc3a1985114cbf7f68e075c2a638dc1e6cacebc0f2417aad78d629b125875c49b7acfcafc97d6af8b02d26ded5fddf8bb29e8ea4ddc135d28761e89e3f4fae8d9441363f71b9306f07080236d352c10b9b7f0a0758c769bd1efbb68481e88a088bcc743f8b348454a74653796a3067bf479729f31360711394b07d6bba20ca02de4fa08e0e5ae9ce54936f0f2f8f7a99cec472b105fed0f67d7f3d0b9c47c837751c778eda1876e93eb11a8634dcdac75840f80b527e8ea3aac0fa17963379d142120430e6e9f926e98dbfb3646a7c96728d8d19fb8daf0dc6a5ae743593cb4ef63d97c699c422e3cbf276f4aa2725ec0b410b62b1307ffde054d16438b0cdac087b2f41a12c0b13fe0d2746e696001759ccdcc7664b81ece215b214e71f5142664d2da293f7c4d471cd8d4a3ffa55e11626af3aaf0825d4331a45975011aa9f3f9141748908ea48ab0203010001
0.0.190x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100df7975dd74619ba26d1923cb878547834abb8acaaffee1bf75116d64d0ba95915cb8c8a39fc764d8292048e5d7a7fa42e3faae1a8a4e49d8acf3a5a094ea0179041598b3d705db036dc1e1eb9b15600337fc546932c53aafcd7c9d051cf7cb3e4c6b9fc1805dd287b39019bc5e3cf2ad7a3ca6d2af0c44da7a517aff5328272944c5e20b964a50e26e4ecb4595e37229fb4084049d2bcf8492c92b54a827e959ba3640b60a6cc9fd30cd07762d21068aeb4bd48136116211474d2ad41302514a3614a2951580d0eef475207573d579b190a38fb38bb78f755c4285b9b6cab65b851619af51e63d917d97b51ca49f30b6ef41cd38c7d2c0186fe08a9dd72a8e8d58b0eec96899244ddcd934600026f5ae877dffb2372cfe183109225140ce983f08ce0c615c451b845a48cd16e66af452ba26d573b850c2b359189472b20d13eaae11ba08d83c4134ffee842d3bde2894d7326df12f3b9627ed492425e33d7d46d347b71628f61892629b78b91d22fd8df37f74f53989e3de43d0c1de89da2f850203010001
0.0.200x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100dc4b5ce5f6892b84720ec5efc3581b0dc4909a401dbee30f294e5a5eced632196dec984f99e54ceb8037178d266352da9cdee8b8e0d5a856fb8f2d6682e6a8e9e4b61ea3ebe8b76a3ca6a86db4fdd1700d0119c287858cb4b1455546a9b58b8478ed964e9239aa5b446a66bc12f2b9f531c09973c9c79bb956006a6bc57c22a042b74c3720382480c35a7acaab9ce0c8f21d5286cf153f4f9e4cff5cbb64bc0639e3108d812fcc321f7db64ccbbd619b4790d443a67982ffd57786f596fbf63a740ccdc77f33507c55ee2cb9a9bbd4144a39b8e76f542f05279ab34dc0bf8a2870706c226c2e71ded60fb7aca4b3432ea58ac4a8492c5b663f623e57f138656cd5f08c1a91d8279d5c0fb0f181bda55e7e0deba709b2effe247d897148529499824b230fc308e8515782907ad3850d3465fadfa1a5ce2bbd9206771093b89f141adf5d2e819e1fa9948dc66555811092f8d213a71bd44aef8be872c7a0f1ffb6a64c8fcc775f3162e72b723c09a758525d91c7bbbf1be4f082630f75374ff4770203010001
0.0.210x308201a2300d06092a864886f70d01010105000382018f003082018a02820181008d45c21c0c95ef65a029d52c957fd0f85f20123da034e61671ddee5475f07382a66c66cb4dc50504ddfd37581083df8d1757730ed8d6f364df4c36a2651591955da201a2407fa8ab9b2313811225a0da230fbe380e090aa56efa4f202ec9b4823f6501d96ac698ebf26aacf3ee2d1f32a721c947e1076cf35b373da1d87a36a152e00e71011792282e825ff171c5833b88570bfc6da8449e6f95f8b1265ab555194031553d1d576f93c42c0ca60aabac4c8dd162d8114f2b21511583c72539fe56c499a929de3a40a0d45c17c589c2d7988ce26eafc92a3d37b7ea0042d43e03afa6271b26255a6cccfae5371821d81e0b05c250b59f0a90741a0e0e88a09ed56c5b9780d095f0906f0b81d51263982aae01136c072d844a11d6da4b2a61c644e1ab17f16ff48ee23fede8452f1e42e2d30a0790c25d42060e1d44a671a2eb23d114f68c71e33f176db58a68b430054bc1d2983a23a32ea6ff95fa7c4d8e380eb296e98b7968ecf8454d817c737eea5dd921eb86c16c7b29304a4a7ecbe5a3a10203010001
0.0.220x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100cdd33b2cfc5d25c13714f196429547abf166f3e3093d9cc429642ae26cf79ce668784ef550a035857d5fef1ea5e8aee09d4ac841d5df0a37f67acf56ac35e39eb7ec068b161b141949fe144a7b0666acaefbcbe945566a75841fc742ee84480768ecd0a5cdb3d088c4900caae861adb8f46d4b25d49b59b5771126d08e9f1bfda5e4dab8a9904ba9bf14d201f466ebba389a850c2a03ef61cc4d3cf19bf5d4758406565af8aad7ae3e3068aa9c1a82c668df8cdc459a5332cd25f81a94c5b9f5229deb1941ae9a4afc02cf85bd6d813bf8b12e44ee4522037207e73b1104b9c50fb366b55fcddb10db5a3077e1d3966df87ee4816c47d89c46c63f2accaebaba0f2f7a8c00bf6291509f2bc762a2e40443a3432290b0b815664c8ed4ae9deee976de5f1c91ace6883dedef254673a9573356e5b324a5b5c624e80dfc631b99fcf24f5c3653a8ce21b8b7552bec893f7a30f881a9832b6aec52a9391d1378d6a990550db350d00961070b8da21bbee8ab31634701a37fe8004870b463f6bbb9bd0203010001
0.0.230x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100b476a6d425ebee039bff79bf49630ed49bc8f643500d32038260bd87e04a7dc7d63c48b4e8bdbbc4844c8358d9f08b4175122b4583025ac8e48311a95856cfe059a24639542af67226a8b9e78884b94bf1b6964e8f2e23343d48e8fda3f4987167760ff2b454a9d40864320ab2a3ebeec7674a3c2b86bf57d8550e218de353a73bfb820c6a4cd4ad66fb7d0b14f07f437de9a50b923def028e01a2bc2b38aca43697aa288bb50c3301d0acc919fd35a551d4d9ecd9b0f80744b53fecf95f605079dd396781c9b3d193086cd1773c238f76e137e8171fbeb351b98e6133a443c5ece721d9b59cccc24ce984ef49b5b1604cd8195929b1025304e97ab8424f975b082ab427a8350d4df5e548f1e0d300f2e400fd4c414e3cc12c8ea1d69c1cde46fff2fbfc11b7de01d6538b8d2c765c4cbdd194d27d92474d16e182dc57b3bc844458d3b38d2b9c349e4587fb366ab4c40ba51352cdeb5d9fd01bf6ba9f93cb563ad86dabfeaeb411ad69c58bbd40340afcd9e2dbcde9a9b9b409743ae2402a250203010001
0.0.240x308201a2300d06092a864886f70d01010105000382018f003082018a02820181009dcd8c0a53e90c3559574f66204117d3b503e50a36d3097fac8429e6cecd37bb54071808f2ee982035f851a0c9be2176383a22e38c1aba168f32f90570cb3233cfe625987666af67b514caef21fb8df6d0fcd33cf2606b92ddea5536b6068d86782e39bd5c38445991d419b7d1ec08599412c0949d1c240b35c14dc55274dba71ffae936125a5f819f54132e2439d4ac5597996ece85e13dff3361f9131f56ceac5b9f552b49cf6f9a9ac6e5dce2db369462f93af80e5b56b6e8befa162a061b4a76892bdc84647306c600858fdd2703276c2c70440198efd7fe3545cf2ab580c74cfd6445aaf7bd7f745cc252eabd265eabee862417104e6948a55756fdc222df0a101524de1c3c08ccf043011ec7fe964edd8451a130147c07363a35f11fdeef8f2a2b761757b4358ff89b75a48d67bdc6090693e0bb8679ecbb93ffdb3f3ed96bec93ef4656e3716ab87ce46ca8e1259c8fedde8f2f1ea0f3eb2c48e96551de12330345725f45ed69c8575b51683afa472621826db22bb2d1c4f1e36464a90203010001
0.0.250x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100ae7af9c608c1bdb289fb817ffc6c9577ed6d4f6d57f274b215f1390c7e79e490f9dcb74cffe0e8757d67f90f4b20dd4451b7ff6631a6b45c9e403be5a66224955583d1aa4238ba6f946b71cca8c16cc7888b2f0d333c635b8e5478fac3ba3f81457a1a16b04e2b2252651b6c4688c5510d2edc21b03e0a9b283041beef6783c0089845ecc96e6d235c56685d248f8391fe0afcf8ee03f3b498696c6d9decf2fc990c219ef6d2cbba2a69a26528e6009632d82ead3a583ef0c37c2b79068118e0320b9fcb318f5ae48c0877955d0831bc9521aaa88b93419fed9f462f900fc42601056e24ce449edbdc849bb782c09a1a36ad5e4d4b5d7466b7763913f794b2771b07afb617444fb6b4b7484d64e191b513fc8e2501043f725421cd57b073bed21b00314185d6887fbc2b548d90bb2a3c9184ae944c326db8f37a7356aa882bad4c7947a80e16d0f02e382d5771f1987c1b76e88cde1cdf2d1a92215ec68d9b204e80b5dc4675ff3aabf223f7787eb2415df5e389cff60fc40ca252000b4768410203010001
0.0.270x308201a2300d06092a864886f70d01010105000382018f003082018a02820181009a3b21661868facf1cd8583fbe321acb38f21b6a75cc3c13d7134cc11c7835a64eda74edafc3f450165e3c2c71d21a8bd3ba00a1c782ba7598970ea2efdbb4a5862ae539a2f55a417ad717a299e0e22add863b625bd1fa2d71a7421134019f738247147443e2128d4c62298529d46bacbae84aeb5cd3f43c5ed8ab500fa7246fa32daf17a8d7098a5c8061bc1081f498bb1f51f73431876ad02f9f392570b86b53bc5c5d3f07c56b34349db2ca2879f98bfc9216f1f56987f74d9f68ecc91da8c8d05fa3b811cce361c2d1d5f557c2ad2d14b35f27137f2bf39c527b82e537edb16378e360e72586ca17d6011bde1cb21641f894849ffd42d6968b4916d94764339b3934671ce3481666b7e7d971e97348c87c19258a7fa6d09ea34d30ba1b4ec5cb0bd5cd9116be8cf0d7ab4bdb342689ccbd370b84ff378a7467902578028c0c8c7b412a0863f9e94bc5b1db4d9e49a6d54de4e04898eb62d0013b201fbd947204e7cccdfda043aaa2c904b2a642829f8a34ffce13fa213cdbb332a3a758f90203010001
0.0.280x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100b3cde7b4066b6c3c24e87549d7b91845864f1aa7fa1f8a576d4af30854b6ae93d3c8369028a353a78be92f1552f59d15bd7b90025465d6a85136688f0415e0f6d89d6f1a92046548ea3ce77ee757c3bb06efcaa99f9c6226f195388b427673dac4a9a54965c2fea7aa5320cb31cedf2b26189cf31acdfd0a3b01f9c48ca99861ce9e51bd397a995b43f24673af4545e8bf4dbc94369cd7f6e4bc9b3d64ec3038d53e78ac0bb0dfb0df308eb37c90e2a9bfd5df7ba07a785a114029184891843bbd87573df0a2b53399043bc297af817de58b6fe2282d7df8433294967932da599a1606c83131e5da0850c8ba36453faf2b69bb91daa8b3ada0a6502fba4b5dd74b6d00de6fc935ec332bb511814abb2f6a0ebcd679da33ecc54712143a8aeae8900298ce0943305084e98a9079d2d89fc607826738eb803ed108678bb827c17f6576842c818640724da47a6bde98d673645cfa8a9158b661ac2c818f0483c29a6f87f77f67f768ce26024f74eb1249e51ab7fd0f01100a58f1a5a08233c46dcb0203010001
0.0.290x308201a2300d06092a864886f70d01010105000382018f003082018a02820181009b18967c838877f85a6471ce9f164cef939b01830b9eb22c02cc6b72a907020b3e4c014dc711ea8e095b88d0b4858ec86b05a8c3a59ac12d2b9fabcac282ceb618db00eb59716611d6706c81aa32d9dddc6a6c7b396ba202fedeb33f289a887284ebfc07d166d02c2c6ed32c7324c3ec8ae22112854e18ab5ea07a615c5ef8004ec68ac70dc03003a47f7efe103edce257d28e7961f428f1cfa2e6cf71bf45c564b82ccbda14a183f30c2c3d5a7afba7a004079e87702c249e96a7b2fdd562fc16759efe75abe6a23d0d2f906a2df1d4b64cb2117a7304449c75319a7620c219a4ffc982e822b6e1a07be1cf98be9265d086dc271aa406310f8a846fd331239fe303bd5616c89080fb88639b7c0ceb14009381823e0433db6f9156e2bda1873d4aa9a3a639604bfbd11a6dd6ce03b4b0ceef95601c7d88a840397cdbca3ff214fbf58c9d9dbd79d39ea767e9ae5f6eab9fca05fc4800f557657c90c12c60e02164825d4c33af4737374ea235b50313ed0b75bf89a6b79001fba74cc1319e55150203010001
0.0.300x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100ba7269748681b6ef0a26f5ccce374a62144dd89ecd677f191526d75e081f957666f86b0c312da8689d866a5347329b07f986230731e26fa7b0c6865eec4e939a4f5f99cd149cfce843102cd538c096ec14c1a12ef47e7cb015d7cc41ac6bc4e3c6c6ea309308641f3e750e8eaac03ae77dd1914b48f2cf5ac1fc59b43236af6072709ac8e9fbc97479890be4f88e254df6eb96894a2d5deaef63cb7021205dd054b24f1227d15d840342315617c1ad1336a58cad2b4ed0e1efdb8f7fd342f5da56d4fe65226c8009d79892266edbc1b8e0db24fa15f4ece7902248fcbd33707d3e434a06564e343b03355f52619cac1e53472e7da2cae43debd5e60b1c20677a3547f2824fefab30644cb40614f8ca5a2203d55bea6f419a76a96e564f1db1a67187def7f58f67eb1db1bd91a19d2baa1a3dc06d04c76728910b1b3cbc3096825da019d0dd361871d3e7945d19a7904a7b7d144fb8fcbfc47622033c11c448b51e82554544c0c5f7f3f88bb64887c1011b521a1af54aa7a5c2b2ddd110ccc4210203010001
0.0.310x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100d3b3875603457158619d07ec7da1cede8612a947ff685a4bc30c4650406dae14a51d7ec185bdd456d08a1ee7556ec4880acaa6b64e74182e1e495231060b7c7034515928153cccb0091f7c9d87c89fff64928b1442d2ef056d475a9f03231224494a6e86631b83c2942045ede4e18c3b1f272e79d8a33f0c4e8f4a7d6533e7bb68a4a7bd769fbf3b34f3e67118ab9573b71942c339179f01340f8fd712ff451f99c502a7d8c0e79591be480c757ee8229752354ab137c84461a0bce36e063743041d025e5c8cb5ad1d77b7c5a337bda0a91e4722c3d765ef77554f1b4f3ad2c099b887505f12c9990ebad37c7892e0893060cc351816f22d3341f677d1eb626427a7c0a3b2176f761fd118328ff97259bd696cbffaf31c75bb3aa7be2ab396402c65283d52e5a5193073746fe8ed2797d13a91df6303f36e2c3d7a2ede83e9d85ed6684b651c21b879f9c2c21d167d8f452e85fd5009ec18821ec9c829113ea7d27a9465a93caf9e8f1d02aab36cfcabde6b08ab80be85f58e8be9b0a4a2d12d0203010001
0.0.320x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100b23830ef3a5caea963624b5da98250014490e417832a7c21e6501a25b41b9e4ddaca6e9d3f606cfa4d940f50349a5bb5157d50d345fad2a635110a39e1f1f658ec4edc74dd110605b67b2abfe3a1240fe18ef04c206d6a44e1d6f69511f6d7c740af450f71b72c04b3df75dcb7273c345fe5c4383a819bfe81a81fc9c8af80839e8fbf534c39c7910297c35adf5b2a09c27e8eb88d6d044f2c8d55333a825830987d26e47c5bf49cf31da5b6ec471639f7a5e0a6cb79b2238afb65721ff63c3705d13e6a8a0222682bd7d5753e230981879196bae35543dfc815c7ec9bf261d75964c8faeadf0411e8a2a46c6dd6791b05bc39f46037a9a5d129d0e3c230f743a31082b94e16beb1c0267f12e0bca1d751b156c386817647b837fdc64a1da18f9b9b5471a95639f4344c01140adbdf249e31834c5f4a4bde3fcacb62950da6d517f6187affdc81596fe0d403b32f5af9dec5e7abcf287fda6eb3c1ef1f9972de998bfc43d2f26ff120b9efe5f44e69ecfd12ff0b4c22a99ae8a4c3169d51dac30203010001
0.0.330x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100bdc944b38678640be61e1ee8500b07447d12dc7b16c57bcba63bc14ff88e47d369887e07949973135c8d8c5b65155aa0d080e829c3f21a07c2746e38163ef8c6b71431810cb28eaa8d75db84055acf9b56c96c8b47c5162c6aa68af9e1db683d4637389d9c88580d8673c8f9305b67d2b65eb1a5bd11e57b930e9e4f25e5fc417cbda34d321d2f6da7f9097e2e9e3db84145e08c6825cc13c585d6946620c5f3ae54a5eb96fab0238156b158c2a61d451180a748efcb47d0f222d7c895c375eb3cecaeb11e49fe37819b99fe6753b4cd81899508e80fe10ff5454b1f3dd8d7b6a03c22e6d304a8b43fe03cc88b7a86249eed43b6288eb3b95e1811f405cb39c8c33c208ed68eb9a50397302130ca3975eed99767bf9db6d76029624c3e104b65fdb72733e29468e329d70cb1b2561bac46d2deba90539cf84b6baab175064d06c70b997b1105609f08a332163e6199a7b042043b6d834b1d0fff48d87c69170aab18d8d564527f5cb6865a68ac5a5c6310d7e1ff07d7dcc439f895c5ffaddcbd0203010001
0.0.340x308201a2300d06092a864886f70d01010105000382018f003082018a02820181008bf8375e6e9747e5b6946b74e1b9a7b2d4f466ee8555f8cc8bc9c3fb3e91cb3484188d2bf42e303a072440cd48307309aa0f20d512f09595e36161470c2db1389f31cf473ce32d090c6de745d9d91d7034b4554fcb66d9aee0327c99c021448835c523be81deb33561ae6dc0fbc7a9b5417c398d8f0a516d51893d6bd9b2d46b4df745e7f8d044b05bf54a69e52a6fae12d6d1e69290ba6da0725ce14c845c69e67c12f2618b64b4dca244c04f7a28d23a9e34266e2ca371232d610d0bc3bba389dde98f107b57d181c2fd98e64c71d3e69836920ac5b14c7835b37e377f11f1b29362f1527a715aa9016169cdcd92e1761ed0ca5c832465e43de193bf3b364f35dfd23be716a1b8a266ff54440532bf08823f9995a315daabc5afb084e9dae352c703e50affaa7e3f4e26051351273bc5f0c131f40cf1c57a385e95d265c7e4e9ca7ae6318c8c07fb1562851e6a4f90b0bcc9258ae6c967034e4ffa2d1d8ff49b12f117f5d1bc1630e64b19aa277dbe402a8897e44c98b11dcf143ab82540c50203010001
0.0.350x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100dab44c8f86d3fd5c98914f3450f848892235be81919fc4dea32cb3c74eabf16a9c17b3977a6a6f7577bed1f752b9e67e126f07f52390c8f29c2ed01436e8adc45d5a18339c59fb64ef7eee59b146125a8519250fc7697d97129807357c0469973ec20f1111be0e6ccaf58a1b60e63e0563c26a10b300a119a6290c178d371fb07a5d35a7cbb37cf8414b59ce3f461d04a82d0bb22526c77303e8b3305ccf80d2a5572e26826069ed15d5eb7e4ce968f3011331c55c4a60b59737dec9c6fd93bd6f4caa6c1d7041de66ef7f5f0ab77dbf1008bf38e776e869f4861ad821400ddf1821c9efa47d5305af6be6c91cc0352b9388fa02d6fc749fddcd5cda0dcf3722d9fb88b5330e903e349acee505bc47590fd7084bd6cb07a77e9efffdf5d1c3781e9d984f8b2462985f7418449456d727bf7a58532257ec0b5764d8f875ca26fd2d2403e7776d4c8d7086537337a27b480d4d1926e39339be229a9b96dd044b9e5c8b44c9fb00847c2d7f66b73b2d52a89e4d8457ca34286221e869649d8505ad0203010001
0.0.360x308201a2300d06092a864886f70d01010105000382018f003082018a02820181009383257eb68ac25c8ae76f77e545a995684f0a2496e24da29f5463c5a2e9562dd8b5626fe38566ff91fa7ee311400f6b48e3e24943fdacb49c3318d6ff453e9bb89d591c5a92ae6fb99ce647b8bf4c4ec9532fbf505f0dcbc8962af1d39f9c757ddedbb062a086ebfcf8cb65d2176d5da74245d622cb46596aafd4b21da4e08495c6274b2c5871097c0d9606e3d5c969edee0e2c24f03c2233db90db1d79d2e76fb89376853059de2a8c7b30c00c49e6a034b77edbe94291385f7181d13ef2e6eea6029210abb20838626e0b50029bbb7837af32c588677068193d16609a57c964e488657a2ed1abfa75158877c2a65e3beb03ef5b1290f2a0161bf9830c14a095deb73ad062f33461feceb046eac1a0dd36c98268b3306af9da66f8fba97bd8b49be0065dfedd3ada7a8aaedf9d91c5553527662164fc6ec59455f65e199e574bd485098b962afd767766241c3d5aea1f545d51651848d4be1832ada53d93efea3a26ba4a9a94159f8f7f1c3fc4cfe4b9dd846dd6bce976fc73084cb8cea0330203010001
0.0.370x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100d72352b64575e687a590f82d4b8c3486d683fa966ae5f6a2338d98434b62c27ac7a9226f41ac78831054c0d4b2bd0df52948c9ebb837f9ae1b8502a026e549cd29526e5dee55ff86280ff11a8bb5c17627ed58d260ef98b544e2655e97e606a2397d1c4322e509854cdb8347d228a273cfec3a92ac1b906ee529a4ad06cc1c2dc85dca4af470e657c95c33ffd158cc6b3e8133b488102c9afbbea53ba2718136007f0fc58faf5ca7383026084a90c48262c25bacf156c445b430dba961df4ef4721ad53aebf7350a2b442c5ba10c216cce9556e5c11db2fd2152fcf9b829f10e21017eca0c13601e008270fad982e4323d4c1c98aa8a9daa6f40a7728d92c3b80e77140b1808dc73a3fce49274c2580d74a82a3b7e5b0fef2d8e18aa4e30e8658bc3ab626dee995aa2e8ea512793423fa5574bc23d1a256402d21f1a49c0fbfc89fac68e913a32724821e15d63e0b3da89b9f3c13bf1728f2675bc0c6c7c0edf3cb3015ab0f6583c61aa59f1688c9e02e4853c66cb7d46e3c50f92a9f945e3cb0203010001
0.0.380x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100d0a7db4f00138a9ad5cab9df36cc772265a8e16d4a80baf4c4950ebb68aa84e72bbc07a77ed0a054d66e8189f0f6865503f4ddc2c84685595eb19a91598ffc9636ac0bc73f5d645c54de10241e64a8390757c55e9a35d551748950b44e6159cf903175d1cc5bcf9c0b025581b004cd1a28a0184af4864f008ea2af13641dd56f3e69ef8e5579e0f7635fe18e83acddf6f146ecacf1a11f761754a4063da3e56735034f33298c90b2abcace483f585006e7b87fccb98f6556d5b70502964b53dbff9a5737fef2b7e032df9cc614f422d239a78a95ae0690556f3545ce8e54562a3869a4dd556de885aaacfc82562c8edb14f74cffca2d1df8a51b3aa524518ea9c90ec8c4a0fc69cfad94247035b65fe22290a9baa131ba4ea3847b5e2d4802cb4e9a2683d0daec11d022fbe8005946821f9fd783f0cc203ffc17f7ebcf7dc7a6b89bd01ff6bc512063724a95980ad17223fcd65515aaf3694932c19efd568a32da66146e994b534f24793e1506475e2490cb67d5ee8cf01f0b4ab7923fd80fab0203010001
+
Node Account IDPublic Key
0.0.30x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100b8f44cd507abbf5ca06d4acd531821e782dc8e51f977758062bae02bbd13e7cb60396d6792bf8a43f1116495e66aebd93d7938c7b133fdfe3ffe0e0cd19a7a6f33e35c389b4781fc78dac41c3a300fa547c4b4b7c73c8479f9b20da76d4ff9331af037941c63b01bca0a0bfa32a08d9ecd26090bbd4b67fa4c98d2c2dd5cf0a981a9d6ea1bf9b4a9f7af3aeb4916e165e024f08fe11111e2ab86f044b508f793f3ce742ff8cff470afaba11a66de82184461138c7c1688ab3d1e9084a3c8a529942ff716440bd91404b0c6ba86ad6c8ad7f8eb1549a29184ca3302ccd22af815d862fe99994fe3fda4faf67b78a5413408e72de6dd4964a4bb2f25a3f5f870775a9ccc8dd16c02f74f67cde449076920fdd3ce83a3cde1917312f9978c583e3969d580d178f3db518073d535e0c605f85d366a789959c999c94c7d3a44888f084c12e942e7453bfa5a13b33c16a32c2bbb197a1d1217dea5b68b0e16d1d0ad8c0923af801e82eb022c8dc683cd0d2c44d536953e2e15709caca58c416996d5070203010001
0.0.40x308201a2300d06092a864886f70d01010105000382018f003082018a02820181009131aa368f9345229f97b6259cccaffea23e00cd5ead02e3f696c1e714ee3939dad860e38bf95a2974f9eb48e9343f8aac405ea955d05323e117b3b1c94813a3af42fe8082c3d43baf1bd4d8367e93db00ad696e627a1036ae534f011ead5e56f37a6ffe44b6b9e099401192ad560a0346b41a810095f5f2d7fd32d6eeb655ba758c6b526c129386af7197c7a53ae603d622832254961f16d0efa8079a768561888be733492217956bbcafaebb6135c5fbb2484d5b4a5fdf0336ac02e26c1652c1bd8eaf30dae1d6d3eb00f7b4fab8d6478fe8d95eb911df966a0dea4e522db76b8966570ecc5af09516424f0af5f8ee66e386d5650713997169ac37573bf52fd058de95ab2ff68e68111ab23405ea964b2bb88d02c0f1caed71ecdd4e4e408594876fdb8500bc55c7ba02066e05ab98d9f7e0466d9702eb57ee3722f8fcc85a75505ff3262170288b788723adb97e4de5620cc90ead1382fcd7571889fefb11e6771bc3f6f3feb19c7ac542878d03a90270526c3eed2494eff54e153ca9f6890203010001
0.0.60x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100900452b7e82812fa0c481495a96e2b02f9e5b176c9df4678f7157e84f9817514cc6e87df2ddf31c9b4cfcb12b5f857f372451282b3cd66f8ebce4af15d595c6beb70661320adb8b07e2d523c2587b709796b4a660c821d199f57dd18d6671c02a3051a730c7445fc4497ff941bec4e5084f2f591ae265d48dd9d6de474666bd7bbc53eae878735b32604644bf23dad5ee1d6a14bb366c1664d700c4db649970434e81321f977ae442b7a541fd55fc9e03342ef4e116d587496a22920d1d0d9de76320d46459ffeb104264eec5d6b1cac5cdb6de3972b28d87e8c71ef1845511555d8bec88e2d6b0df70c18b611d8539427b6488b34fffe9e6759f654d6968a094346bd9e8ab051f8b9385903874e373a21a2cfcb0b224645140471fc8ddee0015fa88f9a7864d0ee913684f6afb361e06b4cacc845c9c0f6d91ff480f08cec4027c9736d1263ccc8156f4723dbd2186cba515873442f211eb160db9f6bc724c20e6c473ad91e9e70b4fadffed33d5d90eb326b1c404a230595401439584ed2d50203010001
0.0.70x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100c321bcc49c90a52b67b8c0b817caa3f11e989845236548d8adf341b4132ce171a7a440c889330445058e809d9a90450ed748d0ce51fa726481a5b91c26f4b14f56052471388dd18e8fe95bf1e4ead9293cfe2ab893f25e666aca92379593ece2d137b55754c6791f649df8e2538e1b6116c32dac05eb62b17a7727d8a6fdfea712d7c1ea39778ab863fc5b06ed2c0db18cedbe395c9c4b2d82816a1810393f7e3b34c085fd337dc22666e8cf3958756708403122f10e6e71b830617785e07732ae97cef1f489fe718d07e929f5971d9ee660b3ca70099f6d86b0514078e5b04434f62c0a5d42e77334830523e11788acfcd894f9c2f75709edf7a53504359724e4884d0ee48a8033eab8e8f268c3451edba200b76c65ffb3c3309e522ee7a01a5af59a1f8f0a8dc9551c2e51ef3292e57a10f27e05fd5dc19c0f4950b36bd8cb56e0085b75facd27aba5b80a6f65de802e05b18dd198d068403483acddbca9ee915d93e08f9eaa8989ba920e0e251b2ccda428da1d725565d74533f96771d64d0203010001
0.0.80x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100a1c4077154303cc72c4fb7692c3f94251bdec1239a1f7a8972abe91a35323fbeca625a7ffae6406c855dc2af2110900b0df0e6e6db76364dfa1ffe85eda567936e2985b85634a32aa52a6599dd6c30be1f7a6c5b8f5eecaf2621d8a459682fcd2dbaad1561d11f33fccb7f5500ac568d165dbeaace3286d2894f64129d781d6c72fd7d599c9e1d3af4aa433c23b910fae4c4841641f61526ad787ebea539874167e9d3a73cc0fb156429d15ec763a6d0f06115a79b9af783d77b98d83096aa4743f97408d9e14bcf4ddffe4591768847b40cb8da7ca375256d2b935d095fe252fae81ff6e37f84d7a90d7e570a4f8ef3c7d766eeda472f0920199015a8908259a873c5454fcbbdcad2e528de85455b4083c7dc4adc5a988e0cddfdc159d5d712abd544aa73ec029089814c98a44f26fc0644659c183e3184aa272f8d1dc0bfa3e0a560484cb055ba4dbb5cc339ec80bd11d642dc3a702e8c703ab2193084d9bd63f0dfe12a433c2576eaf781cfad867ef70bda61768b2bef14f50c6c3b8b096f0203010001
0.0.90x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100c48ce608205097e1cf8a77bdd8b87172211fd36ae0b629c6c0b4e2cc0914eaf689f60ff91e7bf5740c0dd4b5a7b64d61650ddcab16d5b342715135cf8c6a67d95b662acf4faaf170c1d2aff40747d07b8d77fb2097977b0d3fbe779d7f3632151d12b84271f10d61797082389156ebed2127ca4ca246a7afd64f52ce70365defe737fb8e6fa35ad47ed04022c57d1b1646ab76fd62a40c4a116972748d5f9f72bd71ecd4bebf55c1c795fe1b9748b34d1ccec17b3a269e719655073d4dcea080a490988596b1dbe1527598e029fca330c658a8b7357ed15454073f92db258099c9856bfd367b46ea0b28f57b24d1d9e3ef678ad0a57063ab5c1f1f6ccf257c097421468a8c2752bf00baf29f5596c6f01b68667b58439c440f4250ab7902f20417f723a35b3d5d3625bc4fb34098dd2766dbcd170413cbfa75b008663c2bcfd752e81b5deafddc7f41354250af3fe85c50a591fd92fac9be12aa7c9fc9678b1be302ebad8ee4f6510022b7173668fcb9a23b5fab743a19c3a8bfec0dccf5003d0203010001
0.0.100x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100c57edb9ff276e023b28021cb1d87cdf1966b698cf48e4eaaa7c692077ceee8ccb239a4c921597e8e89f7cc05d3f3131578976c4e314405d4a4e03a72410c5c09ca527ad5a85b998637e72a32e1fbc0d5546b2465e9e806c2dd509eb050ab5fb27063fd92815b1dd2689e2111caeb6f549e94a9f00f0821d4ca6c6a6117f5a533c9263bf074a30d5cbef50d1c8c2387bca972ededa0983b5d0a6b57dcb0020006828b40e4076b4870b24bad84056ee52b5f422e8840028c25006382d8e9c661225f4f76ea72e340607e9fc6f3c20433076a1ca8cb15ed03ac8966d0507bcde681e4e0231ee9f87d111e7b48ac8f94d2d842b52df73f573cc5414964797c626968ffae7418f3b6109b5a0f09e3223f4a4d5e3509dd250138f6bc17bf6cece17594430df180a38e90adf2affbfad0c6b8c1b87f178a061dcfbff8b92c9166d874c1ff5af4fbcdbfe8e9d099370ddf60be747633d36ee4eb5cd51f6e3c339e151e41bdb5a5ce2c8c97a0a43b3cd4cc081884c879f9d2f3748428c8573f17c90f3cbd0203010001
0.0.120x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100d1f4bcd5a8bb6bbc8708d41ac83f798a4af4f51b0e2788e46e89de5d1653fbfc6520e16026d6dfffda96a697b0710e737a358f4777f596ec12c96b0e5982ba1ee5d3176d71317a57834c502958fd25fa53c5202f87462ab7b69d7b5ba93d07d3f2bd10012736d188348617b3746c2c47014a18dc9551d1d39da2a80387a774df4c0cf1ef6a4a3a9ff5b186e9f167fa23c44118872c98efef70bb79ef46b3a739ad5766f2f7e533a3fc4d94d22f22585aafdecb2073b7b530e7c6eff16941414d96fb382d2b71d19ad5c140acd967625bcdb7ab4af3190c33e942b4e0ebd04b47c53af6e04e76033116b50ed633b77fa402c6a6ed59f0343554a045ea04565e53253f9384b5232e6e41e27d935d93a56ee227380513cd29182846a27fe0613353d53278c4eb6951fb65bcfa748be78eda736118386ff6da3f04d4045afcb2ced9c7d0684e64aab44da696d9b2ac1f0619c9f0bedad2262fa58b03337a1bb6904ead9b50f209a50eb466d17f540bdb26d6c8740c18062f5f30a9b2fa97d48272170203010001
0.0.130x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100b474b6f61666f334c5eefdcb0ad8ca7fab9fea93ece57266c2dd15f8185b5a6f2bb61127ab5a06d76c5ce4cdfd3b424523030d4733a18cdfacfa6f4059574723deb09c31240a2183f09b20c506afeca6cf12bb468219e67230af9b75f0ff26bdab8c1df03880f91c9df7e0cb70ef66c071c6c5f7a7f495ca56fb3fb9ec6cc1b7336eb1bb831588c1fabcd0157d687f06372424e7b9b6378e57cdb70aad710e076816d6a931061144dec50976a1b81a9a7acb294a6bdb3f469fadb742f4a60fd9569b9867825ba78a8fbd1ba62fc815323a0fb209c2cfb7b8afd746ee487f0efccab8119bf279129f119008d122d7ed94311b57e10bd226bc22c64289c984242f46ba900b0405d548d0c6617a6580dac1400e7fcec3c47d1c1a181856633aa5ecaef43a35de520d7c6683e61427e3a4f6748a78f12d1b821431955b6a731662e6c9ced98b62c0ae595950aa45adcf979f99c968801f54020aa5b3e2074431aef2179a8fcb7578aba5570c3841ef69b1ee7af4d54c26e195f9fa79fc68e55286250203010001
0.0.140x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100bdd1fa36dca8eda4d53111f5ff7588439eecaa0fb0ff589625e21e5e1ec7f6eb9b10b842e058f7b6200c5ed98fa511c8ee75df16cc22b6d4d6c17f05b429fea572bf2e40652cb3bba7c7cd40ca1865cbf686a91376e74a52e3d7189e5967f01c1c342fd1587d601921822e0c7b258caa812592ebe89002fa481ef3e28bb392b38380ec0eeb5454dcc76ecd3eb62125f0848c13d162a48dfe4e9b0a7e7de02375686945fc4493437a9ab20cead33b1ca441c8cea7ba2f513c70dc7e01290d7873826a044d031e7ebefcfe04995b98fe2271a596bfdb87fe56791617e5aa869d22176a5aa783051b5ab641d6f358e0d4b6c98f4052ce6282f225591ef7dd1132d6e7c88cda81f49c9699b84a336ee7ee77fee3907d41a4d7b82e6094dc0cc6c1f7f0c183f502d7389f21be71e278646e77fcec4e62d39369fa8887af5acbdb009abe9df78b3b40744247a8b8f341e323e2d4022a15760edb3b121254fb3176c6e5992fbb15e58bcc71a1d67b103b3adcbdfe24a40f124933c9c4094708dafaaa8f0203010001
0.0.150x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100a8201a6e1ebd55747695ea77179da3694c4e28090b807dd51c1a86a0eaaeccb7fc6977e57b5a07a56c3bc02d304f48458926185cb18d005577657f1b61e040d2d345abc6ec381c77464aa87a0f44c437096755ec1880b4da201ebc7ad9b0ea44e2080d57c1d3bcdfe94348cc8e5c245a7699d57a3a18c2a1f529ba3d34716e299957bfd80bd8d014ca5b79f4720320b6bff944826f9ea646d35403981f2bd40ecde727171e86c04475406f87b52d8a64dfbb40646a8d65f5d343776d3874fa43db2e7b54d3d7aed0b89a43d6204ed9100e7a2b6173d30a1b82f2f2648a2a3431f25a813f3f01838b716ba4a8d9d6dc408ecba390e8f4acbab56a72a2691b730495adbc63d74fa8f5c01460077947939c5e2036d746c54fcf347b90ebbdc81c0526affcf88a91ddb0d1a68db7de8a634a831e1e580d960ab1ae2be55d9860f1cdc65cf576fef4c1bfecb4fd03a0e4d00d62a55a6e6e165e93d97c55d078c1af84dcf77e1ef3f0c34419366da78e5b7f36132a1134ee56824731b5e127818e15370203010001
0.0.170x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100aa1eca514bdc4a9044f200dd8bb20065310773741dd8da42e0e4c1593d98b0e232d04c9dc7c512f4d7658cb297c186b1d41b77fd78fd3c36da9652af245e03f6e0c1f4e6f80d51a530dec2cf73840ce3b323af627194540c2dbb0f60803e9fefbede949016683969ce7818f08e62744453c2938d42b7a1e87b919e289064381aa9f76d629e08a1866b0b6ecf71599e1c18587cdaff58801536eb9371c5ccb142523cfd78022e4b01ba55e30d0450872d7a485d1cc902414eecf691e153f3126ea20f019b3d72d64987fd6955cd50320a05b01cc9b4f7dfb8619cf4f8a7ab5785c050fa7c8f87cba9e839ce1d6665a10890f93e8fe4762f578b30469ce1f21fa33118b5753e454bbf0c1d28bb3e26162a7219f6b6af150d7889149a0f8f767a043d37d2e7b1d4403709a96683c88e714d2ee705c6d2889b8b944af6ab51cbf4be5f9e83f2a22f4b74bafed82d7878cae8d8e40338b7b54ee80b0517534b2ae098f3cf3e00371a41e8d0e57e784fffe4a62e8feea9db55f0907be3d5bed53994550203010001
0.0.180x308201a2300d06092a864886f70d01010105000382018f003082018a02820181009da3ac1deb4c13b0ee06ff4bec73f391a325046c24b14e1212f60c813c6efbda6ebebe458b8058e433cba237244dd590964c3a6822fd27cc3a1985114cbf7f68e075c2a638dc1e6cacebc0f2417aad78d629b125875c49b7acfcafc97d6af8b02d26ded5fddf8bb29e8ea4ddc135d28761e89e3f4fae8d9441363f71b9306f07080236d352c10b9b7f0a0758c769bd1efbb68481e88a088bcc743f8b348454a74653796a3067bf479729f31360711394b07d6bba20ca02de4fa08e0e5ae9ce54936f0f2f8f7a99cec472b105fed0f67d7f3d0b9c47c837751c778eda1876e93eb11a8634dcdac75840f80b527e8ea3aac0fa17963379d142120430e6e9f926e98dbfb3646a7c96728d8d19fb8daf0dc6a5ae743593cb4ef63d97c699c422e3cbf276f4aa2725ec0b410b62b1307ffde054d16438b0cdac087b2f41a12c0b13fe0d2746e696001759ccdcc7664b81ece215b214e71f5142664d2da293f7c4d471cd8d4a3ffa55e11626af3aaf0825d4331a45975011aa9f3f9141748908ea48ab0203010001
0.0.190x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100df7975dd74619ba26d1923cb878547834abb8acaaffee1bf75116d64d0ba95915cb8c8a39fc764d8292048e5d7a7fa42e3faae1a8a4e49d8acf3a5a094ea0179041598b3d705db036dc1e1eb9b15600337fc546932c53aafcd7c9d051cf7cb3e4c6b9fc1805dd287b39019bc5e3cf2ad7a3ca6d2af0c44da7a517aff5328272944c5e20b964a50e26e4ecb4595e37229fb4084049d2bcf8492c92b54a827e959ba3640b60a6cc9fd30cd07762d21068aeb4bd48136116211474d2ad41302514a3614a2951580d0eef475207573d579b190a38fb38bb78f755c4285b9b6cab65b851619af51e63d917d97b51ca49f30b6ef41cd38c7d2c0186fe08a9dd72a8e8d58b0eec96899244ddcd934600026f5ae877dffb2372cfe183109225140ce983f08ce0c615c451b845a48cd16e66af452ba26d573b850c2b359189472b20d13eaae11ba08d83c4134ffee842d3bde2894d7326df12f3b9627ed492425e33d7d46d347b71628f61892629b78b91d22fd8df37f74f53989e3de43d0c1de89da2f850203010001
0.0.200x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100dc4b5ce5f6892b84720ec5efc3581b0dc4909a401dbee30f294e5a5eced632196dec984f99e54ceb8037178d266352da9cdee8b8e0d5a856fb8f2d6682e6a8e9e4b61ea3ebe8b76a3ca6a86db4fdd1700d0119c287858cb4b1455546a9b58b8478ed964e9239aa5b446a66bc12f2b9f531c09973c9c79bb956006a6bc57c22a042b74c3720382480c35a7acaab9ce0c8f21d5286cf153f4f9e4cff5cbb64bc0639e3108d812fcc321f7db64ccbbd619b4790d443a67982ffd57786f596fbf63a740ccdc77f33507c55ee2cb9a9bbd4144a39b8e76f542f05279ab34dc0bf8a2870706c226c2e71ded60fb7aca4b3432ea58ac4a8492c5b663f623e57f138656cd5f08c1a91d8279d5c0fb0f181bda55e7e0deba709b2effe247d897148529499824b230fc308e8515782907ad3850d3465fadfa1a5ce2bbd9206771093b89f141adf5d2e819e1fa9948dc66555811092f8d213a71bd44aef8be872c7a0f1ffb6a64c8fcc775f3162e72b723c09a758525d91c7bbbf1be4f082630f75374ff4770203010001
0.0.210x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100ed31947fd677a39fa14b9181df8b519cf0e710ccfc96d57e9b6e50c7332a53368cd25b2166fd628fc1a3718dce8564de7214b679b81cdee0bb69e4d474b55cf71b29a48949e9b8d2f9034a2a6c7d8286852d827ff18fd7bb0cbfbad8a78a7576fe65deb269a1f13c6bc3fd086dcf1ac9afbd2a62620e7dfe549c0d066339b9a7cc95d914cfa71abf05575724694b472ce8a69a1235cc47eb9bdaad661c934920ab8a62231ccfbc310c8aa169aad71518e379bb8b21dac074508a691355237545bce2a578caa18cab5bd6e7c160fc216f173d37d425052246fbb946b3558f0345491269b8f4b21d4c580969928b2a6e1b8fd486ad6973e88c5956fe36d5c78a0bef66a2dbc10825a27cdfd379ff515530ad07c3fa65f081bf633ae58c74a30d0d5b3abb93d72a62ac41b25bd84e475624fa7c1175ac1abf733dcacc8f8dd1a8f26c88b3540ed0da524974570754297b66ba3bfcfbeac7a782523e23d9e8c900af599b1ae111ecbbd1163b71101e9bd3dc36ba552cec47d4e05c41d1cba2b3da4f0203010001
0.0.220x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100cdd33b2cfc5d25c13714f196429547abf166f3e3093d9cc429642ae26cf79ce668784ef550a035857d5fef1ea5e8aee09d4ac841d5df0a37f67acf56ac35e39eb7ec068b161b141949fe144a7b0666acaefbcbe945566a75841fc742ee84480768ecd0a5cdb3d088c4900caae861adb8f46d4b25d49b59b5771126d08e9f1bfda5e4dab8a9904ba9bf14d201f466ebba389a850c2a03ef61cc4d3cf19bf5d4758406565af8aad7ae3e3068aa9c1a82c668df8cdc459a5332cd25f81a94c5b9f5229deb1941ae9a4afc02cf85bd6d813bf8b12e44ee4522037207e73b1104b9c50fb366b55fcddb10db5a3077e1d3966df87ee4816c47d89c46c63f2accaebaba0f2f7a8c00bf6291509f2bc762a2e40443a3432290b0b815664c8ed4ae9deee976de5f1c91ace6883dedef254673a9573356e5b324a5b5c624e80dfc631b99fcf24f5c3653a8ce21b8b7552bec893f7a30f881a9832b6aec52a9391d1378d6a990550db350d00961070b8da21bbee8ab31634701a37fe8004870b463f6bbb9bd0203010001
0.0.230x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100b476a6d425ebee039bff79bf49630ed49bc8f643500d32038260bd87e04a7dc7d63c48b4e8bdbbc4844c8358d9f08b4175122b4583025ac8e48311a95856cfe059a24639542af67226a8b9e78884b94bf1b6964e8f2e23343d48e8fda3f4987167760ff2b454a9d40864320ab2a3ebeec7674a3c2b86bf57d8550e218de353a73bfb820c6a4cd4ad66fb7d0b14f07f437de9a50b923def028e01a2bc2b38aca43697aa288bb50c3301d0acc919fd35a551d4d9ecd9b0f80744b53fecf95f605079dd396781c9b3d193086cd1773c238f76e137e8171fbeb351b98e6133a443c5ece721d9b59cccc24ce984ef49b5b1604cd8195929b1025304e97ab8424f975b082ab427a8350d4df5e548f1e0d300f2e400fd4c414e3cc12c8ea1d69c1cde46fff2fbfc11b7de01d6538b8d2c765c4cbdd194d27d92474d16e182dc57b3bc844458d3b38d2b9c349e4587fb366ab4c40ba51352cdeb5d9fd01bf6ba9f93cb563ad86dabfeaeb411ad69c58bbd40340afcd9e2dbcde9a9b9b409743ae2402a250203010001
0.0.240x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100c969da83f5eb8824c8860dc6868f40a0293f0803567a6e5736e04bbea97c976c331a479645dd60de418f1e6a57663a4bc1a7afc378d4d1d6bd1bcfe8ed1d9bd2b7e43e1f027683dbbe2169768f1e18c6373c1f861cb67422a263cdb965313c55bf59b4ce5719ce58ee0ca65420cc62a50f073c8a9106777989887740d9f1bfadae7769e490fe6eb869459144d73d4246e8893a1390f07a1fb0655ae25d8617e0c77023c7e7eab395a47b892e067addd2937ca5be77a6081e79704c7a9c36a597aca79503059e4af463b3e7dfe4c92a354d0d51b5408087e86362ba5ee69dd812b51821d8bb69674ddd4a0cf80ae8abf6d3629b874dd14b5d7e7a1dda25112d07f4680c4dbb5ae9202a4f06a741a0ded6f5341ee546f724a50a68a6e0a87c36d47896d41d0cf17a2743e98b4290cb4d7df445a9e68284118ede4757f6c1b241c3ee8a39a774ae473bd66d05e8260dfec1a3dda37623a8ba407289ed2e62ce25955353659cde55fd0ae8bccfaeb2e5b586a82d5d9e81285e12fe53fa2bcf22dc530203010001
0.0.250x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100ddffb02738b223e1a5933d254ad4d98bbebb4ea67029b531d82e7c417fc72059de179b4b028039d44bed655ec77736880a2450b346d74caf0d3dcd797f47b7cf251285c2954c5b52bb77cc8d41b66616b3c85bcf80684c07ba60a595ef5c59a9d80bf0bb7b63f21611bea9ce0c9414b8b289d1c969898b2dfb2dd7820b22d6c705f41ee6ee32acafcac5c21e68307445a442c6a7aebf3d2f7959f9a158611a44bc5a405bd74d5097f012873090d9071305019aa03336e201021ad169dd9fbf2441eaf8561116e32466bbfac4c06fccaa56926951f8a5f51de4ac01b46c8372f6aaca0d4664e9d9d9f652b0571a60829969f8b4d6346183dad8e9e92981cc0f73b6fe9c919ebd2737c2909bf674b0f0bad5bbd297254419a4b20ff5f11b47e36c5a6864116d1a64f82cf67b1c108b379ceb4e423758a0f846de0071722a747093f331443c97f7c0094949c634ddbae2a4ebe09086581b665a009aa41def5200fb81e52cd3f13f2faced75be38b314402c4443aff216d1fa3d1724cdb54109e5170203010001
0.0.270x308201a2300d06092a864886f70d01010105000382018f003082018a02820181009a3b21661868facf1cd8583fbe321acb38f21b6a75cc3c13d7134cc11c7835a64eda74edafc3f450165e3c2c71d21a8bd3ba00a1c782ba7598970ea2efdbb4a5862ae539a2f55a417ad717a299e0e22add863b625bd1fa2d71a7421134019f738247147443e2128d4c62298529d46bacbae84aeb5cd3f43c5ed8ab500fa7246fa32daf17a8d7098a5c8061bc1081f498bb1f51f73431876ad02f9f392570b86b53bc5c5d3f07c56b34349db2ca2879f98bfc9216f1f56987f74d9f68ecc91da8c8d05fa3b811cce361c2d1d5f557c2ad2d14b35f27137f2bf39c527b82e537edb16378e360e72586ca17d6011bde1cb21641f894849ffd42d6968b4916d94764339b3934671ce3481666b7e7d971e97348c87c19258a7fa6d09ea34d30ba1b4ec5cb0bd5cd9116be8cf0d7ab4bdb342689ccbd370b84ff378a7467902578028c0c8c7b412a0863f9e94bc5b1db4d9e49a6d54de4e04898eb62d0013b201fbd947204e7cccdfda043aaa2c904b2a642829f8a34ffce13fa213cdbb332a3a758f90203010001
0.0.280x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100b3cde7b4066b6c3c24e87549d7b91845864f1aa7fa1f8a576d4af30854b6ae93d3c8369028a353a78be92f1552f59d15bd7b90025465d6a85136688f0415e0f6d89d6f1a92046548ea3ce77ee757c3bb06efcaa99f9c6226f195388b427673dac4a9a54965c2fea7aa5320cb31cedf2b26189cf31acdfd0a3b01f9c48ca99861ce9e51bd397a995b43f24673af4545e8bf4dbc94369cd7f6e4bc9b3d64ec3038d53e78ac0bb0dfb0df308eb37c90e2a9bfd5df7ba07a785a114029184891843bbd87573df0a2b53399043bc297af817de58b6fe2282d7df8433294967932da599a1606c83131e5da0850c8ba36453faf2b69bb91daa8b3ada0a6502fba4b5dd74b6d00de6fc935ec332bb511814abb2f6a0ebcd679da33ecc54712143a8aeae8900298ce0943305084e98a9079d2d89fc607826738eb803ed108678bb827c17f6576842c818640724da47a6bde98d673645cfa8a9158b661ac2c818f0483c29a6f87f77f67f768ce26024f74eb1249e51ab7fd0f01100a58f1a5a08233c46dcb0203010001
0.0.290x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100f31ef425ec23762b217598676b9022d70f7f5e338e23d6362e60809d0a5a10b218ec632be7b0599c7bc840e38b736816f0e6b7f0f1ef5ee074f4638ef60e8073e90923e617b96cad84c1ec98a3f0df75658bc4d584180e490965addbdd766b6e8f8177e15a16dc1bb9f88ceb7817407b8039521cbe120d45b4a5321cb7eed57901c91e801ebbc15f16c621bb31253d0412186b2a22ea87894066197aa918e860d48b3a9f93f775b06b451fa10f3bf3dca917b8f724d4978022b273dc17452fe4a040796890f438b60a7b61f388796899b8c0722fec2dc9aa1b4ffb55584bf1336e61a3dc18d4894f23d6676f459761379a5a18fb16aa6d94bad487bdc96eec0030bd82ec7c06a7f11d6b40fe367167f7c648ab83b25cc67489bceec5af0c305148b0a231344102d93a535c093f3c7ef97028401e2b47f3f32bd76a6dc5d3cf19a69c32f7cc41e37379ff1c926c01131e5bd8b73b7632a182827c9df2ea3b8dbffcff46528d50c467ef7b934715620b6ed7d21d4a033f47f42a6c46912763a71d0203010001
0.0.300x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100ba7269748681b6ef0a26f5ccce374a62144dd89ecd677f191526d75e081f957666f86b0c312da8689d866a5347329b07f986230731e26fa7b0c6865eec4e939a4f5f99cd149cfce843102cd538c096ec14c1a12ef47e7cb015d7cc41ac6bc4e3c6c6ea309308641f3e750e8eaac03ae77dd1914b48f2cf5ac1fc59b43236af6072709ac8e9fbc97479890be4f88e254df6eb96894a2d5deaef63cb7021205dd054b24f1227d15d840342315617c1ad1336a58cad2b4ed0e1efdb8f7fd342f5da56d4fe65226c8009d79892266edbc1b8e0db24fa15f4ece7902248fcbd33707d3e434a06564e343b03355f52619cac1e53472e7da2cae43debd5e60b1c20677a3547f2824fefab30644cb40614f8ca5a2203d55bea6f419a76a96e564f1db1a67187def7f58f67eb1db1bd91a19d2baa1a3dc06d04c76728910b1b3cbc3096825da019d0dd361871d3e7945d19a7904a7b7d144fb8fcbfc47622033c11c448b51e82554544c0c5f7f3f88bb64887c1011b521a1af54aa7a5c2b2ddd110ccc4210203010001
0.0.310x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100d3b3875603457158619d07ec7da1cede8612a947ff685a4bc30c4650406dae14a51d7ec185bdd456d08a1ee7556ec4880acaa6b64e74182e1e495231060b7c7034515928153cccb0091f7c9d87c89fff64928b1442d2ef056d475a9f03231224494a6e86631b83c2942045ede4e18c3b1f272e79d8a33f0c4e8f4a7d6533e7bb68a4a7bd769fbf3b34f3e67118ab9573b71942c339179f01340f8fd712ff451f99c502a7d8c0e79591be480c757ee8229752354ab137c84461a0bce36e063743041d025e5c8cb5ad1d77b7c5a337bda0a91e4722c3d765ef77554f1b4f3ad2c099b887505f12c9990ebad37c7892e0893060cc351816f22d3341f677d1eb626427a7c0a3b2176f761fd118328ff97259bd696cbffaf31c75bb3aa7be2ab396402c65283d52e5a5193073746fe8ed2797d13a91df6303f36e2c3d7a2ede83e9d85ed6684b651c21b879f9c2c21d167d8f452e85fd5009ec18821ec9c829113ea7d27a9465a93caf9e8f1d02aab36cfcabde6b08ab80be85f58e8be9b0a4a2d12d0203010001
0.0.320x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100b23830ef3a5caea963624b5da98250014490e417832a7c21e6501a25b41b9e4ddaca6e9d3f606cfa4d940f50349a5bb5157d50d345fad2a635110a39e1f1f658ec4edc74dd110605b67b2abfe3a1240fe18ef04c206d6a44e1d6f69511f6d7c740af450f71b72c04b3df75dcb7273c345fe5c4383a819bfe81a81fc9c8af80839e8fbf534c39c7910297c35adf5b2a09c27e8eb88d6d044f2c8d55333a825830987d26e47c5bf49cf31da5b6ec471639f7a5e0a6cb79b2238afb65721ff63c3705d13e6a8a0222682bd7d5753e230981879196bae35543dfc815c7ec9bf261d75964c8faeadf0411e8a2a46c6dd6791b05bc39f46037a9a5d129d0e3c230f743a31082b94e16beb1c0267f12e0bca1d751b156c386817647b837fdc64a1da18f9b9b5471a95639f4344c01140adbdf249e31834c5f4a4bde3fcacb62950da6d517f6187affdc81596fe0d403b32f5af9dec5e7abcf287fda6eb3c1ef1f9972de998bfc43d2f26ff120b9efe5f44e69ecfd12ff0b4c22a99ae8a4c3169d51dac30203010001
0.0.330x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100aea7008a4763b6e25da222cc34d3c7a78e3d096538feaebca672bfca143f5ffb9085f5e933e41ba587cc31a389f746c94c137c68b5a03f3696869ab4d042866f4840614a6e18bdf9a5a0bb0500551cccfd033bad7bff8e80795cd54d752468acc684e03dcc4554da47f672084c8fa251f7191f37ef8d0ce8e13dd96c85b801eedc9503a26e347533eb0b1cddd504eec9a6e4b1bc07e7783e2ee7cc410470a48865a767c61b4955139fc879c86ce38f1bca515d6b35ccfa0c62c8d8498505400aaf2fe065f3df08e8a1dff8794ba682c9a36ca77451006072d458a1f39fae8fc98892b4819f33f269e67150ee3d988213ba7cb96cf4ab617d6ab8f188a46ce1da6b67babbee4fcd02de2422e79f2ebe4d4c55bb90fa85681239bd21f6e57ab598e9370122bfab3cfdf0119fc5c6472d67ab49495e75b22a2c7be3c67c272d8d96e5d0e1842ac4f89d12f5e8e09dbaa7f1bace4d7841fd7e24e3eec825a02eac177add2d9c110abeb77e4ec6c6860a7db216d5cfba4acad9dff5bde516b40e68910203010001
0.0.340x308201a2300d06092a864886f70d01010105000382018f003082018a02820181008bf8375e6e9747e5b6946b74e1b9a7b2d4f466ee8555f8cc8bc9c3fb3e91cb3484188d2bf42e303a072440cd48307309aa0f20d512f09595e36161470c2db1389f31cf473ce32d090c6de745d9d91d7034b4554fcb66d9aee0327c99c021448835c523be81deb33561ae6dc0fbc7a9b5417c398d8f0a516d51893d6bd9b2d46b4df745e7f8d044b05bf54a69e52a6fae12d6d1e69290ba6da0725ce14c845c69e67c12f2618b64b4dca244c04f7a28d23a9e34266e2ca371232d610d0bc3bba389dde98f107b57d181c2fd98e64c71d3e69836920ac5b14c7835b37e377f11f1b29362f1527a715aa9016169cdcd92e1761ed0ca5c832465e43de193bf3b364f35dfd23be716a1b8a266ff54440532bf08823f9995a315daabc5afb084e9dae352c703e50affaa7e3f4e26051351273bc5f0c131f40cf1c57a385e95d265c7e4e9ca7ae6318c8c07fb1562851e6a4f90b0bcc9258ae6c967034e4ffa2d1d8ff49b12f117f5d1bc1630e64b19aa277dbe402a8897e44c98b11dcf143ab82540c50203010001
0.0.350x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100dab44c8f86d3fd5c98914f3450f848892235be81919fc4dea32cb3c74eabf16a9c17b3977a6a6f7577bed1f752b9e67e126f07f52390c8f29c2ed01436e8adc45d5a18339c59fb64ef7eee59b146125a8519250fc7697d97129807357c0469973ec20f1111be0e6ccaf58a1b60e63e0563c26a10b300a119a6290c178d371fb07a5d35a7cbb37cf8414b59ce3f461d04a82d0bb22526c77303e8b3305ccf80d2a5572e26826069ed15d5eb7e4ce968f3011331c55c4a60b59737dec9c6fd93bd6f4caa6c1d7041de66ef7f5f0ab77dbf1008bf38e776e869f4861ad821400ddf1821c9efa47d5305af6be6c91cc0352b9388fa02d6fc749fddcd5cda0dcf3722d9fb88b5330e903e349acee505bc47590fd7084bd6cb07a77e9efffdf5d1c3781e9d984f8b2462985f7418449456d727bf7a58532257ec0b5764d8f875ca26fd2d2403e7776d4c8d7086537337a27b480d4d1926e39339be229a9b96dd044b9e5c8b44c9fb00847c2d7f66b73b2d52a89e4d8457ca34286221e869649d8505ad0203010001
0.0.360x308201a2300d06092a864886f70d01010105000382018f003082018a02820181009383257eb68ac25c8ae76f77e545a995684f0a2496e24da29f5463c5a2e9562dd8b5626fe38566ff91fa7ee311400f6b48e3e24943fdacb49c3318d6ff453e9bb89d591c5a92ae6fb99ce647b8bf4c4ec9532fbf505f0dcbc8962af1d39f9c757ddedbb062a086ebfcf8cb65d2176d5da74245d622cb46596aafd4b21da4e08495c6274b2c5871097c0d9606e3d5c969edee0e2c24f03c2233db90db1d79d2e76fb89376853059de2a8c7b30c00c49e6a034b77edbe94291385f7181d13ef2e6eea6029210abb20838626e0b50029bbb7837af32c588677068193d16609a57c964e488657a2ed1abfa75158877c2a65e3beb03ef5b1290f2a0161bf9830c14a095deb73ad062f33461feceb046eac1a0dd36c98268b3306af9da66f8fba97bd8b49be0065dfedd3ada7a8aaedf9d91c5553527662164fc6ec59455f65e199e574bd485098b962afd767766241c3d5aea1f545d51651848d4be1832ada53d93efea3a26ba4a9a94159f8f7f1c3fc4cfe4b9dd846dd6bce976fc73084cb8cea0330203010001
0.0.370x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100d72352b64575e687a590f82d4b8c3486d683fa966ae5f6a2338d98434b62c27ac7a9226f41ac78831054c0d4b2bd0df52948c9ebb837f9ae1b8502a026e549cd29526e5dee55ff86280ff11a8bb5c17627ed58d260ef98b544e2655e97e606a2397d1c4322e509854cdb8347d228a273cfec3a92ac1b906ee529a4ad06cc1c2dc85dca4af470e657c95c33ffd158cc6b3e8133b488102c9afbbea53ba2718136007f0fc58faf5ca7383026084a90c48262c25bacf156c445b430dba961df4ef4721ad53aebf7350a2b442c5ba10c216cce9556e5c11db2fd2152fcf9b829f10e21017eca0c13601e008270fad982e4323d4c1c98aa8a9daa6f40a7728d92c3b80e77140b1808dc73a3fce49274c2580d74a82a3b7e5b0fef2d8e18aa4e30e8658bc3ab626dee995aa2e8ea512793423fa5574bc23d1a256402d21f1a49c0fbfc89fac68e913a32724821e15d63e0b3da89b9f3c13bf1728f2675bc0c6c7c0edf3cb3015ab0f6583c61aa59f1688c9e02e4853c66cb7d46e3c50f92a9f945e3cb0203010001
0.0.380x308201a2300d06092a864886f70d01010105000382018f003082018a0282018100d0a7db4f00138a9ad5cab9df36cc772265a8e16d4a80baf4c4950ebb68aa84e72bbc07a77ed0a054d66e8189f0f6865503f4ddc2c84685595eb19a91598ffc9636ac0bc73f5d645c54de10241e64a8390757c55e9a35d551748950b44e6159cf903175d1cc5bcf9c0b025581b004cd1a28a0184af4864f008ea2af13641dd56f3e69ef8e5579e0f7635fe18e83acddf6f146ecacf1a11f761754a4063da3e56735034f33298c90b2abcace483f585006e7b87fccb98f6556d5b70502964b53dbff9a5737fef2b7e032df9cc614f422d239a78a95ae0690556f3545ce8e54562a3869a4dd556de885aaacfc82562c8edb14f74cffca2d1df8a51b3aa524518ea9c90ec8c4a0fc69cfad94247035b65fe22290a9baa131ba4ea3847b5e2d4802cb4e9a2683d0daec11d022fbe8005946821f9fd783f0cc203ffc17f7ebcf7dc7a6b89bd01ff6bc512063724a95980ad17223fcd65515aaf3694932c19efd568a32da66146e994b534f24793e1506475e2490cb67d5ee8cf01f0b4ab7923fd80fab0203010001
diff --git a/hedera/networks/release-notes/mirror-node.mdx b/hedera/networks/release-notes/mirror-node.mdx index 8c03083c..789916ef 100644 --- a/hedera/networks/release-notes/mirror-node.mdx +++ b/hedera/networks/release-notes/mirror-node.mdx @@ -7,11 +7,100 @@ Visit the [Hedera status page](https://status.hedera.com/) for the latest versio ## Latest Releases +## [v0.149.0](https://github.com/hiero-ledger/hiero-mirror-node/releases/tag/v0.149.0) + +There were a ton of changes integrated in support of the block node project in this release. [HIP-1200](https://hips.hedera.com/hip/hip-1200) worked kicked off with support for verifying `TssSignedBlockProof` in the block stream. The mirror node can now process the new `LedgerIdPublicationTransaction` synthetic transaction that externalizes the network ledger ID which is used in the block proof verification. The latest block root hash changes from [HIP-1056](https://hips.hedera.com/hip/hip-1056) were integrated to ensure we hash and verify the full block stream hierarchy. Finally, [HIP-1193](https://hips.hedera.com/hip/hip-1193) saw support for downloading block stream files from the cloud bucket and automatic cut-over to block streams. + +[HIP-1340](https://hips.hedera.com/hip/hip-1340) Pectra upgrade saw incremental progress this sprint. Support was added for [EIP-7702](https://eips.ethereum.org/EIPS/eip-7702) transaction type that allows Externally Owned Accounts (EOAs) to set the code in their account. The Importer can now process this new transaction type and store the new `authorization_list` data. Additionally, the `/api/v1/contracts/results/{id}/opcodes` endpoint now uses `EthereumTransaction` HAPI transactions so it can work with the EIP-7702 transaction type. + + + * HIP-1200 Verify TssSignedBlockProof #12977 + * chore: update solo version to v0.54.0 #12968 + * Bump hedera.app to 0.71.0 #12936 + * HIP-1056 Latest block root hash changes #12934 + * HIP-1193 Support downloading blockstream files from cloud bucket #12924 + * Add batch transaction acceptance test #12922 + * HIP-1200 Support LedgerIdPublicationTransaction #12904 + * HIP-1340 Add EIP7702 Ethereum Transaction Parser #12893 + * HIP-1340 Support Ethereum calls in TransactionExecutionService #12841 + + + + * Fix rosetta validation failure #12995 + * Fix importer non-zero realm test failures #12986 + * Fix gas calculation in /network/fees rest-java API #12979 + * Fix url encoding for cross cluster health check #12966 + * Fix GCP Marketplace workflow #12953 + * Conditionally run acceptance test in the copy live environment script #12941 + * Set transaction fee and patch nonce when building ethereum transaction body #12935 + * Fixed web3 acceptance testcase #12930 + * Fixed web3 contract call issue with null value #12926 + * Allow transaction simulations when the sender is smart contract #12923 + + + + * Bump nodemon from 3.1.11 to 3.1.12 #12991 + * Bump rest dependencies #12990 + * Bump Spring Boot from 4.0.2 to 4.0.3 #12989 + * Bump tomcat to 11.0.18 #12985 + * Bump up acceptance test dependencies #12981 + * Update test script in package.json #12980 + * Bump express-openapi-validator from 5.6.0 to 5.6.2 #12967 + * Bump the dependencies group in /rest with 4 updates #12964 + * Bump the dependencies group in /rosetta with 2 updates #12963 + * Bump mathjs from 15.1.0 to 15.1.1 in /rest/monitoring in the dependencies group #12962 + * Bump glob from 13.0.1 to 13.0.3 in /rest/check-state-proof in the dependencies group #12961 + * Bump the dependencies group across 1 directory with 4 updates #12960 + * Bump io.projectreactor:reactor-core-micrometer from 1.2.12 to 3.8.3 #12959 + * Bump com.gorylenko.gradle-git-properties:gradle-git-properties from 2.5.5 to 2.5.7 #12958 + * Bump software.amazon.awssdk:bom from 2.41.24 to 2.41.29 #12957 + * Bump io.hypersistence:hypersistence-utils-hibernate-71 from 3.15.1 to 3.15.2 #12956 + * Bump org.flywaydb:flyway-database-postgresql from 12.0.0 to 12.0.1 #12954 + * Bump qs from 6.14.1 to 6.14.2 in /rest #12952 + * Bump qs from 6.14.1 to 6.14.2 in /rest/monitoring #12951 + * Bump axios from 1.13.4 to 1.13.5 in /rest #12927 + * Bump @aws-sdk/client-s3 from 3.983.0 to 3.985.0 in /rest in the dependencies group #12920 + * Bump glob from 13.0.0 to 13.0.1 in /rest/check-state-proof in the dependencies group #12919 + * Bump github.com/lib/pq from 1.10.9 to 1.11.1 in /rosetta in the dependencies group #12918 + * Bump gradle-wrapper from 9.3.0 to 9.3.1 #12916 + * Bump org.testcontainers:testcontainers-postgresql from 2.0.2 to 2.0.3 #12915 + * Bump com.gorylenko.gradle-git-properties:gradle-git-properties from 2.5.4 to 2.5.5 #12914 + * Bump com.graphql-java-generator:graphql-java-client-runtime from 3.1 to 4.0 #12913 + * Bump software.amazon.awssdk:bom from 2.41.21 to 2.41.24 #12912 + * Bump io.hypersistence:hypersistence-utils-hibernate-71 from 3.15.0 to 3.15.1 #12911 + * Bump io.grpc:grpc-bom from 1.78.0 to 1.79.0 #12910 + * Bump versions for v0.149.0-SNAPSHOT #12906 + + +## [v0.148.0](https://github.com/hiero-ledger/hiero-mirror-node/releases/tag/v0.148.0) + +This release saw support for [HIP-1313 High-Volume Entity Creation](https://hips.hedera.com/hip/hip-1313). A new `high_volume` boolean field was added to the database and the transaction REST APIs. This field will be set to true if the user opts into high-volume pricing to create their entities. + +Partial support for [HIP-1193 Record Stream to Block Stream Cut-over](https://hips.hedera.com/hip/hip-1193) was implemented. As part of the larger block stream effort, mirror nodes will need to transition from reading record streams to reading block streams. This transition is intending to be automatic for most mirror node operators outside potentially adjusting their IAM permissions to allow reading a different bucket. Full cut-over support will be completed in `v0.149.0`. + +There were a number of notable dependency upgrades. Spring Boot was upgraded to version 4 which contained a number of major breaking changes. This should be mostly transparent to operators unless they are setting Spring specific configuration properties. The gRPC API module transitioned from using the unmaintained grpc-spring to using the new official Spring gRPC. Additionally, our application was tested successfully against Kubernetes 1.34 and Helm 4 ensuring compatibility for a wider set of deployments. + +### Breaking Changes +The JavaScript implementation of `/api/v1/network/supply` was removed in this release in favor of the newer Java-based implementation. The Java implementation of this API was enabled by default in the Helm chart in the previous release and has been running in Hedera managed environments without issue. Operators should ensure their routing logic is updated so that requests to `/api/v1/network/supply` are directed to the rest-java process instead of the JavaScript-based rest process. If operators use our docker compose or Helm chart this routing change is handled automatically. + +## [v0.147.0](https://github.com/hiero-ledger/hiero-mirror-node/releases/tag/v0.147.0) + +This release contains some notable dependency upgrades. The Java version was increased from JDK 21 to JDK 25. Testing shows that this change resulted in a `10-20%` improvement in Java REST API throughput. It also resulted in a 100-200 ms drop in stream file processing latency. For the JavaScript-based REST APIs, the Node.js version was increased from 22 LTS to 24 LTS. Testing shows this increased REST API throughput anywhere from `5% to 100%`, averaging around 50% improvement overall. Finally, we're upgrading Stackgres from 1.17 to 1.18.3 which gives us some stability fixes. + +The new Java-based `/api/v1/network/`supply REST API is now enabled by default in the Helm chart. In the next release, we'll be deleting the legacy JavaScript-based implementation. Operators should ensure they're ready to transition to the new backend. + +[HIP-1195](https://hips.hedera.com/hip/hip-1195) had some updates to make it compatible with the block stream. We also integrated the upstream changes to rename `LambdaSStore` to `HookStore`. + +### Breaking Changes +We fixed a bug in the formatting of the `batch_key` field in the response of the transaction REST APIs. The field was being formatted directly as a hexadecimal string instead of our standard key wrapper object (e.g. `{"_type": "ED25519", "key": "1234..."}`). The previous behavior did not match the format defined in the OpenAPI specification or in the [HIP-551](https://hips.hedera.com/hip/hip-551) Batch Transactions. Luckily this is a newer field that has not been used in production yet so we don't expect any major disruption from this change. + ## [v0.146.0](https://github.com/hiero-ledger/hiero-mirror-node/releases/tag/v0.146.0) Support for [HIP-1259](https://hips.hedera.com/hip/hip-1259) fee collection account `0.0.802` was added. Once live on mainnet, this should help reduce the size of the mirror node database by sending fees to a single account on every transaction and instead distributing fees to nodes and system accounts once per day. -New block node specific metrics `hiero.mirror.importer.stream.latency` and `hiero.mirror.importer.stream.error` were added for [HIP-1081](https://hips.hedera.com/hip/hip-1081). These metrics previously existed for record streams and were implemented in block streams to reach feature parity. Support for streaming from the earliest available block was added. If `hiero.mirror.importer.startBlockNumber` is set to `-1` and the database is empty, then the importer will query the configured block node to determine what's the earliest block it has available to use. If a non-negative number is set then it will sync from that exact block as before. Finally, an issue with reading trailing non-transaction statechanges in an event was also addressed. +New block node specific metrics `hiero.mirror.importer.stream.latency` and `hiero.mirror.importer.stream.error` were added for [HIP-1081](https://hips.hedera.com/hip/hip-1081). These metrics previously existed for record streams and were implemented in block streams to reach feature parity. +Support for streaming from the earliest available block was added. If `hiero.mirror.importer.startBlockNumber` is set to `-1` and the database is empty, then the importer will query the configured block node to determine what's the earliest block it has available to use. +If a non-negative number is set then it will sync from that exact block as before. Finally, an issue with reading trailing non-transaction statechanges in an event was also addressed. [HIP-1195](https://hips.hedera.com/hip/hip-1195) hooks had acceptance tests added to support end to end testing of the feature. An issue with duplicate keys was addressed by de-duplicating lambda storage updates. diff --git a/hedera/networks/release-notes/services.mdx b/hedera/networks/release-notes/services.mdx index f266297c..b4215529 100644 --- a/hedera/networks/release-notes/services.mdx +++ b/hedera/networks/release-notes/services.mdx @@ -4,20 +4,193 @@ description: "Consensus Node release information" --- Visit the [Hedera status page](https://status.hedera.com/) for the latest versions supported on each network. -## Release v0.70 - - **MAINNET UPDATE: FEBRUARY 18, 2026** - +## Release v0.71 - **TESTNET UPDATE: FEBRUARY 4, 2025** + **MAINNET UPDATE: MARCH 18, 2026** ## Release highlights +Release 0.71 focuses on strengthening core infrastructure and expanding observability to support downstream services and future network capabilities. + + + **TSS Infrastructure Improvements** + Enhancements to signature set handling improve reliability during reconnect scenarios. + + **State Metrics API Expansion** + Additional State Metrics API methods have been implemented to support BlockNode, enabling downstream services to access additional node state information required for block production and analytics workflows. + + + +### [**Build 0.71.3**](https://github.com/hiero-ledger/hiero-consensus-node/releases/tag/v0.71.3) + + + **TESTNET UPDATED: MARCH 10, 2026** + + + +Bug Fixes + * add hiero logger #23649 #23709 by @mxtartaglia-sl + +Tests + * Add more tests #24062 by @Neeharika-Sompalli + + +### [**Build 0.71.2**](https://github.com/hiero-ledger/hiero-consensus-node/releases/tag/v0.71.2) + + + **TESTNET UPDATED: MARCH 5, 2026** + + + +Chores + * cherry-pick reject file append on files with empty key list #23831 #23900 by @AlexKehayov + + +### [**Build 0.71.1**](https://github.com/hiero-ledger/hiero-consensus-node/releases/tag/v0.71.1) + + + **TESTNET UPDATED: FEBRUARY 19, 2026** + + + +Chores +* cherry-pick (release/0.71): Disabling hooks #23502 by @akdev + +Continuous Integration +* Cherry Pick Determinism checks failing python setup for debian #23539 by @andrewb1269 + + +### [**Build 0.71.0**](https://github.com/hiero-ledger/hiero-consensus-node/releases/tag/v0.71.0) + + Features +* Refactor the FeeResult object to be encapsulated semantic #22964 by @joshmarinacci +* add HOOK_SLOT_UPDATE extra #22969 by @joshmarinacci +* 23009 Use PBJ format for SigSet on reconnect #23021 by @imalygin +* Simple fees for contract service queries #22872 by @ibankov +* 22922 Store SigSet in PBJ format #22971 by @imalygin +* Add production configs for high volume throttles #22891 by @Neeharika-Sompalli +* Use hashing prefixes in all block merkle tree operations #22783 by @mhess-swl +* Simple fees for Smart Contracts Service #22319 by @ibankov +* Initialize Block producing benchmarks +* New Metrics Framework supporting labels #22719 by @akugal +* Address book service Simple Fees #22644 by @ibankov +* Add simple fee calculators for Util, Network Admin, and File services #22788 by @aderevets +* Serialize and de-serialize high_volume field correctly #22881 by @Neeharika-Sompalli +* Add protobufs for high volume entity creation hip #22851 by @Neeharika-Sompalli +* 22756 Additional State API methods required for BlockNode #22782 by @imalygin +* 22653 hts system contract transfer functions update with transfer event emission logic #22750 by @gkozyryatskyy +* Implement a support for the new BN response BehindPublisher #22540 by @petreze +* Delete old FeeModel and registry, along with related unit tests #22692 by @joshmarinacci +* more Token Transaction Simple Fees #22584 by @joshmarinacci +Bug Fixes +* (0.71) Ensure HTS transfer gas cost reflects HBAR auto-creations #23181 by @tinker-michaelj +* Consensus optimization #23132 by @poulok +* Increase gradle JVM memory settings #22963 by @poulok +* Resolve compilation warnings related to Javadoc formatting and comment placement #21900 by @rbair23 +* fix the double run of gradle determinism #22984 by @andrewb1269 +* Fix token associate fee for multiple tokens #22952 by @ibankov +* point to explicit proto pkg version #22935 by @venilinvasilev +* Update dev genesis network json #22932 by @derektriley +* updated BlockStreamManagerWrapper #22937 by @AlexKehayov +* fix message in the BN communication test #22934 by @petreze +* Resolved compiler warnings in VirtualMapStateTest #22903 by @imalygin +* Use unique account names in SteadyStateThrottlingTest #22858 by @tinker-michaelj +* Fix flaky Hapi Test in RecordCreationSuite #22896 by @ibankov +* 22863 Fix migration testing exception #22870 by @imalygin +* extend Schedule Delete admin key check to also keep track of delegatable contract ids #22834 by @stoyanov-st +* 22388: Reconnect: custom reconnect roots are no longer needed #22440 by @artemananiev +Other Changes +Build System +* publish the swirlds-cli Jar because other modules depend on it #23040 by @jjohannes +* remove yahCliJar from assemble #22902 by @jjohannes +Chores +* Cherry-Pick (0.71): Use incremental streaming hashers for all subroots #23143 by @mhess-swl +* remove teams from CODEOWNERS for gradle #23053 by @anthony-swirldslabs +* 22984 Cleanup usages of SelfSerializable #23033 by @imalygin +* move fallen behind monitor #23041 by @netopyr +* Add extra validations for queries #22982 by @Neeharika-Sompalli +* Add BYTES to nodeFee #22920 by @Neeharika-Sompalli +* 22972: 1B: IndexOutOfBoundsException when resizing HDHM #22976 by @artemananiev +* 22991 Remove MerkleData*Stream classes #22994 by @imalygin +* Removed empty time-consuming task from CI +* Enable hooks #23004 by @Neeharika-Sompalli +* Fix simple fees json #23003 by @Neeharika-Sompalli +* Cleanup PeerInfo related classes #22970 by @poulok +* Cleanup GitHub workflows #22967 by @poulok +* Cleanup redundent BN XTS HAPI Tests #22950 by @derektriley +* Update BN Streaming Metrics md with alerting #22958 by @derektriley +* add private repo checks to skip certain ci steps #22861 by @andrewb1269 +* Refactor Platform CLI infrastructure #22720 by @mxtartaglia-sl +* Cleanup event-intake dependencies #22821 by @netopyr +* 19654 Removed com.swirlds.common.merkle.crypto package #22910 by @imalygin +* 22448 Removed old serialization mechanism for VM #22895 by @imalygin +* Fix CryptoTransfer fee calculations for SimpleFees #22928 by @Neeharika-Sompalli +* move orphan buffer #22899 by @netopyr +* remove dependency on com.hedera.cryptography.rpm #22912 by @anthony-swirldslabs +* Remove AddressBook #22593 by @timo0 +* removing StateTest #22626 by @mxtartaglia-sl +* Publish LedgerId #22865 by @tinker-michaelj +* 22879 Removed swirlds-merkle module #22880 by @imalygin +* Minor Version Roll to 0.71.0-SNAPSHOT +* Switch add-on tracer type to ActionSidecarContentTracer #22869 by @tinker-michaelj +* Disable event hash validators #22772 by @mhess-swl +* bump org.hiero.gradle.build from 0.6.2 to 0.6.4 #22780 by @dependabot[bot] +* Expose EvmFrameState in RootProxyWorldUpdater +* Simplify interaction between consensus layer and execution layer #22836 by @netopyr +* Move unit tests of consensus metrics to new module #22825 by @netopyr +* Move EventSignatureValidor into event-intake module #22706 by @netopyr +* Reenable backpressure BN communication tests #22857 by @petreze +* 22864: Make use of hash code checks in bucket mutations #22866 by @artemananiev +* Capture PCES files in failure artifacts #22774 by @mhess-swl +* Remove PlatformContext from DefaultConsensusEngine #22796 by @poulok +* increase cert ttl on teleport auth steps #22893 by @andrewb1269 +Continuous Integration +* Update runners & Improve XTS Dry Run Capabilities #23172 #23217 by @rbarker-dev +* Update build-release-artifact and associated workflows #23206 by @andrewb1269 +* rename zxf to flow on MATS and XTS dry run workflows #23191 by @andrewb1269 +* cherry-pick update hiero-observability group #23179 by @andrewb1269 +* Update checkout refs to fix gradle determinism checks #22957 by @rbarker-dev +* run checkVersionConsistency on PRs #22917 by @jjohannes +* add dry run flag to version roll workflow #22378 by @andrewb1269 +Documentation Updates +* Add clarifying javadocs to SequenceMap #22875 by @poulok +Refactoring +* 22804 Additional constructor for WritableKVStateBase #23036 by @imalygin +* 21284 Use MerkleNodeState in BlockStreamManager #22884 by @imalygin +* Move LinkedEvent to consensus-model #22826 by @poulok +* Move RandomAccessDeque and SequentialRingBuffer out of swirlds-common #22748 by @poulok +Tests +* Add more tests #23055 by @Neeharika-Sompalli +* #23028 to fix decimal parsing in bash, #23034 to use solo deployment diagnostics #23035 by @alex-kuzmin-hg +* Fix failing XTS tests #23032 by @Neeharika-Sompalli +* senders/receivers sorting and additional ERC transfer events test #22978 by @gkozyryatskyy +* Implement Simple Fees - Crypto Transfer hapi tests #22859 by @Evdokia-Georgieva +* NLG_0.11.1 fixed SmartContract startup #22868 #22871 by @alex-kuzmin-hg +* Refactor SimpleFeesSuite negative tests and Implement Topic Create with Simple Fees tests coverage #22460 by @Evdokia-Georgieva +* Added a chaos test which tries to break rpc sync mechansm explicitly #22558 by @abies +* 22753 NLG with latency metrics #22768 by @alex-kuzmin-hg + + + + +## Release v0.70 + + **MAINNET UPDATED: FEBRUARY 25, 2026** + + + + **TESTNET UPDATED: FEBRUARY 5, 2026** + + +## Release highlights + Release 0.70 delivers significant advancements in fee processing efficiency and foundational infrastructure for future scalability, building on Hedera’s focus on performance and simplicity. The headline feature implements HIP-1259 Fee Collection Account, centralizing fee accumulation for streamlined operations, while incremental progress on several multi-phase HIPs and block node enhancements prepares the network for higher throughput and enhanced data handling. + + Fee Collection Account (HIP-1259) @@ -36,6 +209,15 @@ HIP-1081: Block Node — Updates to Block Node communications including new supp +### [**Build 0.70.1**](https://github.com/hiero-ledger/hiero-consensus-node/releases/tag/v0.70.1) + + - ci(workflows-fix): Determinism checks failing python setup for debian (cp #23350) by @rbarker-dev in #23882 + - chore: Only use round timestamp for long-term schedules if all evts are empty by @tinker-michaelj in #23881 + - fix(23639): add hiero logger (#23649) by @mxtartaglia-sl in #23883 + + **Full Changelog**: [v0.70.0...v0.70.1](https://github.com/hiero-ledger/hiero-consensus-node/compare/v0.70.0...v0.70.1) + + ### [**Build 0.70.0**](https://github.com/hiero-ledger/hiero-consensus-node/releases/tag/v0.70.0) - Implement a support for the new BN response `BehindPublisher` [#22913](https://github.com/hiero-ledger/hiero-consensus-node/pull/22913) by @petreze @@ -45,9 +227,15 @@ HIP-1081: Block Node — Updates to Block Node communications including new supp - Populate state proofs with real Merkle paths [#22253](https://github.com/hiero-ledger/hiero-consensus-node/pull/22253) by @mhess-swl - Simple fees for File/Schedule service queries [#22537](https://github.com/hiero-ledger/hiero-consensus-node/pull/22537) by @ibankov - Add connection/client for BN service API [#22483](https://github.com/hiero-ledger/hiero-consensus-node/pull/22483) by @timfn-hg + **Full Changelog**: [v0.69.1...v0.70.0](https://github.com/hiero-ledger/hiero-consensus-node/compare/v0.69.1...v0.70.0) +## Performance Results + + ![](/images/networks/release-notes/services/0.70_performance_measurement_results_extract.png) + + ## Release v0.69 @@ -133,7 +321,7 @@ See more in the communication [here](https://hedera.com/blog/price-update-to-con ## Performance Results - ![](/images/networks/release-notes/services/0.69_Performance-measurement-results_extract.001.png) + ![](/images/networks/release-notes/services/0.69_performance_measurement_results_extract.001.png) ## Release v0.68 diff --git a/hedera/open-source-solutions.mdx b/hedera/open-source-solutions.mdx index af2db3bb..ffc1b58f 100644 --- a/hedera/open-source-solutions.mdx +++ b/hedera/open-source-solutions.mdx @@ -3,6 +3,29 @@ title: "Open Source Solutions and Integrations" sidebarTitle: "Overview" --- +## Hello Future: Apex Hackathon + +The Hedera Hello Future Apex Hackathon brings together new and experienced builders worldwide to collaborate and compete virtually. + + + {" "} - + {" "} - -*** - -## Key Features - -### Feature 1: Multi-Network Execution and Local Node - -The **`network use `** command gives you the ability to switch between different networks if you have configured accounts for each of the Hedera networks. You can also configure the default account for the [Hedera Local Node in your Hedera CLI](https://github.com/hashgraph/hedera-cli?tab=readme-ov-file#4-set-up-operator-credentials) so you can run tests locally on your local node. - -### Feature 2: Script Blocks - -[**Script blocks**](https://github.com/hashgraph/hedera-cli?tab=readme-ov-file#backup-commands) allow you to chain multiple commands to prepare a testing environment on a specific network. Let's take a look at some examples. - -**A. Account creation and fetching a balance (basic example)** - -This script block is a simple example that shows how the Script Block feature works. The script switches to the testnet, creates an account (called Alice), stores the account's ID, and queries the account's balance using the stored account ID. - -```json -{ - "name": "account-create", - "commands": [ - "network use testnet", - "account create --name alice -b 100000000 --args accountId:idAcc1", - "wait 3", - "account balance --account-id-or-name {{idAcc1}} --only-hbar" - ], - "args": {} -} -``` - -**B. Advanced token creation and transfer** - -The following example is a bit more complex. Here's a breakdown: - -* Create three random accounts and store outputs as variables like the private key, internal account name, and account ID. -* Create a token called `mytoken` and use account 1 as the admin key and account 2 as the treasury account. Again, we store the token ID in a variable conveniently called `tokenId` . -* Associate account 3 with our newly created token and transfer one unit of our token from account 2 to account 3. The wait command has been added to make sure the operation has been completed. -* Let's wait three seconds to make sure the mirror nodes have picked up the balance changes, then look up the balance for account 3 for our newly created token. Finally, we print the stored state for our new token to the terminal. - -```json wrap -{ - "name": "transfer", - "commands": [ - "network use testnet", - "account create --name alice --args privateKey:privKeyAcc1 --args name:nameAcc1 --args accountId:idAcc1", - "account create --name bob --args privateKey:privKeyAcc2 --args name:nameAcc2 --args accountId:idAcc2", - "account create --name greg --args privateKey:privKeyAcc3 --args name:nameAcc3 --args accountId:idAcc3", - "token create -n mytoken -s MTK -d 2 -i 1000 --supply-type infinite --admin-key {{privKeyAcc1}} --treasury-id {{idAcc2}} --treasury-key {{privKeyAcc2}} --args tokenId:tokenId", - "token associate --account-id {{idAcc3}} --token-id {{tokenId}}", - "token transfer -t {{tokenId}} -b 1 --from {{nameAcc2}} --to {{nameAcc3}}", - "wait 3", - "account balance --account-id-or-name {{nameAcc3}} --token-id {{tokenId}}", - "state view --token-id {{tokenId}}" - ], - "args": {} -} -``` - - - -Scripts can also be downloaded from external sources using the [`state download` command](https://github.com/hashgraph/hedera-cli?tab=readme-ov-file#usage-7) to make it easier to set up your Hedera CLI in CI/CD pipelines. - - -### Feature 3: Smart Contract Deployment and Interactions - -You can use the CLI to deploy and interact with smart contracts. Currently, the CLI supports only Hardhat scripts for these operations. We've also added support for storing data as variables within Hardhat scripts, allowing you to maintain state and share it between scripts and commands. This is especially useful when using the Script Blocks feature (see [bullet 3 in the announcement blog post](https://hedera.com/blog/an-early-look-at-the-hedera-cli-simplify-automate-and-accelerate-development-on-hedera)). - -```javascript scripts/deploy.js -const stateController = require('../../state/stateController.js').default; - -async function main() { - const [deployer] = await ethers.getSigners(); - - console.log('Deploying contracts with the account:', deployer.address); - - // The deployer will also be the owner of our token contract - const ERC721Token = await ethers.getContractFactory('ERC721Token', deployer); - const contract = await ERC721Token.deploy(deployer.address); - await contract.waitForDeployment(); - - const contractAddress = await contract.getAddress(); - console.log('ERC721 Token contract deployed at:', contractAddress); - - // Store address in script arguments as "erc721address" - stateController.saveScriptArgument('erc721address', contractAddress); -} - -main().catch(console.error); -``` - - -### Feature 4: State Management - -The Hedera CLI tool **tracks state**. Each account, token, or topic you create gets stored in its internal state. Additionally, you can **assign names** to each entity type to make it easier to reference them, eliminating the need to remember account IDs or private keys. The tool automatically looks up the account name in the state and signs a transaction using the found account's private key. This makes it a lot easier to execute commands. - -Additionally, you can [**create state backups**](https://github.com/hashgraph/hedera-cli?tab=readme-ov-file#backup-commands) **or** [**download a state file**](https://github.com/hashgraph/hedera-cli?tab=readme-ov-file#state-commands) **from an external location**. This is useful if you want to use the same base state to run your tests. It also avoids the need to prepare the testing environment manually. - - -#### 💡 Feature Requests? - -Feel free to contribute to the Hedera CLI or submit a feature request or bug via the [**issues tab**](https://github.com/hashgraph/hedera-cli/issues)**.** - - -*** - -## Future Roadmap - -Upcoming roadmap work includes: - -* **Telemetry**: Collect anonymized data to better understand how developers use the tool to make it better. We only collect commands without parameters or sensitive data. For example, we collect `account create` or `state view` . -* **Smart Contracts:** Deploying and interacting with smart contracts. -* **Sign module:** Rework the key signing module to make it more flexible. - -*** - -## Commands Overview - - -

Designed to initialize and configure your working environment.

-
setup init
-setup reload
-
- - -

Designed to manage and interact with the different Hedera network environments.

-
network use
-network list
-
- - -

Designed to pause the execution of commands. Useful to wait for mirror nodes to receive data.

-
wait
-
- - -

Designed to manage accounts.

-
account create
-account balance
-account list
-account import
-account clear
-account delete
-account view
-
- - -

Designed to create, associate, and transfer tokens.

-
token create-from-file
-token create
-token associate
-token transfer
-
- - -

Designed to create topics and retrieve information for topics.

-
topic create
-topic list
-topic message submit
-topic message find
-
- - -

Designed to transfer HBAR.

-
hbar transfer
-
- - -

Designed to create state backups.

-
backup create
-backup restore
-
- - -

Designed to manage and view state.

-
state download
-state view
-state clear
-
- - -

Designed to load and execute scripts.

-
script load
-script list
-script delete
-
-
-*** - -## Additional Resources - -* [**Hedera CLI Repository**](https://github.com/hashgraph/hedera-cli) -* [**CLI Full List of Commands**](https://github.com/hashgraph/hedera-cli?tab=readme-ov-file#commands) -* **Learn about** [**Script Blocks**](https://github.com/hashgraph/hedera-cli?tab=readme-ov-file#script-commands) **and how you can use** [**dynamic variables**](https://github.com/hashgraph/hedera-cli?tab=readme-ov-file#dynamic-variables-in-scripts) diff --git a/hedera/open-source-solutions/hiero-cli/overview.mdx b/hedera/open-source-solutions/hiero-cli/overview.mdx new file mode 100644 index 00000000..aff49e4d --- /dev/null +++ b/hedera/open-source-solutions/hiero-cli/overview.mdx @@ -0,0 +1,215 @@ +--- +title: "Overview" +--- + +## Introduction to Hiero CLI + +The [Hiero CLI ](https://github.com/hiero-ledger/hiero-cli) is a command‑line interface that offers a simple way to interact with the Hedera network. It consolidates many common network operations into easy-to‑use commands so you can: + +* **Test** your Hedera applications quickly. +* **Automate** repetitive tasks without writing bulky code. +* **Simplify** key management, letting you focus on building and scaling your solutions. + +*** + +## Getting Started + +**Prerequisites**: + +* Node.js installation: LTS 16.20.2 or higher +* [Hedera Account](https://portal.hedera.com/) (for mainnet, testnet, or previewnet) or [Hedera Local Node](/hedera/tutorials/local-node/how-to-set-up-a-hedera-local-node) (for localnet) + +The easiest way to get started with Hiero CLI is to install it globally via NPM: + +``` +npm install -g @hiero-ledger/hiero-cli +``` + +Once installed, you can use the CLI with the `hcli` command: + +```sh +# Check available commands +hcli --help + +# Example: Check account balance +hcli account balance --account-id 0.0.123456 + +# Example: Transfer HBAR +hcli hbar transfer --to 0.0.123456 --amount 10 +``` + + +#### **First-time setup (Initialization):** +When you run any command that requires an operator (like transferring HBAR or creating tokens) in interactive mode, the CLI will automatically launch an initialization wizard to guide you through configuring the operator account, private key, and settings. In script mode (non-interactive), an error will be thrown instead, requiring you to use `hcli` network set-operator to configure the operator first. + + + + ## Manual Setup (For Developers) + + If you want to contribute to the development of the Hiero CLI or create your own version or plugins, follow these instructions. + + **Prerequisites** + + * Node.js installation: LTS 16.20.2 or higher + * [Hedera Account](https://portal.hedera.com/) (for mainnet, testnet, or previewnet) or [Hedera Local Node](/hedera/tutorials/local-node/how-to-set-up-a-hedera-local-node) (for localnet) + * Git + + **Step 1: Clone the repository** + + ```sh + git clone https://github.com/hiero-ledger/hiero-cli.git + ``` + + **Step 2: Install dependencies** + + ```sh + cd hiero-cli + npm install + ``` + + **Step 3: Build the package** + + ```sh + npm run build + ``` + + **Step 4: CLI Initialization** + + The Hiero CLI initializes automatically when you run any command. The CLI loads default plugins and registers their commands. No manual setup is required. + + When you first run the CLI, it will: + + * Load all default plugins from `dist/plugins/` + * Initialize the Core API with the selected output format + * Register all plugin commands + * Use testnet as the default network + + **Note:** There is a test plugin available that is required for running integration tests. + + You can verify the installation by checking available commands: + + ```sh + node dist/hiero-cli.js --help + ``` + + **Step 5: Set Up Operator Credentials** + + To interact with Hedera networks, you need to configure operator credentials for each network you want to use. Use the network plugin's set-operator command: + + ```sh + # Set operator for testnet using account name (if already imported) + node dist/hiero-cli.js network set-operator --operator my-testnet-account --network testnet + + # Set operator for testnet using account-id:private-key pair + node dist/hiero-cli.js network set-operator --operator 0.0.123456:302e020100300506032b657004220420... --network testnet + + # Set operator for mainnet + node dist/hiero-cli.js network set-operator --operator 0.0.123456:302e020100300506032b657004220420... --network mainnet + ``` + + The operator credentials are stored in the CLI's state management system. Make sure that each operator account contains at least 1 HBAR for transaction fees. + + **Step 6: Setting Up an Alias (Optional) + + To avoid typing the full command each time, you can set an alias in your shell profile. Replace the path with the absolute path to your hiero-cli installation. + + + + Add the following line to your `~/.bashrc`,` ~/.bash_profile`, or `~/.zshrc`: + + ```sh + alias hcli="node /path/to/hiero-cli/dist/hiero-cli.js" + ``` + + Then reload your shell: + + ```sh + # For bash + source ~/.bashrc + + # or + source ~/.bash_profile + + # For zsh + source ~/.zshrc + ``` + + + Add the following line to your PowerShell profile. First, open PowerShell and check if your profile exists: + ```sh + # Check if profile exists + Test-Path $PROFILE + + # If it doesn't exist, create it + New-Item -ItemType File -Path $PROFILE -Force + ``` + + Then add the following function to your profile: + + ```js + function hcli { + node C:\path\to\hiero-cli\dist\hiero-cli.js @args + } + ``` + + Then reload your PowerShell: + + ```sh + . $PROFILE + ``` + + Now you can use `hcli` with arguments just like on Unix systems. + + + + +## Global Flags + +These flags are available on **all Hiero CLI commands**. They control output, help, and versioning, regardless of the specific plugin or command you’re using. + +- `--format `: Controls how command output is formatted.
Supported values `human` (default) or `json` for machine-readable output. +- `-h, --help`: Displays help information for a command. +- `-V, --version`: Outputs the installed Hiero CLI version. + +## Plugins Overview + + + Manage operator credentials and keys + + + Switch networks, manage operator credentials, and check network health + + + Transfer HBAR between accounts + + + Create, import, manage accounts, and view balances + + + Create, associate, and transfer tokens + + + Create topics and manage topic messages + + + Inspect and update CLI configuration values + + + Add, remove, enable/disable, and inspect plugins + + +## Scripting + +Once you’re familiar with the available CLI commands, you can take the next step with scripting. Scripting is especially useful for CI/CD pipelines, setting up test environments, and automating repeated workflows. + + + Learn how to create your first script using Hiero CLI commands. + + +## Contributing + + +### 💡 Feature Requests? + +Feel free to contribute to the Hiero CLI or submit a feature request or bug via the [**issues tab**](https://github.com/hiero-ledger/hiero-cli/issues)**.** + \ No newline at end of file diff --git a/hedera/open-source-solutions/hiero-cli/plugins/account-plugin.mdx b/hedera/open-source-solutions/hiero-cli/plugins/account-plugin.mdx new file mode 100644 index 00000000..786aafb5 --- /dev/null +++ b/hedera/open-source-solutions/hiero-cli/plugins/account-plugin.mdx @@ -0,0 +1,126 @@ +--- +title: "Account Plugin" +--- + +## Most Used Commands + +**Create a new account** + +```sh +hcli account create \ + --balance 1 \ + --name +``` + +**Check an account balance** + +```sh +hcli account balance --account myaccount +``` + +**List all accounts** + +```sh +hcli account list +``` + +## Full Command Reference + + + Creates a new Hedera account. + + + Initial HBAR balance. Add "t" for Tinybar units
+ `--balance 10` --> 10 HBAR
+ `--balance 100t` --> 100 Tinybars +
+ + + The maximum number of automatic association tokens allowed
+ Default value set to 0 +
+ + + Key manager to use: `local` or `local_encrypted` (defaults to config setting)
+
+ + + Alias of the created account to be used
+
+ + + Set the default key type. Defaults to ecdsa (recommended for full usability)
+
+ + + Set the payer account, can be an account ID or alias + +
+ + + Import an existing account into the CLI tool. Provide `accountId:privateKey` format. + + + Specify the private key in `accountId:privateKey` format (e.g., "`0.0.123456:abc123...`") + + + + Alias for the account to be used + + + + Key manager to use: `local` or `local_encrypted` (defaults to config setting)
+
+
+ + + Retrieve the balance for an account ID or name. + + + Account ID, alias or name of the account present in state + + + + Show only HBAR balance + + + + Show balance for specific token ID, specify token ID or name + + + + Display balances in raw units (tinybars for HBAR, base units for tokens) + + + + + List all accounts stored in the address book. + + + Include private keys reference ID in listing. This is not the actual private key! + + + + + View detailed information about an account. + + + View data for account ID or name of the account present in state. + + + + + Remove all account information from the address book. + + + + Delete an account from the address book. You need to specify either name or ID to delete the account. + + + Account name to be deleted from the store. + + + + Account ID to be deleted from the store. + + \ No newline at end of file diff --git a/hedera/open-source-solutions/hiero-cli/plugins/config-plugin.mdx b/hedera/open-source-solutions/hiero-cli/plugins/config-plugin.mdx new file mode 100644 index 00000000..7b71ba0f --- /dev/null +++ b/hedera/open-source-solutions/hiero-cli/plugins/config-plugin.mdx @@ -0,0 +1,59 @@ +--- +title: "Config Plugin" +--- +## Full Command Reference + + + List all configuration options with current values. + + + + Get the value of a configuration option. + + + Option name to read. + + + + + Set the value of a configuration option. + + + Option name to set. Use `list` command to check what options could be set. + + + + Value to set (boolean|number|string). Booleans: true/false. + + + +## Configuration Options + +The config plugin allows you to control global Hiero CLI behavior. Configuration values are typically stored in the CLI config file and affect logging, cryptographic support, and key management defaults. + + + **Enables support for Ed25519 keys** within the Hiero CLI. When enabled, the CLI can:
+ - Generate Ed25519 keys
+ - Use Ed25519 keys for signing transactions
+ - Interact with accounts or services that rely on Ed25519 cryptography
+ + **When to enable:**
+ - You are working with Hedera accounts or tooling that explicitly require Ed25519 keys
+ - You are testing compatibility with different key types +
+ + + Controls the verbosity of CLI output.
+ Allowed values:
+ - `silent`: No output except critical failures
+ - `error`: Only errors are shown
+ - `warn`: Errors and warnings
+ - `info`: General informational messages
+ - `debug`: Verbose output for troubleshooting +
+ + + Defines which key manager the CLI uses by default when creating or managing keys. Keep the default `local_encrypted` setting unless you are working in a controlled test environment.
+ - `local`: Keys are stored locally in plaintext (not recommended for production).
+ - `local_encrypted`: Keys are stored locally and encrypted (recommended).
+
\ No newline at end of file diff --git a/hedera/open-source-solutions/hiero-cli/plugins/credentials-plugin.mdx b/hedera/open-source-solutions/hiero-cli/plugins/credentials-plugin.mdx new file mode 100644 index 00000000..446b3b32 --- /dev/null +++ b/hedera/open-source-solutions/hiero-cli/plugins/credentials-plugin.mdx @@ -0,0 +1,18 @@ +--- +title: "Credentials Plugin" +--- + +## Full Command Reference + + + Show all stored credentials. + + + + Remove credentials by keyRefId from KMS storage. + + + Key reference ID to remove from KMS
+ Example: `hcli credentials remove --id kr_8167eee6d0bee5c1` +
+
\ No newline at end of file diff --git a/hedera/open-source-solutions/hiero-cli/plugins/hbar-plugin.mdx b/hedera/open-source-solutions/hiero-cli/plugins/hbar-plugin.mdx new file mode 100644 index 00000000..2cf973a5 --- /dev/null +++ b/hedera/open-source-solutions/hiero-cli/plugins/hbar-plugin.mdx @@ -0,0 +1,31 @@ +--- +title: "HBAR Plugin" +--- + +## Full Command Reference + + + Transfer HBAR (tinybars) from one account to another. + + + Amount to transfer. Default: display units.
+ Add `t` for base units. Example: "1" = 1 HBAR, "100t" = 100 tinybar +
+ + + Account ID or name to transfer to + + + + AccountID:privateKey pair, AccountID:keyType:privateKey format, or account name to transfer from (defaults to operator).
+ Key type can be "ecdsa" or "ed25519" (defaults to ecdsa if not specified). +
+ + + Memo for the transfer. + + + + Key manager to use: local or local_encrypted (defaults to config setting). + +
diff --git a/hedera/open-source-solutions/hiero-cli/plugins/network-plugin.mdx b/hedera/open-source-solutions/hiero-cli/plugins/network-plugin.mdx new file mode 100644 index 00000000..5168826a --- /dev/null +++ b/hedera/open-source-solutions/hiero-cli/plugins/network-plugin.mdx @@ -0,0 +1,42 @@ +--- +title: "Network Plugin" +--- + +## Full Command Reference + + + List all available networks with their configuration and health status. + + + + Switch the active network to the specified network name. + + + Network name (testnet, mainnet, previewnet, localnet) + + + + + Get operator credentials for a specific network. + + + Target network (defaults to current network) + + + + + Set operator credentials for signing transactions on a specific network.

+ **⚠️ Use this command to set the operator to avoid triggering the setup wizard asking you to set up an operator account. This is important when using the Hiero CLI in a CI/CD environment.** + + + Operator credentials: name or `account-id:private-key pair`. + + + + Target network (defaults to current network). + + + + Key manager to use: local or local_encrypted (defaults to config setting). + +
\ No newline at end of file diff --git a/hedera/open-source-solutions/hiero-cli/plugins/plugin-management-plugin.mdx b/hedera/open-source-solutions/hiero-cli/plugins/plugin-management-plugin.mdx new file mode 100644 index 00000000..d1af2741 --- /dev/null +++ b/hedera/open-source-solutions/hiero-cli/plugins/plugin-management-plugin.mdx @@ -0,0 +1,42 @@ +--- +title: "Plugin Management Plugin" +--- + + +## Full Command Reference + + + Add a new plugin to the plugin-management state and enable it. + + + Filesystem path to the plugin directory containing `manifest.js` + + + + + Remove a plugin from the plugin-management state. + + + Name of the plugin to remove from the state + + + + + Enable a plugin by name in the plugin-management state. + + + Name of the plugin to enable + + + + + Disable a plugin by name in the plugin-management state. + + + Name of the plugin to disable. + + + + + Show all loaded plugins. + \ No newline at end of file diff --git a/hedera/open-source-solutions/hiero-cli/plugins/token-plugin.mdx b/hedera/open-source-solutions/hiero-cli/plugins/token-plugin.mdx new file mode 100644 index 00000000..207d2818 --- /dev/null +++ b/hedera/open-source-solutions/hiero-cli/plugins/token-plugin.mdx @@ -0,0 +1,211 @@ +--- +title: "Token Plugin" +--- + +## Most Used Commands + +**Create a new token with treasy and admin key set to alias Alice** + +```sh +hcli token create \ + --token-name "My Token" \ + --symbol "MTK" \ + --treasury alice \ + --decimals 2 \ + --initial-supply 1000 \ + --supply-type FINITE \ + --admin-key alice \ + --name mytoken-alias +``` + +**Token associate** + +```sh +hcli token associate \ + --token mytoken-alias \ + --account bob +``` + +## Full Command Reference + +If you want to create a complex token with many keys, custom fees, and other options, take a look at the [below guide](#guide:-token-create-from-file-specification) for creating tokens from a specification file using the `token create-from-file` command. + + + Create a new fungible token with specified properties. + + + Token name. + + + + Token symbol. + + + + Treasury account: either an alias or `treasury-id:treasury-key` pair. + + + + Decimals for the token. Default: 0. + + + + Initial supply amount. Default: display units (with decimals applied). Append "t" for raw base units (e.g., "1000t"). + + + + Set supply type: `INFINITE` (default) or `FINITE`. + + + + Maximum supply of the token to bet set upon creation. **This option is required if you set supply type to `FINITE`.** + + + + Admin key to be set for the token upon creation. If option not set then the operator key is passed as admin key. + + + + Optional name to register for the token. + + + + Key manager to use: local or local_encrypted (defaults to config setting). + + + + Optional memo for the token (max 100 characters). + + + + + Create a new token from a JSON file definition with advanced features. See the full guide below.
+ Example: `hcli token create-from-file --file ~/projects/token.json` + + + Token definition file path (absolute or relative) to a JSON file. + + + + Key manager to use: local or local_encrypted (defaults to config setting). + +
+ + + Associate a token with an account to enable transfers. + + + Token: either a token alias or token-id + + + + Account: either an alias or `account-id:account-key` pair to associate with the token. + + + + Key manager to use: local or local_encrypted (defaults to config setting). + + + + + Transfer a fungible token from one account to another. + + + Token: either a token alias or token-id. + + + + Destination account: either an alias or account-id. + + + + Source account: either a stored alias or `account-id:private-key` or `account-id:key-type:private-key pair`. + + + + Amount to transfer. Default: display units (with decimals applied). Append "t" for raw base units (e.g., "100t"). + + + + Key manager to use: local or local_encrypted (defaults to config setting). + + + + + List all tokens stored in state for the current network or a specified network. + + + Show token key information (admin, supply, wipe, etc.). + + + + Filter tokens by network (defaults to current active network). + + + +## Guide: Token Create From File (Specification) + +Create a token by defining its configuration in a JSON file. This is the recommended approach for repeatable token creation (scripts, CI, team handoffs), and it supports aliases for token keys so you don’t have to hardcode account keys everywhere. + +### What it does + +`token create-from-file` reads a JSON file that matches a supported schema and creates a token on the selected network. + +You can define: +- token metadata (name, symbol, decimals, memo) +- supply model (finite/infinite, initial/max supply) +- token keys (admin, supply, wipe, kyc, freeze, pause, feeSchedule) +- optional token associations +- optional custom fees + +### Quickstart + +Create a `token.json` file and add a JSON specification. Here's a basic example that both uses the full key format for the `treasuryKey` and the alias format for the `adminKey`. + +```json +{ + "name": "token-keys-example", + "symbol": "TRK", + "decimals": 10, + "supplyType": "infinite", + "initialSupply": 1000, + "treasuryKey": "<0.0.1002:3030020100300706052b8104000a042204207f109a9e3b0d8ecfba9cc23a3614433ce0fa7ddcc80f2a8f10b222179a5a80d6>", + "adminKey": "alice-account" +} +``` + +You can create a toke from this specification by running the following command: `hcli token create-from-file --file ./token.json` + +### Full breakdown + +Here's a full breakdown of all the options you can use: + +```json +{ + "name": "token-full-example", + "symbol": "TFE", + "decimals": 8, + "supplyType": "finite", + "initialSupply": 1000000, + "maxSupply": 10000000, + "treasuryKey": "", + "adminKey": "", + "supplyKey": "", + "wipeKey": "", + "kycKey": "", + "freezeKey": "", + "pauseKey": "", + "feeScheduleKey": "", + "memo": "Full example token with all fields", + "associations": [""], + "customFees": [ + { + "type": "fixed", + "amount": 100, + "unitType": "HBAR", + "collectorId": "0.0.1234", + "exempt": false + } + ] +} +``` \ No newline at end of file diff --git a/hedera/open-source-solutions/hiero-cli/plugins/topic-plugin.mdx b/hedera/open-source-solutions/hiero-cli/plugins/topic-plugin.mdx new file mode 100644 index 00000000..4ddd4073 --- /dev/null +++ b/hedera/open-source-solutions/hiero-cli/plugins/topic-plugin.mdx @@ -0,0 +1,116 @@ +--- +title: "Topic Plugin" +--- + +## Most Used Commands + +**Create a new topic with admin and submit key set** + +```sh +hcli topic create \ + --name marketing-updates \ + --memo "Weekly digest" \ + --admin-key alice \ + --submit-key bob +``` + +**Submit a message** + +```sh +hcli topic submit-message \ + --topic 0.0.7473019 \ + --message '{"event":"mint","amount":10}' +``` + +**Find messages between a range of 1 and 3** + +```sh +hcli topic find-message \ + --topic marketing-updates \ + --sequence-gt 1 \ + --sequence-lt 3 +``` + +## Full Command Reference + + + Create a new Hedera Consensus Service topic with optional memo and keys. + + + Define the name for this topic. + + + + The memo for a topic. + + + + Pass an admin key as name or private key for the topic. Private key can be optionally prefixed with key type
+ (e.g., "ed25519:..." or "ecdsa:..."). Defaults to ecdsa if no prefix. +
+ + + Submit key as account name or `{accountId}:{private_key}` format. + + + + Key manager to use: local or local_encrypted (defaults to config setting) + +
+ + + List all topics stored in the state. + + + Filter topics by network. + + + + + Submit a message to a Hedera Consensus Service topic + + + The topic ID or topic name. + + + + Submit a message to the topic. + + + + Account to use for signing the message. Can be an alias or `{accountId}:{private_key}`.
+ Required for public topics (without submit keys). For topics with submit keys, must be one of the authorized signers. +
+ + + Key manager to use: local or local_encrypted (defaults to config setting) + +
+ + + Find messages in a topic by sequence number or filters + + + The topic ID or topic name to filter for. + + + + Filter by sequence number greater than. + + + + Filter by sequence number greater than or equal to. + + + + Filter by sequence number less than. + + + + Filter by sequence number less than or equal to. + + + + Filter by sequence number equal to. + + \ No newline at end of file diff --git a/hedera/open-source-solutions/hiero-cli/scripting/quickstart.mdx b/hedera/open-source-solutions/hiero-cli/scripting/quickstart.mdx new file mode 100644 index 00000000..22ad83e0 --- /dev/null +++ b/hedera/open-source-solutions/hiero-cli/scripting/quickstart.mdx @@ -0,0 +1,124 @@ +--- +title: "Quickstart" +--- + +## Scripting with Hiero CLI + +Hiero CLI scripts let you run repeatable, end-to-end workflows for Hedera: creating accounts, transferring HBAR, creating tokens, submitting topic messages, and more. These scripts are designed to be non-interactive (safe for CI). + +Example scripts live in: +- [examples/scripts/*.sh](https://github.com/hiero-ledger/hiero-cli/tree/main/examples/scripts) +- shared helpers: [examples/scripts/common/*](https://github.com/hiero-ledger/hiero-cli/tree/main/examples/scripts/common) + +## Prerequisites + +- Node.js 18+ +- Build the CLI or have a globally installed version of the CLI +- Provide your Hedera operator credentials. Export these environment variables: + +```sh +export HEDERA_OPERATOR_ACCOUNT_ID=0.0.xxxxxx +export HEDERA_OPERATOR_KEY=302e020100300506032b657004220420... +``` + + + These are required for scripts that submit transactions to Hedera (e.g., create account, transfer, token operations). + + +## Script structure (recommended pattern) + +All example scripts follow the same layout: + +### Step 1: Strict bash mode + +```bash +#!/usr/bin/env bash +set -euo pipefail +``` + +- `-e` exit immediately on error +- `-u` error on undefined variables +- `-o` pipefail fail if any command in a pipe fails + +### Step 2: Load helpers & Setup + +Scripts load shared utilities from examples/scripts/common/. + +Typical helpers include: +- **structured log output** (print_step, print_info, print_error) +- **random alias generator** (pick_random_name) +- **sleep utilities** (sleep_loop) to wait for mirror-node consistency + +### Step 3: `hcli()` wrapper (where automation begins) + +From this point, scripts start executing real CLI commands. + +```sh +hcli() { + cd "${PROJECT_DIR}" && node dist/hiero-cli.js --format json "$@" +} +``` + +Why this wrapper matters: +- ensures commands run from the project root +- uses the built CLI entrypoint +- forces `--format json` so scripts don’t depend on human formatting +- prevents interactive prompts (better for CI / automation) + +## Quickstart script: create an account and view it + +This is the smallest “real” end-to-end example: +- configure network + operator +- create one account with 1 HBAR +- view account details + +First, create a file called `create-account-quickstart.sh` with the below script contents: + +```sh +#!/usr/bin/env bash +set -euo pipefail + +# --- Paths --- +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_DIR="$(cd "${SCRIPT_DIR}/../.." && pwd)" + +# --- Helpers --- +HELPERS="$SCRIPT_DIR/common/helpers.sh" +SETUP="$SCRIPT_DIR/common/setup.sh" + +source "$HELPERS" +source "$SETUP" + +# --- hcli wrapper (JSON output for scripting) --- +hcli() { + cd "${PROJECT_DIR}" && node dist/hiero-cli.js --format json "$@" +} + +print_step "Selecting Hedera testnet as the active network" +hcli network use --global testnet + +print_step "Configuring CLI operator for testnet" +hcli network set-operator \ + --operator "${HEDERA_OPERATOR_ACCOUNT_ID}:${HEDERA_OPERATOR_KEY}" \ + --network testnet + +ACCOUNT_NAME="$(pick_random_name)" +print_step "Creating demo account: ${ACCOUNT_NAME} (1 HBAR)" +hcli account create --name "${ACCOUNT_NAME}" --balance 1.0 + +print_info "Waiting briefly for mirror node indexing..." +sleep_loop 5 + +print_step "Viewing account ${ACCOUNT_NAME}" +hcli account view --account "${ACCOUNT_NAME}" + +print_step "Done." +``` + +Next, run it from the project root: + +```sh +./examples/scripts/create-account-quickstart.sh +``` + +Start building your own scripts or explore other examples in the [Hiero CLI repository](https://github.com/hiero-ledger/hiero-cli/tree/main/examples/scripts). \ No newline at end of file diff --git a/hedera/sdks-and-apis/hedera-api/miscellaneous/exchangerate.mdx b/hedera/sdks-and-apis/hedera-api/miscellaneous/exchangerate.mdx index e20c2f32..af0fd947 100644 --- a/hedera/sdks-and-apis/hedera-api/miscellaneous/exchangerate.mdx +++ b/hedera/sdks-and-apis/hedera-api/miscellaneous/exchangerate.mdx @@ -8,10 +8,10 @@ title: "ExchangeRate" An exchange rate between hbar and cents (USD) and the time at which the exchange rate will expire, and be superseded by a new exchange rate.\ The price is computed as follow: `1 hbar = (centEquiv / hbarEquiv) USD cents` -| Field | Type | Description | -| ---------------- | ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------ | -| `hbarEquiv` | | Denominator in calculation of exchange rate between hbar and cents | -| `centEquiv` | | Numerator in calculation of exchange rate between hbar and cents | +| Field | Type | Description | +| ---------------- | --------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | +| `centEquiv` | uint64 | Numerator in calculation of exchange rate between hbar and cents | +| `hbarEquiv` | uint64 | Denominator in calculation of exchange rate between hbar and cents | | `expirationTime` | [TimestampSeconds](/hedera/sdks-and-apis/hedera-api/miscellaneous/timestamp#timestampseconds) | Expiration time in seconds for this exchange rate | ## ExchangeRateSet diff --git a/hedera/sdks-and-apis/sdks/accounts-and-hbar/get-account-balance.mdx b/hedera/sdks-and-apis/sdks/accounts-and-hbar/get-account-balance.mdx index b9c643f3..026e8a15 100644 --- a/hedera/sdks-and-apis/sdks/accounts-and-hbar/get-account-balance.mdx +++ b/hedera/sdks-and-apis/sdks/accounts-and-hbar/get-account-balance.mdx @@ -7,27 +7,27 @@ A query that returns the account balance for the specified account. Requesting a In Services release 0.50, returning token balance from the consensus node was deprecated with HIP-367. This query returns token information by requesting the information from the Hedera Mirror Node APIs via [/api/v1/accounts/\{id\}/tokens](https://mainnet.mirrornode.hedera.com/api/v1/docs/#/accounts/listTokenRelationshipByAccountId). Token symbol is not returned in the response. - -#### **Recommend Using Mirror Node REST API** -For obtaining account balance and historical balance information, consider using the Mirror Node REST API endpoint [**List Account Balances**](https://docs.hedera.com/api-reference/balances/list-account-balances) which offers several advantages: + +#### **DEPRECATION NOTICE: `AccountBalanceQuery`** +The `AccountBalanceQuery` is deprecated and will be completely removed in **July 2026**. This is the only SDK method presented on this page and it will no longer function after this date. + +A gradual throttle reduction begins in **May 2026**. To avoid rate limiting and future service disruptions, you must migrate to the Mirror Node REST API. +📚 **For the full migration guide, read:** [Migrating from AccountBalanceQuery: What You Need to Know](https://hedera.com/blog/migrating-from-accountbalancequery-what-you-need-to-know ) + + + +#### **Recommend Using Mirror Node REST API** +For obtaining account balance and historical balance information, consider using the Mirror Node REST API endpoint [**List Account Balances**](https://docs.hedera.com/api-reference/balances/list-account-balances ) which offers several advantages: * **Cost-effective and scalable:** [Mirror node providers](/hedera/core-concepts/mirror-nodes/hedera-mirror-node#mainnet) offer paid plans with a large number of queries included. The Hedera-hosted mirror node offers free queries with specific throttles for testing. While account balance queries via SDK are currently free, this is subject to change in the future. * **Performance:** Mirror nodes don't burden consensus nodes, allowing them to focus on processing transactions and providing efficient access to historical data without impacting network performance. * **Historical data:** Mirror nodes store complete transaction history and balance snapshots - ideal for analytics, auditing, and monitoring past activity. -📚 **_For more details, please read our [blog post on querying data](https://hedera.com/blog/querying-data-on-hedera-sdk-vs-mirror-node-rest-api)._** - +📚 **For more details on querying data, read:** [Querying Data on Hedera: SDK vs Mirror Node REST API](https://hedera.com/blog/querying-data-on-hedera-sdk-vs-mirror-node-rest-api/ ) - - -##### **Avoid Using `AccountBalanceQuery`** - -Using `AccountBalanceQuery` is not recommended. **This query may not be supported in future releases**. For account balances and historical data, use the Mirror Node REST API. - - **Query Fees** diff --git a/hedera/sdks-and-apis/sdks/consensus-service/submit-a-message.mdx b/hedera/sdks-and-apis/sdks/consensus-service/submit-a-message.mdx index 68e80369..66ab3858 100644 --- a/hedera/sdks-and-apis/sdks/consensus-service/submit-a-message.mdx +++ b/hedera/sdks-and-apis/sdks/consensus-service/submit-a-message.mdx @@ -35,13 +35,6 @@ TopicMessageSubmitTransaction() ## **Transaction Fees** - -#### ⚠️ **Upcoming Price Change – ConsensusSubmitMessage** - -Starting **January 2026**, the price for the ConsensusSubmitMessage transaction will increase from **$0.0001** to **$0.0008** USD. This change will take effect with the **v0.69 mainnet release** and applies only to **`ConsensusSubmitMessage`** transactions. This update improves the long-term economic sustainability of the Hedera network while preserving predictable and USD-fixed pricing for developers. Read [this blog article](http://hedera.com/blog/price-update-to-consensussubmitmessage-in-consensus-service-january-2026) for more information. - - - - Each transaction incurs a standard Hedera network fee based on network resource usage. - If a custom fee is set for a topic, users submitting messages must pay this fee in HBAR or HTS tokens. - The Fee Schedule Key allows authorized users to update fee structures. If set, it must sign transactions modifying fees. @@ -49,13 +42,6 @@ Starting **January 2026**, the price for the ConsensusSubmitMessage transaction - If you submit a message to a topic with a custom fee, the cost changes from the baseline $0.0001 USD to roughly $0.05 USD per `TopicMessageSubmitTransaction`. - Use the [query fees table](/hedera/networks/mainnet/fees#consensus-service) for the base transaction fee and the [Hedera Fee Estimator](https://hedera.com/fees) to estimate standard network fees. - - **⚠️ Upcoming Price Change – ConsensusSubmitMessage** - -Starting **January 2026**, the price for the ConsensusSubmitMessage transaction will increase from `$0.0001` to `$0.0008` USD. This change will take effect with the **v0.69 mainnet release** and applies only to **`ConsensusSubmitMessage`** transactions. This update improves the long-term economic sustainability of the Hedera network while preserving predictable and USD-fixed pricing for developers. Read [this blog article](http://hedera.com/blog/price-update-to-consensussubmitmessage-in-consensus-service-january-2026) for more information. - - - ## Methods diff --git a/hedera/sdks-and-apis/sdks/queries.mdx b/hedera/sdks-and-apis/sdks/queries.mdx index 475cd5cb..05e709c2 100644 --- a/hedera/sdks-and-apis/sdks/queries.mdx +++ b/hedera/sdks-and-apis/sdks/queries.mdx @@ -7,17 +7,25 @@ Queries are requests that do not require network consensus. Queries are processe #### **Recommend Using Mirror Node REST API** - -For obtaining balance and historical information, consider using the [Mirror Node REST API](/hedera/sdks-and-apis/rest-api) which offers several advantages: - +For obtaining token information and historical data, consider using the Mirror Node REST API endpoint [**Get Token Account Balance**](https://docs.hedera.com/api-reference/tokens/list-token-balances ) which offers several advantages: * **Cost-effective and scalable:** [Mirror node providers](/hedera/core-concepts/mirror-nodes/hedera-mirror-node#mainnet) offer paid plans with a large number of queries included. The Hedera-hosted mirror node offers free queries with specific throttles for testing. While some SDK queries are currently free, these are subject to change in the future. * **Performance:** Mirror nodes don't burden consensus nodes, allowing them to focus on processing transactions and providing efficient access to historical data without impacting network performance. * **Historical data:** Mirror nodes store complete transaction history, records, and events - ideal for analytics, auditing, and monitoring past activity. -📚 **_For more details, please read our [blog post on querying data](https://hedera.com/blog/querying-data-on-hedera-sdk-vs-mirror-node-rest-api)._** - +📚 **For more details on querying data, read:** [Querying Data on Hedera: SDK vs Mirror Node REST API](https://hedera.com/blog/querying-data-on-hedera-sdk-vs-mirror-node-rest-api/ ) + +#### **DEPRECATION NOTICE: `AccountBalanceQuery`** +The `AccountBalanceQuery` is deprecated and will be completely removed in **July 2026**. This is the only SDK method presented on this page and it will no longer function after this date. + +A gradual throttle reduction begins in **May 2026**. To avoid rate limiting and future service disruptions, you must migrate to the Mirror Node REST API. + +📚 **For the full migration guide, read:** [Migrating from AccountBalanceQuery: What You Need to Know](https://hedera.com/blog/migrating-from-accountbalancequery-what-you-need-to-know ) + + + + | Cryptocurrency Accounts | Consensus | Tokens | File Service | Smart Contracts | Schedule Service | | -------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | | [AccountBalanceQuery](/hedera/sdks-and-apis/sdks/accounts-and-hbar/get-account-balance) | [TopicInfoQuery](/hedera/sdks-and-apis/sdks/consensus-service/get-topic-info) | [TokenBalanceQuery](/hedera/sdks-and-apis/sdks/token-service/get-account-token-balance) | [FileContentsQuery](/hedera/sdks-and-apis/sdks/file-service/get-file-contents) | [ContractCallQuery](/hedera/sdks-and-apis/sdks/smart-contracts/get-a-smart-contract-function) | [ScheduleInfoQuery](/hedera/sdks-and-apis/sdks/schedule-transaction/get-schedule-info) | diff --git a/hedera/sdks-and-apis/sdks/set-up-your-local-network.mdx b/hedera/sdks-and-apis/sdks/set-up-your-local-network.mdx index 8908c255..37c573e2 100644 --- a/hedera/sdks-and-apis/sdks/set-up-your-local-network.mdx +++ b/hedera/sdks-and-apis/sdks/set-up-your-local-network.mdx @@ -2,6 +2,9 @@ title: "Set Up Your Local Network" --- +import LocalNodeDeprecation from '/snippets/local-node-deprecation.mdx'; + + While you are developing your application, you can use the Hedera-supported networks (previewnet and testnet) to test your application against. In addition to using those networks, you have the option to set up your own local consensus node and mirror node for testing purposes. diff --git a/hedera/sdks-and-apis/sdks/smart-contracts/call-a-smart-contract-function.mdx b/hedera/sdks-and-apis/sdks/smart-contracts/call-a-smart-contract-function.mdx index 713769c8..b3477bfa 100644 --- a/hedera/sdks-and-apis/sdks/smart-contracts/call-a-smart-contract-function.mdx +++ b/hedera/sdks-and-apis/sdks/smart-contracts/call-a-smart-contract-function.mdx @@ -24,7 +24,7 @@ The amount of gas used, as well as other attributes of the transaction, e.g. siz ```java Java //Create the transaction -ContractCreateTransaction transaction = new ContractExecuteTransaction() +ContractExecuteTransaction transaction = new ContractExecuteTransaction() .setContractId(newContractId) .setGas(100_000_000) .setFunction("set_message", new ContractFunctionParameters() diff --git a/hedera/sdks-and-apis/sdks/token-service/get-account-token-balance.mdx b/hedera/sdks-and-apis/sdks/token-service/get-account-token-balance.mdx index acbfd3c4..336a2333 100644 --- a/hedera/sdks-and-apis/sdks/token-service/get-account-token-balance.mdx +++ b/hedera/sdks-and-apis/sdks/token-service/get-account-token-balance.mdx @@ -5,16 +5,29 @@ title: "Get account token balance" To get the balance of tokens for an account, you can submit an account balance query. The account balance query will return the tokens the account holds in a list format. + + +#### **DEPRECATION NOTICE: `AccountBalanceQuery`** + +The `AccountBalanceQuery` is deprecated and will be completely removed in **July 2026**. This is the only SDK method presented on this page and it will no longer function after this date. + +A gradual throttle reduction begins in **May 2026**. To avoid rate limiting and future service disruptions, you must migrate to the Mirror Node REST API. + +📚 **For the full migration guide, read:** [Migrating from AccountBalanceQuery: What You Need to Know](https://hedera.com/blog/migrating-from-accountbalancequery-what-you-need-to-know ) + + + + #### **Recommend Using Mirror Node REST API** -For obtaining token information and historical data, consider using the Mirror Node REST API endpoint [**Get Token Account Balance**](https://docs.hedera.com/api-reference/tokens/list-token-balances) which offers several advantages: +For obtaining token information and historical data, consider using the Mirror Node REST API endpoint [**List Token Balances**](https://docs.hedera.com/api-reference/tokens/list-token-balances) which offers several advantages: * **Cost-effective and scalable:** [Mirror node providers](/hedera/core-concepts/mirror-nodes/hedera-mirror-node#mainnet) offer paid plans with a large number of queries included. The Hedera-hosted mirror node offers free queries with specific throttles for testing. While some SDK queries are currently free, these are subject to change in the future. * **Performance:** Mirror nodes don't burden consensus nodes, allowing them to focus on processing transactions and providing efficient access to historical data without impacting network performance. * **Historical data:** Mirror nodes store complete transaction history, records, and events - ideal for analytics, auditing, and monitoring past activity. -📚 **_For more details, please read our [blog post on querying data](https://hedera.com/blog/querying-data-on-hedera-sdk-vs-mirror-node-rest-api)._** +📚 **For more details on querying data, read:** [Querying Data on Hedera: SDK vs Mirror Node REST API](https://hedera.com/blog/querying-data-on-hedera-sdk-vs-mirror-node-rest-api/). diff --git a/hedera/support-and-community/glossary.mdx b/hedera/support-and-community/glossary.mdx index b1f487b0..32f02f8e 100644 --- a/hedera/support-and-community/glossary.mdx +++ b/hedera/support-and-community/glossary.mdx @@ -125,6 +125,16 @@ A 32-byte prefix of the running hash of the last Record Stream Object from the p A successive number assigned to each record file, incremented by one for each new file. For pre-existing networks, this value is bootstrapped through [mirror nodes](#mirror-nodes) and subsequently maintained by service nodes. + +### Block Stream + +--- + +A block stream is a new, unified data format for consensus nodes that consolidates event streams, record streams, sidecars, and signature files into a single, cohesive stream. Each block in the stream is a self-contained, independently verifiable entity that includes all transactions, events, and state changes for a given round of consensus. This design enhances transparency and trust within the network by allowing downstream services to seamlessly maintain and verify the network state. Block streams are defined by a comprehensive Protobuf specification, ensuring clear and consistent data structures for inputs, outputs, and state changes at the consensus node level. + +[HIP-1056: Block Streams](https://hips.hedera.com/hip/hip-1056) | [Block Node Repository](https://github.com/hiero-ledger/hiero-block-node) + + ### Block Timestamp --- @@ -454,11 +464,17 @@ The principle that all transactions on a distributed ledger should be treated eq A "fallback fee" in the context of Hedera and smart contracts is a type of custom fee that is charged to the recipient of a token transfer, rather than the sender. This can lead to vulnerabilities in smart contracts if they unknowingly accept a token with a high fallback fee, resulting in a loss of funds. Discussions on mitigation strategies, such as sender-pays models or limits on custom fees, are ongoing. [Here's](https://hedera.com/blog/nft-royalty-fees-hedera-hashgraph) a comprehensive blog post covering fallback fees. +### Fee Collection Account + +--- + +The single, special network account (0.0.802) that consolidates all HBAR network transaction fees before they are distributed daily to reward and treasury accounts. This process, introduced in [HIP-1259](https://hips.hedera.com/hip/hip-1259), simplifies transaction records and improves network efficiency. + ### Fee Collector Account --- -A fee collector account is an account designated to receive transaction fees and [custom token fees](/hedera/sdks-and-apis/sdks/token-service/custom-token-fees) on the Hedera network. The account collects the fees users pay for executing transactions and queries on the network. +A user-designated account that receives custom fees from transfers of a specific token. The token creator defines this account in the token's fee schedule. ### Fiat Currency diff --git a/hedera/tutorials.mdx b/hedera/tutorials.mdx index cd52fd46..1a88dd4e 100644 --- a/hedera/tutorials.mdx +++ b/hedera/tutorials.mdx @@ -3,6 +3,29 @@ title: Tutorials sidebarTitle: Overview --- +## Hello Future: Apex Hackathon + +The Hedera Hello Future Apex Hackathon brings together new and experienced builders worldwide to collaborate and compete virtually. + + + + - **⚠️ Upcoming Price Change – ConsensusSubmitMessage** - -Starting **January 2026**, the price for the ConsensusSubmitMessage transaction will increase from `$0.0001` to `$0.0008` USD. This change will take effect with the **v0.69 mainnet release** and applies only to **`ConsensusSubmitMessage`** transactions. This update improves the long-term economic sustainability of the Hedera network while preserving predictable and USD-fixed pricing for developers. Read [this blog article](http://hedera.com/blog/price-update-to-consensussubmitmessage-in-consensus-service-january-2026) for more information. - - - --- ## Code Check ✅ diff --git a/hedera/tutorials/consensus/submit-your-first-message.mdx b/hedera/tutorials/consensus/submit-your-first-message.mdx index 449331a0..506884de 100644 --- a/hedera/tutorials/consensus/submit-your-first-message.mdx +++ b/hedera/tutorials/consensus/submit-your-first-message.mdx @@ -219,13 +219,6 @@ time.Sleep(30000) To conclude: The total cost to create a topic and send a message to it is **$0.0101.** - - **⚠️ Upcoming Price Change – ConsensusSubmitMessage** - -Starting **January 2026**, the price for the ConsensusSubmitMessage transaction will increase from `$0.0001` to `$0.0008` USD. This change will take effect with the **v0.69 mainnet release** and applies only to **`ConsensusSubmitMessage`** transactions. This update improves the long-term economic sustainability of the Hedera network while preserving predictable and USD-fixed pricing for developers. Read [this blog article](http://hedera.com/blog/price-update-to-consensussubmitmessage-in-consensus-service-january-2026) for more information. - - - --- ## Code Check ✅ diff --git a/hedera/tutorials/local-node.mdx b/hedera/tutorials/local-node.mdx index 41154e75..10bfadd0 100644 --- a/hedera/tutorials/local-node.mdx +++ b/hedera/tutorials/local-node.mdx @@ -3,6 +3,9 @@ title: Local Node sidebarTitle: Overview --- +import LocalNodeDeprecation from '/snippets/local-node-deprecation.mdx'; + + diff --git a/hedera/tutorials/local-node/how-to-run-hedera-local-node-in-a-cloud-development-environment-cde.mdx b/hedera/tutorials/local-node/how-to-run-hedera-local-node-in-a-cloud-development-environment-cde.mdx index 4baa657a..39093293 100644 --- a/hedera/tutorials/local-node/how-to-run-hedera-local-node-in-a-cloud-development-environment-cde.mdx +++ b/hedera/tutorials/local-node/how-to-run-hedera-local-node-in-a-cloud-development-environment-cde.mdx @@ -2,6 +2,15 @@ title: How to Run Hedera Local Node in a Cloud Development Environment (CDE) sidebarTitle: Overview --- + +import LocalNodeDeprecation from '/snippets/local-node-deprecation.mdx'; + + + +import LocalNodeDeprecation from '/snippets/local-node-deprecation.mdx'; + + + The [**Hedera Local Node**](https://github.com/hashgraph/hedera-local-node) project enables developers to establish their own local network for development and testing. The local network comprises the consensus node, mirror node, [JSON-RPC relay](https://github.com/hashgraph/hedera-json-rpc-relay#readme), and other Consensus Node services be set up without Docker and draining your computer’s resources by using .Cloud Development Environments (CDEs). CDEs allows developers to work from any device without the need to maintain static and brittle local development environments. ## **Available Services** diff --git a/hedera/tutorials/local-node/how-to-run-hedera-local-node-in-a-cloud-development-environment-cde/codespaces.mdx b/hedera/tutorials/local-node/how-to-run-hedera-local-node-in-a-cloud-development-environment-cde/codespaces.mdx index 679aeca3..1fb1671b 100644 --- a/hedera/tutorials/local-node/how-to-run-hedera-local-node-in-a-cloud-development-environment-cde/codespaces.mdx +++ b/hedera/tutorials/local-node/how-to-run-hedera-local-node-in-a-cloud-development-environment-cde/codespaces.mdx @@ -2,6 +2,9 @@ title: "Run a Local Node in Codespaces" --- +import LocalNodeDeprecation from '/snippets/local-node-deprecation.mdx'; + + Codespaces is a cloud development environment (CDE) that's hosted in the cloud. You can customize your project for GitHub Codespaces by committing configuration files to your repository (often known as Configuration-as-Code), which creates a repeatable codespaces configuration for all users of your project. [GitHub Codespaces overview](https://docs.github.com/en/codespaces/overview) diff --git a/hedera/tutorials/local-node/how-to-run-hedera-local-node-in-a-cloud-development-environment-cde/gitpod.mdx b/hedera/tutorials/local-node/how-to-run-hedera-local-node-in-a-cloud-development-environment-cde/gitpod.mdx index 88508722..0fcdf834 100644 --- a/hedera/tutorials/local-node/how-to-run-hedera-local-node-in-a-cloud-development-environment-cde/gitpod.mdx +++ b/hedera/tutorials/local-node/how-to-run-hedera-local-node-in-a-cloud-development-environment-cde/gitpod.mdx @@ -2,6 +2,9 @@ title: "Run a Local Node in Gitpod" --- +import LocalNodeDeprecation from '/snippets/local-node-deprecation.mdx'; + + The local network comprises the consensus node, mirror node, [JSON-RPC relay](https://github.com/hashgraph/hedera-json-rpc-relay#readme), and other Consensus Node services and now be set up without Docker and draining your computer’s resources by using Gitpod. Gitpod provides Cloud Development Environments (CDEs) and allows developers to work from any device without the need to maintain static and brittle local development environments. By the end of this tutorial, you will have your Hedera local node running on Gitpod. diff --git a/hedera/tutorials/local-node/how-to-set-up-a-hedera-local-node.mdx b/hedera/tutorials/local-node/how-to-set-up-a-hedera-local-node.mdx index e4f9445b..dea3255e 100644 --- a/hedera/tutorials/local-node/how-to-set-up-a-hedera-local-node.mdx +++ b/hedera/tutorials/local-node/how-to-set-up-a-hedera-local-node.mdx @@ -2,6 +2,9 @@ title: "How to Set Up a Hedera Local Node" --- +import LocalNodeDeprecation from '/snippets/local-node-deprecation.mdx'; + + The [**Hedera Local Node**](https://github.com/hashgraph/hedera-local-node) project enables developers to establish their own local network for development and testing. The local network comprises the consensus node, mirror node, [JSON-RPC relay](https://github.com/hashgraph/hedera-json-rpc-relay#readme), and other Hedera products, and can be set up using the CLI tool and Docker. This setup allows you to seamlessly build and deploy smart contracts from your local environment. diff --git a/hedera/tutorials/local-node/setup-hedera-node-cli-npm.mdx b/hedera/tutorials/local-node/setup-hedera-node-cli-npm.mdx index 660f079f..b5373ddb 100644 --- a/hedera/tutorials/local-node/setup-hedera-node-cli-npm.mdx +++ b/hedera/tutorials/local-node/setup-hedera-node-cli-npm.mdx @@ -2,6 +2,10 @@ title: "Set Up a Hedera Local Node using the NPM CLI" --- +import LocalNodeDeprecation from '/snippets/local-node-deprecation.mdx'; + + + Hedera is an open-source, public, proof-of-stake network. Its network services offer low and fixed fees, 10k TPS, and instant transaction finality. Learn more about the [Hedera platform and how it works](https://hedera.com/how-it-works). In this tutorial, we will adopt, set up, and run a Hedera node locally using the [@hashgraph/hedera-local](https://www.npmjs.com/package/@hashgraph/hedera-local) NPM Command Line Interface (CLI) tool with `docker compose`. diff --git a/hedera/tutorials/more-tutorials.mdx b/hedera/tutorials/more-tutorials.mdx index efd0efc8..2aa3bc2f 100644 --- a/hedera/tutorials/more-tutorials.mdx +++ b/hedera/tutorials/more-tutorials.mdx @@ -3,38 +3,78 @@ title: More Tutorials sidebarTitle: Overview --- + + + + + + + +## Developer Tools + + + + + + + + > + + + + > + + + > @@ -42,18 +82,15 @@ sidebarTitle: Overview ## The Basics - + - + > - - - + + + + + + - - -## Developer Tools - - - > - - - - > - - - > + + diff --git a/hedera/tutorials/more-tutorials/HSM-signing.mdx b/hedera/tutorials/more-tutorials/HSM-signing.mdx new file mode 100644 index 00000000..3ecc4c0a --- /dev/null +++ b/hedera/tutorials/more-tutorials/HSM-signing.mdx @@ -0,0 +1,55 @@ +--- +title: HSM/KMS Signing Solutions +sidebarTitle: Overview +--- + +This collection of tutorials demonstrates how to sign Hedera Hashgraph transactions using keys stored in various cloud-based Key Management Services (KMS) and Hardware Security Modules (HSMs). These examples show how to integrate Hedera with popular cloud providers to ensure that your private keys are never exposed in your application environment. + +## How it Works + +The general workflow for each solution is as follows: + +1. **Key Generation**: An asymmetric key is created and stored in the respective KMS/HSM service. +2. **Public Key Retrieval**: The public key corresponding to the stored private key is fetched from the KMS. +3. **Hedera Account Creation**: A new Hedera account is created and associated with the retrieved public key. +4. **Transaction Signing**: A custom signer function is implemented that sends transaction bytes to the KMS/HSM for signing. The Hedera SDK is configured to use this custom signer. +5. **Transaction Execution**: Transactions are executed on the Hedera network using the client configured with the custom signer. + +## General Prerequisites + +Before you begin, ensure you have the following: + +- A **Hedera Testnet account**. If you don't have one, you can register at the [Hedera Developer Portal](https://portal.hedera.com/). +- **Node.js** (version 18.0.0 or higher). +- Cloud-specific CLI tools and accounts as detailed in the provider-specific sections. + +## Provider Examples + + + + Sign transactions using an asymmetric key stored in AWS Key Management Service. + + + Utilize an HSM-backed secp256k1 key in Azure Key Vault (Premium SKU) for signing. + + + Sign transactions with a Google Cloud HSM-backed secp256k1 key. + + + +## Disclaimer + +These examples are for demonstration purposes only. When implementing in a production environment, always follow security best practices for key management and access control. + +## Resources + +- [GitHub Repository](https://github.com/hedera-dev/tutorial-hsm-signing) diff --git a/hedera/tutorials/more-tutorials/HSM-signing/aws-kms.mdx b/hedera/tutorials/more-tutorials/HSM-signing/aws-kms.mdx new file mode 100644 index 00000000..a5febba3 --- /dev/null +++ b/hedera/tutorials/more-tutorials/HSM-signing/aws-kms.mdx @@ -0,0 +1,214 @@ +--- +title: "Sign Hedera Transactions with AWS KMS" +--- + +This tutorial demonstrates how to use an `ECC_SECG_P256K1` key in AWS KMS to sign Hedera transactions. This solution ensures that your private keys are never exposed in your application environment. + +--- + +## Prerequisites + +Before you begin, ensure you have: + +- An **AWS account** with appropriate permissions +- **AWS CLI** installed and configured ([Installation Instructions](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)) +- **Node.js** (version 18.0.0 or higher) +- A **Hedera Testnet account**. If you don't have one, you can register at the [Hedera Developer Portal](https://portal.hedera.com/) + +--- + +## Part 1: AWS KMS Setup + +### 1. Create an ECC Key in AWS KMS + +Create an asymmetric key with the `ECC_SECG_P256K1` key spec, which is compatible with Hedera's ECDSA key requirements. + +```bash +# Create the KMS key +aws kms create-key \ + --key-spec ECC_SECG_P256K1 \ + --key-usage SIGN_VERIFY \ + --description "Hedera transaction signing key" +``` + +Save the **Key ID** from the output. It will look like: `arn:aws:kms:us-east-1:123456789012:key/abcd1234-5678-90ab-cdef-EXAMPLE11111` + +### 2. Create a Key Alias (Optional but Recommended) + +Create an alias for easier reference to your key. + +```bash +aws kms create-alias \ + --alias-name alias/hedera-signing-key \ + --target-key-id +``` + +### 3. Set Up IAM Permissions + +Create an IAM policy that allows your application to use the KMS key for signing operations. + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "kms:Sign", + "kms:GetPublicKey", + "kms:DescribeKey" + ], + "Resource": "" + } + ] +} +``` + +Attach this policy to an IAM user or role that your application will use. + +--- + +## Part 2: Application Setup + +### 1. Install Dependencies + +Create a new Node.js project and install the required dependencies. + +```bash +npm init -y +npm install @hashgraph/sdk @aws-sdk/client-kms dotenv +``` + +### 2. Create the `.env` File + +Create a `.env` file with your AWS credentials and Hedera account details. + +``` +# AWS KMS Configuration +AWS_REGION=us-east-1 +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +KMS_KEY_ID= + +# Hedera Account Details +HEDERA_ACCOUNT_ID= +HEDERA_PRIVATE_KEY= +HEDERA_NETWORK=testnet +``` + +### 3. Create the Signer Function + +Create a custom signer function that uses AWS KMS to sign transaction bytes. + +```javascript +const { KMSClient, SignCommand, GetPublicKeyCommand } = require("@aws-sdk/client-kms"); +const { PrivateKey } = require("@hashgraph/sdk"); + +const kmsClient = new KMSClient({ region: process.env.AWS_REGION }); + +async function createKmsSigner(keyId) { + // Get the public key from KMS + const getPublicKeyCommand = new GetPublicKeyCommand({ KeyId: keyId }); + const publicKeyResponse = await kmsClient.send(getPublicKeyCommand); + + // Convert the public key to Hedera format + const publicKeyBytes = Buffer.from(publicKeyResponse.PublicKey); + const publicKey = PrivateKey.fromBytesECDSA(publicKeyBytes); + + // Return a signer function + return async (message) => { + const signCommand = new SignCommand({ + KeyId: keyId, + Message: message, + MessageType: "RAW", + SigningAlgorithm: "ECDSA_SHA_256" + }); + + const signResponse = await kmsClient.send(signCommand); + return Buffer.from(signResponse.Signature); + }; +} +``` + +### 4. Create and Sign a Transaction + +Use the custom signer to create and sign a Hedera transaction. + +```javascript +const { Client, AccountCreateTransaction, Hbar } = require("@hashgraph/sdk"); +require("dotenv").config(); + +async function main() { + // Create Hedera client + const client = Client.forTestnet(); + client.setOperator( + process.env.HEDERA_ACCOUNT_ID, + process.env.HEDERA_PRIVATE_KEY + ); + + // Create KMS signer + const kmsSigner = await createKmsSigner(process.env.KMS_KEY_ID); + + // Create a new account with the KMS public key + const transaction = await new AccountCreateTransaction() + .setKey(kmsSigner.publicKey) + .setInitialBalance(Hbar.fromTinybars(100)) + .freezeWith(client); + + // Sign with KMS + const signature = await kmsSigner(transaction.toBytes()); + transaction.addSignature(kmsSigner.publicKey, signature); + + // Execute the transaction + const response = await transaction.execute(client); + const receipt = await response.getReceipt(client); + + console.log("Account created:", receipt.accountId.toString()); +} + +main().catch(console.error); +``` + +--- + +## Part 3: Verification + +### 1. Verify Key Configuration + +Verify that your KMS key is configured correctly: + +```bash +aws kms describe-key --key-id +``` + +The output should show: +- `KeySpec: ECC_SECG_P256K1` +- `KeyUsage: SIGN_VERIFY` + +### 2. Test Transaction Signing + +Run your application and verify that transactions are being signed successfully with the KMS key. + +--- + +## Cleanup + +To avoid ongoing charges, delete the KMS key when you're done: + +```bash +# Schedule key deletion (7-30 days) +aws kms schedule-key-deletion --key-id --pending-window-in-days 7 + +# Or delete immediately (if key is not in use) +aws kms delete-key --key-id +``` + + +**Important**: Deleting a KMS key is irreversible. Make sure you have backups of any data encrypted with this key before deletion. + + +## Resources + +- [GitHub Repository - AWS KMS Signing](https://github.com/hedera-dev/tutorial-hsm-signing/tree/master/hedera-aws-kms-signing) +- [AWS KMS Documentation](https://docs.aws.amazon.com/kms/) +- [Hedera SDK Documentation](/hedera/sdks-and-apis) diff --git a/hedera/tutorials/more-tutorials/HSM-signing/azure-key-vault.mdx b/hedera/tutorials/more-tutorials/HSM-signing/azure-key-vault.mdx new file mode 100644 index 00000000..31b14473 --- /dev/null +++ b/hedera/tutorials/more-tutorials/HSM-signing/azure-key-vault.mdx @@ -0,0 +1,169 @@ +--- +title: "Sign Hedera Transactions with Azure Key Vault" +--- + +This guide provides a comprehensive walkthrough for setting up a **secp256k1 signing key in an Azure Key Vault (Premium SKU)** and using it to sign Hedera Hashgraph transactions with a Node.js application. It incorporates solutions to common Azure CLI and SDK integration issues. + +--- + +## Part 1: Azure Infrastructure Setup (CLI) + +These steps will configure all the necessary cloud resources using the Azure CLI. + +### 1. Prerequisites + +| Requirement | Notes | +| :--- | :--- | +| **Azure Account** | A free trial with credits will work. | +| **Azure CLI** | [Installation Instructions](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli) | +| **Node.js & npm** | Version 18.0.0 or higher. | + +### 2. Login and Set Subscription + +First, log in to your Azure account and set the subscription you want to use. + +```bash +# Log in to your Azure account +az login + +# List your available subscriptions +az account list --output table + +# Set the active subscription +az account set --subscription "" +``` + +### 3. Create a Resource Group + +A resource group is a container for all your project's Azure resources. + +```bash +az group create --name "hedera-hsm-rg" --location "eastus" +``` + +### 4. Register the Key Vault Provider + +Your subscription must be registered to use the Key Vault service. This step prevents the `MissingSubscriptionRegistration` error. + +```bash +# Register the provider +az provider register --namespace Microsoft.KeyVault + +# Check the registration status (wait for "Registered") +az provider show -n Microsoft.KeyVault --query "registrationState" +``` + +### 5. Create a Premium Key Vault + +To use HSM-backed keys (`EC-HSM`), you **must** use the **Premium** SKU. This prevents the `HardwareKeysNotSupported` error. The Key Vault name must be globally unique. + +```bash +# Set a unique name for your Key Vault +export KEY_VAULT_NAME="hedera-hsm-vault-$RANDOM" + +# Create the vault with the Premium SKU +az keyvault create --name $KEY_VAULT_NAME --resource-group "hedera-hsm-rg" --location "eastus" --sku "Premium" +``` + +### 6. Create the HSM-Backed Key + +Now, create the `EC-HSM` key. Before you do, you must grant your own user account permission to create keys in the vault. This prevents the `Forbidden` error during key creation. + +```bash +# Grant your user account the "Key Vault Crypto Officer" role +az role assignment create --role "Key Vault Crypto Officer" --assignee --scope "/subscriptions//resourceGroups/hedera-hsm-rg/providers/Microsoft.KeyVault/vaults/$KEY_VAULT_NAME" + +# Wait a minute for permissions to apply, then create the HSM key +az keyvault key create --vault-name $KEY_VAULT_NAME --name "hedera-secp256k1-hsm" --kty "EC-HSM" --curve "P-256K" +``` + +### 7. Create a Service Principal + +Create a service principal to authenticate with Azure. + +```bash +az ad sp create-for-rbac --name "HederaHSMSigner" +``` + +This will output a JSON object. **Save the `appId`, `password`, and `tenant` values** for your `.env` file later. + +### 8. Grant Service Principal Access + +Grant the service principal the "Key Vault Crypto User" role. This role allows it to get the public key and perform sign operations. We use the `--assignee` flag with the service principal's `appId` to avoid argument errors. + +```bash +# Set the appId from the previous step as a variable +export AZURE_CLIENT_ID="" + +# Assign the role +az role assignment create --role "Key Vault Crypto User" --assignee $AZURE_CLIENT_ID --scope "/subscriptions//resourceGroups/hedera-hsm-rg/providers/Microsoft.KeyVault/vaults/$KEY_VAULT_NAME" +``` + +--- + +## Part 2: Running the Script + +Now that the Azure infrastructure is ready, you can configure and run the application. + +### 1. Install Dependencies + +In your project directory, install the necessary Azure packages. + +```bash +npm install +``` + +### 2. Create the `.env` File + +Create a file named `.env` and populate it with your credentials. + +``` +# Service Principal Credentials from Step 7 +AZURE_CLIENT_ID="" +AZURE_CLIENT_SECRET="" +AZURE_TENANT_ID="" + +# Key Vault Details +AZURE_KEY_VAULT_URI="https://.vault.azure.net" +AZURE_KEY_NAME="hedera-secp256k1-hsm" + +# Hedera Account Details +HEDERA_ACCOUNT_ID="" +HEDERA_PRIVATE_KEY="" +``` + +### 3. Run the `azure-hedera-hsm.js` Script + +Finally, execute the script. + +```bash +node azure-hedera-hsm.js +``` + +You should see a successful run, creating an account and signing a transaction using your Azure HSM key. + +--- + +## Part 3: Verification and Cleanup + +### 1. Verify HSM Usage + +To confirm that the key is HSM-protected, run this command. + +```bash +az keyvault key show --vault-name $KEY_VAULT_NAME --name "hedera-secp256k1-hsm" --query "key.kty" +``` + +The output must be `"EC-HSM"`. + +### 2. Cleanup + +To delete all the created resources, simply delete the resource group. + +```bash +az group delete --name "hedera-hsm-rg" --yes +``` + +## Resources + +- [GitHub Repository - Azure KMS Signing](https://github.com/hedera-dev/tutorial-hsm-signing/tree/master/hedera-azure-kms-signing) diff --git a/hedera/tutorials/more-tutorials/HSM-signing/gcp-kms.mdx b/hedera/tutorials/more-tutorials/HSM-signing/gcp-kms.mdx new file mode 100644 index 00000000..98ee630d --- /dev/null +++ b/hedera/tutorials/more-tutorials/HSM-signing/gcp-kms.mdx @@ -0,0 +1,276 @@ +--- +title: "Sign Hedera Transactions with Google Cloud HSM" +--- + +This tutorial demonstrates how to use a Google Cloud HSM-backed `secp256k1` key for signing Hedera transactions. This solution ensures that your private keys are stored securely in Google Cloud's Hardware Security Module. + +--- + +## Prerequisites + +Before you begin, ensure you have: + +- A **Google Cloud Platform (GCP) account** with billing enabled +- **Google Cloud SDK (gcloud)** installed and configured ([Installation Instructions](https://cloud.google.com/sdk/docs/install)) +- **Node.js** (version 18.0.0 or higher) +- A **Hedera Testnet account**. If you don't have one, you can register at the [Hedera Developer Portal](https://portal.hedera.com/) + +--- + +## Part 1: Google Cloud HSM Setup + +### 1. Enable Required APIs + +Enable the Cloud KMS API for your project. + +```bash +# Set your project ID +export PROJECT_ID="your-gcp-project-id" + +# Enable Cloud KMS API +gcloud services enable cloudkms.googleapis.com --project=$PROJECT_ID +``` + +### 2. Create a Key Ring + +Create a key ring to organize your keys. Key rings must be created in a specific location. + +```bash +# Set the location (e.g., us-east1, us-west1, etc.) +export LOCATION="us-east1" + +# Create the key ring +gcloud kms keyrings create hedera-keyring \ + --location=$LOCATION \ + --project=$PROJECT_ID +``` + +### 3. Create an HSM-Backed Key + +Create a `secp256k1` key with HSM protection. This requires Cloud HSM, which provides FIPS 140-2 Level 3 certified hardware. + +```bash +# Create the HSM key +gcloud kms keys create hedera-secp256k1-key \ + --keyring=hedera-keyring \ + --location=$LOCATION \ + --purpose=asymmetric-signing \ + --default-algorithm=ec-sign-p256-sha256 \ + --protection-level=hsm \ + --project=$PROJECT_ID +``` + + +**Note**: HSM protection level requires Cloud HSM, which may have additional costs. For development, you can use `software` protection level, but for production, HSM is recommended. + + +### 4. Set Up Service Account + +Create a service account for your application to authenticate with GCP. + +```bash +# Create service account +gcloud iam service-accounts create hedera-kms-signer \ + --display-name="Hedera KMS Signer" \ + --project=$PROJECT_ID + +# Get the service account email +export SERVICE_ACCOUNT_EMAIL="hedera-kms-signer@${PROJECT_ID}.iam.gserviceaccount.com" +``` + +### 5. Grant Permissions + +Grant the service account permission to use the key for signing operations. + +```bash +# Grant Cloud KMS CryptoKey Signer role +gcloud kms keys add-iam-policy-binding hedera-secp256k1-key \ + --location=$LOCATION \ + --keyring=hedera-keyring \ + --member="serviceAccount:${SERVICE_ACCOUNT_EMAIL}" \ + --role="roles/cloudkms.signer" \ + --project=$PROJECT_ID +``` + +### 6. Create and Download Service Account Key + +Create a key file for the service account to authenticate your application. + +```bash +# Create and download the key file +gcloud iam service-accounts keys create ~/hedera-kms-key.json \ + --iam-account=$SERVICE_ACCOUNT_EMAIL \ + --project=$PROJECT_ID +``` + +--- + +## Part 2: Application Setup + +### 1. Install Dependencies + +Create a new Node.js project and install the required dependencies. + +```bash +npm init -y +npm install @hashgraph/sdk @google-cloud/kms dotenv +``` + +### 2. Create the `.env` File + +Create a `.env` file with your GCP credentials and Hedera account details. + +``` +# Google Cloud Configuration +GOOGLE_APPLICATION_CREDENTIALS=/path/to/hedera-kms-key.json +GCP_PROJECT_ID= +GCP_LOCATION=us-east1 +GCP_KEY_RING=hedera-keyring +GCP_KEY_NAME=hedera-secp256k1-key + +# Hedera Account Details +HEDERA_ACCOUNT_ID= +HEDERA_PRIVATE_KEY= +HEDERA_NETWORK=testnet +``` + +### 3. Create the Signer Function + +Create a custom signer function that uses Google Cloud KMS to sign transaction bytes. + +```javascript +const { KeyManagementServiceClient } = require("@google-cloud/kms"); +const { PrivateKey } = require("@hashgraph/sdk"); + +const client = new KeyManagementServiceClient(); + +async function createGcpKmsSigner(projectId, location, keyRing, keyName) { + const keyPath = client.cryptoKeyPath(projectId, location, keyRing, keyName); + + // Get the public key from KMS + const [publicKeyResponse] = await client.getPublicKey({ + name: client.cryptoKeyVersionPath(projectId, location, keyRing, keyName, "1") + }); + + // Convert the public key to Hedera format + const publicKeyBytes = Buffer.from(publicKeyResponse.pem, "base64"); + const publicKey = PrivateKey.fromBytesECDSA(publicKeyBytes); + + // Return a signer function + return { + publicKey: publicKey, + sign: async (message) => { + const [signResponse] = await client.asymmetricSign({ + name: client.cryptoKeyVersionPath(projectId, location, keyRing, keyName, "1"), + digest: { + sha256: message + } + }); + + return Buffer.from(signResponse.signature, "base64"); + } + }; +} +``` + +### 4. Create and Sign a Transaction + +Use the custom signer to create and sign a Hedera transaction. + +```javascript +const { Client, AccountCreateTransaction, Hbar } = require("@hashgraph/sdk"); +require("dotenv").config(); + +async function main() { + // Create Hedera client + const client = Client.forTestnet(); + client.setOperator( + process.env.HEDERA_ACCOUNT_ID, + process.env.HEDERA_PRIVATE_KEY + ); + + // Create GCP KMS signer + const kmsSigner = await createGcpKmsSigner( + process.env.GCP_PROJECT_ID, + process.env.GCP_LOCATION, + process.env.GCP_KEY_RING, + process.env.GCP_KEY_NAME + ); + + // Create a new account with the KMS public key + const transaction = await new AccountCreateTransaction() + .setKey(kmsSigner.publicKey) + .setInitialBalance(Hbar.fromTinybars(100)) + .freezeWith(client); + + // Sign with KMS + const messageHash = transaction.toBytes(); + const signature = await kmsSigner.sign(messageHash); + transaction.addSignature(kmsSigner.publicKey, signature); + + // Execute the transaction + const response = await transaction.execute(client); + const receipt = await response.getReceipt(client); + + console.log("Account created:", receipt.accountId.toString()); +} + +main().catch(console.error); +``` + +--- + +## Part 3: Verification + +### 1. Verify Key Configuration + +Verify that your KMS key is configured correctly: + +```bash +gcloud kms keys describe hedera-secp256k1-key \ + --keyring=hedera-keyring \ + --location=$LOCATION \ + --project=$PROJECT_ID +``` + +The output should show: +- `purpose: ASYMMETRIC_SIGN` +- `algorithm: EC_SIGN_P256_SHA256` +- `protectionLevel: HSM` + +### 2. Test Transaction Signing + +Run your application and verify that transactions are being signed successfully with the GCP HSM key. + +--- + +## Cleanup + +To avoid ongoing charges, delete the KMS key and related resources when you're done: + +```bash +# Delete the key (this schedules deletion, keys are retained for 24 hours) +gcloud kms keys destroy hedera-secp256k1-key \ + --keyring=hedera-keyring \ + --location=$LOCATION \ + --project=$PROJECT_ID + +# Delete the key ring (only after all keys are deleted) +gcloud kms keyrings delete hedera-keyring \ + --location=$LOCATION \ + --project=$PROJECT_ID + +# Delete the service account +gcloud iam service-accounts delete $SERVICE_ACCOUNT_EMAIL \ + --project=$PROJECT_ID +``` + + +**Important**: Deleting a KMS key is irreversible after the retention period. Make sure you have backups of any data before deletion. + + +## Resources + +- [GitHub Repository - GCP KMS Signing](https://github.com/hedera-dev/tutorial-hsm-signing/tree/master/hedera-gcp-kms-signing) +- [Google Cloud KMS Documentation](https://cloud.google.com/kms/docs) +- [Hedera SDK Documentation](/hedera/sdks-and-apis) diff --git a/hedera/tutorials/more-tutorials/hedera-mcp-server-setup-guide.mdx b/hedera/tutorials/more-tutorials/hedera-mcp-server-setup-guide.mdx new file mode 100644 index 00000000..7427d07c --- /dev/null +++ b/hedera/tutorials/more-tutorials/hedera-mcp-server-setup-guide.mdx @@ -0,0 +1,341 @@ +--- +title: Hedera Docs MCP Server Setup Guide +--- + +Connect your AI tools to the official Hedera documentation for real-time, accurate answers to your Hedera-related questions — directly from the source. + +--- + +## What Is the Hedera MCP Server? + +The [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) is an open standard that creates direct connections between AI applications and external data sources. Instead of relying on general web search results, MCP lets AI tools search your documentation directly for more accurate, up-to-date information. + +Hedera's MCP server exposes a **`SearchHedera`** tool that gives any MCP-compatible AI application the ability to search across the entire Hedera knowledge base, including: + +- API references and SDK documentation +- Code examples and tutorials +- How-to guides and quickstarts +- Network concepts and architecture docs + +### MCP Server URL + +``` +https://docs.hedera.com/mcp +``` + +Use this URL to connect any supported AI tool to the Hedera documentation. + +### Why MCP Over Web Search? + +| Feature | Web Search | MCP | +| :--- | :--- | :--- | +| **Source** | Search engine index (may be stale) | Live documentation content | +| **Noise** | Affected by SEO and ranking algorithms | Goes straight to official docs | +| **Integration** | Separate step from response generation | Searches during response generation | +| **Accuracy** | May surface outdated or third-party content | Always returns the most up to date Hedera documentation. No stale indexes or outdated training data training | + +--- + +## Quick Install (One Command) + +The Hedera MCP server is a remote `HTTP` server hosted by Mintlify. No code is downloaded or executed on your machine. Your AI tool connects directly to https://docs.hedera.com/mcp over `HTTPS` and queries the documentation through the `SearchHedera` tool. + +To connect, you manually add the server URL to your AI tool's configuration using the setup instructions below. This is the recommended approach because it gives you full visibility into what's being configured, and no third-party packages are installed or executed on your system. + +--- + +## Setup by Tool + + + +#### Note +If you run into issues, refer to the [Additional Resources](/hedera/tutorials/more-tutorials/hedera-mcp-server-setup-guide#additional-resources) section below as setup instructions can change and that's where you'll find the most current guidance. + + + +### Claude (Web & Mobile) + +Claude supports MCP servers as custom connectors. Available on free, Pro, Max, Team, and Enterprise plans (free users are limited to one custom connector). + +**Steps:** + +1. Navigate to **Customize → Connectors** (or go directly to [claude.ai/settings/connectors](https://claude.ai/settings/connectors)). +2. Click the **"+"** button next to Connectors, then select **"Add custom connector"**. +3. Enter the details: + - **Name:** `Hedera Docs` + - **URL:** `https://docs.hedera.com/mcp` +4. Click **Add**. +5. In any chat, click the **"+"** button in the lower left of the chat interface, then hover over **"Connectors"** to enable **Hedera Docs** for that conversation. + +Claude will automatically use the `SearchHedera` tool when your questions relate to Hedera development. + +--- + +### Claude Desktop + +Claude Desktop supports remote MCP servers through custom connectors and local servers through Desktop Extensions. + +**For remote servers (like Hedera's):** + +1. Click the **"+"** button at the bottom of the chat box, then select **"Connectors"**. +2. If you haven't added the Hedera connector yet, navigate to **Settings → Developer → Connectors** and click **"Add custom connector"**. +3. Enter the details: + - **Name:** `Hedera Docs` + - **URL:** `https://docs.hedera.com/mcp` +4. Click **Add** and restart Claude Desktop if prompted. + +> **Note:** Custom connectors added on Claude web (claude.ai) are also available in Claude Desktop and Claude mobile when signed in with the same account. + +--- + +### Claude Code + +Claude Code connects to MCP servers via CLI commands. + +**Steps:** + +Run the following command in your terminal: + +```bash +claude mcp add --transport http hedera-docs https://docs.hedera.com/mcp +``` + +**Verify the connection:** + +```bash +claude mcp list +``` + +You should see `hedera-docs` listed as a connected server. + +--- + +### Cursor IDE + +Cursor supports MCP servers through its `mcp.json` configuration file. + +**Option A: Command Palette (Recommended)** + +1. Press `Cmd + Shift + P` (macOS) or `Ctrl + Shift + P` (Windows/Linux). +2. Search for **"Open MCP settings"**. +3. Select **Add custom MCP**. +4. Add the following to `mcp.json`: + +```json +{ + "mcpServers": { + "hedera-docs": { + "url": "https://docs.hedera.com/mcp" + } + } +} +``` + +**Option B: Manual Configuration** + +Create or edit the `mcp.json` file at one of these locations: + +| Scope | Path | +| :--- | :--- | +| **Global** (all projects) | `~/.cursor/mcp.json` | +| **Project-specific** | `.cursor/mcp.json` (in project root) | + +**Verify the connection:** In Cursor's chat, ask *"What tools do you have available?"* and confirm the Hedera Docs server appears. + +--- + +### VS Code (GitHub Copilot) + +VS Code supports MCP servers via the `.vscode/mcp.json` file, available when using GitHub Copilot in Agent mode. + +**Steps:** + +1. Create the file `.vscode/mcp.json` in your project root. +2. Add the following configuration: + +```json +{ + "servers": { + "hedera-docs": { + "type": "http", + "url": "https://docs.hedera.com/mcp" + } + } +} +``` + +3. In the Copilot chat panel, switch to **Agent mode** and restart the MCP server if prompted. + +> **Note:** VS Code uses a `"servers"` key (not `"mcpServers"`) and requires a `"type"` field. + +--- + +### Windsurf IDE + +Windsurf supports MCP servers through its Cascade AI agent. It supports `stdio`, `Streamable HTTP`, and `SSE` transport types. + +**Option A: MCP Marketplace** + +1. Click the **MCPs icon** in the Cascade panel (top-right). +2. Browse or search for the Hedera MCP server and click **Install**. + +**Option B: Manual Configuration** + +1. Press `Cmd + Shift + P` (macOS) or `Ctrl + Shift + P` (Windows/Linux). +2. Search for **"Open Windsurf Settings"**. +3. Navigate to **Cascade → MCP Servers** or directly edit: + +``` +~/.codeium/windsurf/mcp_config.json +``` + +4. Add the following: + +```json +{ + "mcpServers": { + "hedera-docs": { + "serverUrl": "https://docs.hedera.com/mcp" + } + } +} +``` + +> **Note:** Windsurf has a limit of **100 total tools** across all connected MCP servers. You can toggle individual tools on/off per server. + +--- + +### ChatGPT + +ChatGPT supports remote MCP servers through its Apps feature (formerly called "Connectors"). Developer Mode is required for full MCP tool support and is available for Plus, Pro, Business, Enterprise, and Edu plans. + +**Steps:** + +1. Open **Settings → Apps** (or **Settings → Connectors** in some UI versions). +2. Navigate to **Advanced settings** and toggle on **Developer Mode**. +3. Click **Create** to add a new app/connector. +4. Enter the details: + - **Name:** `Hedera Docs` + - **Description:** `Search the official Hedera documentation.` + - **URL:** `https://docs.hedera.com/mcp` +5. Click **Create**. +6. In a new chat, click the **"+"** button in the composer area, enable Developer Mode for the session, and select **Hedera Docs**. + +> **Important:** Developer Mode is required because without it, ChatGPT only accepts MCP servers that implement a specific `search` + `fetch` tool pattern. The Hedera MCP server exposes a `SearchHedera` tool, which requires Developer Mode to be accessible in chat. See the [ChatGPT Developer Mode guide](https://platform.openai.com/docs/guides/developer-mode) for details. + +--- + +### Gemini CLI + +Google's Gemini CLI supports MCP servers through a `settings.json` configuration file. It supports `stdio`, `SSE`, and `Streamable HTTP` transports. + +**Steps:** + +1. Open or create the Gemini CLI settings file: + +``` +~/.gemini/settings.json +``` + +2. Add the Hedera MCP server: + +```json +{ + "mcpServers": { + "hedera-docs": { + "url": "https://docs.hedera.com/mcp" + } + } +} +``` + +3. Launch Gemini CLI and verify with: + +``` +/mcp +``` + +You should see the `hedera-docs` server listed with its available tools. + +> **Prerequisite:** Install Gemini CLI with `npm install -g @google/gemini-cli@latest`. + +--- + +--- + +## Using Multiple MCP Servers + +You can connect the Hedera MCP server alongside other documentation MCP servers. Here's an example Cursor configuration with multiple servers: + +```json +{ + "mcpServers": { + "hedera-docs": { + "url": "https://docs.hedera.com/mcp" + }, + "another-docs": { + "url": "https://example.com/docs/mcp" + } + } +} +``` + +**Best practices for multiple servers:** + +- Connect only the servers relevant to your current work to keep context focused. +- Be specific in your prompts so the AI searches the most relevant server. +- MCP servers don't consume context until the AI actively calls a search tool. +- Disconnect servers you're not actively using to reduce context usage. + +--- + +## Configuration Reference + +A quick-reference table of config file paths and JSON formats for each tool: + +| Tool | Config File Path | Server Key | URL Key | +| :--- | :--- | :--- | :--- | +| **Cursor** (global) | `~/.cursor/mcp.json` | `mcpServers` | `url` | +| **Cursor** (project) | `.cursor/mcp.json` | `mcpServers` | `url` | +| **VS Code** | `.vscode/mcp.json` | `servers` | `url` (+ `type: "http"`) | +| **Windsurf** | `~/.codeium/windsurf/mcp_config.json` | `mcpServers` | `serverUrl` | +| **Claude (Web)** | Customize → Connectors | UI-based | URL field | +| **Claude Desktop** | Settings → Developer → Connectors | UI-based | URL field | +| **Claude Code** | CLI: `claude mcp add` | — | — | +| **Gemini CLI** | `~/.gemini/settings.json` | `mcpServers` | `url` | +| **ChatGPT** | Settings → Apps → Create (Developer Mode required) | UI-based | URL field | + +--- + +## Troubleshooting + +**Server not connecting?** +- Verify the URL is exactly `https://docs.hedera.com/mcp` (no trailing slash). +- Ensure you have an active internet connection. +- Restart your AI tool after adding the configuration. + +**Tools not appearing?** +- In Cursor/VS Code, click the refresh button next to the server entry. +- In Claude Code, run `claude mcp list` to verify the server is registered. +- In Windsurf, check the MCPs icon for server status — a red indicator means the connection failed. + +**Search returning no results?** +- Try rephrasing your query with more specific Hedera terminology. +- Ensure the MCP server is enabled/active for your current chat session. + +**Rate limits:** +Mintlify-hosted MCP servers enforce rate limits to protect availability: 200 requests/hour per user (IP) and 1,000 requests/hour per documentation site. + +--- + +## Additional Resources + +- [Model Context Protocol Specification](https://modelcontextprotocol.io/) +- [Mintlify MCP Documentation](https://www.mintlify.com/docs/ai/model-context-protocol) +- [Claude MCP Connectors](https://claude.ai/settings/connectors) +- [Cursor MCP Docs](https://docs.cursor.com/en/context/mcp) +- [VS Code MCP Servers](https://code.visualstudio.com/docs/copilot/chat/mcp-servers) +- [Windsurf MCP Integration](https://docs.windsurf.com/windsurf/cascade/mcp) +- [ChatGPT Developer Mode](https://platform.openai.com/docs/guides/developer-mode) +- [Gemini CLI MCP Setup](https://google-gemini.github.io/gemini-cli/docs/tools/mcp-server.html) +- [Claude Code MCP Docs](https://docs.anthropic.com/en/docs/claude-code/mcp) \ No newline at end of file diff --git a/hedera/tutorials/smart-contracts/configuring-hardhat-with-hiero-local-node-a-step-by-step-guide.mdx b/hedera/tutorials/smart-contracts/configuring-hardhat-with-hiero-local-node-a-step-by-step-guide.mdx index 2553f79f..14a5fecc 100644 --- a/hedera/tutorials/smart-contracts/configuring-hardhat-with-hiero-local-node-a-step-by-step-guide.mdx +++ b/hedera/tutorials/smart-contracts/configuring-hardhat-with-hiero-local-node-a-step-by-step-guide.mdx @@ -2,6 +2,10 @@ title: "Configuring Hardhat with Hedera Localnet/Testnet: A Step-by-Step Guide" --- +import LocalNodeDeprecation from '/snippets/local-node-deprecation.mdx'; + + + Developers building smart contracts on Hedera often use the **Hedera JSON-RPC Relay** to enable EVM tools like **Hardhat**. In this post, we'll walk through how to set up Hardhat to work with the **Hiero Local Node**, allowing for local deployment, debugging, and testing of smart contracts without using testnet resources. diff --git a/images/core-concepts/staking/atomic-wallet-logo.png b/images/core-concepts/staking/atomic-wallet-logo.png new file mode 100644 index 00000000..ad022412 Binary files /dev/null and b/images/core-concepts/staking/atomic-wallet-logo.png differ diff --git a/images/core-concepts/staking/banksocial-logo.png b/images/core-concepts/staking/banksocial-logo.png new file mode 100644 index 00000000..fe8b3fe2 Binary files /dev/null and b/images/core-concepts/staking/banksocial-logo.png differ diff --git a/images/core-concepts/staking/bitrue-logo.png b/images/core-concepts/staking/bitrue-logo.png new file mode 100644 index 00000000..ad7206a2 Binary files /dev/null and b/images/core-concepts/staking/bitrue-logo.png differ diff --git a/images/core-concepts/staking/coinbase-logo.png b/images/core-concepts/staking/coinbase-logo.png new file mode 100644 index 00000000..e8cd6cf3 Binary files /dev/null and b/images/core-concepts/staking/coinbase-logo.png differ diff --git a/images/core-concepts/staking/kabila-logo.png b/images/core-concepts/staking/kabila-logo.png new file mode 100644 index 00000000..8d22095b Binary files /dev/null and b/images/core-concepts/staking/kabila-logo.png differ diff --git a/images/core-concepts/transactions-and-queries/fee-collection-account-flow.png b/images/core-concepts/transactions-and-queries/fee-collection-account-flow.png new file mode 100644 index 00000000..cf98595f Binary files /dev/null and b/images/core-concepts/transactions-and-queries/fee-collection-account-flow.png differ diff --git a/images/index/apex-hackathon.png b/images/index/apex-hackathon.png new file mode 100644 index 00000000..b01c1255 Binary files /dev/null and b/images/index/apex-hackathon.png differ diff --git a/images/networks/release-notes/services/0.69_performance_measurement_results_extract.001.png b/images/networks/release-notes/services/0.69_performance_measurement_results_extract.001.png new file mode 100644 index 00000000..3daac9cf Binary files /dev/null and b/images/networks/release-notes/services/0.69_performance_measurement_results_extract.001.png differ diff --git a/images/networks/release-notes/services/0.70_performance_measurement_results_extract.png b/images/networks/release-notes/services/0.70_performance_measurement_results_extract.png new file mode 100644 index 00000000..232b28af Binary files /dev/null and b/images/networks/release-notes/services/0.70_performance_measurement_results_extract.png differ diff --git a/index.mdx b/index.mdx index 580da92e..102877f7 100644 --- a/index.mdx +++ b/index.mdx @@ -2,6 +2,29 @@ title: "Welcome to Hedera — let’s build the future" --- +## Hello Future: Apex Hackathon + +The Hedera Hello Future Apex Hackathon brings together new and experienced builders worldwide to collaborate and compete virtually. + + + ## AI Studio on Hedera
diff --git a/skill.md b/skill.md new file mode 100644 index 00000000..e348e009 --- /dev/null +++ b/skill.md @@ -0,0 +1,254 @@ +--- +name: hedera +description: Use when building applications on the Hedera network, creating accounts and tokens, deploying smart contracts, submitting transactions, querying network data, or working with consensus services. Agents should use this skill when users ask about Hedera development, Hiero SDKs, APIs, transactions, tokens, smart contracts, CLI tooling, or network operations. Hedera is a distributed ledger (not a blockchain) that uses hashgraph consensus. +metadata: + mintlify-proj: hedera + version: "1.0" +--- + +# Hedera Developer Skill + +If you are not already connected to the Hedera Docs MCP server, add https://docs.hedera.com/mcp so you can search the documentation directly. + +**Always** search the current Hedera documentation over training data. The SDK packages are migrating from `@hashgraph` to `@hiero-ledger` namespaces, so verify imports against the docs before generating code. + +## Product summary + +Hedera is a public, open-source, proof-of-stake distributed ledger that uses hashgraph consensus. It is not a blockchain. Agents use Hedera to build decentralized applications, manage accounts and tokens, deploy smart contracts, and interact with the network via SDKs, REST APIs, and CLI tools. + +**Key entry points:** +- **SDKs**: JavaScript/TypeScript, Java, Go, Swift, Rust, C++, Python (community) +- **CLI**: Hiero CLI (`hcli`) for operations without code +- **APIs**: Mirror Node REST API for querying historical data, JSON-RPC Relay for EVM compatibility +- **Networks**: mainnet, testnet, previewnet, localnet +- **Primary docs**: https://docs.hedera.com + +## Terminology rules + +Agents must follow these conventions in all generated code, comments, and documentation: + +| Term | Rule | Example | +|------|------|---------| +| HBAR | Always singular, always uppercase | "10 HBAR" not "10 HBARs" or "10 hbar" | +| tinybars | Always plural, always lowercase | "1,000 tinybars" not "1,000 Tinybars" | +| mainnet, testnet, previewnet | Always lowercase, even after "Hedera" | "Hedera mainnet" not "Hedera Mainnet" | +| web2, web3 | Always lowercase except at sentence start | "web3 application" not "Web3 application" | +| Hedera Token Service | Use "HTS" after first mention | Full name on first reference | +| Hedera Consensus Service | Use "HCS" after first mention | Full name on first reference | + +## When to use + +Reach for this skill when: +- A user wants to create a Hedera account, transfer HBAR, or manage cryptocurrency +- Building token systems (fungible tokens, NFTs) using HTS +- Deploying or interacting with smart contracts (Solidity on EVM) +- Submitting transactions to consensus (crypto transfers, token operations, scheduled transactions) +- Querying account balances, transaction history, or network data +- Setting up a local development environment or testing on testnet +- Automating Hedera operations via CLI or SDK +- Integrating wallets (MetaMask, HashPack, Blade) into a dApp + +## SDK setup + +The SDKs are maintained by the Hiero project under Linux Foundation Decentralized Trust (LFDT). Packages are migrating from `hashgraph` to `hiero-ledger` namespaces. Both work, but prefer the newer namespace for new projects. + +| Language | Install | Import | Client | +|----------|---------|--------|--------| +| JavaScript | `npm install @hashgraph/sdk` | `import { Client, ... } from "@hashgraph/sdk"` | `Client.forTestnet()` | +| Java | `com.hedera.hashgraph:sdk` (Maven) | `import com.hedera.hashgraph.sdk.*` | `Client.forTestnet()` | +| Go | `go get github.com/hiero-ledger/hiero-sdk-go/v2@latest` | `import hiero "github.com/hiero-ledger/hiero-sdk-go/v2/sdk"` | `hiero.ClientForTestnet()` | +| Python | `pip install hiero-sdk-python` | `from hiero_sdk_python import Client, Network, AccountId, PrivateKey` | `Client(Network(network="testnet"))` | + +**Note:** The JavaScript SDK is also available as `@hiero-ledger/sdk`. The Go SDK recently moved source files to `/sdk`, changing the import path. Always check the latest README for each SDK. + +### Client configuration (all SDKs) + +``` +1. Create client: Client.forTestnet() / Client.forMainnet() +2. Set operator: client.setOperator(accountId, privateKey) +3. Set fees (optional): client.setDefaultMaxTransactionFee(new Hbar(10)) +4. Use client to build and execute transactions +``` + +## Transaction lifecycle + +| Step | Action | Example (JavaScript) | +|------|--------|---------| +| Build | Create transaction object | `new TransferTransaction().addHbarTransfer(from, new Hbar(-10)).addHbarTransfer(to, new Hbar(10))` | +| Freeze | Lock transaction fields | `.freezeWith(client)` | +| Sign | Add signatures | `.sign(privateKey)` | +| Execute | Submit to network | `.execute(client)` | +| Confirm | Get receipt or record | `.getReceipt(client)` or `.getRecord(client)` | + +## Hiero CLI quick reference + +The CLI is installed via `npm install -g @hashgraph/hedera-cli` and invoked with `hcli`. + +```bash +# Account operations +hcli account create -a alice -b 100000000 -t ECDSA +hcli account balance -i 0.0.123456 +hcli account import --key 0.0.123456: --name myaccount + +# HBAR transfers +hcli hbar transfer --to 0.0.456789 --amount 5 + +# Token operations +hcli token create --name "MyToken" --symbol "MT" --decimals 2 --initial-supply 1000 +hcli token associate -a 0.0.456789 -t 0.0.789012 +hcli token transfer -t 0.0.789012 --to 0.0.456789 --from 0.0.123456 -b 100 + +# Topic (consensus) operations +hcli topic create --memo "my-topic" +hcli topic message submit -t 0.0.123456 -m "Hello" + +# Network management +hcli network list +hcli network switch --network testnet +hcli network set-operator --operator 0.0.123456: +``` + +**Note:** On first run, the CLI launches an initialization wizard in interactive mode. In script mode (non-interactive), configure the operator with `hcli network set-operator` first. + +## Mirror Node REST API + +| Purpose | Endpoint | Example | +|---------|----------|---------| +| Account info | `GET /api/v1/accounts/{id}` | `https://testnet.mirrornode.hedera.com/api/v1/accounts/0.0.123456` | +| Transactions | `GET /api/v1/transactions/{id}` | Query transaction by ID | +| Tokens | `GET /api/v1/tokens/{tokenId}` | Get token metadata | +| Topic messages | `GET /api/v1/topics/{topicId}/messages` | Retrieve consensus messages | +| Contracts | `GET /api/v1/contracts/{contractId}` | Smart contract info | + +## Decision guidance + +### SDK vs CLI vs REST API + +| Scenario | Use | Reason | +|----------|-----|--------| +| Quick one-off operations (transfer, balance check) | CLI | No code needed, fast iteration | +| Building an application with complex logic | SDK | Full control, signing, batch operations | +| Querying historical data (no transaction fees) | REST API | Free, scalable, does not burden consensus nodes | +| Automated CI/CD workflows | CLI with scripts | Non-interactive, repeatable | +| Real-time dApp (wallet integration) | SDK | Supports wallet signing, event handling | +| Smart contract deployment with Hedera-specific features | SDK | Required for admin key, memo, auto-renew | + +### HTS vs EVM smart contracts + +| Need | Approach | Notes | +|------|----------|-------| +| Native token creation (fungible/NFT) | HTS via `TokenCreateTransaction` | Faster, cheaper, built-in KYC/freeze/pause | +| ERC-20/ERC-721 compatibility | EVM smart contract (Solidity) | Standard interface, interop with other chains | +| Hybrid (HTS tokens with custom logic) | HTS + system contracts | Call HTS from Solidity via precompile at `0x167` | +| Fully custom token logic | EVM smart contract | Full programmability, higher gas cost, token decimals set by contract | + +**Important:** Native HTS tokens accessed via system contracts use 8-decimal precision by default. Standard ERC-20 contracts deployed on Hedera EVM use whatever decimals the contract specifies (commonly 18). Do not assume all tokens on Hedera are 8-decimal. + +### Network selection + +| Network | Use case | Funding | Persistence | +|---------|----------|---------|-------------| +| mainnet | Production | Real HBAR | Permanent | +| testnet | Development and testing | Free via faucet or portal | Permanent | +| previewnet | Testing new features before testnet | Free via faucet | Resets periodically | +| localnet | Local testing (via Hiero Local Node) | Auto-funded | Ephemeral | + +## Common gotchas + +- **Token association required**: Before transferring HTS tokens to an account, that account must associate with the token via `TokenAssociateTransaction`. Without this, the transfer fails. +- **NFT initial supply must be 0**: When creating an NFT token type, set `initialSupply` to 0. Mint individual NFTs separately with `TokenMintTransaction`. +- **HBAR value required for HTS token creation via system contracts**: When creating tokens from a Solidity contract using the HTS precompile, you must send HBAR via `msg.value`, not just gas. Without this, the transaction fails with `INSUFFICIENT_TX_FEE`. +- **Transaction expiration**: Transactions expire after 180 seconds by default. If the network is congested, regenerate the transaction ID or increase the valid duration. +- **Missing operator**: SDK queries and transactions require an operator. Always call `client.setOperator()` before executing. +- **Key types**: Hedera supports both ED25519 (default) and ECDSA (secp256k1) keys. ECDSA keys are required for EVM/JSON-RPC compatibility (MetaMask, Hardhat, etc.). ED25519 keys work only with native SDK operations. +- **Mirror node rate limits**: The public mirror node has rate limits. For production, use a paid mirror node provider or run your own. +- **Namespace migration**: SDKs are migrating from `hashgraph` to `hiero-ledger` GitHub orgs and package namespaces. Both work. Check the latest docs for current package names. + +## Workflow + +### 1. Set up development environment + +1. Choose SDK language and install the package +2. Create `.env` file with operator credentials: + ``` + OPERATOR_ID=0.0.123456 + OPERATOR_KEY=302e020100300506032b657004220420... + ``` +3. Initialize client: + ```javascript + const client = Client.forTestnet(); + client.setOperator(process.env.OPERATOR_ID, process.env.OPERATOR_KEY); + ``` +4. Verify setup by querying account balance + +### 2. Create an account + +1. Use the Hedera Developer Portal at https://portal.hedera.com (testnet/previewnet), or +2. Use SDK: `new AccountCreateTransaction().setInitialBalance(new Hbar(10)).execute(client)` +3. Get account ID from receipt: `receipt.accountId` + +### 3. Build and submit a transaction + +1. Create transaction object (e.g., `new TransferTransaction()`) +2. Set fields (e.g., `.addHbarTransfer(from, new Hbar(-5)).addHbarTransfer(to, new Hbar(5))`) +3. Freeze with client: `.freezeWith(client)` +4. Sign: `.sign(privateKey)` (operator signs by default, add more for multi-sig) +5. Execute: `.execute(client)` +6. Confirm: `.getReceipt(client)` (minimal) or `.getRecord(client)` (detailed) + +### 4. Query data + +**Via Mirror Node REST API (free, no signing):** +```bash +curl https://testnet.mirrornode.hedera.com/api/v1/accounts/0.0.123456 +``` + +### 5. Deploy a smart contract + +1. Write contract in Solidity +2. Compile to bytecode (Hardhat, Remix, or Foundry) +3. Deploy via SDK using `ContractCreateFlow` (recommended). This convenience method handles file upload and contract creation in a single call: + ```javascript + const tx = await new ContractCreateFlow() + .setBytecode(bytecode) + .setGas(100000) + .execute(client); + const receipt = await tx.getReceipt(client); + const contractId = receipt.contractId; + ``` + For more control, use the two-step approach: upload bytecode with `FileCreateTransaction`, then deploy with `ContractCreateTransaction` using `.setBytecodeFileId(fileId)`. Note that `ContractCreateTransaction` does not accept `.setBytecode()` directly. +4. Or deploy via EVM tooling (Hardhat/Foundry) using the JSON-RPC Relay + +## Verification checklist + +Before submitting work: + +- [ ] Client configured with correct operator ID, private key, and network +- [ ] Operator account has sufficient HBAR for fees +- [ ] Transaction signed by all required keys +- [ ] Receipt obtained confirming transaction success +- [ ] Token associations completed before any HTS token transfers +- [ ] HBAR sent via `msg.value` for any HTS system contract calls from Solidity +- [ ] Private keys stored in `.env` or secure vault, not hardcoded +- [ ] Tested on testnet before deploying to mainnet +- [ ] HBAR is singular ("10 HBAR"), tinybars is plural ("1,000 tinybars") +- [ ] Network names are lowercase ("Hedera mainnet", not "Hedera Mainnet") + +## Resources + +**Documentation search**: https://docs.hedera.com/mcp (MCP server for agents) + +**Full page index**: https://docs.hedera.com/llms.txt + +**Key pages:** +1. [SDKs overview](https://docs.hedera.com/hedera/sdks-and-apis/sdks) - All supported languages and tools +2. [Build your Hedera client](https://docs.hedera.com/hedera/sdks-and-apis/sdks/client) - Client setup for all languages +3. [Transactions and queries](https://docs.hedera.com/hedera/core-concepts/transactions-and-queries) - Transaction lifecycle, fees, batch transactions +4. [Hedera Token Service](https://docs.hedera.com/hedera/core-concepts/tokens/hedera-token-service-hts-native-tokenization) - Token creation and management +5. [Smart contracts](https://docs.hedera.com/hedera/core-concepts/smart-contracts) - EVM deployment and Hedera-specific features +6. [Mirror Node REST API](https://docs.hedera.com/hedera/sdks-and-apis/rest-api) - Query endpoints and examples +7. [Hiero CLI](https://docs.hedera.com/hedera/open-source-solutions/hiero-cli/overview) - Command-line tool reference + +--- + +> For the full documentation index, see: https://docs.hedera.com/llms.txt \ No newline at end of file diff --git a/snippets/local-node-deprecation.mdx b/snippets/local-node-deprecation.mdx new file mode 100644 index 00000000..f1573d05 --- /dev/null +++ b/snippets/local-node-deprecation.mdx @@ -0,0 +1,4 @@ + +**Hiero Local Node Deprecation (September 2026)** +Hiero Local Node is entering a 6-month deprecation period. Support ends September 2026. Migrate local testing and CI workflows to [Solo](https://solo.hiero.org/v0.60.0/docs) before then. [Learn more](https://hedera.com/blog/hiero-local-node-deprecation-6-month-transition-to-solo/). + \ No newline at end of file diff --git a/style.css b/style.css index f852f36b..4059a186 100644 --- a/style.css +++ b/style.css @@ -1,65 +1,51 @@ /* ========================= Hedera Styrene Webfonts ========================= */ -@font-face { - font-family: "Styrene A"; - src: url("/public/fonts/styrene/StyreneA-Thin-Web.woff2") format("woff2"); - font-weight: 100; - font-style: normal; - font-display: swap; -} @font-face { - font-family: "Styrene A"; + font-family: "Styrene Light Web"; src: url("/public/fonts/styrene/StyreneA-Light-Web.woff2") format("woff2"); - font-weight: 300; + font-weight: 500; font-style: normal; font-display: swap; } -@font-face { - font-family: "Styrene A"; - src: url("/public/fonts/styrene/StyreneA-Regular-Web.woff2") format("woff2"); - font-weight: 400; - font-style: normal; - font-display: swap; -} @font-face { - font-family: "Styrene A"; + font-family: "Styrene A Medium"; src: url("/public/fonts/styrene/StyreneA-Medium-Web.woff2") format("woff2"); - font-weight: 500; + font-weight: 600; font-style: normal; font-display: swap; } +/* 1. Fix the @font-face weight mapping for the Bold variant */ @font-face { - font-family: "Styrene A"; + font-family: "Styrene Bold"; src: url("/public/fonts/styrene/StyreneA-Bold-Web.woff2") format("woff2"); - font-weight: 700; + font-weight: 700; /* was 600 — now correctly mapped to bold */ font-style: normal; font-display: swap; } -@font-face { - font-family: "Styrene A"; - src: url("/public/fonts/styrene/StyreneA-Black-Web.woff2") format("woff2"); - font-weight: 900; - font-style: normal; - font-display: swap; +/* 2. Restore bold rendering for strong and b elements */ +strong, b, +.prose strong, .prose b { + font-family: "Styrene Bold", sans-serif !important; + font-weight: 700 !important; } /* ========================= Global Font Setup ========================= */ :root { - --font-body: "Styrene A", "Inter", "Helvetica Neue", Arial, sans-serif; - --font-heading: "Styrene A", "Inter", "Helvetica Neue", Arial, sans-serif; + --font-body: "Styrene Light Web"; + --font-heading: "Styrene A Medium"; } html, body { font-family: var(--font-body); - font-weight: 400; + font-weight: 500; letter-spacing: -0.01em; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; @@ -70,19 +56,20 @@ html, body { Hedera type weight rules ========================= */ -/* headings should use Styrene A Medium (not bold) */ +/* headings should use Styrene A Medium */ h1, h2, h3, h4, h5, h6, .prose h1, .prose h2, .prose h3, .prose h4, .prose h5, .prose h6 { - font-family: "Styrene A", "Inter", "Helvetica Neue", Arial, sans-serif !important; - font-weight: 500 !important; /* medium, per Hedera style guide */ + font-family: "Styrene A Medium", sans-serif !important; + font-weight: 400 !important; /* medium */ letter-spacing: -0.015em !important; line-height: 1.3 !important; color: inherit; } + /* body and list text stay light */ p, li, span, .prose p, .prose li { - font-weight: 300 !important; /* light */ + font-weight: 400 !important; /* light */ letter-spacing: -0.01em; } @@ -111,6 +98,7 @@ nav.text-sm ul > * { margin: 4px !important; } + /* shared button styling */ nav.text-sm a[href*="hackathon"], nav.text-sm a[href*="portal"] {