docs: Ledger Live integration, contract deploy learnings, NEXT_STEPS updates
Some checks failed
Deploy to Phoenix / deploy (push) Has been cancelled
Some checks failed
Deploy to Phoenix / deploy (push) Has been cancelled
- ADD_CHAIN138_TO_LEDGER_LIVE: Ledger form done; public code review repo bis-innovations/LedgerLive; init/push commands - CONTRACT_DEPLOYMENT_RUNBOOK: Chain 138 gas price 1 gwei, 36-addr check, TransactionMirror workaround - CONTRACT_*: AddressMapper, MirrorManager deployed 2026-02-12; 36-address on-chain check - NEXT_STEPS_FOR_YOU: Ledger done; steps completable now (no LAN); run-completable-tasks-from-anywhere - MASTER_INDEX, OPERATOR_OPTIONAL, SMART_CONTRACTS_INVENTORY_SIMPLE: updates - LEDGER_BLOCKCHAIN_INTEGRATION_COMPLETE: bis-innovations/LedgerLive reference Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
43
scripts/bridge/fund-mainnet-relay-bridge.sh
Executable file
43
scripts/bridge/fund-mainnet-relay-bridge.sh
Executable file
@@ -0,0 +1,43 @@
|
||||
#!/usr/bin/env bash
|
||||
# Fund the mainnet CCIPRelayBridge with WETH from the deployer wallet.
|
||||
# Usage: ./scripts/bridge/fund-mainnet-relay-bridge.sh [amount_wei]
|
||||
# If amount_wei is omitted, transfers the deployer's full WETH balance.
|
||||
# Env: PRIVATE_KEY, ETHEREUM_MAINNET_RPC or RPC_URL_MAINNET (use Infura/Alchemy if llamarpc rate-limits)
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
||||
[[ -f "${PROJECT_ROOT}/smom-dbis-138/.env" ]] && source "${PROJECT_ROOT}/smom-dbis-138/.env" 2>/dev/null || true
|
||||
|
||||
DEPLOYER="${DEPLOYER_ADDRESS:-0x4A666F96fC8764181194447A7dFdb7d471b301C8}"
|
||||
WETH="0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"
|
||||
BRIDGE="0xF9A32F37099c582D28b4dE7Fca6eaC1e5259f939"
|
||||
# Prefer RPC_URL_MAINNET so override works (e.g. RPC_URL_MAINNET=https://ethereum.publicnode.com if Infura requires secret)
|
||||
RPC="${RPC_URL_MAINNET:-${ETHEREUM_MAINNET_RPC:-https://ethereum.publicnode.com}}"
|
||||
|
||||
[[ -n "${PRIVATE_KEY:-}" ]] || { echo "PRIVATE_KEY required"; exit 1; }
|
||||
command -v cast &>/dev/null || { echo "cast not found (install Foundry)"; exit 1; }
|
||||
|
||||
BALANCE=$(cast call $WETH "balanceOf(address)(uint256)" $DEPLOYER --rpc-url "$RPC" 2>/dev/null || echo "0")
|
||||
echo "Deployer WETH balance (mainnet): $BALANCE wei"
|
||||
echo "Bridge WETH balance (mainnet): $(cast call $WETH "balanceOf(address)(uint256)" $BRIDGE --rpc-url "$RPC" 2>/dev/null || echo "0") wei"
|
||||
|
||||
if [[ "${1:-}" = "" ]]; then
|
||||
AMT="$BALANCE"
|
||||
echo "Transferring full balance: $AMT wei"
|
||||
else
|
||||
AMT="$1"
|
||||
echo "Transferring: $AMT wei"
|
||||
fi
|
||||
|
||||
if [[ -z "$AMT" ]] || [[ "$AMT" = "0" ]]; then
|
||||
echo "Nothing to transfer."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
cast send $WETH "transfer(address,uint256)" $BRIDGE "$AMT" \
|
||||
--rpc-url "$RPC" \
|
||||
--private-key "$PRIVATE_KEY" \
|
||||
--legacy
|
||||
|
||||
echo "Done. Bridge WETH balance: $(cast call $WETH "balanceOf(address)(uint256)" $BRIDGE --rpc-url "$RPC") wei"
|
||||
47
scripts/bridge/grant-relayer-role-mainnet.sh
Normal file
47
scripts/bridge/grant-relayer-role-mainnet.sh
Normal file
@@ -0,0 +1,47 @@
|
||||
#!/usr/bin/env bash
|
||||
# Grant RELAYER_ROLE on mainnet CCIPRelayRouter to the relay service address.
|
||||
# Run once with the router's admin key (deployer). Required when relay tx reverts with "transaction execution reverted".
|
||||
#
|
||||
# Usage: ./scripts/bridge/grant-relayer-role-mainnet.sh [relayer_address]
|
||||
# relayer_address defaults to 0x4A666F96fC8764181194447A7dFdb7d471b301C8 (from relay .env RELAYER_ADDRESS)
|
||||
# Env: PRIVATE_KEY (admin of router), ETHEREUM_MAINNET_RPC or RPC_URL_MAINNET
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
||||
[[ -f "${PROJECT_ROOT}/smom-dbis-138/.env" ]] && source "${PROJECT_ROOT}/smom-dbis-138/.env" 2>/dev/null || true
|
||||
[[ -f "${PROJECT_ROOT}/.env" ]] && source "${PROJECT_ROOT}/.env" 2>/dev/null || true
|
||||
|
||||
RELAY_ROUTER="${CCIP_RELAY_ROUTER_MAINNET:-0xAd9A228CcEB4cbB612cD165FFB72fE090ff10Afb}"
|
||||
RELAYER="${1:-0x4A666F96fC8764181194447A7dFdb7d471b301C8}"
|
||||
# Prefer RPC_URL_MAINNET so command-line override works (e.g. ETHEREUM_MAINNET_RPC=https://ethereum.publicnode.com if Infura requires secret)
|
||||
RPC="${RPC_URL_MAINNET:-${ETHEREUM_MAINNET_RPC:-https://ethereum.publicnode.com}}"
|
||||
|
||||
[[ -n "${PRIVATE_KEY:-}" ]] || { echo "PRIVATE_KEY required (must be admin of CCIPRelayRouter)"; exit 1; }
|
||||
command -v cast &>/dev/null || { echo "cast not found (install Foundry)"; exit 1; }
|
||||
|
||||
echo "CCIPRelayRouter (mainnet): $RELAY_ROUTER"
|
||||
echo "Granting RELAYER_ROLE to: $RELAYER"
|
||||
echo "RPC: $RPC"
|
||||
echo ""
|
||||
|
||||
# Optional: check if already has role (keccak256("RELAYER_ROLE"))
|
||||
ROLE_HASH=$(cast keccak "RELAYER_ROLE" 2>/dev/null || true)
|
||||
if [[ -n "$ROLE_HASH" ]]; then
|
||||
HAS_ROLE=$(cast call "$RELAY_ROUTER" "hasRole(bytes32,address)(bool)" "$ROLE_HASH" "$RELAYER" --rpc-url "$RPC" 2>/dev/null || echo "false")
|
||||
else
|
||||
HAS_ROLE="false"
|
||||
fi
|
||||
|
||||
if [[ "${HAS_ROLE:-false}" = "true" ]]; then
|
||||
echo "Relayer already has RELAYER_ROLE. No action needed."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "Sending grantRelayerRole(relayer)..."
|
||||
cast send "$RELAY_ROUTER" "grantRelayerRole(address)" "$RELAYER" \
|
||||
--rpc-url "$RPC" \
|
||||
--private-key "$PRIVATE_KEY" \
|
||||
--legacy
|
||||
|
||||
echo "Done. Restart the relay service so it can relay messages."
|
||||
53
scripts/bridge/run-send-cross-chain.sh
Executable file
53
scripts/bridge/run-send-cross-chain.sh
Executable file
@@ -0,0 +1,53 @@
|
||||
#!/usr/bin/env bash
|
||||
# Send WETH cross-chain via CCIP (Chain 138 → destination chain).
|
||||
# Usage: ./scripts/bridge/run-send-cross-chain.sh <amount_eth> [recipient] [--dry-run]
|
||||
# Env: CCIP_DEST_CHAIN_SELECTOR, GAS_PRICE, GAS_LIMIT, CONFIRM_ABOVE_ETH (prompt above this amount)
|
||||
# Version: 2026-01-31
|
||||
|
||||
set -euo pipefail
|
||||
[[ "${DEBUG:-0}" = "1" ]] && set -x
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
source "${SCRIPT_DIR}/../lib/load-project-env.sh"
|
||||
|
||||
[[ -z "${PRIVATE_KEY:-}" ]] && { echo "PRIVATE_KEY required"; exit 1; }
|
||||
[[ -z "${CCIPWETH9_BRIDGE_CHAIN138:-}" ]] && { echo "CCIPWETH9_BRIDGE_CHAIN138 required"; exit 1; }
|
||||
command -v cast &>/dev/null || { echo "ERROR: cast not found (install Foundry)"; exit 1; }
|
||||
|
||||
DRY_RUN=false
|
||||
ARGS=()
|
||||
for a in "$@"; do
|
||||
[[ "$a" = "--dry-run" ]] && DRY_RUN=true || ARGS+=("$a")
|
||||
done
|
||||
|
||||
AMOUNT_ETH="${ARGS[0]:?Usage: $0 amount_eth [recipient] [--dry-run]}"
|
||||
RECIPIENT="${ARGS[1]:-$(cast wallet address "$PRIVATE_KEY" 2>/dev/null)}"
|
||||
|
||||
DEST_SELECTOR="${CCIP_DEST_CHAIN_SELECTOR:-5009297550715157269}"
|
||||
GAS_PRICE="${GAS_PRICE:-1000000000}"
|
||||
GAS_LIMIT="${GAS_LIMIT:-}"
|
||||
RPC="${RPC_URL_138:-$CHAIN138_RPC}"
|
||||
[[ -z "$RPC" ]] && { echo "ERROR: RPC_URL_138 or CHAIN138_RPC required"; exit 1; }
|
||||
BRIDGE="${CCIPWETH9_BRIDGE_CHAIN138}"
|
||||
|
||||
# Confirmation for large amounts
|
||||
CONFIRM_ABOVE="${CONFIRM_ABOVE_ETH:-1}"
|
||||
if [[ -n "$CONFIRM_ABOVE" ]] && awk -v a="$AMOUNT_ETH" -v b="$CONFIRM_ABOVE" 'BEGIN{exit !(a+0>=b+0)}' 2>/dev/null; then
|
||||
read -p "Send $AMOUNT_ETH ETH to $RECIPIENT? [y/N] " r
|
||||
[[ "${r,,}" != "y" ]] && [[ "${r,,}" != "yes" ]] && exit 0
|
||||
fi
|
||||
|
||||
AMOUNT_WEI=$(cast --to-wei "$AMOUNT_ETH" ether)
|
||||
FEE_WEI=$(cast call "$BRIDGE" "calculateFee(uint64,uint256)" "$DEST_SELECTOR" "$AMOUNT_WEI" --rpc-url "$RPC" 2>/dev/null | cast --to-dec || echo "0")
|
||||
FEE_TOKEN=$(cast call "$BRIDGE" "feeToken()(address)" --rpc-url "$RPC" 2>/dev/null || echo "0x0")
|
||||
V=""; [[ "$FEE_TOKEN" = "0x0000000000000000000000000000000000000000" ]] && [[ -n "$FEE_WEI" ]] && [[ "$FEE_WEI" != "0" ]] && V="--value $FEE_WEI"
|
||||
|
||||
GAS_OPT=""; [[ -n "$GAS_LIMIT" ]] && GAS_OPT="--gas-limit $GAS_LIMIT"
|
||||
|
||||
if [[ "$DRY_RUN" = true ]]; then
|
||||
echo "DRY-RUN: cast send $BRIDGE sendCrossChain($DEST_SELECTOR,$RECIPIENT,$AMOUNT_WEI) --gas-price $GAS_PRICE --legacy $V $GAS_OPT"
|
||||
cast call "$BRIDGE" "sendCrossChain(uint64,address,uint256)" "$DEST_SELECTOR" "$RECIPIENT" "$AMOUNT_WEI" --rpc-url "$RPC" --private-key "$PRIVATE_KEY" $V 2>/dev/null && echo "Simulation: OK" || echo "Simulation: (check params)"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Real execution: broadcasts sendCrossChain transaction (no --dry-run)
|
||||
cast send "$BRIDGE" "sendCrossChain(uint64,address,uint256)" "$DEST_SELECTOR" "$RECIPIENT" "$AMOUNT_WEI" --rpc-url "$RPC" --private-key "$PRIVATE_KEY" --gas-price "$GAS_PRICE" --legacy $V $GAS_OPT
|
||||
Reference in New Issue
Block a user