/ generate.sh
generate.sh
1 #!/usr/bin/env bash 2 set -e 3 4 # Generate private key for Ethereum wallet 5 6 # Variables 7 key_file="eth.key" 8 address_file="eth.address" 9 URL=${URL:-https://key.codex.storage} 10 MODE=${MODE:-remote} 11 PROGRESS_MARK="\033[0;36m\u2022\033[0m" 12 PASS_MARK="\033[0;32m\u2714\033[0m" 13 FAIL_MARK="\033[0;31m\u2718\033[0m" 14 SCRIPT_URL="${SCRIPT_URL:-https://get.codex.storage/generate.sh}" 15 16 # Help 17 if [[ $1 == *"help"* ]] ; then 18 COMMAND="curl -s ${SCRIPT_URL}" 19 echo -e " 20 \e[33mGenerate private key for Ethereum wallet\e[0m\n 21 \e[33mUsage:\e[0m 22 ${COMMAND} | bash 23 ${COMMAND} | bash 24 ${COMMAND} | MODE=local bash 25 ${COMMAND} | URL=https://key.codex.storage bash 26 ${COMMAND} | bash -s help 27 28 \e[33mVariables:\e[0m 29 - MODE=local - Generate key locally 30 - ETH_PRIVATE_KEY=0x... - Use provided private key 31 - URL=https://key.codex.storage - Key generation service URL 32 " 33 exit 0 34 fi 35 36 # Show 37 show_start() { 38 echo -e "\n \e[33m${1}\e[0m\n" 39 } 40 41 show_progress() { 42 echo -e " ${PROGRESS_MARK} ${1}" 43 } 44 45 show_pass() { 46 echo -e "\r\e[1A\e[0K ${PASS_MARK} ${1}" 47 } 48 49 show_fail() { 50 echo -e "\r\e[1A\e[0K ${FAIL_MARK} ${1}" 51 [[ -n "${2}" ]] && echo -e "\e[31m \n Error: ${2}\e[0m\n" 52 exit 1 53 } 54 55 # Start 56 show_start "Generate Ethereum private key..." 57 58 # Generate remote 59 generate_remote() { 60 message="Generating key using \e[31mremote\e[0m ${URL}" 61 show_progress "${message}" 62 response=$(curl -m 5 --fail -s ${URL} || true) 63 [[ -n "${response}" ]] && show_pass "${message}" || show_fail "${message}" "Failed to connect to ${URL}" 64 65 message="Saving private key to file" 66 show_progress "${message}" 67 if ! (awk -F ': ' '/private/ {print $2}' <<<"${response}" >"${key_file}") >/dev/null 2>&1; then 68 show_fail "${message}" "Failed to save address to file" 69 fi 70 show_pass "${message}" 71 72 message="Saving address to file" 73 show_progress "${message}" 74 if ! (awk -F ': ' '/address/ {print $2}' <<<"${response}" >"${address_file}") >/dev/null 2>&1; then 75 show_fail "${message}" "Failed to save private key to file" 76 fi 77 show_pass "${message}" 78 79 # Permissions 80 message="Setting private key file permissions" 81 show_progress "${message}" 82 case "$(uname -s)" in 83 Linux*) OS="linux" ;; 84 Darwin*) OS="darwin" ;; 85 CYGWIN*|MINGW*|MSYS*) OS="windows" ;; 86 *) show_fail "${message}" "Unsupported OS: $(uname)" ;; 87 esac 88 89 if [[ $OS == "windows" ]]; then 90 if ! (icacls "${key_file}" /inheritance:r /grant:r `whoami`:F) >/dev/null 2>&1; then 91 show_fail "${message}" "Failed to set private key file permissions" 92 fi 93 show_pass "Setting private key file permissions" 94 else 95 if ! (chmod 600 "${key_file}") >/dev/null 2>&1; then 96 show_fail "${message}" "Failed to set private key file permissions" 97 fi 98 show_pass "${message}" 99 fi 100 101 # Show 102 address=$(cat ${address_file}) 103 echo 104 echo -e " - private key file - \e[90m${PWD}/\e[0m\e[94m${key_file}\e[0m" 105 echo -e " - address file - \e[90m${PWD}/\e[0m\e[94m${address_file}\e[0m" 106 echo -e " - address - \e[0m\e[94m${address}\e[0m\n" 107 } 108 109 # Generate locally 110 generate_locally() { 111 message="Generating key locally" 112 show_progress "${message}" && show_fail "${message}" "Local key generation is not implemented yet" 113 } 114 115 # User provided private key 116 user_private_key() { 117 message="Using provided private key" 118 show_progress "${message}" && show_pass "${message}" 119 120 # Save 121 message="Saving private key to file" 122 show_progress "${message}" 123 if ! (echo "${ETH_PRIVATE_KEY}" | tee "${key_file}") >/dev/null 2>&1; then 124 show_fail "${message}" "Failed to save private key to file" 125 fi 126 show_pass "${message}" 127 128 # Permissions 129 message="Setting private key file permissions" 130 show_progress "${message}" 131 if ! (chmod 600 "${key_file}") >/dev/null 2>&1; then 132 show_fail "${message}" "Failed to set private key file permissions" 133 fi 134 show_pass "${message}" 135 136 # Show 137 echo 138 echo -e " - private key - \e[90m${PWD}/\e[0m\e[94m${key_file}\e[0m" 139 echo -e " - please use your key address to get the tokens\n" 140 } 141 142 # Mode 143 [[ -n "${ETH_PRIVATE_KEY}" ]] && MODE="private_key" 144 145 # Save keyrair 146 case "${MODE}" in 147 remote) generate_remote ;; 148 local) generate_locally ;; 149 private_key) user_private_key ;; 150 *) show_fail "Invalid mode: ${MODE}" ;; 151 esac