-
-
Notifications
You must be signed in to change notification settings - Fork 9
/
block.go
213 lines (191 loc) · 8.15 KB
/
block.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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
package blockchair
import (
"strings"
)
// DataBlock includes full server response to block request.
type DataBlock struct {
Data map[string]DataInfo `json:"data,omitempty"`
Context Context `json:"context"`
}
// DataBlockEth includes full server response to block request for Ethereum.
type DataBlockEth struct {
Data map[string]DataInfoEth `json:"data,omitempty"`
Context Context `json:"context"`
}
// DataInfoEth describes the outer structure of the block for Ethereum.
type DataInfoEth struct {
Block BlockEth `json:"block"`
Uncles []string `json:"uncles,omitempty"`
Transactions []string `json:"transactions,omitempty"`
SyntheticTransactions []float32 `json:"synthetic_transactions"`
}
// DataInfo describes the outer structure of the block.
type DataInfo struct {
Block Block `json:"block"`
Transactions []string `json:"transactions"`
}
// Block the structure of one specific Bitcoin-like block.
type Block struct {
ID int `json:"id"`
Hash string `json:"hash"`
Date string `json:"date"`
Time string `json:"time"`
MedianTime string `json:"median_time"`
Size int `json:"size"`
StrippedSize int `json:"stripped_size"`
Weight int `json:"weight"`
Version int `json:"version"`
VersionHex string `json:"version_hex"`
VersionBits string `json:"version_bits"`
MerkleRoot string `json:"merkle_root"`
Nonce int `json:"nonce"`
Bits int `json:"bits"`
Difficulty float32 `json:"difficulty"`
Chainwork string `json:"chainwork"`
CoinbaseDataHex string `json:"coinbase_data_hex"`
TransactionCount int `json:"transaction_count"`
WitnessCount int `json:"witness_count"`
InputCount int `json:"input_count"`
OutputCount int `json:"output_count"`
InputTotal int `json:"input_total"`
InputTotalUsd float32 `json:"input_total_usd"`
OutputTotal int `json:"output_total"`
OutputTotalUsd float32 `json:"output_total_usd"`
FeeTotal int `json:"fee_total"`
FeeTotalUsd float32 `json:"fee_total_usd"`
FeePerKb float32 `json:"fee_per_kb"`
FeePerKbUsd float32 `json:"fee_per_kb_usd"`
FeePerKwu float32 `json:"fee_per_kwu"`
FeePerKwuUsd float32 `json:"fee_per_kwu_usd"`
CddTotal float32 `json:"cdd_total"`
Generation int `json:"generation"`
GenerationUsd float32 `json:"generation_usd"`
Reward int `json:"reward"`
RewardUsd float32 `json:"reward_usd"`
GuessedMiner string `json:"guessed_miner"`
}
// BlockEth the structure of one specific Ethereum block.
type BlockEth struct {
ID int `json:"id"`
Hash string `json:"hash"`
Date string `json:"date"`
Time string `json:"time"`
Size int `json:"size"`
Miner string `json:"miner"`
ExtraDataHex string `json:"extra_data_hex"`
Difficulty float32 `json:"difficulty"`
GasUsed int `json:"gas_used"`
GasLimit int `json:"gas_limit"`
BaseFeePerGas float32 `json:"base_fee_per_gas,omitempty"`
LogsBloom string `json:"logs_bloom"`
MixHash string `json:"mix_hash"`
Nonce string `json:"nonce"`
ReceiptsRoot string `json:"receipts_root"`
Sha3Uncles string `json:"sha3_uncles"`
StateRoot string `json:"state_root"`
TotalDifficulty string `json:"total_difficulty"`
TransactionsRoot string `json:"transactions_root"`
UncleCount int `json:"uncle_count"`
TransactionCount int `json:"transaction_count"`
SyntheticTransactionCount int `json:"synthetic_transaction_count"`
CallCount int `json:"call_count"`
SyntheticCallCount int `json:"synthetic_call_count"`
ValueTotal string `json:"value_total"`
ValueTotalUsd float32 `json:"value_total_usd"`
InternalValueTotal string `json:"internal_value_total"`
InternalValueTotalUsd float32 `json:"internal_value_total_usd"`
Generation string `json:"generation"`
GenerationUsd float32 `json:"generation_usd"`
UncleGeneration string `json:"uncle_generation"`
UncleGenerationUsd float32 `json:"uncle_generation_usd"`
FeeTotal string `json:"fee_total"`
FeeTotalUsd float32 `json:"fee_total_usd"`
BurnedTotal string `json:"burned_total,omitempty"`
Reward string `json:"reward"`
RewardUsd float32 `json:"reward_usd"`
}
// Context common context for all requests
type Context struct {
Code int `json:"code"`
Source string `json:"source"`
Limit int `json:"limit"`
Offset int `json:"offset"`
Results int `json:"results"`
State int `json:"state"`
MarketPriceUsd float64 `json:"market_price_usd"`
Cache *Cache `json:"cache"`
API *API `json:"api"`
Server string `json:"server"`
Time float32 `json:"time"`
RenderTime float32 `json:"render_time"`
FullTime float32 `json:"full_time"`
RequestCost float32 `json:"request_cost"`
}
// Cache common cache for all requests
type Cache struct {
Live bool `json:"live"`
Duration int `json:"duration"`
Since string `json:"since"`
Until string `json:"until"`
Time float32 `json:"time,omitempty"`
}
// API common API for all requests
type API struct {
Version string `json:"version"`
LastMajorUpdate string `json:"last_major_update"`
NextMajorUpdate string `json:"next_major_update,omitempty"`
Documentation string `json:"documentation"`
Notice string `json:"notice"`
}
// GetBlock fetch a Bitcoin-like block.
func (c *Client) GetBlock(crypto string, blockID string) (*DataBlock, error) {
return c.GetBlockAdv(crypto, blockID, nil)
}
// GetBlockAdv fetch a Bitcoin-like block with options.
func (c *Client) GetBlockAdv(crypto string, blockID string, options map[string]string) (resp *DataBlock, e error) {
if e = c.ValidateCrypto(crypto); e != nil {
return
}
resp = &DataBlock{}
var path = crypto + "/dashboards/block/" + blockID
return resp, c.LoadResponse(path, resp, options)
}
// GetBlocks fetches multiple Bitcoin-like blocks.
func (c *Client) GetBlocks(crypto string, blockIDs []string) (*DataBlock, error) {
return c.GetBlocksAdv(crypto, blockIDs, nil)
}
// GetBlocksAdv fetches multiple Bitcoin-like blocks with options
func (c *Client) GetBlocksAdv(crypto string, blockIDs []string, options map[string]string) (resp *DataBlock, e error) {
if e = c.ValidateCrypto(crypto); e != nil {
return
}
resp = &DataBlock{}
var path = crypto + "/dashboards/blocks/" + strings.Join(blockIDs, ",")
return resp, c.LoadResponse(path, resp, options)
}
// GetBlockEth fetch an Ethereum block.
func (c *Client) GetBlockEth(crypto string, blockID string) (*DataBlockEth, error) {
return c.GetBlockEthAdv(crypto, blockID, nil)
}
// GetBlockEthAdv fetch an Ethereum block with options.
func (c *Client) GetBlockEthAdv(crypto string, blockID string, options map[string]string) (resp *DataBlockEth, e error) {
if e = c.ValidateCryptoEth(crypto); e != nil {
return
}
resp = &DataBlockEth{}
var path = crypto + "/dashboards/block/" + blockID
return resp, c.LoadResponse(path, resp, options)
}
// GetBlocksEth fetches multiple Ethereum blocks.
func (c *Client) GetBlocksEth(crypto string, blockIDs []string) (*DataBlockEth, error) {
return c.GetBlocksEthAdv(crypto, blockIDs, nil)
}
// GetBlocksEthAdv fetches multiple Ethereum blocks with options.
func (c *Client) GetBlocksEthAdv(crypto string, blockIDs []string, options map[string]string) (resp *DataBlockEth, e error) {
if e = c.ValidateCryptoEth(crypto); e != nil {
return
}
resp = &DataBlockEth{}
var path = crypto + "/dashboards/blocks/" + strings.Join(blockIDs, ",")
return resp, c.LoadResponse(path, resp, options)
}