@@ -11,6 +11,7 @@ import {
1111 TonWallet ,
1212 EventEmitter ,
1313} from "@hot-labs/near-connect" ;
14+ import { HotBridge , utils } from "@hot-labs/omni-sdk" ;
1415import { StellarWalletsKit , allowAllModules , WalletNetwork } from "@creit.tech/stellar-wallets-kit" ;
1516import { base , bsc , mainnet , solana } from "@reown/appkit/networks" ;
1617import { EthersAdapter } from "@reown/appkit-adapter-ethers" ;
@@ -36,10 +37,17 @@ const initialConfig: WibeClientOptions = {
3637 icons : [ "https://wibe.io/favicon.ico" ] ,
3738} ;
3839
40+ const hotBridge = new HotBridge ( { } ) ;
41+
3942export class Wibe3Client {
4043 private hotConnector : HotConnector ;
4144 wallet : NearWallet | EvmWallet | SolanaWallet | StellarWallet | TonWallet | null = null ;
42- events : EventEmitter < { connect : { wallet : ChainAbstracted } ; disconnect : { } } > ;
45+ balances : TokenBalance [ ] = [ ] ;
46+ events = new EventEmitter < {
47+ connect : { wallet : ChainAbstracted } ;
48+ "balance:changed" : { balances : TokenBalance [ ] } ;
49+ disconnect : { } ;
50+ } > ( ) ;
4351
4452 onConnect : ( wallet : ChainAbstracted ) => void = ( ) => { } ;
4553 onDisconnect : ( ) => void = ( ) => { } ;
@@ -53,16 +61,19 @@ export class Wibe3Client {
5361 div . style . display = "none" ;
5462 }
5563
56- this . events = new EventEmitter < { connect : { wallet : ChainAbstracted } ; disconnect : { } } > ( ) ;
57-
5864 this . hotConnector = new HotConnector ( {
5965 onConnect : ( wallet ) => {
6066 this . wallet = wallet ;
67+ this . balances = [ ] ;
6168 this . events . emit ( "connect" , { wallet : wallet as ChainAbstracted } ) ;
69+ this . events . emit ( "balance:changed" , { balances : [ ] } ) ;
70+ this . refreshBalances ( ) ;
6271 } ,
6372
6473 onDisconnect : ( ) => {
6574 this . wallet = null ;
75+ this . balances = [ ] ;
76+ this . events . emit ( "balance:changed" , { balances : [ ] } ) ;
6677 this . events . emit ( "disconnect" , { } ) ;
6778 } ,
6879
@@ -88,21 +99,32 @@ export class Wibe3Client {
8899 } ) ;
89100 }
90101
91- async getBalance ( token : OmniToken ) : Promise < TokenBalance > {
102+ async refreshBalances ( ) {
103+ this . balances = await this . getBalances ( Object . values ( OmniToken ) ) ;
104+ this . events . emit ( "balance:changed" , { balances : this . balances } ) ;
105+ }
106+
107+ async getBalances ( tokens : OmniToken [ ] ) : Promise < TokenBalance [ ] > {
92108 if ( ! this . wallet ) throw new Error ( "No wallet connected" ) ;
93109 const tradingAddress = await this . wallet . getIntentsAddress ( ) ;
94- const balances = await this . hotConnector . intents . getIntentsBalances ( [ token ] , tradingAddress ) ;
95- const metadata = OmniTokenMetadata [ token ] ;
96- return {
97- int : balances [ token ] || 0n ,
98- id : metadata . contractId ,
99- float : Number ( balances [ token ] || 0 ) / Math . pow ( 10 , metadata . decimals ) ,
100- decimals : metadata . decimals ,
101- symbol : metadata . symbol ,
102- } ;
110+ const balances = await this . hotConnector . intents . getIntentsBalances ( tokens , tradingAddress ) ;
111+
112+ return tokens . map ( ( token ) => {
113+ const metadata = OmniTokenMetadata [ token ] ;
114+ const icon = `https://storage.herewallet.app/ft/1010:${ metadata . contractId } .png` ;
115+
116+ return {
117+ icon,
118+ int : balances [ token ] || 0n ,
119+ id : metadata . contractId ,
120+ float : Number ( balances [ token ] || 0 ) / Math . pow ( 10 , metadata . decimals ) ,
121+ decimals : metadata . decimals ,
122+ symbol : metadata . symbol ,
123+ } ;
124+ } ) ;
103125 }
104126
105- async isSignedIn ( ) {
127+ get isSignedIn ( ) {
106128 return ! ! this . wallet ;
107129 }
108130
@@ -124,22 +146,39 @@ export class Wibe3Client {
124146 } ;
125147 }
126148
127- async withdraw ( ) { }
149+ async withdraw ( args : { token : OmniToken ; amount : number } ) {
150+ if ( ! this . wallet ) throw new Error ( "No wallet connected" ) ;
151+ if ( this . wallet . type !== WalletType . NEAR ) throw new Error ( "Only NEAR wallet can withdraw" ) ;
152+
153+ const token = OmniTokenMetadata [ args . token ] ;
154+ await hotBridge . withdrawToken ( {
155+ chain : 1010 ,
156+ token : token . contractId ,
157+ amount : BigInt ( utils . parseAmount ( args . amount , token . decimals ) ) ,
158+ intentAccount : await this . wallet . getIntentsAddress ( ) ,
159+ receiver : await this . wallet . getAddress ( ) ,
160+ signIntents : ( t ) => this . wallet ! . signIntents ( t ) ,
161+ } ) ;
162+ }
128163}
129164
130165export const useWibe3 = ( wibe3 : Wibe3Client ) => {
131166 const [ wallet , setWallet ] = useState < ChainAbstracted | null > ( wibe3 . wallet ) ;
167+ const [ balances , setBalances ] = useState < TokenBalance [ ] > ( wibe3 . balances ) ;
132168 const [ address , setAddress ] = useState < string | null > ( null ) ;
133169 const [ tradingAddress , setTradingAddress ] = useState < string | null > ( null ) ;
134170
135171 useEffect ( ( ) => {
172+ const onBalanceChanged = ( t : { balances : TokenBalance [ ] } ) => setBalances ( t . balances ) ;
136173 const onConnect = ( t : { wallet : ChainAbstracted } ) => setWallet ( t . wallet ) ;
137174 const onDisconnect = ( ) => setWallet ( null ) ;
138175 wibe3 . events . on ( "connect" , onConnect ) ;
139176 wibe3 . events . on ( "disconnect" , onDisconnect ) ;
177+ wibe3 . events . on ( "balance:changed" , onBalanceChanged ) ;
140178 return ( ) => {
141179 wibe3 . events . off ( "connect" , onConnect ) ;
142180 wibe3 . events . off ( "disconnect" , onDisconnect ) ;
181+ wibe3 . events . off ( "balance:changed" , onBalanceChanged ) ;
143182 } ;
144183 } , [ wibe3 ] ) ;
145184
@@ -151,7 +190,6 @@ export const useWibe3 = (wibe3: Wibe3Client) => {
151190
152191 const connect = useCallback ( async ( ) => {
153192 await wibe3 . connect ( ) ;
154- setWallet ( wallet ) ;
155193 } , [ ] ) ;
156194
157195 const auth = useCallback ( async ( ) => {
@@ -161,16 +199,15 @@ export const useWibe3 = (wibe3: Wibe3Client) => {
161199
162200 const disconnect = useCallback ( async ( ) => {
163201 await wibe3 . disconnect ( ) ;
164- setWallet ( null ) ;
165202 } , [ ] ) ;
166203
167- const getBalance = useCallback ( async ( token : OmniToken ) => {
168- return wibe3 . getBalance ( token ) ;
204+ const refresh = useCallback ( async ( ) => {
205+ await wibe3 . refreshBalances ( ) ;
169206 } , [ ] ) ;
170207
171- const withdraw = useCallback ( async ( ) => {
172- await wibe3 . withdraw ( ) ;
208+ const withdraw = useCallback ( async ( token : OmniToken , amount : number ) => {
209+ await wibe3 . withdraw ( { token , amount } ) ;
173210 } , [ ] ) ;
174211
175- return { address, connect, auth, disconnect, getBalance , tradingAddress, withdraw } ;
212+ return { address, connect, auth, disconnect, balances , tradingAddress, withdraw, refresh } ;
176213} ;
0 commit comments