#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" CONFIG_PATH="${1:-$SCRIPT_DIR/dao.config.env}" if [[ ! -f "$CONFIG_PATH" ]]; then echo "Ошибка: не найден конфиг $CONFIG_PATH" exit 1 fi # shellcheck disable=SC1090 source "$CONFIG_PATH" require_cmd() { if ! command -v "$1" >/dev/null 2>&1; then echo "Ошибка: команда '$1' не найдена" exit 1 fi } require_cmd solana require_cmd solana-keygen require_cmd node if [[ -z "${DAO_REALM_NAME:-}" || -z "${DAO_CLUSTER:-}" || -z "${DAO_ISSUER_KEYPAIR:-}" || -z "${SPL_GOVERNANCE_PROGRAM_ID:-}" ]]; then echo "Ошибка: обязательные поля конфига пустые" exit 1 fi if [[ ! -f "$DAO_ISSUER_KEYPAIR" ]]; then echo "Ошибка: keypair не найден: $DAO_ISSUER_KEYPAIR" exit 1 fi if [[ "${DAO_REALM_NAME}" == *"TEMPLATE"* || "${DAO_REALM_NAME}" == *"CHANGE_ME"* ]]; then echo "Ошибка: похоже, не заменили тестовое имя DAO_REALM_NAME" exit 1 fi if ! [[ "${DAO_VOTING_TIME_SEC}" =~ ^[0-9]+$ ]] || ! [[ "${DAO_GOV_NFT_SUPPLY}" =~ ^[0-9]+$ ]] || ! [[ "${DAO_APPROVAL_THRESHOLD_PERCENT}" =~ ^[0-9]+$ ]]; then echo "Ошибка: числовые параметры заданы некорректно" exit 1 fi if (( DAO_APPROVAL_THRESHOLD_PERCENT < 51 || DAO_APPROVAL_THRESHOLD_PERCENT > 100 )); then echo "Ошибка: DAO_APPROVAL_THRESHOLD_PERCENT должен быть в диапазоне 51..100" exit 1 fi ISSUER_PUBKEY="$(solana-keygen pubkey "$DAO_ISSUER_KEYPAIR")" ISSUER_BALANCE="$(solana balance "$ISSUER_PUBKEY" --url "$DAO_CLUSTER" 2>/dev/null || true)" REALM_PDA="$(node - "$DAO_REALM_NAME" "$SPL_GOVERNANCE_PROGRAM_ID" <<'NODE' const { PublicKey } = require("@solana/web3.js"); const realmName = process.argv[2]; const programId = new PublicKey(process.argv[3]); const [pda] = PublicKey.findProgramAddressSync( [Buffer.from("governance"), Buffer.from(realmName, "utf8")], programId ); console.log(pda.toBase58()); NODE )" if [[ -z "$REALM_PDA" ]]; then echo "Ошибка: не удалось вычислить PDA realm." exit 1 fi REALM_EXISTS="no" if solana account "$REALM_PDA" --url "$DAO_CLUSTER" >/dev/null 2>&1; then REALM_EXISTS="yes" fi cat <