Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using Cysharp.Threading.Tasks;
- using Solana.Unity.SDK;
- using Solana.Unity.SDK.Nft;
- using UnityEngine;
- public class BalanceHandler : MonoBehaviour
- {
- public static Action<double> OnBalanceChanged;
- public static Action<string,decimal> OnUpdatedToken;
- private bool isLoadingTokens;
- private Dictionary<string, decimal> balance = new ();
- private void OnEnable()
- {
- Web3.OnBalanceChange += AlertBalanceChange;
- }
- private void OnDisable()
- {
- Web3.OnBalanceChange -= AlertBalanceChange;
- }
- private void AlertBalanceChange(double _newBalance)
- {
- MainThreadDispatcher.Instance().Enqueue(() =>
- {
- OnBalanceChanged?.Invoke(_newBalance);
- });
- ForceUpdate();
- }
- public void ForceUpdate()
- {
- Web3.UpdateBalance().Forget();
- GetOwnedTokenAccounts().AsAsyncUnitUniTask().Forget();
- }
- private async UniTask GetOwnedTokenAccounts()
- {
- if (isLoadingTokens) return;
- isLoadingTokens = true;
- var _tokens = await Web3.Wallet.GetTokenAccounts();
- if (_tokens == null) return;
- List<UniTask> _loadingTasks = new List<UniTask>();
- if (_tokens is { Length: > 0 })
- {
- var _tokenAccounts = _tokens.OrderByDescending(_tk => _tk.Account.Data.Parsed.Info.TokenAmount.AmountUlong);
- foreach (var _item in _tokenAccounts)
- {
- if (!(_item.Account.Data.Parsed.Info.TokenAmount.AmountUlong > 0)) break;
- var _loadTask = Nft.TryGetNftData(_item.Account.Data.Parsed.Info.Mint,
- Web3.Instance.WalletBase.ActiveRpcClient).AsUniTask();
- _loadingTasks.Add(_loadTask);
- _loadTask.ContinueWith(_nft =>
- {
- string _name = _nft.metaplexData.data.metadata.name;
- decimal _value = _item.Account.Data.Parsed.Info.TokenAmount.AmountDecimal;
- OnUpdatedToken?.Invoke(_name,_value);
- if (balance.ContainsKey(_name))
- {
- balance[_name] = _value;
- }
- else
- {
- balance.Add(_name,_value);
- }
- }).Forget();
- }
- }
- await UniTask.WhenAll(_loadingTasks);
- isLoadingTokens = false;
- }
- public decimal GetBalance(string _key)
- {
- return balance.ContainsKey(_key) ? balance[_key] : 0;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement