cycles-quartz/examples/transfers/contracts/deploy-contract-Neutrond.sh
Daniel Gushchyan 14a6913632
refactor: refactor repo as standard rust monorepo (#222)
Co-authored-by: hu55a1n1 <sufialhussaini@gmail.com>
2024-09-30 23:33:22 +04:00

355 lines
12 KiB
Bash
Executable file

#!/bin/bash
set -eo pipefail
# Color definitions
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
MAGENTA='\033[0;35m'
CYAN='\033[0;36m'
BOLD='\033[1m'
NC='\033[0m' # No Color
# Function to print colored and formatted messages
print_message() {
local color=$1
local message=$2
echo -e "${color}${BOLD}${message}${NC}"
}
# Function to print section headers
print_header() {
local message=$1
echo -e "\n${MAGENTA}${BOLD}======== $message ========${NC}\n"
}
# Function to print success messages
print_success() {
local message=$1
echo -e "${GREEN}${BOLD}$message${NC}"
}
# Function to print error messages
print_error() {
local message=$1
echo -e "${RED}${BOLD}❌ Error: $message${NC}"
exit 1
}
# Function to print waiting messages
print_waiting() {
local message=$1
echo -e "${YELLOW}${BOLD}$message${NC}"
}
# Function to update and display progress
update_progress() {
local step=$1
local total_steps=$2
local percentage=$((step * 100 / total_steps))
print_message $BLUE "Progress: [$percentage%] Step $step of $total_steps"
}
# Set up variables
ROOT=${ROOT:-$(git rev-parse --show-toplevel)}
WASMD_HOME=${WASMD_HOME:-"$HOME/.neutrond"}
USER_ADDR=$(neutrond keys show -a "val1" --keyring-backend test --home "$WASMD_HOME" --keyring-dir "$WASMD_HOME")
if [ -z "$USER_ADDR" ]; then
print_error "User address not found. Please ensure the key exists in the keyring."
fi
WASM_BIN="$1"
INSTANTIATE_MSG="$2"
NODE_URL=${NODE_URL:-127.0.0.1:26657}
LABEL=${LABEL:-quartz-transfers-app}
COUNT=${COUNT:-0}
QUARTZ_PORT="${QUARTZ_PORT:-11090}"
CHAIN_ID=${CHAIN_ID:-test-1}
TXFLAG="--chain-id ${CHAIN_ID} --gas-prices 0.0025untrn --gas auto --gas-adjustment 1.3 --keyring-dir "$WASMD_HOME" --keyring-backend "test" "
CMD="neutrond --node http://$NODE_URL"
TOTAL_STEPS=7
CURRENT_STEP=0
update_progress $((++CURRENT_STEP)) $TOTAL_STEPS
print_header "Deploying WASM Contract"
print_message $CYAN "Contract: ${WASM_BIN}"
print_message $CYAN "Chain ID: ${CHAIN_ID}"
print_message $CYAN "User Address: ${USER_ADDR}"
print_message $CYAN "Command: $CMD"
print_message $BLUE "Storing WASM contract..."
RES=$($CMD tx wasm store "$WASM_BIN" --from "$USER_ADDR" $TXFLAG -y --output json )
TX_HASH=$(echo "$RES" | jq -r '.txhash')
print_message $CYAN "Transaction hash: $TX_HASH"
print_waiting "Waiting for transaction to be included in a block..."
ATTEMPTS=0
MAX_ATTEMPTS=30
while [ $ATTEMPTS -lt $MAX_ATTEMPTS ]; do
TX_RESULT=$($CMD query tx "$TX_HASH" --output json 2>/dev/null || echo '{"code": 1}')
TX_CODE=$(echo "$TX_RESULT" | jq -r '.code // .tx_result.code // 1')
if [[ $TX_CODE == "0" ]]; then
print_success "Transaction processed successfully."
break
elif [[ $TX_CODE != "1" ]]; then
print_error "Error processing transaction. Code: $TX_CODE"
fi
print_waiting "Transaction not yet processed. Waiting... (Attempt $((ATTEMPTS+1))/$MAX_ATTEMPTS)"
sleep 2
ATTEMPTS=$((ATTEMPTS+1))
done
if [ $ATTEMPTS -eq $MAX_ATTEMPTS ]; then
print_error "Failed to retrieve transaction after $MAX_ATTEMPTS attempts."
fi
print_message $BLUE "Extracting CODE_ID..."
CODE_ID=$(echo "$TX_RESULT" | jq -r '.events[] | select(.type=="store_code") | .attributes[] | select(.key=="code_id") | .value')
print_message $CYAN "Extracted CODE_ID: $CODE_ID"
if [[ -z "$CODE_ID" || "$CODE_ID" == "null" ]]; then
print_error "Failed to extract CODE_ID."
fi
update_progress $((++CURRENT_STEP)) $TOTAL_STEPS
print_header "Instantiating Contract"
print_message $CYAN "Label: ${LABEL}"
print_message $CYAN "Code ID: ${CODE_ID}"
INSTANTIATE_MSG_PARSED=$(echo "$INSTANTIATE_MSG" | jq -r '.')
INSTANTIATE_MSG_ONELINE=$(echo "$INSTANTIATE_MSG_PARSED" | jq '{quartz: .} + {denom: "untrn"}' )
# Print the instantiate message for debugging
echo "Instantiate message: $INSTANTIATE_MSG_ONELINE"
INSTANTIATE_CMD="$CMD tx wasm instantiate $CODE_ID '$INSTANTIATE_MSG_ONELINE' --from "$USER_ADDR" $TXFLAG --label $LABEL -y --no-admin --output json"
print_message $BLUE "Executing instantiate command..."
RES=$(eval "$INSTANTIATE_CMD")
TX_HASH=$(echo "$RES" | jq -r '.txhash')
print_waiting "Waiting for instantiate transaction to be processed..."
ATTEMPTS=0
while [ $ATTEMPTS -lt $MAX_ATTEMPTS ]; do
TX_RESULT=$($CMD query tx "$TX_HASH" --output json 2>/dev/null || echo '{"code": 1}')
TX_CODE=$(echo "$TX_RESULT" | jq -r '.code // .tx_result.code // 1')
if [[ $TX_CODE == "0" ]]; then
print_success "Instantiate transaction processed successfully."
break
elif [[ $TX_CODE != "1" ]]; then
print_error "Error processing instantiate transaction. Code: $TX_CODE"
fi
print_waiting "Instantiate transaction not yet processed. Waiting... (Attempt $((ATTEMPTS+1))/$MAX_ATTEMPTS)"
sleep 2
ATTEMPTS=$((ATTEMPTS+1))
done
if [ $ATTEMPTS -eq $MAX_ATTEMPTS ]; then
print_error "Failed to retrieve instantiate transaction after $MAX_ATTEMPTS attempts."
fi
print_message $BLUE "Querying for instantiated contract..."
RES=$($CMD query wasm list-contract-by-code "$CODE_ID" --output json)
CONTRACT=$(echo "$RES" | jq -r '.contracts[0]')
if [[ -z "$CONTRACT" || "$CONTRACT" == "null" ]]; then
print_error "Failed to retrieve contract address."
fi
print_message $CYAN "CONTRACT: $CONTRACT"
cd $ROOT/relayer
update_progress $((++CURRENT_STEP)) $TOTAL_STEPS
print_header "Executing SessionCreate on Enclave"
export EXECUTE_CREATE=$(QUARTZ_PORT=$QUARTZ_PORT ./scripts/relay.sh SessionCreate)
if [ -z "$EXECUTE_CREATE" ]; then
print_error "Failed to execute SessionCreate on enclave"
fi
print_success "SessionCreate execution successful"
print_message $BLUE "Submitting SessionCreate to contract..."
RES=$($CMD tx wasm execute "$CONTRACT" "$EXECUTE_CREATE" --from "$USER_ADDR" $TXFLAG --keyring-backend "test" --keyring-dir "$WASMD_HOME" -y --output json)
TX_HASH=$(echo "$RES" | jq -r '.txhash')
if [ -z "$TX_HASH" ] || [ "$TX_HASH" == "null" ]; then
print_error "Failed to retrieve transaction hash"
fi
print_message $CYAN "Transaction hash: $TX_HASH"
print_waiting "Waiting for transaction to be included in a block..."
ATTEMPTS=0
MAX_ATTEMPTS=30
while [ $ATTEMPTS -lt $MAX_ATTEMPTS ]; do
TX_RESULT=$($CMD query tx "$TX_HASH" --output json 2>/dev/null || echo '{"code": 1}')
TX_CODE=$(echo "$TX_RESULT" | jq -r '.code // .tx_result.code // 1')
if [[ $TX_CODE == "0" ]]; then
print_success "Transaction processed successfully."
break
elif [[ $TX_CODE != "1" ]]; then
print_error "Error processing transaction. Code: $TX_CODE"
fi
print_waiting "Transaction not yet processed. Waiting... (Attempt $((ATTEMPTS+1))/$MAX_ATTEMPTS)"
sleep 2
ATTEMPTS=$((ATTEMPTS+1))
done
if [ $ATTEMPTS -eq $MAX_ATTEMPTS ]; then
print_error "Failed to retrieve transaction after $MAX_ATTEMPTS attempts."
fi
print_success "Handshake process completed"
update_progress $((++CURRENT_STEP)) $TOTAL_STEPS
print_header "Setting Session PK"
cd $ROOT/utils/tm-prover
export PROOF_FILE="light-client-proof.json"
rm -f "$PROOF_FILE"
print_message $BLUE "Removed old $PROOF_FILE"
# print_waiting "Waiting for new blocks to be produced..."
print_waiting "Waiting for transaction to be included in a block..."
ATTEMPTS=0
MAX_ATTEMPTS=30
while [ $ATTEMPTS -lt $MAX_ATTEMPTS ]; do
TX_RESULT=$($CMD query tx "$TX_HASH" --output json 2>/dev/null || echo '{"code": 1}')
TX_CODE=$(echo "$TX_RESULT" | jq -r '.code // .tx_result.code // 1')
if [[ $TX_CODE == "0" ]]; then
print_success "Transaction processed successfully."
break
elif [[ $TX_CODE != "1" ]]; then
print_error "Error processing transaction. Code: $TX_CODE"
fi
print_waiting "Transaction not yet processed. Waiting... (Attempt $((ATTEMPTS+1))/$MAX_ATTEMPTS)"
sleep 2
ATTEMPTS=$((ATTEMPTS+1))
done
print_success "Required blocks produced. Proceeding with tm-prover..."
cd "$ROOT/apps/transfers"
export TRUSTED_HASH=$(cat trusted.hash)
export TRUSTED_HEIGHT=$(cat trusted.height)
print_message $CYAN "Trusted hash: $TRUSTED_HASH"
print_message $CYAN "Trusted height: $TRUSTED_HEIGHT"
cd $ROOT/utils/tm-prover
export QUARTZ_SESSION=$($CMD query wasm contract-state raw $CONTRACT $(echo -n "quartz_session" | xxd -p -c 20) --node "http://$NODE_URL")
print_message $CYAN "Quartz Session before prover: $QUARTZ_SESSION"
export PROOF_FILE="light-client-proof.json"
if [ -f "$PROOF_FILE" ]; then
rm "$PROOF_FILE"
print_message $BLUE "Removed old $PROOF_FILE"
fi
print_message $BLUE "Running prover to get light client proof..."
cargo run -- --chain-id test-1 \
--primary "http://$NODE_URL" \
--witnesses "http://$NODE_URL" \
--trusted-height $TRUSTED_HEIGHT \
--trusted-hash $TRUSTED_HASH \
--contract-address $CONTRACT \
--storage-key "quartz_session" \
--trace-file $PROOF_FILE > /dev/null 2>&1
if [ $? -eq 0 ]; then
print_success "Light client proof generated successfully"
else
print_error "Failed to generate light client proof"
fi
export POP=$(cat $PROOF_FILE)
export POP_MSG=$(jq -nc --arg message "$POP" '$ARGS.named')
update_progress $((++CURRENT_STEP)) $TOTAL_STEPS
print_header "Executing SessionSetPubKey on Enclave"
cd $ROOT/relayer
export EXECUTE_SETPUB=$(QUARTZ_PORT=$QUARTZ_PORT ./scripts/relay.sh SessionSetPubKey "$POP_MSG")
RES=$($CMD tx wasm execute "$CONTRACT" "$EXECUTE_SETPUB" --from "$USER_ADDR" $TXFLAG --keyring-backend "test" --keyring-dir "$WASMD_HOME" -y --output json)
TX_HASH=$(echo $RES | jq -r '.txhash')
if [ -z "$TX_HASH" ] || [ "$TX_HASH" == "null" ]; then
print_error "Failed to retrieve transaction hash"
fi
print_message $CYAN "Transaction hash: $TX_HASH"
print_waiting "Waiting for transaction to commit..."
ATTEMPTS=0
MAX_ATTEMPTS=30
while [ $ATTEMPTS -lt $MAX_ATTEMPTS ]; do
if $CMD query tx "$TX_HASH" &> /dev/null; then
print_success "Transaction committed successfully"
break
fi
print_waiting "Waiting for tx (Attempt $((ATTEMPTS+1))/$MAX_ATTEMPTS)"
sleep 2
ATTEMPTS=$((ATTEMPTS+1))
done
if [ $ATTEMPTS -eq $MAX_ATTEMPTS ]; then
print_error "Transaction failed to commit after $MAX_ATTEMPTS attempts"
fi
update_progress $((++CURRENT_STEP)) $TOTAL_STEPS
print_header "Checking Session Success"
export NONCE_AND_KEY=$($CMD query wasm contract-state raw "$CONTRACT" $(printf '%s' "quartz_session" | hexdump -ve '/1 "%02X"') -o json | jq -r .data | base64 -d)
# echo $NONCE_AND_KEY
export PUBKEY=$(echo $NONCE_AND_KEY | jq -r .pub_key)
update_progress $TOTAL_STEPS $TOTAL_STEPS
print_header "Deployment Summary"
print_success "Deployment and handshake completed successfully!"
echo -e "${CYAN}${BOLD}"
echo "📌 Contract Details:"
echo " • Address: ${CONTRACT}"
echo " • Code ID: ${CODE_ID}"
echo " • Label: ${LABEL}"
echo " • Chain ID: ${CHAIN_ID}"
echo
echo "🔑 Contract Key Information:"
echo " • Public Key: ${PUBKEY}"
echo
echo "🌐 Network Information:"
echo " • Node URL: ${NODE_URL}"
echo " • Quartz Port: ${QUARTZ_PORT}"
echo
echo "👤 User Information:"
echo " • Address: ${USER_ADDR}"
echo " • Keyring Backend: test"
echo " • Keyring Directory: /home/peppi/.neutrond/"
echo
echo "🔧 Additional Settings:"
echo " • Gas Prices: 0.0025untrn"
echo " • Gas Adjustment: 1.3"
echo -e "${NC}"
# ASCII art logo for QUARTZ
cat << "EOF"
██████ ██ ██ █████ ██████ ████████ ███████
██ ██ ██ ██ ██ ██ ██ ██ ██ ██
██ ██ ██ ██ ███████ ██████ ██ ███████
██ ▄▄ ██ ██ ██ ██ ██ ██ ██ ██ ██
██████ ██████ ██ ██ ██ ██ ██ ███████
▀▀
POWERED BY INFORMAL.SYSTEMMS
EOF
print_message $MAGENTA "We hope you'll enjoy developing Quartz Apps!"