Lewati ke isi

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:

  1. 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
    

  2. 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
    

  3. 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
    

  4. Catatan: Anvil --load-state adalah chain terpisah dari validator Besu. Read (saldo vault/pool) benar; tx write via public RPC masuk ke Anvil, bukan IBFT consensus. Revert ke main-validator1:8595 setelah 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

  1. Pre-cliff: Transfer GDC langsung ke kontrak klaim untuk bootstrap pool, atau set BOOTSTRAP_CLAIM_POOL di script fund.
  2. Post-cliff (~1 bln): Admin panggil POST /api/v1/admin/community/release-vault untuk 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