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_without_burn_build_exec.js scripts/dao/dao.config.env"
|