2026-03-04 02:03:08 -08:00
# Minting c* and cW* on Chain 138 and Other Networks
**Purpose:** How to mint compliant tokens (c*) and compliant wrapped tokens (cW*) to the deployer on Chain 138 and on other networks where they are deployed.
**Deployer:** `0x4A666F96fC8764181194447A7dFdb7d471b301C8`
---
## Summary
| Token type | Chain 138 | Other networks (1, 25, 56, 137, 100, 10, 42161, 8453, 43114) |
|------------|-----------|---------------------------------------------------------------|
| **c ** * (cUSDT, cUSDC, cEURC, …) | Deployer is **owner ** → can mint | Deploy first with `DeployCompliantFiatTokensForChain.s.sol` (owner = deployer), then mint same as 138 |
chore: sync docs, config schemas, scripts, and meta task alignment
- Institutional / JVMTM / reserve-provenance / GRU transport + standards JSON
- Validation and verify scripts (Blockscout labels, x402, GRU preflight, P1 local path)
- Wormhole wiring in AGENTS, MCP_SETUP, MASTER_INDEX, 04-configuration README
- Meta docs, integration gaps, live verification log, architecture updates
- CI validate-config workflow updates
Operator/LAN items, submodule working trees, and public token-aggregation edge
routes remain follow-up (see TODOS_CONSOLIDATED P1).
Made-with: Cursor
2026-03-31 22:31:39 -07:00
| **cW ** * (cWUSDT, cWUSDC, …) | Not deployed on 138 (cW* are on destination chains only) | Default deploy path gives deployer **admin ** + **MINTER_ROLE ** ; **strict mode ** can revoke deployer MINTER/BURNER so only bridge roles remain |
2026-03-04 02:03:08 -08:00
---
## 1. c* on Chain 138
All 12 c* are already deployed; deployer is owner. Mint with cast or scripts.
**Script (cUSDT/cUSDC only):** `smom-dbis-138/scripts/mint-for-liquidity.sh`
2026-03-27 18:50:28 -07:00
**Script (all 12 c*):** `smom-dbis-138/scripts/mint-all-c-star-138.sh [amount_human]` — mints cUSDT, cUSDC, cEURC, cEURT, cGBPC, cGBPT, cAUDC, cJPYC, cCHFC, cCADC, cXAUC, cXAUT to deployer (default 1M each). **cXAUC/cXAUT: ** `amount_human` is **troy ounces ** (1 token = 1 troy oz Au), not dollars.
**Script (cXAUC/cXAUT only, troy oz):** `smom-dbis-138/scripts/mint-xau-chain138.sh <troy_ounces> [--cxauc-only|--cxaut-only]` — uses decimal ounces → 6-decimal base units; optional `MINT_TO=0x…` , `DRY_RUN=1` .
**Reconcile deployer (burn all + remint from USD peg):** `smom-dbis-138/scripts/reconcile-xau-deployer-chain138.sh` — env: `RETARGET_USD` , `RETARGET_MODE` (`split` | `each` ), `XAU_SPOT_USD` , or `TROY_OZ_CXAUC` + `TROY_OZ_CXAUT` ; `DRY_RUN=1` to preview.
2026-03-04 02:03:08 -08:00
**Cast (per token):**
```bash
cd smom-dbis-138 && source .env
DEPLOYER=0x4A666F96fC8764181194447A7dFdb7d471b301C8
# 1M tokens = 1000000000000 base units (6 decimals)
cast send <CUSDT_ADDRESS> "mint(address,uint256)" "$DEPLOYER" 1000000000000 \
--rpc-url "$RPC_URL_138" --private-key "$PRIVATE_KEY" --legacy --gas-limit 100000
```
Addresses: see [TOKENS_AND_NETWORKS_MINTABLE_TO_DEPLOYER.md ](TOKENS_AND_NETWORKS_MINTABLE_TO_DEPLOYER.md ) §1.1.
---
## 2. c* on other networks
### Step 1: Deploy c* to the target chain (if not already deployed)
From `smom-dbis-138/` :
```bash
source .env
# Example: Polygon (137). Set RPC and chain-id for the target chain.
export RPC_URL="$POLYGON_MAINNET_RPC" # or BSC_RPC_URL, etc.
# Deploy cUSDT + cUSDC (default). Add DEPLOY_CEURC=1 etc. for more.
forge script script/deploy/DeployCompliantFiatTokensForChain.s.sol:DeployCompliantFiatTokensForChain \
--rpc-url "$RPC_URL" --broadcast --private-key "$PRIVATE_KEY" --chain-id 137
# Optional: deploy all 12 c* (set env flags)
DEPLOY_CEURC=1 DEPLOY_CEURT=1 DEPLOY_CGBPC=1 DEPLOY_CGBPT=1 \
DEPLOY_CAUDC=1 DEPLOY_CJPYC=1 DEPLOY_CCHFC=1 DEPLOY_CCADC=1 \
DEPLOY_CXAUC=1 DEPLOY_CXAUT=1 \
forge script script/deploy/DeployCompliantFiatTokensForChain.s.sol:DeployCompliantFiatTokensForChain \
--rpc-url "$RPC_URL" --broadcast --private-key "$PRIVATE_KEY" --chain-id 137
```
Then set in `.env` : `CUSDT_137=<addr>` , `CUSDC_137=<addr>` , etc.
### Step 2: Mint c* on that chain
Same as 138: deployer is owner. Use cast with the chain’ s RPC and token address:
```bash
RPC="$POLYGON_MAINNET_RPC"
CUSDT_POLY="0x..." # from deploy output or .env CUSDT_137
cast send "$CUSDT_POLY" "mint(address,uint256)" "$DEPLOYER" 1000000000000 \
--rpc-url "$RPC" --private-key "$PRIVATE_KEY" --legacy --gas-limit 100000
```
Use the same cast pattern with that chain's RPC and token addresses from .env (e.g. `CUSDT_POLYGON` , `CUSDC_POLYGON` for Polygon).
---
## 3. cW* on other networks
chore: sync docs, config schemas, scripts, and meta task alignment
- Institutional / JVMTM / reserve-provenance / GRU transport + standards JSON
- Validation and verify scripts (Blockscout labels, x402, GRU preflight, P1 local path)
- Wormhole wiring in AGENTS, MCP_SETUP, MASTER_INDEX, 04-configuration README
- Meta docs, integration gaps, live verification log, architecture updates
- CI validate-config workflow updates
Operator/LAN items, submodule working trees, and public token-aggregation edge
routes remain follow-up (see TODOS_CONSOLIDATED P1).
Made-with: Cursor
2026-03-31 22:31:39 -07:00
cW* are **CompliantWrappedToken ** .
- **Default deploy path:** the deploy script grants **MINTER_ROLE ** to both the **bridge ** and the **admin (deployer) ** , so the deployer can mint.
- **Strict hard-peg deploy path:** set `CW_STRICT_MODE=1` when running `DeployCWTokens.s.sol` ; the script revokes deployer `MINTER_ROLE` / `BURNER_ROLE` after bridge grant. Optional: set `CW_GOVERNANCE_ADMIN=0x...` to move `DEFAULT_ADMIN_ROLE` , and `CW_FREEZE_OPERATIONAL_ROLES=1` to permanently freeze future minter/burner role churn.
In strict hard-peg mode, token-role lockdown is only part of the job. The bridge path should also be finalized with:
- `CWMultiTokenBridgeL1.configureSupportedCanonicalToken(token, true)`
- `CWMultiTokenBridgeL1.setMaxOutstanding(token, chainSelector, amount)` for each destination
- deploy and attach `CWReserveVerifier` on Chain 138 so new wrapping is blocked if canonical backing is unsafe
- `CWMultiTokenBridgeL2.freezeTokenPair(canonicalToken)`
- `CWMultiTokenBridgeL2.freezeDestination(chainSelector)`
Only use the cast mint commands below if the chain was **not ** deployed in strict mode.
2026-03-04 02:03:08 -08:00
**Per token, per chain (cast):**
```bash
cd smom-dbis-138 && source .env
# Example: mint 1M cWUSDT on Polygon (137)
CWUSDT_ADDR="$CWUSDT_137" # from .env after DeployCWTokens
RPC="$POLYGON_MAINNET_RPC"
DEPLOYER=0x4A666F96fC8764181194447A7dFdb7d471b301C8
cast send "$CWUSDT_ADDR" "mint(address,uint256)" "$DEPLOYER" 1000000000000 \
--rpc-url "$RPC" --private-key "$PRIVATE_KEY" --legacy --gas-limit 100000
```
**Env vars for addresses (examples):** `CWUSDT_137` , `CWUSDC_137` , `CWUSDT_1` , `CWUSDC_1` , … (see [CW_TOKENS_AND_NETWORKS.md ](CW_TOKENS_AND_NETWORKS.md ) and `token-mapping-multichain.json` ).
Use `smom-dbis-138/scripts/mint-cw-on-chain.sh <CHAIN_NAME> [amount]` to mint all cW* on a chain (e.g. `./scripts/mint-cw-on-chain.sh Polygon` ). Requires `CWUSDT_<CHAIN>` , `CWUSDC_<CHAIN>` , etc. and chain RPC in .env.
---
## 4. Reference: token addresses by chain
- **Chain 138 c*:** [TOKENS_AND_NETWORKS_MINTABLE_TO_DEPLOYER.md ](TOKENS_AND_NETWORKS_MINTABLE_TO_DEPLOYER.md ) §1.1
- **cW* and networks:** [CW_TOKENS_AND_NETWORKS.md ](CW_TOKENS_AND_NETWORKS.md ), `config/token-mapping-multichain.json`
- **Deploy c* on a chain:** `DeployCompliantFiatTokensForChain.s.sol`
- **Deploy cW* on a chain:** `DeployCWTokens.s.sol` (set `CW_BRIDGE_ADDRESS` )