Skip to content

Commit ee06127

Browse files
add a price for the Beetroot jetton
1 parent 5df4c64 commit ee06127

File tree

1 file changed

+43
-1
lines changed

1 file changed

+43
-1
lines changed

pkg/rates/sources.go

+43-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ func (m *Mock) GetCurrentRates() (map[string]float64, error) {
1818
const (
1919
tonstakers string = "tonstakers"
2020
bemo string = "bemo"
21+
beetroot string = "beetroot"
2122
slpTokens string = "slp_tokens"
2223
)
2324

@@ -58,7 +59,11 @@ func (m *Mock) GetCurrentRates() (map[string]float64, error) {
5859
pools[account] = price
5960
}
6061
}
61-
pools = m.updatePools(pools)
62+
if beetRootPrice, err := retry(beetroot, medianTonPriceToUsd, pools, m.getBeetrootPrice); err == nil {
63+
for account, price := range beetRootPrice {
64+
pools[account] = price
65+
}
66+
}
6267
if slpTokensPrice, err := retry(slpTokens, medianTonPriceToUsd, pools, m.getSlpTokensPrice); err == nil {
6368
for account, price := range slpTokensPrice {
6469
pools[account] = price
@@ -221,3 +226,40 @@ func (m *Mock) getSlpTokensPrice(tonPrice float64, pools map[ton.AccountID]float
221226

222227
return accountsPrice, nil
223228
}
229+
230+
func (m *Mock) getBeetrootPrice(tonPrice float64, pools map[ton.AccountID]float64) (map[tongo.AccountID]float64, error) {
231+
if tonPrice == 0 {
232+
return map[ton.AccountID]float64{}, fmt.Errorf("unknown TON price")
233+
}
234+
var beetRootContract = ton.MustParseAccountID("EQDC8MY5tY5rPM6KFFxz58fMUES6qSsFxi_Pbaig1QuO3F7y")
235+
var beetRootAccount = ton.MustParseAccountID("EQAFGhmx199oH6kmL78PGBHyAx4d5CiJdfXwSjDK5F5IFyfC")
236+
url := fmt.Sprintf("https://tonapi.io/v2/blockchain/accounts/%v/methods/get_price_data", beetRootContract)
237+
respBody, err := sendRequest(url, m.TonApiToken)
238+
if err != nil {
239+
return map[ton.AccountID]float64{}, err
240+
}
241+
defer respBody.Close()
242+
type data struct {
243+
Success bool `json:"success"`
244+
Stack []struct {
245+
Num string `json:"num"`
246+
} `json:"stack"`
247+
}
248+
var result data
249+
if err = json.NewDecoder(respBody).Decode(&result); err != nil {
250+
return map[ton.AccountID]float64{}, fmt.Errorf("[getBeetrootPrice] failed to decode response: %v", err)
251+
}
252+
if !result.Success {
253+
return map[ton.AccountID]float64{}, fmt.Errorf("not success")
254+
}
255+
if len(result.Stack) == 0 {
256+
return map[ton.AccountID]float64{}, fmt.Errorf("empty stack")
257+
}
258+
num, err := strconv.ParseInt(result.Stack[0].Num, 0, 64)
259+
if err != nil {
260+
return map[tongo.AccountID]float64{}, err
261+
}
262+
usdPrice := float64(num) / 100
263+
price := usdPrice / tonPrice
264+
return map[ton.AccountID]float64{beetRootAccount: price}, nil
265+
}

0 commit comments

Comments
 (0)