SHA256
Обновить документацию и словари
This commit is contained in:
@@ -0,0 +1,206 @@
|
||||
# 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`.
|
||||
Reference in New Issue
Block a user