Skip to content

Commit e82adb4

Browse files
TzKT events
1 parent 48b2245 commit e82adb4

File tree

9 files changed

+166
-49
lines changed

9 files changed

+166
-49
lines changed

README.md

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -117,14 +117,20 @@ Read more about events and SignalR in the [doc](https://github.com/dipdup-net/go
117117
package main
118118

119119
import (
120+
"context"
120121
"log"
121122

123+
"github.com/dipdup-net/go-lib/tzkt/data"
122124
"github.com/dipdup-net/go-lib/tzkt/events"
123125
)
124126

125127
func main() {
126-
tzkt := events.NewTzKT(events.BaseURL)
127-
if err := tzkt.Connect(); err != nil {
128+
tzkt := events.NewTzKT(data.BaseEventsURL)
129+
130+
ctx, cancel := context.WithCancel(context.Background())
131+
defer cancel()
132+
133+
if err := tzkt.Connect(ctx); err != nil {
128134
log.Panic(err)
129135
}
130136
defer tzkt.Close()
@@ -137,6 +143,10 @@ func main() {
137143
panic(err)
138144
}
139145

146+
if err := tzkt.SubscribeToCycles(2); err != nil {
147+
panic(err)
148+
}
149+
140150
if err := tzkt.SubscribeToAccounts("KT1K4EwTpbvYN9agJdjpyJm4ZZdhpUNKB3F6"); err != nil {
141151
panic(err)
142152
}
@@ -145,7 +155,15 @@ func main() {
145155
panic(err)
146156
}
147157

148-
if err := tzkt.SubscribeToOperations("KT1K4EwTpbvYN9agJdjpyJm4ZZdhpUNKB3F6", events.KindTransaction); err != nil {
158+
if err := tzkt.SubscribeToOperations("KT1K4EwTpbvYN9agJdjpyJm4ZZdhpUNKB3F6", data.KindTransaction); err != nil {
159+
panic(err)
160+
}
161+
162+
if err := tzkt.SubscribeToTokenTransfers("", "", ""); err != nil {
163+
panic(err)
164+
}
165+
166+
if err := tzkt.SubscribeToTokenBalances("", "", ""); err != nil {
149167
panic(err)
150168
}
151169

@@ -155,28 +173,40 @@ func main() {
155173

156174
switch msg.Channel {
157175
case events.ChannelAccounts:
158-
items := msg.Body.([]events.Account)
176+
items := msg.Body.([]data.Account)
159177
for _, item := range items {
160178
log.Println(item)
161179
}
162180
case events.ChannelBigMap:
163-
items := msg.Body.([]events.BigMapUpdate)
181+
items := msg.Body.([]data.BigMapUpdate)
164182
for _, item := range items {
165183
log.Println(item)
166184
}
167185
case events.ChannelBlocks:
168-
items := msg.Body.([]events.Block)
186+
items := msg.Body.([]data.Block)
169187
for _, item := range items {
170188
log.Println(item)
171189
}
172190
case events.ChannelHead:
173-
head := msg.Body.(events.Head)
191+
head := msg.Body.(data.Head)
174192
log.Println(head)
175193
case events.ChannelOperations:
176-
items := msg.Body.([]interface{})
194+
items := msg.Body.([]any)
195+
for _, item := range items {
196+
log.Println(item.(*data.Transaction))
197+
}
198+
case events.ChannelTokenBalances:
199+
items := msg.Body.([]data.TokenBalance)
177200
for _, item := range items {
178-
log.Println(item.(*events.Transaction))
201+
log.Println(item)
202+
}
203+
case events.ChannelTransfers:
204+
items := msg.Body.([]data.Transfer)
205+
for _, item := range items {
206+
log.Println(item)
179207
}
208+
case events.ChannelCycles:
209+
log.Println(msg.Body.(data.Cycle))
180210
}
181211

182212
case events.MessageTypeReorg:

go.mod

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ require (
1818
github.com/stretchr/testify v1.7.0
1919
github.com/tidwall/gjson v1.12.1
2020
github.com/yhirose/go-peg v0.0.0-20210804202551-de25d6753cf1
21-
golang.org/x/crypto v0.0.0-20211202192323-5770296d904e
22-
golang.org/x/text v0.3.7
21+
golang.org/x/crypto v0.5.0
22+
golang.org/x/text v0.6.0
2323
gopkg.in/yaml.v3 v3.0.0
2424
gorm.io/driver/mysql v1.2.1
2525
gorm.io/driver/postgres v1.2.3
@@ -62,7 +62,7 @@ require (
6262
github.com/vmihailenco/msgpack/v5 v5.3.4 // indirect
6363
github.com/vmihailenco/tagparser v0.1.2 // indirect
6464
github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
65-
golang.org/x/sys v0.0.0-20211205182925-97ca703d548d // indirect
65+
golang.org/x/sys v0.4.0 // indirect
6666
google.golang.org/protobuf v1.26.0-rc.1 // indirect
67-
mellium.im/sasl v0.2.1 // indirect
67+
mellium.im/sasl v0.3.1 // indirect
6868
)

go.sum

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -299,8 +299,8 @@ golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWP
299299
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
300300
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
301301
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
302-
golang.org/x/crypto v0.0.0-20211202192323-5770296d904e h1:MUP6MR3rJ7Gk9LEia0LP2ytiH6MuCfs7qYz+47jGdD8=
303-
golang.org/x/crypto v0.0.0-20211202192323-5770296d904e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
302+
golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE=
303+
golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU=
304304
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
305305
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
306306
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
@@ -325,7 +325,7 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R
325325
golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
326326
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
327327
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
328-
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE=
328+
golang.org/x/net v0.5.0 h1:GyT4nK/YDHSqa1c4753ouYCDajOYKTja9Xb/OHtgvSw=
329329
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
330330
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
331331
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -365,17 +365,18 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc
365365
golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
366366
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
367367
golang.org/x/sys v0.0.0-20210923061019-b8560ed6a9b7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
368-
golang.org/x/sys v0.0.0-20211205182925-97ca703d548d h1:FjkYO/PPp4Wi0EAUOVLxePm7qVW4r4ctbWpURyuOD0E=
369-
golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
368+
golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18=
369+
golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
370370
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
371371
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
372372
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
373373
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
374374
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
375375
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
376376
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
377-
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
378377
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
378+
golang.org/x/text v0.6.0 h1:3XmdazWV+ubf7QgHSTWeykHOci5oeekaGJBLkrkaw4k=
379+
golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
379380
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
380381
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
381382
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
@@ -449,5 +450,6 @@ gorm.io/gorm v1.22.4/go.mod h1:1aeVC+pe9ZmvKZban/gW4QPra7PRoTEssyc922qCAkk=
449450
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
450451
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
451452
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
452-
mellium.im/sasl v0.2.1 h1:nspKSRg7/SyO0cRGY71OkfHab8tf9kCts6a6oTDut0w=
453453
mellium.im/sasl v0.2.1/go.mod h1:ROaEDLQNuf9vjKqE1SrAfnsobm2YKXT1gnN1uDp1PjQ=
454+
mellium.im/sasl v0.3.1 h1:wE0LW6g7U83vhvxjC1IY8DnXM+EU095yeo8XClvCdfo=
455+
mellium.im/sasl v0.3.1/go.mod h1:xm59PUYpZHhgQ9ZqoJ5QaCqzWMi8IeS49dhp6plPCzw=

tzkt/data/cylce.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package data
2+
3+
import "time"
4+
5+
// Cycle -
6+
type Cycle struct {
7+
Index uint64 `json:"index"`
8+
FirstLevel uint64 `json:"firstLevel"`
9+
StartTime time.Time `json:"startTime"`
10+
LastLevel uint64 `json:"lastLevel"`
11+
EndTime time.Time `json:"endTime"`
12+
SnapshotIndex uint64 `json:"snapshotIndex"`
13+
SnapshotLevel uint64 `json:"snapshotLevel"`
14+
RandomSeed string `json:"randomSeed,omitempty"`
15+
TotalBakers uint64 `json:"totalBakers"`
16+
TotalStaking uint64 `json:"totalStaking"`
17+
TotalDelegators uint64 `json:"totalDelegators"`
18+
TotalDelegated uint64 `json:"totalDelegated"`
19+
SelectedBakers uint64 `json:"selectedBakers"`
20+
SelectedStake uint64 `json:"selectedStake"`
21+
Quote *Quote `json:"quote,omitempty"`
22+
TotalRolls uint64 `json:"totalRolls"`
23+
}

tzkt/data/general.go

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package data
22

33
import (
44
"encoding/json"
5-
stdJSON "encoding/json"
65
"time"
76
)
87

@@ -65,25 +64,6 @@ type Transfer struct {
6564
MigrationID *uint64 `json:"migrationId,omitempty"`
6665
}
6766

68-
// Token -
69-
type Token struct {
70-
ID uint64 `json:"id"`
71-
Contract Address `json:"contract"`
72-
TokenID string `json:"tokenId"`
73-
Standard string `json:"standard"`
74-
Metadata stdJSON.RawMessage `json:"metadata,omitempty"`
75-
FirstLevel uint64 `json:"firstLevel"`
76-
FirstTime time.Time `json:"firstTime"`
77-
LastLevel uint64 `json:"lastLevel"`
78-
LastTime time.Time `json:"lastTime"`
79-
TransfersCount uint64 `json:"transfersCount"`
80-
BalancesCount uint64 `json:"balancesCount"`
81-
HoldersCount uint64 `json:"holdersCount"`
82-
TotalMinted string `json:"totalMinted"`
83-
TotalBurned string `json:"totalBurned"`
84-
TotalSupply string `json:"totalSupply"`
85-
}
86-
8767
// Protocol -
8868
type Protocol struct {
8969
Code int64 `json:"code"`

tzkt/data/tokens.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package data
2+
3+
import (
4+
stdJSON "encoding/json"
5+
"time"
6+
)
7+
8+
// Token -
9+
type Token struct {
10+
ID uint64 `json:"id"`
11+
Contract Address `json:"contract"`
12+
TokenID string `json:"tokenId"`
13+
Standard string `json:"standard"`
14+
Metadata stdJSON.RawMessage `json:"metadata,omitempty"`
15+
FirstLevel uint64 `json:"firstLevel"`
16+
FirstTime time.Time `json:"firstTime"`
17+
LastLevel uint64 `json:"lastLevel"`
18+
LastTime time.Time `json:"lastTime"`
19+
TransfersCount uint64 `json:"transfersCount"`
20+
BalancesCount uint64 `json:"balancesCount"`
21+
HoldersCount uint64 `json:"holdersCount"`
22+
TotalMinted string `json:"totalMinted"`
23+
TotalBurned string `json:"totalBurned"`
24+
TotalSupply string `json:"totalSupply"`
25+
}
26+
27+
// TokenBalance -
28+
type TokenBalance struct {
29+
ID uint64 `json:"id"`
30+
Account *Address `json:"account,omitempty"`
31+
Token *Token `json:"token,omitempty"`
32+
Balance string `json:"balance,omitempty"`
33+
TransfersCount uint64 `json:"transfersCount"`
34+
FirstLevel uint64 `json:"firstLevel"`
35+
FirstTime time.Time `json:"firstTime"`
36+
LastLevel uint64 `json:"lastLevel"`
37+
LastTime time.Time `json:"lastTime"`
38+
}

tzkt/events/README.md

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ Golang library for TzKT events API
33

44
## Usage
55

6+
Full docs for TzKT API can be found [here](https://api.tzkt.io/).
67

78
### TzKT client
89

@@ -15,9 +16,13 @@ import events "github.com/dipdup-net/go-lib/tzkt/events"
1516
Then create `TzKT` client, connect to server and subscribe to channels.
1617

1718
```golang
18-
tzkt := events.NewTzKT(events.BaseURL)
19-
if err := tzkt.Connect(); err != nil {
20-
log.Panic(err)
19+
tzkt := events.NewTzKT(data.BaseEventsURL)
20+
21+
ctx, cancel := context.WithCancel(context.Background())
22+
defer cancel()
23+
24+
if err := tzkt.Connect(ctx); err != nil {
25+
log.Panic(err)
2126
}
2227
defer tzkt.Close()
2328

tzkt/events/consts.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,20 @@ const (
88
MethodBigMap = "SubscribeToBigMaps"
99
MethodAccounts = "SubscribeToAccounts"
1010
MethodTokenTransfers = "SubscribeToTokenTransfers"
11+
MethodTokenBalances = "SubscribeToTokenBalances"
12+
MethodCycles = "SubscribeToCycles"
1113
)
1214

1315
// Channels
1416
const (
15-
ChannelHead = "head"
16-
ChannelBlocks = "blocks"
17-
ChannelOperations = "operations"
18-
ChannelBigMap = "bigmaps"
19-
ChannelAccounts = "accounts"
20-
ChannelTransfers = "transfers"
17+
ChannelHead = "head"
18+
ChannelBlocks = "blocks"
19+
ChannelOperations = "operations"
20+
ChannelBigMap = "bigmaps"
21+
ChannelAccounts = "accounts"
22+
ChannelTransfers = "transfers"
23+
ChannelCycles = "cycles"
24+
ChannelTokenBalances = "token_balances"
2125
)
2226

2327
// Big map tags

tzkt/events/tzkt.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,33 @@ func (tzkt *TzKT) SubscribeToTokenTransfers(account, contract, tokenID string) e
144144
return tzkt.subscribe(MethodTokenTransfers, args)
145145
}
146146

147+
// SubscribeToTokenBalances - sends token balances when they are updated.
148+
func (tzkt *TzKT) SubscribeToTokenBalances(account, contract, tokenID string) error {
149+
args := make(map[string]interface{})
150+
if account != "" {
151+
args["account"] = account
152+
}
153+
if contract != "" {
154+
args["contract"] = contract
155+
}
156+
if tokenID != "" {
157+
args["tokenID"] = tokenID
158+
}
159+
return tzkt.subscribe(MethodTokenBalances, args)
160+
}
161+
162+
// SubscribeToCycles - notifies of the start of a new cycle with a specified delay.
163+
// delayBlocks is the number of blocks (2 by default) to delay a new cycle notification. It should be >= 2 (to not worry abour reorgs) and < cycle size
164+
func (tzkt *TzKT) SubscribeToCycles(delayBlocks uint64) error {
165+
if delayBlocks < 2 {
166+
return errors.Errorf("delayBocks should be >= 2: %d", delayBlocks)
167+
}
168+
args := map[string]any{
169+
"delayBocks": delayBlocks,
170+
}
171+
return tzkt.subscribe(MethodCycles, args)
172+
}
173+
147174
func (tzkt *TzKT) subscribe(channel string, args ...interface{}) error {
148175
tzkt.invokationID += 1
149176
msg := signalr.NewInvocation(fmt.Sprintf("%d", tzkt.invokationID), channel, args...)
@@ -243,6 +270,14 @@ func parseData(channel string, data []byte) (any, error) {
243270
var transfer []tzktData.Transfer
244271
err := json.Unmarshal(data, &transfer)
245272
return transfer, err
273+
case ChannelTokenBalances:
274+
var balances []tzktData.TokenBalance
275+
err := json.Unmarshal(data, &balances)
276+
return balances, err
277+
case ChannelCycles:
278+
var cycle tzktData.Cycle
279+
err := json.Unmarshal(data, &cycle)
280+
return cycle, err
246281
default:
247282
return nil, errors.Errorf("unknown channel: %s", channel)
248283
}

0 commit comments

Comments
 (0)