hts-system-contract — скилл для Claude Code: что делает и как ставить
Скилл помогает создавать и настраивать нативные токены Hedera через смарт-контракты Solidity с вызовом прекомпайла 0x167. Пригодится при выпуске NFT, настройке комиссий и правил KYC.
npx skills add hedera-dev/hedera-skills --skill hts-system-contract -a claude-codeЧто делает hts-system-contract
Скилл подключает правила и паттерны для работы со смарт-контрактами Hedera Token Service (HTS). Он направляет модель на вызовы системного прекомпайла 0x167, развёртывание взаимозаменяемых токенов и коллекций NFT через библиотеки @hashgraph/smart-contracts. Доступны как базовый контракт HederaTokenService.sol, так и безопасные варианты вроде SafeHTS.sol с автоматическим откатом при ошибке.
В инструкциях разобран механизм управления через семь типов ключей в KeyHelper: администрирование, KYC, заморозка счетов, списание, эмиссия, комиссии и пауза. Также учитывается специфика самой сети Hedera: получатели обязаны предварительно связать свой аккаунт с токеном через associateToken, иначе перевод не пройдёт.
Без явной передачи HBAR вызов createFungibleToken или createNonFungibleToken завершится ошибкой INSUFFICIENT_TX_FEE. Поэтому к транзакции создания обязательно добавляют value: msg.value.
Какие задачи решает
- написать смарт-контракт на Solidity для создания токенов HTS
- настроить роли управления токеном через KeyHelper
- организовать выпуск и минт NFT-коллекций на Hedera
- внедрить проверку KYC и заморозку счетов на уровне контракта
Примеры запросов агенту
- Напиши контракт для создания токена HTS с передачей msg.value
- Сделай функцию минта NFT с проверкой кодов HederaResponseCodes
- Настрой ключи KYC и паузы для системного контракта через KeyHelper
Как установить hts-system-contract
1Через Skills CLI (Vercel)
npx skills add hedera-dev/hedera-skills --skill hts-system-contract -a claude-code2Вручную: положить файлы
~/.claude/skills/hts-system-contract/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/hts-system-contract/
1Через Skills CLI (Vercel)
npx skills add hedera-dev/hedera-skills --skill hts-system-contract -a codex2Вручную: положить файлы
.agents/skills/hts-system-contract/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add hedera-dev/hedera-skills --skill hts-system-contract -a cursor2Вручную: положить файлы
.cursor/skills/hts-system-contract/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install hedera-dev/hedera-skills hts-system-contract2Вручную: положить файлы
.github/skills/hts-system-contract/SKILL.md1Через Skills CLI (Vercel)
npx skills add hedera-dev/hedera-skills --skill hts-system-contract -a gemini-cli2Командой платформы
gemini skills install https://github.com/hedera-dev/hedera-skills --path plugins/system-contracts/skills/hts-system-contractВручную: положить файлы
.devin/skills/hts-system-contract/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add hedera-dev/hedera-skills --skill hts-system-contract -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Вопросы о hts-system-contract
Как установить hts-system-contract в Claude Code?
Выполните команду npx skills add hedera-dev/hedera-skills --skill hts-system-contract -a claude-code. Конфигурация запишется в ~/.claude/skills/hts-system-contract/SKILL.md.
Что делает скилл hts-system-contract?
Он снабжает агента инструкциями по разработке смарт-контрактов на Solidity для Hedera Token Service через системный прекомпайл 0x167. Помогает собирать параметры создания токенов, настраивать ключи управления и обрабатывать ответы сети.
Почему при создании токена через HTS контракт падает с ошибкой INSUFFICIENT_TX_FEE?
Создание токена на Hedera требует прямой оплаты в HBAR, одного газа недостаточно. В вызов функции создания нужно явно передавать сумму через {value: msg.value}.
Исходный текст
SKILL.md · Apache-2.0
---
name: hts-system-contract
description: Hedera Token Service (HTS) smart contract development. Use when creating, managing, or interacting with Hedera-native tokens via Solidity contracts. Triggers include HTS tokens, Hedera token creation, HTS precompile, token minting/burning on Hedera, KYC/freeze/pause token controls, custom fee schedules, NFT collections on Hedera, or any token operations using the 0x167 precompile.
---
# Hedera Token Service (HTS) System Contract
HTS precompile at `0x167` enables Solidity contracts to create and manage Hedera-native tokens with built-in compliance controls (KYC, freeze, pause) and custom fees.
## Quick Reference
**Imports:**
```solidity
import {HederaTokenService} from "@hashgraph/smart-contracts/contracts/system-contracts/hedera-token-service/HederaTokenService.sol";
import {KeyHelper} from "@hashgraph/smart-contracts/contracts/system-contracts/hedera-token-service/KeyHelper.sol";
import {ExpiryHelper} from "@hashgraph/smart-contracts/contracts/system-contracts/hedera-token-service/ExpiryHelper.sol";
import {HederaResponseCodes} from "@hashgraph/smart-contracts/contracts/system-contracts/hedera-token-service/HederaResponseCodes.sol";
```
**Safe variants** (auto-revert on failure): `SafeHTS.sol`, `SafeViewHTS.sol`
## Critical: HBAR Payment Required
Token creation requires explicit HBAR value payment (not just gas):
```solidity
// ❌ WRONG - fails with INSUFFICIENT_TX_FEE
(int rc, address token) = createNonFungibleToken(token);
// ✅ CORRECT
(int rc, address token) = createNonFungibleToken{value: msg.value}(token);
```
Call from TypeScript:
```typescript
await contract.createToken(name, symbol, {
gasLimit: 350_000,
value: ethers.parseEther("15"), // ~$1-2 USD of HBAR
});
```
## Token Key System
Seven key types control token operations (bit positions for `keyType` field):
| Key | Bit | Value | Controls |
| ------ | --- | ----- | ---------------------------- |
| ADMIN | 0 | 1 | Update token, keys, deletion |
| KYC | 1 | 2 | Grant/revoke KYC |
| FREEZE | 2 | 4 | Freeze/unfreeze accounts |
| WIPE | 3 | 8 | Wipe balances |
| SUPPLY | 4 | 16 | Mint/burn |
| FEE | 5 | 32 | Update fees |
| PAUSE | 6 | 64 | Pause all operations |
Use `KeyHelper` for key construction:
```solidity
keys[0] = getSingleKey(KeyType.SUPPLY, KeyValueType.CONTRACT_ID, address(this));
```
See [references/keys.md](references/keys.md) for key value types and JSON tuple format.
## Association Model
Accounts must associate with tokens before receiving them:
```solidity
int rc = associateToken(accountAddress, tokenAddress);
require(
rc == HederaResponseCodes.SUCCESS ||
rc == HederaResponseCodes.TOKEN_ALREADY_ASSOCIATED_TO_ACCOUNT,
"Association failed"
);
```
## Common Patterns
### Fungible Token Creation
```solidity
function createToken() external payable {
IHederaTokenService.HederaToken memory token;
token.name = "My Token";
token.symbol = "MTK";
token.treasury = address(this);
token.expiry = createAutoRenewExpiry(address(this), 7776000); // 90 days
(int rc, address created) = createFungibleToken{value: msg.value}(
token, 1000000, 18 // initialSupply, decimals
);
require(rc == HederaResponseCodes.SUCCESS, "Create failed");
}
```
### Mintable NFT Collection
```solidity
function createNFT() external payable {
IHederaTokenService.HederaToken memory token;
token.name = "My NFT";
token.symbol = "MNFT";
token.treasury = address(this);
token.tokenSupplyType = true; // FINITE
token.maxSupply = 10000;
IHederaTokenService.TokenKey[] memory keys = new IHederaTokenService.TokenKey[](1);
keys[0] = getSingleKey(KeyType.SUPPLY, KeyValueType.CONTRACT_ID, address(this));
token.tokenKeys = keys;
token.expiry = createAutoRenewExpiry(address(this), 7776000);
(int rc, address created) = createNonFungibleToken{value: msg.value}(token);
require(rc == HederaResponseCodes.SUCCESS, "Create failed");
}
function mintNFT(bytes memory metadata) external {
bytes[] memory metas = new bytes[](1);
metas[0] = metadata;
(int rc, , int64[] memory serials) = mintToken(tokenAddress, 0, metas);
require(rc == HederaResponseCodes.SUCCESS, "Mint failed");
}
```
### KYC-Enabled Token
Treasury must self-grant KYC after creation:
```solidity
// After token creation with KYC key
int kycRc = grantTokenKyc(tokenAddress, address(this));
require(kycRc == HederaResponseCodes.SUCCESS, "Self-KYC failed");
```
## Response Code Handling
Always check response codes. SUCCESS = 22.
```solidity
require(responseCode == HederaResponseCodes.SUCCESS, "Operation failed");
```
Common codes: See [references/response-codes.md](references/response-codes.md)
## Additional References
- **API Reference**: [references/api.md](references/api.md) - All function signatures
- **Custom Fees**: [references/fees.md](references/fees.md) - Fixed, fractional, royalty fees
- **Compliance Controls**: [references/compliance.md](references/compliance.md) - KYC, freeze, pause details
- **Struct Definitions**: [references/structs.md](references/structs.md) - HederaToken, Expiry, etc.
- **Troubleshooting**: [references/troubleshooting.md](references/troubleshooting.md) - Common errors and fixes
© hedera-dev · Apache-2.0 · hedera-dev/hedera-skills