#!/usr/bin/env bash
# Deploy Litium modular contracts to Bostrom mainnet
#
# Deployment order (handles circular dependency):
# 1. Store all 5 WASMs β get code_ids
# 2. Instantiate litium-core (CW-20 token, no dependencies)
# 3. Instantiate litium-stake with placeholder mine_contract
# 4. Instantiate litium-refer with placeholder mine_contract
# 5. Instantiate litium-mine with real stake + refer addresses
# 6. UpdateConfig on litium-stake + litium-refer to set real mine_contract
# 7. Register mine, stake, refer as authorized callers in litium-core (for minting)
# 8. Instantiate litium-wrap (CW-20βnative bridge, creates TokenFactory denom)
# 9. Register wrap as authorized caller + set burn-exempt slots on litium-core
#
# Usage:
# ./scripts/deploy-litium-modular.sh
#
# Requires: cyber CLI with key "deployer" (or set KEY below)
# ββ Config ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
KEY=""
KEYRING_BACKEND=""
CHAIN_ID="bostrom"
NODE="https://rpc.bostrom.cybernode.ai:443"
GAS_PRICES="0boot"
GAS_ADJ="2.5"
ARTIFACTS_DIR="$(cd "$(dirname "")/.." && ; then
code=$(echo "$tx_result" | jq -r '.code // 0')
if [ "" != "0" ]; then
local raw_log
raw_log=$(echo "$tx_result" |
fi
fi
done
==="
log " ; then
fi
json_line=$(echo "$result" | grep '^{')
local txhash
txhash=$(echo "$json_line" |
if [; then
fi
tx_result=$(wait_tx "$txhash")
local contract_addr
contract_addr=$(echo "$tx_result" |
if [; then
fi
# ββ Preflight checks βββββββββββββββββββββββββββββββββββββββββββββββ
||
||
ADMIN_ADDR=$(cyber keys show "$KEY" --keyring-backend "$KEYRING_BACKEND" -a 2>/dev/null) || die "Key '$KEY' not found"
log "Deployer/Admin: $ADMIN_ADDR"
log "Chain: $CHAIN_ID"
log "Node: $NODE"
# Verify node is reachable
if ! cyber status --node "$NODE" >/dev/null 2>&1; then
die "Cannot reach node at $NODE"
fi
log "Node reachable"
log ""
# ββ Step 1: Store all 5 WASMs ββββββββββββββββββββββββββββββββββββββ
log "============================================"
log " Step 1: Store WASM code"
log "============================================"
CORE_CODE_ID=$(store_wasm "$ARTIFACTS_DIR/litium_core.wasm" "litium-core")
MINE_CODE_ID=$(store_wasm "$ARTIFACTS_DIR/litium_mine.wasm" "litium-mine")
STAKE_CODE_ID=$(store_wasm "$ARTIFACTS_DIR/litium_stake.wasm" "litium-stake")
REFER_CODE_ID=$(store_wasm "$ARTIFACTS_DIR/litium_refer.wasm" "litium-refer")
WRAP_CODE_ID=$(store_wasm "$ARTIFACTS_DIR/litium_wrap.wasm" "litium-wrap")
log ""
log "Code IDs:"
log " litium-core: $CORE_CODE_ID"
log " litium-mine: $MINE_CODE_ID"
log " litium-stake: $STAKE_CODE_ID"
log " litium-refer: $REFER_CODE_ID"
log " litium-wrap: $WRAP_CODE_ID"
# ββ Step 2: Instantiate litium-core (CW-20 token) ββββββββββββββββββ
log ""
log "============================================"
log " Step 2: Instantiate litium-core (CW-20)"
log "============================================"
CORE_ADDR=$(instantiate "$CORE_CODE_ID" "litium-core" \
"{\"name\":\"Litium\",\"symbol\":\"LI\",\"decimals\":6}")
# ββ Step 3: Instantiate litium-stake (placeholder mine_contract) ββββ
log ""
log "============================================"
log " Step 3: Instantiate litium-stake"
log "============================================"
STAKE_ADDR=$(instantiate "$STAKE_CODE_ID" "litium-stake" \
"{\"core_contract\":\"$CORE_ADDR\",\"mine_contract\":\"$ADMIN_ADDR\",\"token_contract\":\"$CORE_ADDR\",\"unbonding_period_seconds\":1814400}")
# ββ Step 4: Instantiate litium-refer (placeholder mine_contract) ββββ
log ""
log "============================================"
log " Step 4: Instantiate litium-refer"
log "============================================"
REFER_ADDR=$(instantiate "$REFER_CODE_ID" "litium-refer" \
"{\"core_contract\":\"$CORE_ADDR\",\"mine_contract\":\"$ADMIN_ADDR\"}")
# ββ Step 5: Instantiate litium-mine (with real stake + refer) βββββββ
log ""
log "============================================"
log " Step 5: Instantiate litium-mine"
log "============================================"
MINE_ADDR=$(instantiate "$MINE_CODE_ID" "litium-mine" \
"{\"max_proof_age\":3600,\"estimated_gas_cost_uboot\":\"250000\",\"core_contract\":\"$CORE_ADDR\",\"stake_contract\":\"$STAKE_ADDR\",\"refer_contract\":\"$REFER_ADDR\",\"token_contract\":\"$CORE_ADDR\",\"warmup_base_rate\":\"1000000\"}")
# ββ Step 6: Update stake + refer to set real mine_contract ββββββββββ
log ""
log "============================================"
log " Step 6: Update mine_contract in stake + refer"
log "============================================"
execute "$STAKE_ADDR" \
"{\"update_config\":{\"mine_contract\":\"$MINE_ADDR\"}}" \
"litium-stake: set mine_contract"
execute "$REFER_ADDR" \
"{\"update_config\":{\"mine_contract\":\"$MINE_ADDR\"}}" \
"litium-refer: set mine_contract"
# ββ Step 7: Register authorized callers in litium-core (for minting) β
log ""
log "============================================"
log " Step 7: Register authorized callers (mint)"
log "============================================"
execute "$CORE_ADDR" \
"{\"register_authorized_caller\":{\"contract_addr\":\"$MINE_ADDR\"}}" \
"litium-core: authorize litium-mine"
execute "$CORE_ADDR" \
"{\"register_authorized_caller\":{\"contract_addr\":\"$STAKE_ADDR\"}}" \
"litium-core: authorize litium-stake"
execute "$CORE_ADDR" \
"{\"register_authorized_caller\":{\"contract_addr\":\"$REFER_ADDR\"}}" \
"litium-core: authorize litium-refer"
# ββ Step 8: Instantiate litium-wrap (CW-20βnative bridge) ββββββββββ
log ""
log "============================================"
log " Step 8: Instantiate litium-wrap"
log "============================================"
WRAP_ADDR=$(instantiate "$WRAP_CODE_ID" "litium-wrap" \
"{\"cw20_contract\":\"$CORE_ADDR\",\"token_subdenom\":\"li\"}")
TOKEN_DENOM="factory/$WRAP_ADDR/li"
log " Native denom: $TOKEN_DENOM"
# ββ Step 9: Register wrap + set burn-exempt slots βββββββββββββββββββ
log ""
log "============================================"
log " Step 9: Register wrap + burn-exempt config"
log "============================================"
execute "$CORE_ADDR" \
"{\"register_authorized_caller\":{\"contract_addr\":\"$WRAP_ADDR\"}}" \
"litium-core: authorize litium-wrap"
execute "$CORE_ADDR" \
"{\"update_config\":{\"mine_contract\":\"$MINE_ADDR\",\"stake_contract\":\"$STAKE_ADDR\",\"refer_contract\":\"$REFER_ADDR\",\"wrap_contract\":\"$WRAP_ADDR\"}}" \
"litium-core: set burn-exempt contract slots"
# ββ Summary βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
log ""
log "============================================"
log " Deployment Complete!"
log "============================================"
log ""
log "Contract Addresses:"
log " LITIUM_CORE_CONTRACT = ''"
log " LITIUM_MINE_CONTRACT = ''"
log " LITIUM_STAKE_CONTRACT = ''"
log " LITIUM_REFER_CONTRACT = ''"
log " LITIUM_WRAP_CONTRACT = ''"
log ""
log "Native Denom (via litium-wrap):"
log " LI_DENOM = ''"
log ""
log "Code IDs:"
log " litium-core: $CORE_CODE_ID"
log " litium-mine: $MINE_CODE_ID"
log " litium-stake: $STAKE_CODE_ID"
log " litium-refer: $REFER_CODE_ID"
log " litium-wrap: $WRAP_CODE_ID"
log ""
log "Paste into src/constants/mining.ts:"
log " export const LITIUM_CORE_CONTRACT = '';"
log " export const LITIUM_MINE_CONTRACT = '';"
log " export const LITIUM_STAKE_CONTRACT = '';"
log " export const LITIUM_REFER_CONTRACT = '';"
log " export const LITIUM_WRAP_CONTRACT = '';"
cw-cyber/scripts/deploy-litium-modular.sh
Ο 0.0%