@river-build/web3
Version:
Dapps for our Space and Registry contracts
73 lines • 3.52 kB
JavaScript
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