useCkBtcLedger.tsx
1 import { IcrcLedgerCanister, IcrcTokenMetadataResponse } from "@dfinity/ledger"; 2 import { useCallback, useEffect, useState } from "react"; 3 import { Principal } from "@dfinity/principal"; 4 import useAuth from "../../auth/hooks/useAuth"; 5 6 const useCkBtcLedger = () => { 7 const { identity, agent } = useAuth(); 8 const [ledgerActor, setLedgerActor] = useState<IcrcLedgerCanister | undefined>(); 9 const [metadata, setMetadata] = useState<IcrcTokenMetadataResponse>(); 10 const [balance, setBalance] = useState<bigint | null>(); 11 12 useEffect(()=> { 13 if(identity && agent) { 14 console.log("Found identity in useCkbtc ledger hook"); 15 } 16 }) 17 18 const getMetadata = useCallback(async () => { 19 if (!ledgerActor) { 20 throw new Error("LedgerCanister not initialized"); 21 } 22 setMetadata(await ledgerActor.metadata({ certified: false })); 23 }, [ledgerActor]); 24 25 const getBalance = useCallback(async () => { 26 if (!ledgerActor || !identity) { 27 return null; 28 } 29 setBalance( 30 await ledgerActor.balance({ 31 owner: identity.getPrincipal(), 32 certified: false, 33 }) 34 ); 35 }, [ledgerActor, identity]); 36 37 useEffect(() => { 38 if (!identity || !agent || metadata || balance) return; 39 const init = async () => { 40 const ledgerActor = IcrcLedgerCanister.create({ 41 agent, 42 canisterId: Principal.fromText( 43 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion 44 process.env.MY_LEDGER_CANISTER_ID! 45 ), 46 }); 47 setLedgerActor(ledgerActor); 48 await getMetadata(); 49 await getBalance(); 50 }; 51 init(); 52 }, [identity, agent, getBalance, getMetadata, metadata, balance]); 53 54 return { 55 ledgerActor, 56 getMetadata, 57 getBalance, 58 metadata, 59 balance 60 }; 61 } 62 63 export default useCkBtcLedger;