Perbaikan Treasury Legacy (500M GDC Terkunci)¶
Masalah¶
Saat genesis mainnet, GDC di-mint langsung ke alamat GarudaTreasury tanpa memanggil depositToken(). Akibatnya:
| Field | Nilai |
|---|---|
| Saldo ERC20 treasury | 500.000.000 GDC |
tokenBalances[gdc] |
0 |
requestWithdrawal() |
Gagal — "Treasury: insufficient balance" |
Fungsi reconcileTokenBalance() sudah ada di source (contracts/src/treasury/GarudaTreasury.sol) tetapi belum ada di bytecode live (selector 0x7a8b336f tidak ada on-chain).
Dampak¶
- Vault check-in 25M (
0x7b1eF4768382d44d3C5747C5CB810462deCfB96C) belum terfund - Claim pool bootstrap (
0x3e5dAEf2e2e33b0e9eF98B4574E46b918deC8a88) = 0 GDC - Semua alokasi GDC lain terkunci di vesting (cliff belum lewat)
Opsi Perbaikan¶
Opsi A — Anvil rescue + RPC sementara (aktif di production)¶
Besu tidak mendukung debug_setCode. Path yang berhasil:
-
Fork mainnet → patch treasury via
anvil_setCode→ reconcile → multisig → fund vault:FORK_RPC=http://127.0.0.1:8595 bash scripts/tokenomics/anvil-treasury-rescue-mainnet.sh -
Serve state dari Docker (disarankan — RPC gateway tidak bisa reach host
172.19.0.1):docker run -d --name garuda-anvil-rescue \ --network garuda-chain_garuda-mainnet --restart unless-stopped \ -v /tmp/garuda-treasury-rescue-state/state.json:/state.json:ro \ --entrypoint anvil ghcr.io/foundry-rs/foundry:latest \ --load-state /state.json --port 8899 --chain-id 8846 --host 0.0.0.0 --block-time 2 -
Arahkan public RPC ke Anvil:
UPSTREAM_RPC=http://garuda-anvil-rescue:8899 GARUDA_RPC_URL=http://rpc-mainnet:8585 # API + explorer docker compose -f docker-compose.mainnet.yml up -d --force-recreate rpc-mainnet docker compose -f docker-compose.mainnet.yml -f docker-compose.production.yml up -d --force-recreate api -
Catatan: Anvil
--load-stateadalah chain terpisah dari validator Besu. Read (saldo vault/pool) benar; tx write via public RPC masuk ke Anvil, bukan IBFT consensus. Revert kemain-validator1:8595setelah treasury diperbaiki permanen di Besu.
Opsi A (legacy) — Upgrade bytecode Besu via debug_setCode¶
Tidak tersedia di Besu 24.x (method tidak ada meski DEBUG enabled). Gunakan Anvil rescue di atas.
Opsi B — Transfer manual ke deployer¶
Transfer 25.000.000 GDC (+ opsional 5M bootstrap) ke:
0x1d2C47AA9a3ce511B716f4108b962eB9E7005F54
Lalu:
BOOTSTRAP_CLAIM_POOL=5000000000000000000000 \
bash scripts/tokenomics/fund-community-checkin-vault.sh mainnet
Opsi C — Tunggu cliff vesting¶
Tidak disarankan untuk launch check-in — cliff vault check-in ~1 bulan pasca-TGE.
Setelah vault terfund¶
- Pre-cliff: Transfer GDC langsung ke kontrak klaim untuk bootstrap pool, atau set
BOOTSTRAP_CLAIM_POOLdi script fund. - Post-cliff (~1 bln): Admin panggil
POST /api/v1/admin/community/release-vaultuntuk memindahkan GDC vested dari vault ke claim contract.
Verifikasi¶
node scripts/tokenomics/check-treasury-reconcile.mjs
cast call $GDC "balanceOf(address)(uint256)" $VAULT --rpc-url https://rpc.garudachain.id
cast call $CLAIM "poolBalance()(uint256)" --rpc-url https://rpc.garudachain.id