1+ import { TokenBalance } from "../../../Models/Balance" ;
2+ import { Network , Token } from "../../../Models/Network" ;
3+ import { formatUnits } from "viem" ;
4+ import KnownInternalNames from "../../knownIds" ;
5+ import { TronWeb } from 'tronweb'
6+ import { insertIfNotExists } from "../helpers" ;
7+ import { BalanceProvider } from "@/Models/BalanceProvider" ;
8+ import { getNetworkRpcUrl } from "@/lib/rpc/resolveNetworkRpcUrl" ;
9+
10+ export class TronBalanceProvider extends BalanceProvider {
11+ supportsNetwork : BalanceProvider [ 'supportsNetwork' ] = ( network ) => {
12+ return ( KnownInternalNames . Networks . TronMainnet . includes ( network . caip2Id ) || KnownInternalNames . Networks . TronNile . includes ( network . caip2Id ) )
13+ }
14+
15+ fetchBalance : BalanceProvider [ 'fetchBalance' ] = async ( address , network ) => {
16+ let balances : TokenBalance [ ] = [ ]
17+ const nodeUrl = getNetworkRpcUrl ( network )
18+
19+ const provider = new TronWeb ( { fullNode : nodeUrl , solidityNode : nodeUrl , privateKey : '01' , } ) ;
20+
21+ for ( const token of network . tokens ) {
22+ try {
23+ const balance = await resolveBalance ( { network, address, token, provider } )
24+
25+ balances . push ( balance )
26+
27+ }
28+ catch ( e ) {
29+ balances . push ( this . resolveTokenBalanceFetchError ( e , token , network ) )
30+ }
31+ }
32+
33+ return balances
34+ }
35+ }
36+
37+ type GetBalanceProps = {
38+ network : Network ,
39+ token : Token ,
40+ address : string ,
41+ provider : TronWeb
42+ }
43+
44+ export const resolveBalance = async ( { address, network, token, provider } : GetBalanceProps ) => {
45+
46+ if ( token . contract !== '0x0000000000000000000000000000000000000000' ) {
47+ const res = await getTRC20Balance ( { network, token, address, provider } )
48+ return res
49+ }
50+ else {
51+ const res = await getNativeAssetBalance ( { network, token, address, provider } )
52+ return res
53+ }
54+ }
55+
56+ const getNativeAssetBalance = async ( { network, token, address, provider } : GetBalanceProps ) => {
57+
58+ const balance = await provider . trx . getBalance ( address ) ;
59+
60+ return ( {
61+ network : network . caip2Id ,
62+ token : token . symbol ,
63+ amount : Number ( formatUnits ( BigInt ( balance . toString ( ) ) , Number ( token ?. decimals ) ) ) ,
64+ request_time : new Date ( ) . toJSON ( ) ,
65+ decimals : Number ( token ?. decimals ) ,
66+ isNativeCurrency : true ,
67+ } )
68+
69+ }
70+
71+ const getTRC20Balance = async ( { network, token, address, provider } : GetBalanceProps ) => {
72+ if ( ! token . contract ) throw new Error ( "Token contract address is missing" )
73+
74+ const tokenContractAddress = token . contract ;
75+ const contract = await provider . contract ( ) . at ( tokenContractAddress ) ;
76+
77+ const balanceResponse = await contract . methods . balanceOf ( address ) . call ( ) ;
78+
79+ const balance = {
80+ network : network . caip2Id ,
81+ token : token . symbol ,
82+ amount : Number ( formatUnits ( BigInt ( balanceResponse as any ) , token . decimals ) ) ,
83+ request_time : new Date ( ) . toJSON ( ) ,
84+ decimals : token . decimals ,
85+ isNativeCurrency : false ,
86+ }
87+
88+ return balance
89+ }
0 commit comments