Files
SHiNE-server/shine-solana/shine/create-SHiNE-DAO/README.md
T

207 lines
7.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# create-SHiNE-DAO
Чистый актуальный комплект для создания SHiNE DAO с governance NFT и для работы с NFT, которые:
1. можно выпускать через голосование DAO;
2. можно сжигать через голосование DAO;
3. в будущем можно будет сжигать через отдельную быструю программу-исполнитель только для одного конкретного `mint`.
Этот набор сделан как production-style папка:
- без старых `runs/`;
- без старых `keypairs/`;
- без legacy-скриптов;
- без смешивания нескольких исторических подходов.
## Что внутри
- `dao.config.env.example` - шаблон конфига для создания самого DAO.
- `nft-flow.config.env.example` - шаблон конфига для выпуска и burn NFT через уже созданное DAO.
- `scripts/01_check_dao_config.sh` - предстаровая проверка конфига DAO.
- `scripts/02_create_dao_with_governance_nfts.js` - создание DAO с governance NFT.
- `scripts/03_prepare_second_voter.js` - подготовка второго голосующего.
- `scripts/04_create_empty_nft_template_with_metadata.js` - создание NFT mint-шаблона с metadata и картинкой.
- `scripts/05_propose_vote_mint_nft.js` - proposal/sign/vote на mint NFT.
- `scripts/06_execute_mint_nft.js` - execute mint proposal.
- `scripts/07_propose_vote_burn_nft.js` - proposal/sign/vote на burn NFT.
- `scripts/08_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-модуля:
```bash
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`
## Быстрый сценарий: создать DAO и запустить NFT-flow
### 1. Создать конфиг DAO
```bash
cp create-SHiNE-DAO/dao.config.env.example create-SHiNE-DAO/dao.config.env
```
Заполнить:
- имя DAO;
- путь к keypair создателя;
- имя и символ governance NFT;
- `DAO_GOV_NFT_SUPPLY` (обычно `10`);
- `DAO_GOV_TOKEN_METADATA_URI` и `DAO_GOV_TOKEN_IMAGE_URL`.
### 2. Проверить конфиг DAO
```bash
./create-SHiNE-DAO/scripts/01_check_dao_config.sh ./create-SHiNE-DAO/dao.config.env
```
### 3. Создать DAO
```bash
node create-SHiNE-DAO/scripts/02_create_dao_with_governance_nfts.js ./create-SHiNE-DAO/dao.config.env
```
После этого из отчета взять:
- `realm`
- `governance`
- `communityMint`
### 4. Создать конфиг NFT-flow
```bash
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.
### 5. Подготовить второго голосующего
```bash
node create-SHiNE-DAO/scripts/03_prepare_second_voter.js ./create-SHiNE-DAO/nft-flow.config.env
```
### 6. Создать NFT mint-шаблон с metadata
```bash
node create-SHiNE-DAO/scripts/04_create_empty_nft_template_with_metadata.js ./create-SHiNE-DAO/nft-flow.config.env
```
Скрипт вернет `mint` будущего NFT.
### 7. Поднять proposal на mint NFT
```bash
node create-SHiNE-DAO/scripts/05_propose_vote_mint_nft.js \
./create-SHiNE-DAO/nft-flow.config.env \
<TARGET_WALLET> \
<NFT_MINT>
```
### 8. Выполнить mint proposal
```bash
node create-SHiNE-DAO/scripts/06_execute_mint_nft.js \
./create-SHiNE-DAO/nft-flow.config.env \
<PROPOSAL> \
<PROPOSAL_TX> \
<TARGET_WALLET> \
<NFT_MINT>
```
### 9. Поднять proposal на burn NFT
```bash
node create-SHiNE-DAO/scripts/07_propose_vote_burn_nft.js \
./create-SHiNE-DAO/nft-flow.config.env \
<CURRENT_OWNER_WALLET> \
<NFT_MINT>
```
### 10. Выполнить burn proposal
```bash
node create-SHiNE-DAO/scripts/08_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
На старте governance NFT mint'ятся создателю DAO, а затем депонируются в Realm.
Практически это означает:
- первоначальный voting power принадлежит создателю DAO;
- затем governance NFT можно дополнительно распределять между другими участниками.
## Future
Если нужен сценарий "хитрый владелец постоянно перекладывает NFT", смотреть:
- `docs/FUTURE_FAST_BURN_EXECUTOR.md`
Там описана целевая отдельная программа, которой DAO может выдать одноразовое право сжечь только один конкретный `mint`.