This guide covers the deployment process for PropChain smart contracts across different networks and environments.
- Rust and cargo-contract installed
- Substrate node (for local deployment)
- Account with sufficient funds (for testnet/mainnet deployment)
- Network-specific configuration
# Build in debug mode
cargo contract build
# Build with verbose output
cargo contract build --verbose# Build optimized contract
cargo contract build --release
# Verify build artifacts
ls -la target/ink/# Start a local Substrate node
substrate-node-template --dev --tmp
# Or use a pre-configured node
./scripts/start-local-node.sh# Instantiate contract
cargo contract instantiate \
--constructor new \
--args "" \
--suri //Alice \
--salt $(date +%s)
# Get contract address
cargo contract info# Set environment variables
export NETWORK=westend
export NODE_URL=wss://westend-rpc.polkadot.io
export SURI=your mnemonic phraseexport NETWORK=rococo
export NODE_URL=wss://rococo-rpc.polkadot.io# 1. Build contract
cargo contract build --release
# 2. Upload contract code
cargo contract upload \
--url $NODE_URL \
--suri $SURI
# 3. Instantiate contract
cargo contract instantiate \
--constructor new \
--args "" \
--url $NODE_URL \
--suri $SURI \
--salt $(date +%s)- Contract audited by security firm
- All tests passing
- Gas optimization completed
- Documentation updated
- Emergency procedures documented
- Funding allocated for deployment costs
# 1. Final build verification
cargo contract build --release
cargo test --release
# 2. Upload to mainnet
cargo contract upload \
--url wss://rpc.polkadot.io \
--suri "$MAINNET_SURI" \
--confirm
# 3. Instantiate with verification
cargo contract instantiate \
--constructor new \
--args "" \
--url wss://rpc.polkadot.io \
--suri "$MAINNET_SURI" \
--confirm \
--salt $(date +%s)- Gas Costs: Higher than testnets
- Finality: ~24 seconds
- Security: Relay chain security
- Upgradeability: Proxy pattern recommended
- Gas Costs: Lower than Polkadot
- Finality: ~12 seconds
- Experimental: Faster feature rollout
- Risk: Higher network risk
- Configuration: Varies by parachain
- Gas Model: May differ from relay chain
- Security: Depends on parachain
- Integration: May require custom adapters
# Verify contract code matches source
cargo contract verify \
--contract $CONTRACT_ADDRESS \
--url $NODE_URL# Generate build info
cargo contract build --release --output-json > build-info.json
# Compare with deployed version
./scripts/verify-deployment.sh $CONTRACT_ADDRESS build-info.json# Monitor contract events
./scripts/monitor-contract.sh $CONTRACT_ADDRESS
# Check contract health
./scripts/health-check.sh $CONTRACT_ADDRESS# 1. Deploy new version
cargo contract upload --new-version
# 2. Migrate to new contract
./scripts/migrate-contract.sh $OLD_ADDRESS $NEW_ADDRESS
# 3. Verify migration
./scripts/verify-migration.sh $NEW_ADDRESS# Check account balance
./scripts/check-balance.sh $ACCOUNT_ADDRESS
# Transfer funds if needed
./scripts/transfer-funds.sh $ACCOUNT_ADDRESS $AMOUNT# Estimate gas usage
cargo contract estimate-gas \
--contract $CONTRACT_ADDRESS \
--method $METHOD_NAME \
--args "$ARGS"
# Increase gas limit
cargo contract call \
--contract $CONTRACT_ADDRESS \
--method $METHOD_NAME \
--args "$ARGS" \
--gas-limit 1000000000000# Check transaction status
./scripts/check-tx.sh $TRANSACTION_HASH
# Debug with verbose output
cargo contract call \
--contract $CONTRACT_ADDRESS \
--method $METHOD_NAME \
--args "$ARGS" \
--verbose# Use secure key storage
export SURI=$(pass show polkadot/mainnet/deployer)
# Never log sensitive data
set +x # Disable command logging
cargo contract instantiate --suri "$SURI"
set -x# Deploy with multi-sig
./scripts/deploy-multisig.sh \
--contract $CONTRACT_ADDRESS \
--threshold 2 \
--signers $SIGNER1 $SIGNER2 $SIGNER3# Emergency pause
./scripts/emergency-pause.sh $CONTRACT_ADDRESS
# Emergency upgrade
./scripts/emergency-upgrade.sh $CONTRACT_ADDRESS $NEW_CODE_HASH# .github/workflows/deploy.yml
name: Deploy Contract
on:
push:
tags: ['v*']
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Rust
uses: actions-rs/toolchain@v1
with:
toolchain: stable
- name: Build Contract
run: cargo contract build --release
- name: Deploy to Testnet
run: ./scripts/deploy-testnet.sh
env:
TESTNET_SURI: ${{ secrets.TESTNET_SURI }}#!/bin/bash
# scripts/deploy.sh
set -euo pipefail
NETWORK=${1:-testnet}
CONTRACT=${2:-property-registry}
echo "Deploying $CONTRACT to $NETWORK..."
case $NETWORK in
local)
NODE_URL="ws://localhost:9944"
SURI="//Alice"
;;
westend)
NODE_URL="wss://westend-rpc.polkadot.io"
SURI="$WESTEND_SURI"
;;
polkadot)
NODE_URL="wss://rpc.polkadot.io"
SURI="$POLKADOT_SURI"
;;
*)
echo "Unknown network: $NETWORK"
exit 1
;;
esac
cargo contract upload \
--url "$NODE_URL" \
--suri "$SURI" \
--confirm
echo "Deployment completed successfully!"- Update contract addresses in documentation
- Add deployment notes to changelog
- Update API documentation if needed
- Notify stakeholders of deployment
- Announce deployment on Discord/Telegram
- Post deployment summary on GitHub
- Update project status page
- Send notification to subscribers
- Set up monitoring dashboards
- Configure alerts for anomalies
- Track gas usage patterns
- Monitor contract interaction metrics