UNPKG

@river-build/web3

Version:

Dapps for our Space and Registry contracts

73 lines 3.52 kB
import { IERC721AShim } from './IERC721AShim'; import { BigNumber } from 'ethers'; import { BaseContractShim } from './BaseContractShim'; import LocalhostAbi from '@river-build/generated/dev/abis/MembershipFacet.abi.json' assert { type: 'json' }; import { dlogger } from '@river-build/dlog'; import { IMembershipMetadataShim } from './IMembershipMetadataShim'; const log = dlogger('csb:IMembershipShim'); export class IMembershipShim extends BaseContractShim { erc721Shim; metadata; constructor(address, provider) { super(address, provider, LocalhostAbi); this.erc721Shim = new IERC721AShim(address, provider); this.metadata = new IMembershipMetadataShim(address, provider); } async hasMembership(wallet) { const balance = (await this.erc721Shim.read.balanceOf(wallet)).toNumber(); return balance > 0; } // If the caller doesn't provide an abort controller, create one and set a timeout // to abort the call after 20 seconds. async listenForMembershipToken(receiver, providedAbortController) { // const timeoutController = providedAbortController ? undefined : new AbortController(); const abortTimeout = providedAbortController ? undefined : setTimeout(() => { log.error('joinSpace timeout'); timeoutController?.abort(); }, 20_000); const abortController = providedAbortController ?? timeoutController; // TODO: this isn't picking up correct typed function signature, treating as string const issuedFilter = this.read.filters['MembershipTokenIssued(address,uint256)'](receiver); const rejectedFilter = this.read.filters['MembershipTokenRejected(address)'](receiver); return new Promise((resolve, _reject) => { const cleanup = () => { this.read.off(issuedFilter, issuedListener); this.read.off(rejectedFilter, rejectedListener); abortController.signal.removeEventListener('abort', onAbort); clearTimeout(abortTimeout); }; const onAbort = () => { cleanup(); resolve({ issued: false, tokenId: undefined }); }; const issuedListener = (recipient, tokenId) => { if (receiver === recipient) { log.log('MembershipTokenIssued', { receiver, recipient, tokenId }); cleanup(); resolve({ issued: true, tokenId: BigNumber.from(tokenId).toString() }); } else { // This techincally should never happen, but we should log it log.log('MembershipTokenIssued mismatch', { receiver, recipient, tokenId }); } }; const rejectedListener = (recipient) => { if (receiver === recipient) { cleanup(); resolve({ issued: false, tokenId: undefined }); } else { // This techincally should never happen, but we should log it log.log('MembershipTokenIssued mismatch', { receiver, recipient }); } }; this.read.on(issuedFilter, issuedListener); this.read.on(rejectedFilter, rejectedListener); abortController.signal.addEventListener('abort', onAbort); }); } } //# sourceMappingURL=IMembershipShim.js.map