-
Notifications
You must be signed in to change notification settings - Fork 16
/
main.go
117 lines (95 loc) · 2.32 KB
/
main.go
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
117
/*
*/
package main
import (
"encoding/base64"
"fmt"
)
func main() {
addrs := addressess()
txn, tname := prepareRedeem(addrs[0], "mkW45toPFaa1uyNGV4TXEWWCxyuDC7BbKG", 300000)
fmt.Println("Tracker for lock: ", tname)
// os.Exit(1)
signed, signer := sign(base64.StdEncoding.EncodeToString(txn), addrs[0])
result := broadcastCommit(base64.StdEncoding.EncodeToString(txn),
base64.StdEncoding.EncodeToString(signed),
signer)
fmt.Println(result)
}
func prepareRedeem(address, btcAddress string, amount int64) ([]byte, string) {
params := map[string]interface{}{
"address": address,
"addressBTC": btcAddress,
"amount": amount,
"feesBTC": 500,
"gasPrice": map[string]interface{}{
"currency": "OLT",
"value": "1000000000",
},
"gas": 400000,
}
resp, err := makeRPCcall("btc.PrepareRedeem", params)
if err != nil {
panic(err)
}
txnHex, _ := resp.Result["rawTx"].(string)
txn, err := base64.StdEncoding.DecodeString(txnHex)
if err != nil {
panic(err)
}
tracker_name, _ := resp.Result["trackerName"].(string)
if len(txn) == 0 ||
tracker_name == "" {
panic("prepareLock failed")
}
return txn, tracker_name
}
func sign(rawTx, address string) ([]byte, interface{}) {
resp, err := makeRPCcall("owner.SignWithAddress",
map[string]interface{}{
"rawTx": rawTx,
"address": address,
})
if err != nil {
panic(err)
}
signature, ok := resp.Result["signature"].(map[string]interface{})
if !ok {
fmt.Println(resp.Result)
panic("failed to get signature")
}
signedStr := signature["Signed"].(string)
signed, err := base64.StdEncoding.DecodeString(signedStr)
if err != nil {
panic(err)
}
signerStr := signature["Signer"]
return signed, signerStr
}
func broadcastCommit(rawTx, signature string, pubKey interface{}) map[string]interface{} {
resp, err := makeRPCcall("broadcast.TxCommit",
map[string]interface{}{
"rawTx": rawTx,
"signature": signature,
"publicKey": pubKey,
})
if err != nil {
panic(err)
}
return resp.Result
}
func addressess() []string {
resp, err := makeRPCcall("owner.ListAccountAddresses", map[string]interface{}{})
if err != nil {
panic(err)
}
add, ok := resp.Result["addresses"].([]interface{})
if !ok {
panic("failed to get address")
}
strs := []string{}
for i := range add {
strs = append(strs, add[i].(string))
}
return strs
}