Home >Backend Development >Golang >solana obtains wallet token balance and optimizes it

solana obtains wallet token balance and optimizes it

Barbara Streisand
Barbara StreisandOriginal
2024-12-26 12:39:10924browse

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

In the past few days, I have been practicing using golang to call solana contracts and switching languages. It feels not so easy. When doing evm, some ethereum codes are implemented in go. It feels like golang evm first language.
In the morning, I read the questions asked by the group

Requirements
1. Want to determine whether Solana’s address is legitimate
2. Want to determine whether the legal address holds any one of the three tokens, that is, balance > 1

I just happened to be doing some exercises, so I will write briefly. The idea is as follows:
Use the wallet address and token address to calculate the token's account address, and then call 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)

The following group members proposed a more efficient solution:

You can use rpc getMultipleAccounts to request hundreds of token accounts at a time. A few times in batches should be enough, which reduces the quota consumption of helius rpc and has good performance

Relatively speaking, the method of group friends is better. After all, Helius’s RPCs have quotas. If you can handle one, don’t do three

There is a little difference in this idea. This is the account data obtained, so the code is written like this:

//获取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)
    }
    }
}

I will just post it and take notes. Welcome to communicate.

The above is the detailed content of solana obtains wallet token balance and optimizes it. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn