Skip to content

Commit

Permalink
Merge pull request #20 from CashScript/subscription
Browse files Browse the repository at this point in the history
electrum subscription contract balance & utxos
  • Loading branch information
mr-zwets authored May 24, 2024
2 parents 359eddb + ce5c690 commit e33fd0f
Showing 1 changed file with 27 additions and 0 deletions.
27 changes: 27 additions & 0 deletions src/components/ContractInfo.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { Artifact, Contract, Network, Utxo } from 'cashscript'
import { ColumnFlex, Wallet } from './shared'
import ContractCreation from './ContractCreation'
import ContractFunctions from './ContractFunctions'
import { ElectrumClient, ElectrumTransport } from 'electrum-cash'

interface Props {
artifact?: Artifact
Expand All @@ -17,9 +18,35 @@ const ContractInfo: React.FC<Props> = ({ artifact, network, setNetwork, setShowW
const [contract, setContract] = useState<Contract | undefined>(undefined)
const [balance, setBalance] = useState<bigint | undefined>(undefined)
const [utxos, setUtxos] = useState<Utxo[] | undefined>([])
const [electrumClient, setElectrumClient] = useState<ElectrumClient | undefined>(undefined)

useEffect(() => setContract(undefined), [artifact])

async function initElectrumSubscription(){
if(electrumClient) electrumClient?.disconnect()
if(!contract?.address) return

// connect to ElectrumClient for subscription
let electrumServerName: string= ""
if(network == "mainnet") electrumServerName = 'bch.imaginary.cash'
if(network == "chipnet")electrumServerName = 'chipnet.imaginary.cash'
if(network == "testnet4") electrumServerName = 'testnet4.imaginary.cash'
if(!electrumServerName) return // no imaginary server for testnet3

const newElectrumClient = new ElectrumClient('Electrum client example', '1.4.1', electrumServerName, ElectrumTransport.WSS.Port, ElectrumTransport.WSS.Scheme)
await newElectrumClient?.connect();
// subscribe to contract address
const refetchContractBalance = async(data:any) => {
if(data) updateUtxosContract()
}
await newElectrumClient?.subscribe(refetchContractBalance, 'blockchain.address.subscribe', contract.address);
setElectrumClient(newElectrumClient)
}

useEffect(() => {
initElectrumSubscription()
}, [contract])

async function updateUtxosContract () {
if (!contract) return
setBalance(await contract.getBalance())
Expand Down

0 comments on commit e33fd0f

Please sign in to comment.