- Resolve stash: merge load_deployment_env path with secure-secrets and CR/LF RPC strip - create-pmm-full-mesh-chain138.sh delegates to sync-chain138-pmm-pools-from-json.sh - env.additions.example: canonical PMM pool defaults (cUSDT/USDT per crosscheck) - Include Chain138 scripts, official mirror deploy scaffolding, and prior staged changes Made-with: Cursor
181 lines
5.3 KiB
Bash
Executable File
181 lines
5.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Update Token List Script
|
|
# Updates token-list.json with deployed contract addresses
|
|
|
|
set -euo pipefail
|
|
|
|
|
|
# Configuration
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
source "$SCRIPT_DIR/../lib/init.sh"
|
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
|
|
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
|
|
# shellcheck disable=SC1090
|
|
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
|
|
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
|
|
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
|
|
set -a
|
|
# shellcheck disable=SC1090
|
|
source "$PROJECT_ROOT/.env"
|
|
set +a
|
|
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
|
|
set -a
|
|
# shellcheck disable=SC1090
|
|
source "$REPO_ROOT/.env"
|
|
set +a
|
|
fi
|
|
CONTRACT_ADDRESSES_FILE="${PROJECT_ROOT}/contracts-deployed.json"
|
|
TOKEN_LIST_FILE="${PROJECT_ROOT}/metamask/token-list.json"
|
|
|
|
# Logging function
|
|
log() {
|
|
log_success "[$(date +'%Y-%m-%d %H:%M:%S')] $1"
|
|
}
|
|
|
|
error() {
|
|
log_error "[ERROR] $1"
|
|
exit 1
|
|
}
|
|
|
|
warn() {
|
|
log_warn "[WARNING] $1"
|
|
}
|
|
|
|
# Validate contract address
|
|
validate_address() {
|
|
local address=$1
|
|
if [[ ! "$address" =~ ^0x[a-fA-F0-9]{40}$ ]]; then
|
|
return 1
|
|
fi
|
|
return 0
|
|
}
|
|
|
|
# Update token in token list
|
|
update_token() {
|
|
local token_address=$1
|
|
local token_symbol=$2
|
|
local token_name=$3
|
|
local token_decimals=${4:-18}
|
|
local token_logo=${5:-}
|
|
|
|
if ! validate_address "$token_address"; then
|
|
error "Invalid token address: $token_address"
|
|
fi
|
|
|
|
log "Updating token: $token_symbol ($token_name) at $token_address"
|
|
|
|
# Check if token already exists in list
|
|
local token_exists=$(jq -r ".tokens[] | select(.address == \"$token_address\") | .address" "$TOKEN_LIST_FILE")
|
|
|
|
if [ -n "$token_exists" ]; then
|
|
log "Token already exists in list, updating..."
|
|
# Update existing token
|
|
jq --arg address "$token_address" \
|
|
--arg symbol "$token_symbol" \
|
|
--arg name "$token_name" \
|
|
--argjson decimals "$token_decimals" \
|
|
--arg logo "$token_logo" \
|
|
'(.tokens[] | select(.address == $address)) |= . + {
|
|
symbol: $symbol,
|
|
name: $name,
|
|
decimals: $decimals,
|
|
logoURI: $logo
|
|
}' "$TOKEN_LIST_FILE" > "${TOKEN_LIST_FILE}.tmp" && \
|
|
mv "${TOKEN_LIST_FILE}.tmp" "$TOKEN_LIST_FILE"
|
|
else
|
|
log "Adding new token to list..."
|
|
# Add new token
|
|
local new_token=$(jq -n \
|
|
--argjson chainId 138 \
|
|
--arg address "$token_address" \
|
|
--arg name "$token_name" \
|
|
--arg symbol "$token_symbol" \
|
|
--argjson decimals "$token_decimals" \
|
|
--arg logo "$token_logo" \
|
|
'{
|
|
chainId: $chainId,
|
|
address: $address,
|
|
name: $name,
|
|
symbol: $symbol,
|
|
decimals: $decimals,
|
|
logoURI: $logo
|
|
}')
|
|
|
|
jq ".tokens += [$new_token]" "$TOKEN_LIST_FILE" > "${TOKEN_LIST_FILE}.tmp" && \
|
|
mv "${TOKEN_LIST_FILE}.tmp" "$TOKEN_LIST_FILE"
|
|
fi
|
|
|
|
# Update timestamp
|
|
jq ".timestamp = \"$(date -u +%Y-%m-%dT%H:%M:%S.000Z)\"" "$TOKEN_LIST_FILE" > "${TOKEN_LIST_FILE}.tmp" && \
|
|
mv "${TOKEN_LIST_FILE}.tmp" "$TOKEN_LIST_FILE"
|
|
|
|
log "Token updated successfully"
|
|
}
|
|
|
|
# Validate token list
|
|
validate_token_list() {
|
|
log "Validating token list..."
|
|
|
|
# Validate JSON schema
|
|
if command -v ajv &> /dev/null; then
|
|
if ajv validate -s "${PROJECT_ROOT}/metamask/token-list.schema.json" -d "$TOKEN_LIST_FILE"; then
|
|
log "Token list schema validation passed"
|
|
else
|
|
error "Token list schema validation failed"
|
|
fi
|
|
else
|
|
warn "ajv-cli not installed, skipping schema validation"
|
|
fi
|
|
|
|
# Validate JSON syntax
|
|
if jq empty "$TOKEN_LIST_FILE" 2>/dev/null; then
|
|
log "Token list JSON syntax is valid"
|
|
else
|
|
error "Token list JSON syntax is invalid"
|
|
fi
|
|
}
|
|
|
|
# Main function
|
|
main() {
|
|
log "Updating token list..."
|
|
|
|
# Check if contract addresses file exists
|
|
if [ ! -f "$CONTRACT_ADDRESSES_FILE" ]; then
|
|
error "Contract addresses file not found: $CONTRACT_ADDRESSES_FILE"
|
|
fi
|
|
|
|
# Check if token list file exists
|
|
if [ ! -f "$TOKEN_LIST_FILE" ]; then
|
|
error "Token list file not found: $TOKEN_LIST_FILE"
|
|
fi
|
|
|
|
# Read contract addresses
|
|
WETH_ADDRESS=$(jq -r '.weth // empty' "$CONTRACT_ADDRESSES_FILE")
|
|
|
|
# Update WETH token
|
|
if [ -n "$WETH_ADDRESS" ] && [ "$WETH_ADDRESS" != "null" ]; then
|
|
update_token \
|
|
"$WETH_ADDRESS" \
|
|
"WETH" \
|
|
"Wrapped Ether" \
|
|
18 \
|
|
"https://explorer.d-bis.org/images/tokens/weth.png"
|
|
else
|
|
warn "WETH address not found in contract addresses file"
|
|
fi
|
|
|
|
# Validate token list
|
|
validate_token_list
|
|
|
|
log "Token list updated successfully"
|
|
log "Token list file: $TOKEN_LIST_FILE"
|
|
log "Next steps:"
|
|
log " 1. Commit token list changes: git add $TOKEN_LIST_FILE && git commit -m 'Update token list with deployed addresses'"
|
|
log " 2. Submit token list: ./scripts/deployment/submit-token-list.sh"
|
|
}
|
|
|
|
# Run main function
|
|
main "$@"
|
|
|