首頁 >後端開發 >Golang >solana 取得錢包token餘額,及優化

solana 取得錢包token餘額,及優化

Barbara Streisand
Barbara Streisand原創
2024-12-26 12:39:10919瀏覽

solana 获取钱包token余额,及优化

這幾天練習使用golang呼叫solana合約,切換一門語言,感覺不那麼輕鬆,搞evm的時候,有ethereum的程式碼是go實現的,感覺golang 像是evm第一語言。
早上的時候,看群友提問

需求
1.想判斷solana地址是否合法
2.想判斷合法地址下,是否持有三個token中的任一個,即balance > 1

剛好做練習,所以簡單寫寫,想法如下:
用錢包位址和token位址算token的帳號位址,再呼叫GetTokenAccountBalance

lokey :=solana.MustPublicKeyFromBase58("HgJ5zad5N4pwKpAM8HQDA3g2r2H7EMLVN6S5HvHdiNyR") //钱包地址
tokenmint := solana.MustPublicKeyFromBase58("J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn") //token 地址
tokenacc, _, _ := solana.FindAssociatedTokenAddress(lokey, tokenmint) //算出token账号地址
outtbl, err = client.GetTokenAccountBalance(context.Background(), tokenacc,rpc.CommitmentFinalized)

後面群友提出更有效率的方案:

可以用 rpc getMultipleAccounts 一次請求幾百個token賬戶,批量拿幾次應該就夠了,降低helius rpc的額度消耗,同時性能也好

相對來說群友這個方法比較好,畢竟helius的rpc都是有限額的,一條能搞定,就不要搞3條

這個思路上有一點點差異,這個是獲取的帳號數據,所以代碼這麼寫:

//获取token 账号代码和前面一样
out, _ := client.GetMultipleAccounts(context.Background(), lokey, tokenacc, tokenacc2, tokenacc3, tokenacc4)
for _, ov := range out.Value {
    if ov != nil {
    if ov.Owner.String() == "11111111111111111111111111111111" { 
            log.Debugf("acc %s,bl %d", ov.Owner.String(), ov.Lamports)
    } else {
            var ta token.Account
            err = bin.NewBinDecoder(ov.Data.GetBinary()).Decode(&ta)
            log.Debugf("acc %s,bl %d", ta.Owner.String(), ta.Amount)
    }
    }
}

我就隨便發發,做做筆記,歡迎交流。

以上是solana 取得錢包token餘額,及優化的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn