# Smart contracts DChain поддерживает **два типа** контрактов — native Go (запечены в бинарь ноды) и WASM (деплоятся on-chain через `DEPLOY_CONTRACT` tx). ## Native (Go, скомпилированы в бинарь) Живут в `blockchain/native*.go`. Видны как `native:`, работают на каждой ноде идентично (тот же Go-код — нет WASM-drift'а). | Контракт | ID | Назначение | |----------|----|-----------| | [username_registry](username_registry.md) | `native:username_registry` | `@username` ↔ pubkey, плата 10_000 µT, min 4 символа | Клиент находит `native:username_registry` автоматически через `/api/well-known-contracts` — без конфигурирования. ## WASM (user-deployable) Деплоятся любым обладателем баланса через `client deploy-contract`. Исполняются в wazero runtime с gas limit и set'ом host-функций. | Контракт | Назначение | Key features | |----------|------------|--------------| | [governance](governance.md) | On-chain параметры | Propose/approve workflow, admin role | | [auction](auction.md) | English auction | Token escrow, автоматический refund, settle | | [escrow](escrow.md) | Двусторонний escrow | Dispute/resolve, admin arbitration | Исходники + WASM-артефакты — в `contracts//`. SDK для написания новых контрактов — [../development/README.md](../development/README.md). ## Деплой WASM Контракты **не деплоятся автоматически** — это выбор оператора. Скрипт-хелпер: ```bash ./scripts/deploy_contracts.sh # деплоит auction + escrow + governance из CWD ``` Или вручную: ```bash client deploy-contract \ --key node.json \ --wasm contracts/auction/auction.wasm \ --abi contracts/auction/auction_abi.json \ --node http://localhost:8080 ``` После деплоя `contract_id` печатается в stdout — сохраните его. ## Вызов контракта (любой типа) ```bash client call-contract \ --key node.json \ --contract \ --method \ --arg # можно повторять --arg64 # числовые аргументы --gas 20000 # reasonable default; read-only методы: 5000 --amount 0 # tx.Amount (для методов с платой — см. username_registry) --node http://localhost:8080 ``` ## Contract treasury У каждого WASM-контракта есть **ownerless treasury** по адресу `hex(sha256(contractID + ":treasury"))`. Private-key не существует, списывать можно только через host function `transfer` из самого контракта. Используется `auction` (escrow bids) и `escrow` (held amount). ## Просмотр state / логов ```bash # Конкретный ключ state curl -s http://localhost:8080/api/contracts//state/ # Последние N логов контракта curl -s "http://localhost:8080/api/contracts//logs?limit=20" | jq . # Или через Explorer UI open http://localhost:8080/contract?id= ```