SHA256
107 lines
3.7 KiB
Bash
Executable File
107 lines
3.7 KiB
Bash
Executable File
#!/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 <<EOF
|
|
============================================================
|
|
ПРЕДСТАРТОВАЯ ПРОВЕРКА DAO (Realms)
|
|
------------------------------------------------------------
|
|
Сеть: $DAO_CLUSTER
|
|
Realm name: $DAO_REALM_NAME
|
|
Realm PDA: $REALM_PDA
|
|
Realm уже существует: $REALM_EXISTS
|
|
Governance program: $SPL_GOVERNANCE_PROGRAM_ID
|
|
Эмиттер (issuer): $ISSUER_PUBKEY
|
|
Баланс эмиттера: ${ISSUER_BALANCE:-unknown}
|
|
NFT name: $DAO_GOV_NFT_NAME
|
|
NFT symbol: $DAO_GOV_NFT_SYMBOL
|
|
NFT supply: $DAO_GOV_NFT_SUPPLY
|
|
Voting time (sec): $DAO_VOTING_TIME_SEC
|
|
Threshold %: $DAO_APPROVAL_THRESHOLD_PERCENT
|
|
Конфиг: $CONFIG_PATH
|
|
============================================================
|
|
EOF
|
|
|
|
if [[ "$REALM_EXISTS" == "yes" ]]; then
|
|
echo "Стоп: realm с таким именем уже существует в этой сети."
|
|
echo "Поменяйте DAO_REALM_NAME в конфиге и запустите снова."
|
|
exit 1
|
|
fi
|
|
|
|
echo
|
|
echo "Проверка пройдена."
|
|
echo "Этот скрипт делает только preflight-валидацию."
|
|
echo "Для реального создания DAO запускайте исполняющий скрипт:"
|
|
echo "node scripts/dao/create_realm_dao_full_build_exec.js scripts/dao/dao.config.env"
|