Advertisement
Learning000001

Untitled

Feb 27th, 2024
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.63 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Cysharp.Threading.Tasks;
  5. using Solana.Unity.SDK;
  6. using Solana.Unity.SDK.Nft;
  7. using UnityEngine;
  8.  
  9. public class BalanceHandler : MonoBehaviour
  10. {
  11. public static Action<double> OnBalanceChanged;
  12. public static Action<string,decimal> OnUpdatedToken;
  13.  
  14. private bool isLoadingTokens;
  15. private Dictionary<string, decimal> balance = new ();
  16.  
  17. private void OnEnable()
  18. {
  19. Web3.OnBalanceChange += AlertBalanceChange;
  20. }
  21.  
  22. private void OnDisable()
  23. {
  24. Web3.OnBalanceChange -= AlertBalanceChange;
  25. }
  26.  
  27. private void AlertBalanceChange(double _newBalance)
  28. {
  29. MainThreadDispatcher.Instance().Enqueue(() =>
  30. {
  31. OnBalanceChanged?.Invoke(_newBalance);
  32. });
  33. ForceUpdate();
  34. }
  35.  
  36. public void ForceUpdate()
  37. {
  38. Web3.UpdateBalance().Forget();
  39. GetOwnedTokenAccounts().AsAsyncUnitUniTask().Forget();
  40. }
  41.  
  42. private async UniTask GetOwnedTokenAccounts()
  43. {
  44. if (isLoadingTokens) return;
  45. isLoadingTokens = true;
  46. var _tokens = await Web3.Wallet.GetTokenAccounts();
  47. if (_tokens == null) return;
  48.  
  49. List<UniTask> _loadingTasks = new List<UniTask>();
  50. if (_tokens is { Length: > 0 })
  51. {
  52. var _tokenAccounts = _tokens.OrderByDescending(_tk => _tk.Account.Data.Parsed.Info.TokenAmount.AmountUlong);
  53. foreach (var _item in _tokenAccounts)
  54. {
  55. if (!(_item.Account.Data.Parsed.Info.TokenAmount.AmountUlong > 0)) break;
  56. var _loadTask = Nft.TryGetNftData(_item.Account.Data.Parsed.Info.Mint,
  57. Web3.Instance.WalletBase.ActiveRpcClient).AsUniTask();
  58. _loadingTasks.Add(_loadTask);
  59. _loadTask.ContinueWith(_nft =>
  60. {
  61. string _name = _nft.metaplexData.data.metadata.name;
  62. decimal _value = _item.Account.Data.Parsed.Info.TokenAmount.AmountDecimal;
  63. OnUpdatedToken?.Invoke(_name,_value);
  64. if (balance.ContainsKey(_name))
  65. {
  66. balance[_name] = _value;
  67. }
  68. else
  69. {
  70. balance.Add(_name,_value);
  71. }
  72. }).Forget();
  73. }
  74. }
  75.  
  76. await UniTask.WhenAll(_loadingTasks);
  77. isLoadingTokens = false;
  78. }
  79.  
  80. public decimal GetBalance(string _key)
  81. {
  82. return balance.ContainsKey(_key) ? balance[_key] : 0;
  83. }
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement