Files

11 KiB
Raw Permalink Blame History

create-SHiNE-DAO

Чистый актуальный комплект для создания SHiNE DAO с переносимым governance mint (Liquid) и для работы с NFT, которые:

  1. можно выпускать через голосование DAO;
  2. можно сжигать через голосование DAO;
  3. в будущем можно будет сжигать через отдельную быструю программу-исполнитель только для одного конкретного mint.

Этот набор сделан как production-style папка:

  • без старых runs/;
  • без старых keypairs/;
  • без legacy-скриптов;
  • без смешивания нескольких исторических подходов.

Что внутри

  • dao.config.env.example - шаблон конфига для создания mint и DAO в три шага.
  • scripts/01_create_governance_mint.js - создание governance mint и metadata без депозита в Realm.
  • scripts/02_create_dao_with_governance_nfts.js - создание Realm / TokenOwnerRecord / Governance / Treasury без deposit и без передачи authority.
  • scripts/03_transfer_dao_authorities.js - передача mint authority, freeze authority, realm authority и metadata update authority на DAO.
  • nft-flow.config.env.example - шаблон конфига для выпуска и burn NFT через уже созданное DAO.
  • scripts/01_check_dao_config.sh - проверка конфига перед созданием DAO из существующего mint.
  • scripts/04_prepare_second_voter.js - подготовка второго голосующего.
  • scripts/05_create_empty_nft_template_with_metadata.js - создание NFT mint-шаблона с metadata и картинкой.
  • scripts/06_propose_vote_mint_nft.js - proposal/sign/vote на mint NFT.
  • scripts/07_execute_mint_nft.js - execute mint proposal.
  • scripts/08_propose_vote_burn_nft.js - proposal/sign/vote на burn NFT.
  • scripts/09_execute_burn_nft.js - execute burn proposal.
  • docs/FUTURE_FAST_BURN_EXECUTOR.md - описание будущей программы для быстрого burn одного конкретного mint.

Подтвержденная база, на которой собран комплект

Комплект собран из тех сценариев, которые уже были подтверждены на devnet:

  • DAO с Realm / Governance / Native Treasury;
  • mint NFT через DAO;
  • burn NFT через DAO.

Важное ограничение текущей схемы burn через DAO

Текущий стандартный burn через proposal работает так:

  1. в proposal вшивается конкретная burn-инструкция;
  2. в ней зашит конкретный token account, из которого надо сжигать NFT;
  3. если владелец успеет переложить NFT в другой token account до execute, этот execute может не пройти.

То есть:

  • burn определяется по mint;
  • но исполняется из конкретного текущего token account;
  • если токен двигают между proposal и execute, нужна более быстрая схема.

Именно для этого отдельно описан future-подход с одноразовым fast-burn executor.

Что нужно заранее

В корне Solana-модуля:

cd shine-solana/shine
npm install

Нужны зависимости:

  • @solana/web3.js
  • @solana/spl-token
  • @solana/spl-governance
  • @metaplex-foundation/mpl-token-metadata
  • @metaplex-foundation/umi

Также должны быть установлены CLI:

  • solana
  • solana-keygen
  • node

Быстрый сценарий: создать mint, раздать токены, создать DAO и затем передать все права на DAO

1. Создать конфиг

cp create-SHiNE-DAO/dao.config.env.example create-SHiNE-DAO/dao.config.env

Заполнить:

  • имя DAO;
  • путь к keypair создателя;
  • имя и символ governance mint;
  • при необходимости DAO_GOV_MINT_KEYPAIR для красивого или фиксированного mint address;
  • DAO_GOV_TOKEN_METADATA_URI и DAO_GOV_TOKEN_IMAGE_URL.

Обычно используются два keypair-файла:

  • DAO_ISSUER_KEYPAIR - временный кошелёк создателя/оператора;
  • DAO_GOV_MINT_KEYPAIR - keypair самого mint, если нужен красивый адрес governance mint.

Сгенерировать их можно так:

solana-keygen new --outfile ./dao-issuer.json
solana-keygen new --outfile ./dao-gov-mint.json

Публичные ключи посмотреть так:

solana-keygen pubkey ./dao-issuer.json
solana-keygen pubkey ./dao-gov-mint.json

Практическое правило:

  • первый keypair обычно временный, его красивый адрес не важен;
  • красивым обычно имеет смысл делать именно DAO_GOV_MINT_KEYPAIR, потому что это постоянный публичный адрес governance mint.

2. Создать governance mint

node create-SHiNE-DAO/scripts/01_create_governance_mint.js ./create-SHiNE-DAO/dao.config.env

Этот шаг:

  1. создаёт mint;
  2. прикрепляет metadata на Arweave;
  3. оставляет у кошелька создателя:
    • mint authority
    • freeze authority
    • metadata update authority

Актуальные Arweave-ссылки для governance mint сейчас такие:

  • image: https://arweave.net/rPGo-uYIFoLxMBVTGyPr5K6fuF0y9xL-8TlAaZyBJgY
  • metadata: https://arweave.net/PdupvtRhj_DTBjTLcjD7Z5GSiEcFUf01GHaYMDs6gGw

3. Раздать токены вручную

spl-token mint <GOVERNANCE_MINT> 1 <WALLET_1>
spl-token mint <GOVERNANCE_MINT> 1 <WALLET_2>

После этого можно руками наминтить управляющие токены на нужные кошельки.
На этом этапе токен ещё обычный и переносимый.

4. Проверить конфиг DAO

./create-SHiNE-DAO/scripts/01_check_dao_config.sh ./create-SHiNE-DAO/dao.config.env

Перед проверкой в dao.config.env нужно указать:

  • DAO_GOV_TOKEN_MINT - уже созданный mint;
  • DAO_REALM_NAME - новое имя DAO;
  • DAO_ISSUER_KEYPAIR - кошелёк создателя;
  • DAO_VOTING_TIME_SEC - по умолчанию 86400 секунд (1 день);
  • DAO_APPROVAL_THRESHOLD_PERCENT.

5. Создать DAO

node create-SHiNE-DAO/scripts/02_create_dao_with_governance_nfts.js ./create-SHiNE-DAO/dao.config.env

Этот шаг:

  • создаёт Realm;
  • создаёт TokenOwnerRecord для кошелька создателя без deposit;
  • создаёт Governance и Native Treasury;
  • задаёт community token type = Liquid;
  • не делает deposit токенов;
  • не передаёт authority.

После этого из отчета взять:

  • realm
  • governance
  • communityMint
  • tokenOwnerRecord

6. Передать все authority на DAO

node create-SHiNE-DAO/scripts/03_transfer_dao_authorities.js ./create-SHiNE-DAO/dao.config.env

Этот шаг передаёт на DAO:

  • mint authority
  • freeze authority
  • realm authority
  • metadata update authority

После этого у создателя не должно остаться административных прав на governance mint и Realm.

7. Создать конфиг NFT-flow

cp create-SHiNE-DAO/nft-flow.config.env.example create-SHiNE-DAO/nft-flow.config.env

Подставить:

  • REALM
  • GOVERNANCE
  • GOVERNING_MINT
  • MAIN_KEYPAIR
  • VOTER2_KEYPAIR
  • metadata URI и картинку для целевого NFT.

8. Подготовить второго голосующего

node create-SHiNE-DAO/scripts/04_prepare_second_voter.js ./create-SHiNE-DAO/nft-flow.config.env

9. Создать NFT mint-шаблон с metadata

node create-SHiNE-DAO/scripts/05_create_empty_nft_template_with_metadata.js ./create-SHiNE-DAO/nft-flow.config.env

Скрипт вернет mint будущего NFT.

10. Поднять proposal на mint NFT

node create-SHiNE-DAO/scripts/06_propose_vote_mint_nft.js \
  ./create-SHiNE-DAO/nft-flow.config.env \
  <TARGET_WALLET> \
  <NFT_MINT>

11. Выполнить mint proposal

node create-SHiNE-DAO/scripts/07_execute_mint_nft.js \
  ./create-SHiNE-DAO/nft-flow.config.env \
  <PROPOSAL> \
  <PROPOSAL_TX> \
  <TARGET_WALLET> \
  <NFT_MINT>

12. Поднять proposal на burn NFT

node create-SHiNE-DAO/scripts/08_propose_vote_burn_nft.js \
  ./create-SHiNE-DAO/nft-flow.config.env \
  <CURRENT_OWNER_WALLET> \
  <NFT_MINT>

13. Выполнить burn proposal

node create-SHiNE-DAO/scripts/09_execute_burn_nft.js \
  ./create-SHiNE-DAO/nft-flow.config.env \
  <PROPOSAL> \
  <PROPOSAL_TX> \
  <CURRENT_OWNER_WALLET> \
  <NFT_MINT>

Что важно про картинку NFT

У конкретного NFT картинка идет не отдельным on-chain полем, а через metadata JSON по uri.

То есть нужно:

  1. загрузить JSON metadata на Arweave/IPFS/HTTPS;
  2. в JSON указать image;
  3. в конфиге передать NFT_METADATA_URI;
  4. NFT_IMAGE_URL хранить для явной проверки и документации.

Что важно про стартовые governance NFT

В новом трёхшаговом flow governance mint создается отдельно, токены можно распределить вручную до создания DAO, а затем отдельным шагом DAO получает права на:

  • mint authority
  • freeze authority
  • realm authority
  • metadata update authority

Это сделано специально, чтобы:

  1. сначала спокойно распределить токены;
  2. затем создать Realm без блокировки стартовых токенов;
  3. и только потом окончательно передать контроль DAO.

Future

Если нужен сценарий "хитрый владелец постоянно перекладывает NFT", смотреть:

  • docs/FUTURE_FAST_BURN_EXECUTOR.md

Там описана целевая отдельная программа, которой DAO может выдать одноразовое право сжечь только один конкретный mint.