Skip to content

Commit 9e00678

Browse files
committed
init
0 parents  commit 9e00678

19 files changed

+1177
-0
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
main.go
2+
test-keyfile.json

README.md

+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# goar
2+
3+
### Install
4+
5+
```
6+
go get github.com/everFinance/goar
7+
```
8+
9+
### Example
10+
11+
Send winston
12+
13+
```golang
14+
package main
15+
16+
import (
17+
"fmt"
18+
"math/big"
19+
20+
"github.com/everFinance/goar/types"
21+
"github.com/everFinance/goar/wallet"
22+
)
23+
24+
func main() {
25+
wallet, err := wallet.NewFromPath("./test-keyfile.json")
26+
if err != nil {
27+
panic(err)
28+
}
29+
30+
id, stat, err := wallet.SendWinston(
31+
big.NewInt(1),
32+
{{target}}, // target address
33+
[]types.Tag{
34+
types.Tag{
35+
Name: "testSendWinston",
36+
Value: "1",
37+
},
38+
},
39+
)
40+
41+
fmt.Println(id, stat, err) // {{id}}, Pending, nil
42+
}
43+
44+
```
45+
46+
Send Data
47+
48+
```golang
49+
package main
50+
51+
import (
52+
"fmt"
53+
54+
"github.com/everFinance/goar/types"
55+
"github.com/everFinance/goar/wallet"
56+
)
57+
58+
func main() {
59+
wallet, err := wallet.NewFromPath("./test-keyfile.json")
60+
if err != nil {
61+
panic(err)
62+
}
63+
64+
id, stat, err := wallet.SendData(
65+
[]byte("123"),
66+
[]types.Tag{
67+
types.Tag{
68+
Name: "testSendData",
69+
Value: "123",
70+
},
71+
},
72+
)
73+
74+
fmt.Println(id, stat, err) // {{id}}, Pending, nil
75+
}
76+
```

client/client.go

+189
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
package client
2+
3+
import (
4+
"bytes"
5+
"encoding/json"
6+
"fmt"
7+
"io/ioutil"
8+
"net/http"
9+
"net/url"
10+
"path"
11+
"strconv"
12+
13+
"github.com/everFinance/goar/types"
14+
)
15+
16+
type Client struct {
17+
client *http.Client
18+
url string
19+
}
20+
21+
func New(url string) *Client {
22+
return &Client{client: http.DefaultClient, url: url}
23+
}
24+
25+
func (c *Client) GetInfo() (info *types.NetworkInfo, err error) {
26+
body, _, err := c.httpGet("info")
27+
if err != nil {
28+
return
29+
}
30+
31+
info = &types.NetworkInfo{}
32+
err = json.Unmarshal(body, info)
33+
return
34+
}
35+
36+
// Transaction
37+
// status: Pending/Invalid hash/overspend
38+
func (c *Client) GetTransactionByID(id string) (tx *types.Transaction, status string, err error) {
39+
body, statusCode, err := c.httpGet(fmt.Sprintf("tx/%s", id))
40+
if err != nil {
41+
return
42+
}
43+
44+
if statusCode != 200 {
45+
status = string(body)
46+
return
47+
}
48+
49+
tx = &types.Transaction{}
50+
err = json.Unmarshal(body, tx)
51+
return
52+
}
53+
54+
func (c *Client) GetTransactionField(id string, field string) (f string, err error) {
55+
// TODO
56+
return
57+
}
58+
59+
func (c *Client) GetTransactionData(id string, extension string) (body []byte, err error) {
60+
url := fmt.Sprintf("tx/%v/%v", id, "data")
61+
if extension != "" {
62+
url = url + "." + extension
63+
}
64+
65+
body, statusCode, err := c.httpGet(url)
66+
if statusCode != 200 {
67+
err = fmt.Errorf("not found data")
68+
}
69+
70+
return
71+
}
72+
73+
func (c *Client) GetTransactionPrice(data []byte, target *string) (reward int64, err error) {
74+
url := fmt.Sprintf("price/%d", len(data))
75+
if target != nil {
76+
url = fmt.Sprintf("%v/%v", url, *target)
77+
}
78+
79+
body, _, err := c.httpGet(url)
80+
if err != nil {
81+
return
82+
}
83+
84+
return strconv.ParseInt(string(body), 10, 64)
85+
}
86+
87+
func (c *Client) GetTransactionAnchor() (anchor string, err error) {
88+
body, _, err := c.httpGet("tx_anchor")
89+
if err != nil {
90+
return
91+
}
92+
93+
anchor = string(body)
94+
return
95+
}
96+
97+
func (c *Client) SubmitTransaction(tx *types.Transaction) (status string, err error) {
98+
by, err := json.Marshal(tx)
99+
if err != nil {
100+
return
101+
}
102+
103+
body, _, err := c.httpPost("tx", by)
104+
status = string(body)
105+
return
106+
}
107+
108+
func (c *Client) Arql(arql string) (ids []string, err error) {
109+
body, _, err := c.httpPost("arql", []byte(arql))
110+
err = json.Unmarshal(body, &ids)
111+
return
112+
}
113+
114+
// Wallet
115+
func (c *Client) GetWalletBalance(address string) (amount string, err error) {
116+
// TODO
117+
return
118+
}
119+
120+
func (c *Client) GetLastTransactionID(address string) (id string, err error) {
121+
body, _, err := c.httpGet(fmt.Sprintf("wallet/%s/last_tx", address))
122+
if err != nil {
123+
return
124+
}
125+
126+
id = string(body)
127+
return
128+
}
129+
130+
// Block
131+
func (c *Client) GetBlockByID(id string) (block *types.Block, err error) {
132+
body, _, err := c.httpGet(fmt.Sprintf("block/hash/%s", id))
133+
if err != nil {
134+
return
135+
}
136+
137+
block = &types.Block{}
138+
err = json.Unmarshal(body, block)
139+
return
140+
}
141+
142+
func (c *Client) GetBlockByHeight(height int64) (block *types.Block, err error) {
143+
body, _, err := c.httpGet(fmt.Sprintf("block/height/%d", height))
144+
if err != nil {
145+
return
146+
}
147+
148+
block = &types.Block{}
149+
err = json.Unmarshal(body, block)
150+
return
151+
}
152+
153+
func (c *Client) httpGet(_path string) (body []byte, statusCode int, err error) {
154+
u, err := url.Parse(c.url)
155+
if err != nil {
156+
return
157+
}
158+
159+
u.Path = path.Join(u.Path, _path)
160+
161+
resp, err := c.client.Get(u.String())
162+
if err != nil {
163+
return
164+
}
165+
defer resp.Body.Close()
166+
167+
statusCode = resp.StatusCode
168+
body, err = ioutil.ReadAll(resp.Body)
169+
return
170+
}
171+
172+
func (c *Client) httpPost(_path string, payload []byte) (body []byte, statusCode int, err error) {
173+
u, err := url.Parse(c.url)
174+
if err != nil {
175+
return
176+
}
177+
178+
u.Path = path.Join(u.Path, _path)
179+
180+
resp, err := c.client.Post(u.String(), "application/json", bytes.NewReader(payload))
181+
if err != nil {
182+
return
183+
}
184+
defer resp.Body.Close()
185+
186+
statusCode = resp.StatusCode
187+
body, err = ioutil.ReadAll(resp.Body)
188+
return
189+
}

client/client_test.go

+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package client
2+
3+
// import (
4+
// "fmt"
5+
// "testing"
6+
7+
// "github.com/everFinance/goar/types"
8+
// "github.com/stretchr/testify/assert"
9+
// )
10+
11+
// func TestGetTransactionByID(t *testing.T) {
12+
// client := New("https://arweave.net")
13+
// fmt.Println(client.GetTransactionByID("FgcKlptyDXSgEonYfy5cNBimq7GJ4h8h6L6pxuuYOBc"))
14+
// }
15+
16+
// func TestGetTransactionPrice(t *testing.T) {
17+
// client := New("https://arweave.net")
18+
// target := ""
19+
// reward, err := client.GetTransactionPrice([]byte("123"), &target)
20+
// assert.NoError(t, err)
21+
// fmt.Println(reward)
22+
// }
23+
24+
// func TestGetLastTransactionID(t *testing.T) {
25+
// client := New("https://arweave.net")
26+
// lastTx, err := client.GetLastTransactionID("dQzTM9hXV5MD1fRniOKI3MvPF_-8b2XDLmpfcMN9hi8")
27+
// assert.NoError(t, err)
28+
// fmt.Println(lastTx)
29+
// }
30+
31+
// func TestGetTransactionAnchor(t *testing.T) {
32+
// client := New("https://arweave.net")
33+
// fmt.Println(client.GetTransactionAnchor())
34+
// }
35+
36+
// func TestSubmitTransaction(t *testing.T) {
37+
// client := New("https://arweave.net")
38+
// fmt.Println(
39+
// client.SubmitTransaction(&types.Transaction{
40+
// ID: "n1iKT3trKn6Uvd1d8XyOqKBy8r-8SSBtGA62m3puK5k",
41+
// }),
42+
// )
43+
// }
44+
45+
// func TestArql(t *testing.T) {
46+
// client := New("https://arweave.net")
47+
// fmt.Println(
48+
// client.Arql(`
49+
// {
50+
// "op": "and",
51+
// "expr1": {
52+
// "op": "equals",
53+
// "expr1": "TokenSymbol",
54+
// "expr2": "ROL"
55+
// },
56+
// "expr2": {
57+
// "op": "equals",
58+
// "expr1": "CreatedBy",
59+
// "expr2": "dQzTM9hXV5MD1fRniOKI3MvPF_-8b2XDLmpfcMN9hi8"
60+
// }
61+
// }
62+
// `),
63+
// )
64+
// }

go.mod

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
module github.com/everFinance/goar
2+
3+
go 1.14
4+
5+
require github.com/stretchr/testify v1.6.1
6+
require github.com/everFinance/gojwk v1.0.0

go.sum

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
2+
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3+
github.com/everFinance/gojwk v1.0.0 h1:le/oI2NgXlrqg3MHU6ka+V30EWcD7TD6+Ilh+go7924=
4+
github.com/everFinance/gojwk v1.0.0/go.mod h1:icXSXsIdpAczlpAtSljQlmABkMTRZENr73KHmo0GOGc=
5+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
6+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
7+
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
8+
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
9+
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
10+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
11+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
12+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

0 commit comments

Comments
 (0)