-
Notifications
You must be signed in to change notification settings - Fork 3
/
undelegate.sh
executable file
·116 lines (100 loc) · 3.62 KB
/
undelegate.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#!/usr/bin/env bash
# -----------------------------------------------------------------------------
# This script can be used to undelegate stake from pool.
#
# Usage: ./undelegate.sh node_address delegator_private_key pool_identity_address amount fee
# -----------------------------------------------------------------------------
POOL_REGISTRY_ADDRESS="0xa01b68fa4f947ea4829bebdac148d1f7f8a0be9a8fd5ce33e1696932bef05356"
TOOLS_JAR=Tools.jar
return=0
function require_success()
{
if [ $1 -ne 0 ]
then
echo "Failed"
exit 1
fi
}
function echo_state()
{
address="$1"
data="$2"
expected="$3"
payload={\"jsonrpc\":\"2.0\",\"method\":\"eth_call\",\"params\":[{\"to\":\"$address\",\"data\":\"$data\"}],\"id\":1}
response=`curl -s -X POST -H "Content-Type: application/json" --data "$payload" "$node_address"`
encoded_stake="$(echo "$response" | egrep -oh 'result":"0x'"[[:xdigit:]]+" | egrep -oh "0x[[:xdigit:]]+")"
stake="$(java -cp $TOOLS_JAR cli.DecodeReturnResult "BigInteger" "$encoded_stake")"
echo "Current stake = $stake"
}
function capture_event()
{
payload={\"jsonrpc\":\"2.0\",\"method\":\"eth_getTransactionReceipt\",\"params\":[\"$1\"],\"id\":1}
response=`curl -s -X POST -H "Content-Type: application/json" --data "$payload" "$node_address"`
# ADSUndelegated topic
if [[ "$response" =~ (\"0x414453556e64656c656761746564000000000000000000000000000000000000\".+\"id) ]];
then
result=${BASH_REMATCH[0]:70}
echo "Undelegate Id = $(( 16#${result:2:64}))"
else
echo "Error! Could not find event log for ADSUndelegated."
exit 1
fi
}
function wait_for_receipt()
{
receipt="$1"
result="1"
while [ "1" == "$result" ]
do
echo " waiting..."
sleep 1
`./rpc.sh --check-receipt-status "$receipt" "$node_address"`
result=$?
if [ "2" == "$result" ]
then
echo "Error! Transaction failed."
exit 1
fi
done
}
function get_nonce(){
address="$1"
payload={\"jsonrpc\":\"2.0\",\"method\":\"eth_getTransactionCount\",\"params\":[\"$address\",\"latest\"],\"id\":1}
response=`curl -s -X POST -H "Content-Type: application/json" --data "$payload" "$node_address"`
nonce_hex="$(echo "$response" | egrep -oh 'result":"0x'"[[:xdigit:]]+" | egrep -oh "0x[[:xdigit:]]+")"
return=$(( 16#${nonce_hex:2} ))
}
if [ $# -ne 5 ]
then
echo "Invalid number of parameters."
echo "Usage: ./undelegate.sh node_address(ip:port) delegator_private_key pool_identity_address amount fee"
exit 1
fi
node_address="$1"
private_key="$2"
pool_identity_address="$3"
amount="$4"
fee="$5"
if [ ${#private_key} == 130 ]
then
private_key=${private_key::-64}
fi
delegator_address="$(java -cp $TOOLS_JAR cli.KeyExtractor "$private_key")"
get_nonce "$delegator_address"
nonce="$return"
echo "Using nonce $nonce"
echo "Undelegating $amount nAmps from $pool_identity_address..."
# undelegate(Address pool, BigInteger amount, BigInteger fee)
callPayload="$(java -cp $TOOLS_JAR cli.ComposeCallPayload "undelegate" "$pool_identity_address" "$amount" "$fee")"
receipt=`./rpc.sh --call "$private_key" "$nonce" "$POOL_REGISTRY_ADDRESS" "$callPayload" "0" "$node_address"`
require_success $?
echo "Transaction hash: \"$receipt\". Waiting for transaction to complete..."
wait_for_receipt "$receipt"
echo "Transaction completed"
capture_event "$receipt"
echo "Retrieving the total stake for $delegator_address..."
# getStake(Address pool, Address staker)
callPayload="$(java -cp $TOOLS_JAR cli.ComposeCallPayload "getStake" "$pool_identity_address" "$delegator_address")"
# This result in a BigInteger: 0x23 (byte), length (byte), value (big-endian length bytes)
echo_state "$POOL_REGISTRY_ADDRESS" "$callPayload"
echo "Undelegation complete."