# BIBI 版（Proxy 代理合约测试）— 首次部署教程

> **现状：** 网站「BIBI版（Proxy代理合约测试）」页签目前还指向 911 同款**不可升级**地址。  
> 要接上可升级 Proxy，需要**先部署一套新的 Proxy**（不是对旧地址 `upgradeTo`）。  
> 本教程用的 Implementation 已含 **批量滴灌结算（省 gas）**，`version()` = `1.1.0-proxy`。

玩家永远只跟 **Proxy 地址**交互。以后再改规则：部署新 Implementation → `owner` 对 Proxy 调 `upgradeTo`。

---

## 你要准备的

1. MetaMask（或同类钱包），切到 **BSC 主网**，有少量 BNB 付 gas  
2. Remix：https://remix.ethereum.org  
3. 仓库里这两个文件全文：
   - `contracts/FomoMinerBibiUpgradeable.sol`（或网站 `/contracts` 开源页同名文件）
   - `contracts/proxy/ERC1967Proxy.sol`

### 初始化参数（与线上一致）

| 参数 | 值 |
|---|---|
| `token_` | `0xfe8bf5b8f5e4eb5f9bc2be16303f7dab8cf56aa8`（BIBI） |
| `poolClaimer_` | `0x8b3125faa80de93f217084c750ed2024e1d65364`（运营领三池；**以后可用 `setPoolClaimer` 更换，无需升级合约**） |
| `owner_` | **你的部署钱包地址**（升级权 + 可改 `poolClaimer` / `owner`） |
| `listPrices_` | `[100000000000000000000000000, 500000000000000000000000000, 1000000000000000000000000000]`<br>即 1亿 / 5亿 / 10亿（18 位小数） |

规则：3 类矿工 · 槽位 50/20/10 · 雇佣 50/50 · 权重 +10/+15/+20 · **长间隔雇佣/抢劫一次结清滴灌**。

---

## 第 1 步：部署 Implementation（逻辑合约）

1. 打开 Remix → 左侧 **File explorer** → 新建 `FomoMinerBibiUpgradeable.sol`  
2. 把仓库同名文件**全文**粘贴进去并保存  
3. 左侧 **Solidity Compiler**：
   - Compiler：`0.8.24`（或 `0.8.24+`）
   - 勾选 **Enable optimization**，runs = `200`
   - 点 **Compile**，确认无红色报错  
4. 左侧 **Deploy & Run**：
   - Environment：**Injected Provider - MetaMask** → 确认是 BSC 主网  
   - Contract 下拉选 **`FomoMinerBibiUpgradeable`**
   - **不要填**构造参数 → 点橙色 **Deploy** → 钱包确认  
5. 在下方 Deployed Contracts 里复制地址，记作 **`0xIMPL...`**

> 不要对 Implementation 点 `initialize`（它已锁定）。

---

## 第 2 步：生成 initialize 的 calldata（还不上链）

1. 仍在 Deployed 的 Implementation 卡片上，找到 **`initialize`**  
2. 填入上面表格四个参数（`listPrices_` 在 Remix 里可写成）：

```text
["100000000000000000000000000","500000000000000000000000000","1000000000000000000000000000"]
```

3. 在函数旁找 **Calldata** / 复制 ABI 编码（一长串以 `0x` 开头）  
4. 记作 **`0xINIT...`**  
5. **不要**点 transact

若 Remix 不好复制 Calldata，可用 Foundry（本机有私钥时）：

```bash
cd contracts
cast calldata "initialize(address,address,address,uint256[3])" \
  0xfe8bf5b8f5e4eb5f9bc2be16303f7dab8cf56aa8 \
  0x8b3125faa80de93f217084c750ed2024e1d65364 \
  你的钱包地址 \
  "[100000000000000000000000000,500000000000000000000000000,1000000000000000000000000000]"
```

---

## 第 3 步：部署 Proxy（玩家要用的地址）

1. Remix 新建 `ERC1967Proxy.sol`，粘贴 `contracts/proxy/ERC1967Proxy.sol` 全文，Compile  
2. Deploy & Run → Contract 选 **`ERC1967Proxy`**  
3. 构造参数：

```text
implementation_ = 0xIMPL...     # 第 1 步地址
_data           = 0xINIT...     # 第 2 步 calldata（Remix 里常叫 data / _data）
```

4. 点 **Deploy** → 钱包确认  
5. 复制 Proxy 地址，记作 **`0xPROXY...`**（这才是网站要填的游戏合约）

---

## 第 4 步：自检（对 Proxy 地址只读）

在 Remix 用 **At Address** 加载 `FomoMinerBibiUpgradeable`，地址填 **`0xPROXY...`**，确认：

| 调用 | 期望 |
|---|---|
| `version()` | `1.1.0-proxy` |
| `owner()` | 你的部署钱包 |
| `paymentToken()` | `0xfe8b…6aa8` |
| `poolClaimer()` | `0x8b31…5364` |
| `slotsOf(0)` | `50` |
| `slotsOf(1)` | `20` |
| `slotsOf(2)` | `10` |

任一项不对 → **不要**接到网站，先排查 initialize 是否成功。

---

## 第 5 步：接到「Proxy代理合约测试」页签

把 **`0xPROXY...`** 发给我，或你自己改：

```text
src/lib/fomo3d/markets.ts
→ id: "bibi_legacy" 的 gameContract = "0xPROXY..."
```

改完后部署/刷新网站，打开 **BIBI版（Proxy代理合约测试）**，游戏合约应显示新 Proxy 地址。

---

## 更换三池领取地址（无需升级）

`owner` 钱包对 **Proxy** 调用：

```text
setPoolClaimer(0x新运营地址)
```

前端 Claim 按钮若要对齐新人，再改 `src/lib/fomo3d/markets.ts` 里的 `CAPITAL_CLAIMER_ADDRESS`。

---

## 以后升级（改玩法逻辑时）

1. 再部署一份新的 `FomoMinerBibiUpgradeable` → `0xIMPL2`  
2. 用 **owner** 钱包对 **Proxy** 调用：
   - `upgradeTo(0xIMPL2)`  
   - 再 `setVersion("1.2.0-proxy")`（可选，方便核对）  
3. 玩家仍用同一个 Proxy 地址，资金与局况都在 Proxy 存储里，不会丢

Foundry 一键升级：

```bash
cd contracts
export PROXY=0xPROXY...
export BSC_RPC_URL=https://bsc-dataseed.binance.org/
export PRIVATE_KEY=0x你的owner私钥
forge script script/UpgradeProxy.s.sol:UpgradeProxy \
  --rpc-url "$BSC_RPC_URL" --broadcast --private-key "$PRIVATE_KEY"
```

---

## Foundry 一键首次部署（可选）

```bash
cd contracts
export BSC_RPC_URL=https://bsc-dataseed.binance.org/
export PRIVATE_KEY=0x你的私钥
# 可选：OWNER=0x...  （默认=广播钱包）
forge script script/DeployProxy.s.sol:DeployProxy \
  --rpc-url "$BSC_RPC_URL" --broadcast --private-key "$PRIVATE_KEY"
```

日志里的 `proxy (use this as gameContract)` 就是页签要填的地址。

---

## 升级注意

1. **只追加** storage 变量；放在 `__gap` 前并缩小 `__gap`  
2. 不要删除 / 重排已有状态变量  
3. 玩家 approve / 转账目标永远是 **Proxy**  
4. 升级不迁移资金：余额在 Proxy 存储里自动保留  

本地自测：`forge test --match-contract ProxyUpgradeTest -vv`
