SHA256
207 lines
7.1 KiB
Markdown
207 lines
7.1 KiB
Markdown
# 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`.
|