/ 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