SHA256
Подготовка перед деплоем в mainnet
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# create-SHiNE-DAO
|
||||
|
||||
Чистый актуальный комплект для создания SHiNE DAO с governance NFT и для работы с NFT, которые:
|
||||
Чистый актуальный комплект для создания SHiNE DAO с переносимым governance mint (`Liquid`) и для работы с NFT, которые:
|
||||
|
||||
1. можно выпускать через голосование DAO;
|
||||
2. можно сжигать через голосование DAO;
|
||||
@@ -15,16 +15,18 @@
|
||||
|
||||
## Что внутри
|
||||
|
||||
- `dao.config.env.example` - шаблон конфига для создания самого DAO.
|
||||
- `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.
|
||||
- `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.
|
||||
- `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`.
|
||||
|
||||
## Подтвержденная база, на которой собран комплект
|
||||
@@ -74,9 +76,9 @@ npm install
|
||||
- `solana-keygen`
|
||||
- `node`
|
||||
|
||||
## Быстрый сценарий: создать DAO и запустить NFT-flow
|
||||
## Быстрый сценарий: создать mint, раздать токены, создать DAO и затем передать все права на DAO
|
||||
|
||||
### 1. Создать конфиг DAO
|
||||
### 1. Создать конфиг
|
||||
|
||||
```bash
|
||||
cp create-SHiNE-DAO/dao.config.env.example create-SHiNE-DAO/dao.config.env
|
||||
@@ -86,29 +88,116 @@ cp create-SHiNE-DAO/dao.config.env.example create-SHiNE-DAO/dao.config.env
|
||||
|
||||
- имя DAO;
|
||||
- путь к keypair создателя;
|
||||
- имя и символ governance NFT;
|
||||
- `DAO_GOV_NFT_SUPPLY` (обычно `10`);
|
||||
- имя и символ governance mint;
|
||||
- при необходимости `DAO_GOV_MINT_KEYPAIR` для красивого или фиксированного mint address;
|
||||
- `DAO_GOV_TOKEN_METADATA_URI` и `DAO_GOV_TOKEN_IMAGE_URL`.
|
||||
|
||||
### 2. Проверить конфиг DAO
|
||||
Обычно используются два keypair-файла:
|
||||
|
||||
- `DAO_ISSUER_KEYPAIR` - временный кошелёк создателя/оператора;
|
||||
- `DAO_GOV_MINT_KEYPAIR` - keypair самого mint, если нужен красивый адрес governance mint.
|
||||
|
||||
Сгенерировать их можно так:
|
||||
|
||||
```bash
|
||||
solana-keygen new --outfile ./dao-issuer.json
|
||||
solana-keygen new --outfile ./dao-gov-mint.json
|
||||
```
|
||||
|
||||
Публичные ключи посмотреть так:
|
||||
|
||||
```bash
|
||||
solana-keygen pubkey ./dao-issuer.json
|
||||
solana-keygen pubkey ./dao-gov-mint.json
|
||||
```
|
||||
|
||||
Практическое правило:
|
||||
|
||||
- первый keypair обычно временный, его красивый адрес не важен;
|
||||
- красивым обычно имеет смысл делать именно `DAO_GOV_MINT_KEYPAIR`, потому что это постоянный публичный адрес governance mint.
|
||||
|
||||
### 2. Создать governance mint
|
||||
|
||||
```bash
|
||||
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. Раздать токены вручную
|
||||
|
||||
```bash
|
||||
spl-token mint <GOVERNANCE_MINT> 1 <WALLET_1>
|
||||
spl-token mint <GOVERNANCE_MINT> 1 <WALLET_2>
|
||||
```
|
||||
|
||||
После этого можно руками наминтить управляющие токены на нужные кошельки.
|
||||
На этом этапе токен ещё обычный и переносимый.
|
||||
|
||||
### 4. Проверить конфиг DAO
|
||||
|
||||
```bash
|
||||
./create-SHiNE-DAO/scripts/01_check_dao_config.sh ./create-SHiNE-DAO/dao.config.env
|
||||
```
|
||||
|
||||
### 3. Создать DAO
|
||||
Перед проверкой в `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
|
||||
|
||||
```bash
|
||||
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`
|
||||
|
||||
### 4. Создать конфиг NFT-flow
|
||||
### 6. Передать все authority на DAO
|
||||
|
||||
```bash
|
||||
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
|
||||
|
||||
```bash
|
||||
cp create-SHiNE-DAO/nft-flow.config.env.example create-SHiNE-DAO/nft-flow.config.env
|
||||
@@ -123,33 +212,33 @@ cp create-SHiNE-DAO/nft-flow.config.env.example create-SHiNE-DAO/nft-flow.config
|
||||
- `VOTER2_KEYPAIR`
|
||||
- metadata URI и картинку для целевого NFT.
|
||||
|
||||
### 5. Подготовить второго голосующего
|
||||
### 8. Подготовить второго голосующего
|
||||
|
||||
```bash
|
||||
node create-SHiNE-DAO/scripts/03_prepare_second_voter.js ./create-SHiNE-DAO/nft-flow.config.env
|
||||
node create-SHiNE-DAO/scripts/04_prepare_second_voter.js ./create-SHiNE-DAO/nft-flow.config.env
|
||||
```
|
||||
|
||||
### 6. Создать NFT mint-шаблон с metadata
|
||||
### 9. Создать NFT mint-шаблон с metadata
|
||||
|
||||
```bash
|
||||
node create-SHiNE-DAO/scripts/04_create_empty_nft_template_with_metadata.js ./create-SHiNE-DAO/nft-flow.config.env
|
||||
node create-SHiNE-DAO/scripts/05_create_empty_nft_template_with_metadata.js ./create-SHiNE-DAO/nft-flow.config.env
|
||||
```
|
||||
|
||||
Скрипт вернет `mint` будущего NFT.
|
||||
|
||||
### 7. Поднять proposal на mint NFT
|
||||
### 10. Поднять proposal на mint NFT
|
||||
|
||||
```bash
|
||||
node create-SHiNE-DAO/scripts/05_propose_vote_mint_nft.js \
|
||||
node create-SHiNE-DAO/scripts/06_propose_vote_mint_nft.js \
|
||||
./create-SHiNE-DAO/nft-flow.config.env \
|
||||
<TARGET_WALLET> \
|
||||
<NFT_MINT>
|
||||
```
|
||||
|
||||
### 8. Выполнить mint proposal
|
||||
### 11. Выполнить mint proposal
|
||||
|
||||
```bash
|
||||
node create-SHiNE-DAO/scripts/06_execute_mint_nft.js \
|
||||
node create-SHiNE-DAO/scripts/07_execute_mint_nft.js \
|
||||
./create-SHiNE-DAO/nft-flow.config.env \
|
||||
<PROPOSAL> \
|
||||
<PROPOSAL_TX> \
|
||||
@@ -157,19 +246,19 @@ node create-SHiNE-DAO/scripts/06_execute_mint_nft.js \
|
||||
<NFT_MINT>
|
||||
```
|
||||
|
||||
### 9. Поднять proposal на burn NFT
|
||||
### 12. Поднять proposal на burn NFT
|
||||
|
||||
```bash
|
||||
node create-SHiNE-DAO/scripts/07_propose_vote_burn_nft.js \
|
||||
node create-SHiNE-DAO/scripts/08_propose_vote_burn_nft.js \
|
||||
./create-SHiNE-DAO/nft-flow.config.env \
|
||||
<CURRENT_OWNER_WALLET> \
|
||||
<NFT_MINT>
|
||||
```
|
||||
|
||||
### 10. Выполнить burn proposal
|
||||
### 13. Выполнить burn proposal
|
||||
|
||||
```bash
|
||||
node create-SHiNE-DAO/scripts/08_execute_burn_nft.js \
|
||||
node create-SHiNE-DAO/scripts/09_execute_burn_nft.js \
|
||||
./create-SHiNE-DAO/nft-flow.config.env \
|
||||
<PROPOSAL> \
|
||||
<PROPOSAL_TX> \
|
||||
@@ -190,12 +279,18 @@ node create-SHiNE-DAO/scripts/08_execute_burn_nft.js \
|
||||
|
||||
## Что важно про стартовые governance NFT
|
||||
|
||||
На старте governance NFT mint'ятся создателю DAO, а затем депонируются в Realm.
|
||||
В новом трёхшаговом flow governance mint создается отдельно, токены можно распределить вручную до создания DAO, а затем отдельным шагом DAO получает права на:
|
||||
|
||||
Практически это означает:
|
||||
- `mint authority`
|
||||
- `freeze authority`
|
||||
- `realm authority`
|
||||
- `metadata update authority`
|
||||
|
||||
- первоначальный voting power принадлежит создателю DAO;
|
||||
- затем governance NFT можно дополнительно распределять между другими участниками.
|
||||
Это сделано специально, чтобы:
|
||||
|
||||
1. сначала спокойно распределить токены;
|
||||
2. затем создать Realm без блокировки стартовых токенов;
|
||||
3. и только потом окончательно передать контроль DAO.
|
||||
|
||||
## Future
|
||||
|
||||
|
||||
Reference in New Issue
Block a user