| 
									
										
										
										
											2019-08-01 13:48:00 -07:00
										 |  |  | #!/usr/bin/env bash
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Delegate stake to a validator | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | set -e | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | here=$(dirname "$0") | 
					
						
							|  |  |  | # shellcheck source=multinode-demo/common.sh | 
					
						
							|  |  |  | source "$here"/common.sh | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-15 12:53:52 -07:00
										 |  |  | stake_sol=1   # default number of SOL to assign as stake (1 SOL) | 
					
						
							| 
									
										
										
										
											2019-08-01 13:48:00 -07:00
										 |  |  | url=http://127.0.0.1:8899   # default RPC url | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | usage() { | 
					
						
							|  |  |  |   if [[ -n $1 ]]; then | 
					
						
							|  |  |  |     echo "$*" | 
					
						
							|  |  |  |     echo | 
					
						
							|  |  |  |   fi | 
					
						
							|  |  |  |   cat <<EOF | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-15 12:53:52 -07:00
										 |  |  | usage: $0 [OPTIONS] <SOL to stake ($stake_sol)> | 
					
						
							| 
									
										
										
										
											2019-08-01 13:48:00 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | Add stake to a validator | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | OPTIONS: | 
					
						
							|  |  |  |   --url   RPC_URL           - RPC URL to the cluster ($url) | 
					
						
							|  |  |  |   --label LABEL             - Append the given label to the configuration files, useful when running | 
					
						
							|  |  |  |                               multiple validators in the same workspace | 
					
						
							|  |  |  |   --no-airdrop              - Do not attempt to airdrop the stake | 
					
						
							|  |  |  |   --keypair FILE            - Keypair to fund the stake from | 
					
						
							| 
									
										
										
										
											2019-08-01 21:08:24 -07:00
										 |  |  |   --force                   - Override delegate-stake sanity checks | 
					
						
							| 
									
										
										
										
											2019-08-01 13:48:00 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | EOF | 
					
						
							|  |  |  |   exit 1 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | common_args=() | 
					
						
							|  |  |  | label= | 
					
						
							|  |  |  | airdrops_enabled=1 | 
					
						
							| 
									
										
										
										
											2019-08-01 21:08:24 -07:00
										 |  |  | maybe_force= | 
					
						
							| 
									
										
										
										
											2020-05-19 20:07:30 -07:00
										 |  |  | keypair= | 
					
						
							| 
									
										
										
										
											2019-08-01 13:48:00 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | positional_args=() | 
					
						
							|  |  |  | while [[ -n $1 ]]; do | 
					
						
							|  |  |  |   if [[ ${1:0:1} = - ]]; then | 
					
						
							|  |  |  |     if [[ $1 = --label ]]; then | 
					
						
							|  |  |  |       label="-$2" | 
					
						
							|  |  |  |       shift 2 | 
					
						
							|  |  |  |     elif [[ $1 = --keypair || $1 = -k ]]; then | 
					
						
							| 
									
										
										
										
											2020-05-19 20:07:30 -07:00
										 |  |  |       keypair="$2" | 
					
						
							| 
									
										
										
										
											2019-08-01 13:48:00 -07:00
										 |  |  |       shift 2 | 
					
						
							| 
									
										
										
										
											2019-08-01 21:08:24 -07:00
										 |  |  |     elif [[ $1 = --force ]]; then | 
					
						
							|  |  |  |       maybe_force=--force | 
					
						
							| 
									
										
										
										
											2019-08-01 22:43:09 -07:00
										 |  |  |       shift 1 | 
					
						
							| 
									
										
										
										
											2019-08-01 13:48:00 -07:00
										 |  |  |     elif [[ $1 = --url || $1 = -u ]]; then | 
					
						
							|  |  |  |       url=$2 | 
					
						
							|  |  |  |       shift 2 | 
					
						
							|  |  |  |     elif [[ $1 = --no-airdrop ]]; then | 
					
						
							|  |  |  |       airdrops_enabled=0 | 
					
						
							|  |  |  |       shift | 
					
						
							|  |  |  |     elif [[ $1 = -h ]]; then | 
					
						
							|  |  |  |       usage "$@" | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       echo "Unknown argument: $1" | 
					
						
							| 
									
										
										
										
											2020-03-06 19:08:20 -08:00
										 |  |  |       usage | 
					
						
							| 
									
										
										
										
											2019-08-01 13:48:00 -07:00
										 |  |  |       exit 1 | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     positional_args+=("$1") | 
					
						
							|  |  |  |     shift | 
					
						
							|  |  |  |   fi | 
					
						
							|  |  |  | done | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | common_args+=(--url "$url") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if [[ ${#positional_args[@]} -gt 1 ]]; then | 
					
						
							|  |  |  |   usage "$@" | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | if [[ -n ${positional_args[0]} ]]; then | 
					
						
							| 
									
										
										
										
											2020-02-15 12:53:52 -07:00
										 |  |  |   stake_sol=${positional_args[0]} | 
					
						
							| 
									
										
										
										
											2019-08-01 13:48:00 -07:00
										 |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | config_dir="$SOLANA_CONFIG_DIR/validator$label" | 
					
						
							| 
									
										
										
										
											2020-03-13 11:41:18 -07:00
										 |  |  | vote_account="$config_dir"/vote-account.json | 
					
						
							|  |  |  | stake_account="$config_dir"/stake-account.json | 
					
						
							| 
									
										
										
										
											2019-08-01 13:48:00 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-13 11:41:18 -07:00
										 |  |  | if [[ ! -f $vote_account ]]; then | 
					
						
							|  |  |  |   echo "Error: $vote_account not found" | 
					
						
							| 
									
										
										
										
											2019-08-01 13:48:00 -07:00
										 |  |  |   exit 1 | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if ((airdrops_enabled)); then | 
					
						
							| 
									
										
										
										
											2020-05-19 20:07:30 -07:00
										 |  |  |   if [[ -z $keypair ]]; then | 
					
						
							|  |  |  |     echo "--keypair argument must be provided" | 
					
						
							|  |  |  |     exit 1 | 
					
						
							|  |  |  |   fi | 
					
						
							|  |  |  |   $solana_cli "${common_args[@]}" --keypair "$SOLANA_CONFIG_DIR/faucet.json" transfer "$keypair" "$stake_sol" | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if [[ -n $keypair ]]; then | 
					
						
							|  |  |  |   common_args+=(--keypair "$keypair") | 
					
						
							| 
									
										
										
										
											2019-08-01 13:48:00 -07:00
										 |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-11 11:13:04 -06:00
										 |  |  | if ! [[ -f "$stake_account" ]]; then | 
					
						
							|  |  |  |   $solana_keygen new --no-passphrase -so "$stake_account" | 
					
						
							|  |  |  | else | 
					
						
							|  |  |  |   echo "$stake_account already exists! Using it" | 
					
						
							|  |  |  | fi | 
					
						
							| 
									
										
										
										
											2019-08-01 13:48:00 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | set -x | 
					
						
							| 
									
										
										
										
											2019-08-22 13:51:16 -07:00
										 |  |  | $solana_cli "${common_args[@]}" \
 | 
					
						
							| 
									
										
										
										
											2020-03-13 11:41:18 -07:00
										 |  |  |   vote-account "$vote_account" | 
					
						
							| 
									
										
										
										
											2019-08-22 13:51:16 -07:00
										 |  |  | $solana_cli "${common_args[@]}" \
 | 
					
						
							| 
									
										
										
										
											2020-03-13 11:41:18 -07:00
										 |  |  |   create-stake-account "$stake_account" "$stake_sol" | 
					
						
							| 
									
										
										
										
											2019-09-29 21:18:15 -07:00
										 |  |  | $solana_cli "${common_args[@]}" \
 | 
					
						
							| 
									
										
										
										
											2020-03-13 11:41:18 -07:00
										 |  |  |   delegate-stake $maybe_force "$stake_account" "$vote_account" | 
					
						
							|  |  |  | $solana_cli "${common_args[@]}" stakes "$stake_account" |