fix wallet load/dump/list

This commit is contained in:
Dobromir Popov
2025-09-29 23:16:06 +03:00
parent dc8f69c5c3
commit e272755015
7 changed files with 352 additions and 40 deletions

View File

@@ -0,0 +1,74 @@
#!/bin/bash
# Script to find if an address belongs to any loaded wallet
# Usage: ./find_address.sh <address>
if [[ $# -ne 1 ]]; then
echo "Usage: $0 <address>"
echo "Example: $0 rin1qvj0yyt9phvled9kxflju3p687a4s7kareglpk5"
exit 1
fi
ADDRESS="$1"
# RPC Configuration
RPC_USER="rinrpc"
RPC_PASSWORD="745ce784d5d537fc06105a1b935b7657903cfc71a5fb3b90"
RPC_HOST="localhost"
RPC_PORT="9556"
echo "Searching for address: $ADDRESS"
echo ""
# First, get list of all loaded wallets
WALLETS_RESPONSE=$(curl -s -u "$RPC_USER:$RPC_PASSWORD" \
-H "Content-Type: application/json" \
-d '{"jsonrpc": "2.0", "id": "listwallets", "method": "listwallets", "params": []}' \
"http://$RPC_HOST:$RPC_PORT")
if echo "$WALLETS_RESPONSE" | grep -q '"error":null'; then
echo "Loaded wallets found. Checking each wallet..."
# Extract wallet names (this is a simple approach, may need refinement)
WALLET_NAMES=$(echo "$WALLETS_RESPONSE" | grep -o '"[^"]*"' | grep -v '"result"' | grep -v '"error"' | grep -v '"id"' | grep -v '"jsonrpc"' | sed 's/"//g')
if [ -z "$WALLET_NAMES" ]; then
echo "No wallets are currently loaded."
echo "Load a wallet first with: ./rin/wallet/cmd/load_main_wallet.sh"
exit 1
fi
FOUND=false
for wallet in $WALLET_NAMES; do
echo "Checking wallet: $wallet"
# Check if address belongs to this wallet
VALIDATE_RESPONSE=$(curl -s -u "$RPC_USER:$RPC_PASSWORD" \
-H "Content-Type: application/json" \
-d '{"jsonrpc": "2.0", "id": "validateaddress", "method": "validateaddress", "params": ["'$ADDRESS'"]}' \
"http://$RPC_HOST:$RPC_PORT/wallet/$wallet")
if echo "$VALIDATE_RESPONSE" | grep -q '"ismine":true'; then
echo "✓ FOUND! Address belongs to wallet: $wallet"
FOUND=true
# Get more details
echo "Address details:"
echo "$VALIDATE_RESPONSE" | grep -E '"isvalid"|"ismine"|"iswatchonly"|"isscript"|"pubkey"|"hdkeypath"'
echo ""
fi
done
if [ "$FOUND" = false ]; then
echo "❌ Address not found in any loaded wallet."
echo ""
echo "The address might be:"
echo "1. In an unloaded wallet"
echo "2. Not belonging to this node"
echo "3. From a different wallet backup"
fi
else
echo "Error getting wallet list: $WALLETS_RESPONSE"
fi

View File

@@ -24,21 +24,34 @@ RESPONSE=$(curl -s -u "$RPC_USER:$RPC_PASSWORD" \
-d "$RPC_REQUEST" \ -d "$RPC_REQUEST" \
"http://$RPC_HOST:$RPC_PORT") "http://$RPC_HOST:$RPC_PORT")
# Check for errors # Show raw response for debugging
ERROR=$(echo "$RESPONSE" | jq -r '.error' 2>/dev/null) echo "Raw response: $RESPONSE"
if [ "$ERROR" != "null" ] && [ -n "$ERROR" ]; then echo ""
echo "Error: $(echo "$ERROR" | jq -r '.message')"
exit 1
fi
# Get wallet list # Check for errors (without jq)
WALLETS=$(echo "$RESPONSE" | jq -r '.result[]' 2>/dev/null) if echo "$RESPONSE" | grep -q '"error":null'; then
if [ -n "$WALLETS" ]; then echo "No errors in response"
# Extract wallet names from the result array
# Look for pattern: "result":["wallet1","wallet2"]
WALLET_SECTION=$(echo "$RESPONSE" | grep -o '"result":\[[^]]*\]')
if [ -n "$WALLET_SECTION" ]; then
# Extract wallet names between quotes
WALLETS=$(echo "$WALLET_SECTION" | grep -o '"[^"]*"' | grep -v '"result"' | sed 's/"//g')
if [ -n "$WALLETS" ]; then
echo "Loaded wallets:" echo "Loaded wallets:"
echo "$WALLETS" | while read -r wallet; do echo "$WALLETS" | while read -r wallet; do
echo " - $wallet" echo " - $wallet"
done done
else else
echo "No wallets are currently loaded." echo "No wallets are currently loaded."
fi
else
echo "No wallet result found in response."
fi
else
echo "Error in response: $RESPONSE"
fi fi

View File

@@ -0,0 +1,27 @@
#!/bin/bash
# Script to load the main wallet
# Usage: ./load_main_wallet.sh
RPC_USER="rinrpc"
RPC_PASSWORD="745ce784d5d537fc06105a1b935b7657903cfc71a5fb3b90"
RPC_HOST="localhost"
RPC_PORT="9556"
echo "Loading main wallet..."
LOAD_RESPONSE=$(curl -s -u "$RPC_USER:$RPC_PASSWORD" \
-H "Content-Type: application/json" \
-d '{"jsonrpc": "2.0", "id": "loadwallet", "method": "loadwallet", "params": ["main"]}' \
"http://$RPC_HOST:$RPC_PORT")
echo "Response: $LOAD_RESPONSE"
if echo "$LOAD_RESPONSE" | grep -q '"error":null'; then
echo "✓ Main wallet loaded successfully"
elif echo "$LOAD_RESPONSE" | grep -q "already loaded"; then
echo "✓ Main wallet is already loaded"
else
echo "Failed to load main wallet"
fi

View File

@@ -0,0 +1,127 @@
#!/bin/bash
# RinCoin Wallet Restoration from Master Seed Script
# Restores a wallet from just the master private key (xprv...)
# Usage: ./restore_from_seed.sh "xprv9s21ZrQH143K3bjynHVk6hBTZLmV9wjqWScL3UyENBYK6RaFo75zu5jnWQtBi932zKbD7c2WARWLJNjBbE3Td2Cc44ym3dmp343qKKFXwxS"
set -eo pipefail
if [[ $# -ne 1 ]]; then
echo "Usage: $0 \"<master_private_key>\""
echo "Example: $0 \"xprv9s21ZrQH143K3bjynHVk6hBTZLmV9wjqWScL3UyENBYK6RaFo75zu5jnWQtBi932zKbD7c2WARWLJNjBbE3Td2Cc44ym3dmp343qKKFXwxS\""
echo ""
echo "To get the master key from your backup file:"
echo "grep 'extended private masterkey' ~/rin_wallet_backups/rin_wallet_backup_*.txt"
exit 1
fi
MASTER_KEY="$1"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
WALLET_NAME="restored_from_seed_${TIMESTAMP}"
# RPC Configuration
RPC_USER="rinrpc"
RPC_PASSWORD="745ce784d5d537fc06105a1b935b7657903cfc71a5fb3b90"
RPC_HOST="localhost"
RPC_PORT="9556"
# Validate master key format
if [[ ! "$MASTER_KEY" =~ ^xprv[a-zA-Z0-9]+ ]]; then
echo "Error: Invalid master key format. Must start with 'xprv'"
exit 1
fi
# Check if RIN node is running
if ! pgrep -f "rincoind" > /dev/null; then
echo "Error: RinCoin daemon is not running. Start it first."
exit 1
fi
echo "Checking if wallet already exists..."
# First try to load existing wallet
LOAD_RESPONSE=$(curl -s -u "$RPC_USER:$RPC_PASSWORD" \
-H "Content-Type: application/json" \
-d '{"jsonrpc": "2.0", "id": "loadwallet", "method": "loadwallet", "params": ["restored_from_seed"]}' \
"http://$RPC_HOST:$RPC_PORT")
echo "Load response: $LOAD_RESPONSE"
if echo "$LOAD_RESPONSE" | grep -q '"error":null'; then
echo "✓ Existing wallet 'restored_from_seed' loaded successfully"
WALLET_NAME="restored_from_seed"
else
echo "Creating new wallet for seed restoration..."
# Create a new wallet
CREATE_RESPONSE=$(curl -s -u "$RPC_USER:$RPC_PASSWORD" \
-H "Content-Type: application/json" \
-d '{"jsonrpc": "2.0", "id": "createwallet", "method": "createwallet", "params": ["'$WALLET_NAME'", false, true, "", false, false, true]}' \
"http://$RPC_HOST:$RPC_PORT")
if echo "$CREATE_RESPONSE" | grep -q '"error":null'; then
echo "✓ New wallet '$WALLET_NAME' created successfully"
else
echo "Error creating wallet: $CREATE_RESPONSE"
exit 1
fi
fi
echo "Setting HD seed from master private key..."
# First, try to import the master key directly
IMPORT_RESPONSE=$(curl -s -u "$RPC_USER:$RPC_PASSWORD" \
-H "Content-Type: application/json" \
-d '{"jsonrpc": "2.0", "id": "importprivkey", "method": "importprivkey", "params": ["'$MASTER_KEY'", "", false]}' \
"http://$RPC_HOST:$RPC_PORT/wallet/$WALLET_NAME")
if echo "$IMPORT_RESPONSE" | grep -q '"error":null'; then
echo "✓ Master key imported successfully"
else
echo "Import response: $IMPORT_RESPONSE"
# Alternative: Try sethdseed with newkeypool=false (don't replace existing keys)
SEED_RESPONSE=$(curl -s -u "$RPC_USER:$RPC_PASSWORD" \
-H "Content-Type: application/json" \
-d '{"jsonrpc": "2.0", "id": "sethdseed", "method": "sethdseed", "params": [false, "'$MASTER_KEY'"]}' \
"http://$RPC_HOST:$RPC_PORT/wallet/$WALLET_NAME")
if echo "$SEED_RESPONSE" | grep -q '"error":null'; then
echo "✓ HD seed set successfully"
else
echo "Error setting HD seed: $SEED_RESPONSE"
echo "Note: The master key format might not be compatible with this method"
echo "Try using the full wallet dump restoration instead"
fi
fi
echo "Generating addresses from seed..."
# Generate some addresses to populate the wallet
for i in {1..10}; do
ADDRESS_RESPONSE=$(curl -s -u "$RPC_USER:$RPC_PASSWORD" \
-H "Content-Type: application/json" \
-d '{"jsonrpc": "2.0", "id": "getnewaddress", "method": "getnewaddress", "params": []}' \
"http://$RPC_HOST:$RPC_PORT/wallet/$WALLET_NAME")
if echo "$ADDRESS_RESPONSE" | grep -q '"error":null'; then
echo " Generated address $i"
else
echo "Warning: Failed to generate address $i"
fi
done
echo ""
echo "✅ Wallet restored from master key successfully!"
echo "Wallet name: $WALLET_NAME"
echo ""
echo "Important notes:"
echo "- The wallet will automatically detect transactions as it syncs"
echo "- You may need to rescan the blockchain to find old transactions"
echo "- Run: ./rin/wallet/cmd/check_balance.sh to see if funds appear"
echo ""
echo "To rescan blockchain (if needed):"
echo "curl -s -u \"$RPC_USER:$RPC_PASSWORD\" -H \"Content-Type: application/json\" -d '{\"jsonrpc\": \"2.0\", \"id\": \"rescanblockchain\", \"method\": \"rescanblockchain\", \"params\": []}' \"http://$RPC_HOST:$RPC_PORT/wallet/$WALLET_NAME\""
echo ""
echo "Check balance with:"
echo "curl -s -u \"$RPC_USER:$RPC_PASSWORD\" -H \"Content-Type: application/json\" -d '{\"jsonrpc\": \"2.0\", \"id\": \"getbalance\", \"method\": \"getbalance\", \"params\": []}' \"http://$RPC_HOST:$RPC_PORT/wallet/$WALLET_NAME\""

View File

@@ -2,20 +2,25 @@
# RinCoin Wallet Restoration Script # RinCoin Wallet Restoration Script
# Restores a wallet from a dump file on a new RinCoin node. # Restores a wallet from a dump file on a new RinCoin node.
# Prerequisites: New RinCoin node running in Docker, backup file available. # Prerequisites: RinCoin node running, backup file available.
set -euo pipefail set -eo pipefail
if [[ $# -ne 1 ]]; then if [[ $# -lt 1 ]] || [[ $# -gt 2 ]]; then
echo "Usage: $0 <path_to_backup_file>" echo "Usage: $0 <path_to_backup_file> [wallet_name]"
echo "Example: $0 ~/rin_wallet_backups/rin_wallet_backup_20230923.txt" echo "Example: $0 ~/rin_wallet_backups/rin_wallet_backup_20230923.txt"
echo "Example: $0 ~/rin_wallet_backups/rin_wallet_backup_20230923.txt my_restored_wallet"
exit 1 exit 1
fi fi
BACKUP_FILE="$1" BACKUP_FILE="$1"
CONTAINER="rincoin-node" NEW_WALLET_NAME="${2:-restored_main}" # Use provided name or default
WALLET_NAME="main" # Will be renamed to avoid conflicts
NEW_WALLET_NAME="restored_main" # RPC Configuration
RPC_USER="rinrpc"
RPC_PASSWORD="745ce784d5d537fc06105a1b935b7657903cfc71a5fb3b90"
RPC_HOST="localhost"
RPC_PORT="9556"
# Verify backup file exists # Verify backup file exists
if [[ ! -f "$BACKUP_FILE" ]]; then if [[ ! -f "$BACKUP_FILE" ]]; then
@@ -23,41 +28,63 @@ if [[ ! -f "$BACKUP_FILE" ]]; then
exit 1 exit 1
fi fi
# Check if container is running # Check if RIN node is running
if ! sudo docker ps --format '{{.Names}}' | grep -q "^${CONTAINER}$"; then if ! pgrep -f "rincoind" > /dev/null; then
echo "Error: ${CONTAINER} container is not running. Start it with 'sudo docker start ${CONTAINER}'." echo "Error: RinCoin daemon is not running. Start it first."
exit 1 exit 1
fi fi
echo "Stopping RinCoin node for safe restoration..." # Copy backup file to daemon's data directory
sudo docker stop "$CONTAINER" TIMESTAMP=$(date +%Y%m%d_%H%M%S)
DAEMON_BACKUP_FILE="/data/restore_backup_${TIMESTAMP}.txt"
SYSTEM_BACKUP_FILE="/mnt/data/docker_vol/rincoin/rincoin-node/data/restore_backup_${TIMESTAMP}.txt"
echo "Copying backup file into container..." echo "Copying backup file to daemon directory..."
sudo docker cp "$BACKUP_FILE" "$CONTAINER:/tmp/wallet_backup.txt" cp "$BACKUP_FILE" "$SYSTEM_BACKUP_FILE"
echo "Starting RinCoin node..." echo "Backup file copied to: $DAEMON_BACKUP_FILE"
sudo docker start "$CONTAINER"
# Wait for RPC to be ready
echo "Waiting for node to fully start..."
sleep 10
echo "Creating new wallet and importing keys..." echo "Creating new wallet and importing keys..."
# Create a new wallet to avoid conflicts # Create a new wallet to avoid conflicts
sudo docker exec "$CONTAINER" rincoin-cli -datadir=/data -conf=/data/rincoin.conf createwallet "$NEW_WALLET_NAME" CREATE_RESPONSE=$(curl -s -u "$RPC_USER:$RPC_PASSWORD" \
-H "Content-Type: application/json" \
-d '{"jsonrpc": "2.0", "id": "createwallet", "method": "createwallet", "params": ["'$NEW_WALLET_NAME'", false, false, "", false, false, true]}' \
"http://$RPC_HOST:$RPC_PORT")
if echo "$CREATE_RESPONSE" | grep -q '"error":null'; then
echo "✓ New wallet '$NEW_WALLET_NAME' created successfully"
else
echo "Error creating wallet: $CREATE_RESPONSE"
exit 1
fi
# Import the dump file # Import the dump file
sudo docker exec "$CONTAINER" rincoin-cli -datadir=/data -conf=/data/rincoin.conf -rpcwallet="$NEW_WALLET_NAME" importwallet /tmp/wallet_backup.txt echo "Importing wallet from backup file..."
IMPORT_RESPONSE=$(curl -s -u "$RPC_USER:$RPC_PASSWORD" \
-H "Content-Type: application/json" \
-d '{"jsonrpc": "2.0", "id": "importwallet", "method": "importwallet", "params": ["'$DAEMON_BACKUP_FILE'"]}' \
"http://$RPC_HOST:$RPC_PORT/wallet/$NEW_WALLET_NAME")
if echo "$IMPORT_RESPONSE" | grep -q '"error":null'; then
echo "✓ Wallet imported successfully"
else
echo "Error importing wallet: $IMPORT_RESPONSE"
exit 1
fi
# Clean up # Clean up
sudo docker exec "$CONTAINER" rm /tmp/wallet_backup.txt echo "Cleaning up temporary files..."
rm -f "$SYSTEM_BACKUP_FILE"
echo "✅ Wallet restored successfully!" echo "✅ Wallet restored successfully!"
echo "New wallet name: $NEW_WALLET_NAME" echo "New wallet name: $NEW_WALLET_NAME"
echo "" echo ""
echo "Verify with:" echo "Verify with:"
echo "sudo docker exec $CONTAINER rincoin-cli -datadir=/data -conf=/data/rincoin.conf -rpcwallet=$NEW_WALLET_NAME getbalance" echo "curl -s -u \"$RPC_USER:$RPC_PASSWORD\" -H \"Content-Type: application/json\" -d '{\"jsonrpc\": \"2.0\", \"id\": \"getbalance\", \"method\": \"getbalance\", \"params\": []}' \"http://$RPC_HOST:$RPC_PORT/wallet/$NEW_WALLET_NAME\""
echo "" echo ""
echo "To use this wallet, update scripts to use -rpcwallet=$NEW_WALLET_NAME" echo "Or check balance with:"
echo "Or rename it back: unloadwallet $NEW_WALLET_NAME && loadwallet $WALLET_NAME" echo "./rin/wallet/cmd/check_balance.sh"
echo ""
echo "To use this wallet as default, update scripts to use wallet name: $NEW_WALLET_NAME"

View File

@@ -0,0 +1,25 @@
#!/bin/bash
# Simple seed restoration
MASTER_KEY="$1"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
WALLET_NAME="seed_restore_${TIMESTAMP}"
echo "Creating wallet: $WALLET_NAME"
echo "Master key: $MASTER_KEY"
curl -s -u "rinrpc:745ce784d5d537fc06105a1b935b7657903cfc71a5fb3b90" \
-H "Content-Type: application/json" \
-d "{\"jsonrpc\": \"2.0\", \"id\": \"createwallet\", \"method\": \"createwallet\", \"params\": [\"$WALLET_NAME\", false, true, \"\", false, false, true]}" \
"http://localhost:9556"
echo ""
echo "Setting seed..."
curl -s -u "rinrpc:745ce784d5d537fc06105a1b935b7657903cfc71a5fb3b90" \
-H "Content-Type: application/json" \
-d "{\"jsonrpc\": \"2.0\", \"id\": \"sethdseed\", \"method\": \"sethdseed\", \"params\": [true, \"$MASTER_KEY\"]}" \
"http://localhost:9556/wallet/$WALLET_NAME"
echo ""
echo "Done! Wallet name: $WALLET_NAME"

19
test_list.sh Normal file
View File

@@ -0,0 +1,19 @@
#!/bin/bash
echo "Testing wallet list..."
RESPONSE=$(curl -s -u "rinrpc:745ce784d5d537fc06105a1b935b7657903cfc71a5fb3b90" \
-H "Content-Type: application/json" \
-d '{"jsonrpc": "2.0", "id": "listwallets", "method": "listwallets", "params": []}' \
"http://localhost:9556")
echo "Raw response:"
echo "$RESPONSE"
echo ""
echo "Checking if jq is available:"
which jq || echo "jq not found"
echo ""
echo "Trying to parse without jq:"
echo "$RESPONSE" | grep -o '"[^"]*"' | grep -v '"result"' | grep -v '"error"' | grep -v '"id"' | grep -v '"jsonrpc"'