Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,18 @@ const mockUseProviderContext = useProviderContext as jest.Mock;

describe("Fetch Escrow Transfers", () => {
jest.setTimeout(15000);

beforeAll(() => {
mockUseProviderContext.mockReturnValue({ provider: amoyProvider, providerOrSigner: amoyProvider });
});

describe("fetch from title escrow transfers", () => {
it("should return parsed transfer logs in valid format", async () => {
const escrowTransfers = await fetchEscrowTransfers(amoyProvider, "0x1F6D8888Fc6B75E10b1840620E8229C3C487a925");
const blockNo = 6000000;
const escrowTransfers = await fetchEscrowTransfers(
amoyProvider,
"0x1F6D8888Fc6B75E10b1840620E8229C3C487a925",
blockNo
);
expect(escrowTransfers).toEqual([
{
type: "TRANSFER_HOLDER",
Expand Down Expand Up @@ -211,7 +215,8 @@ describe("Fetch Escrow Transfers", () => {
describe("fetch from title escrow owner transfers", () => {
it("should return parsed transfer logs for beneficiary in valid format", async () => {
const titleEscrow = TitleEscrow__factory.connect("0x1F6D8888Fc6B75E10b1840620E8229C3C487a925", amoyProvider);
const ownerTransfers = await fetchOwnerTransfers(titleEscrow, amoyProvider);
const blockNo = 6000000;
const ownerTransfers = await fetchOwnerTransfers(titleEscrow, amoyProvider, blockNo);
expect(ownerTransfers).toEqual([
{
type: "TRANSFER_BENEFICIARY",
Expand Down Expand Up @@ -248,7 +253,8 @@ describe("Fetch Escrow Transfers", () => {
describe("fetch from title escrow holder transfers", () => {
it("should return parsed transfer logs for holder in valid format", async () => {
const titleEscrow = TitleEscrow__factory.connect("0x1F6D8888Fc6B75E10b1840620E8229C3C487a925", amoyProvider);
const holderTransfers = await fetchHolderTransfers(titleEscrow, amoyProvider);
const blockNo = 6000000;
const holderTransfers = await fetchHolderTransfers(titleEscrow, amoyProvider, blockNo);
expect(holderTransfers).toEqual([
{
type: "TRANSFER_HOLDER",
Expand Down
18 changes: 10 additions & 8 deletions src/common/hooks/useEndorsementChain/fetchEscrowTransfer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,15 @@ import { EventFragment, Result } from "ethers/lib/utils";

export const fetchEscrowTransfers = async (
provider: providers.Provider,
address: string
address: string,
fromBlockNumber: number
): Promise<TitleEscrowTransferEvent[]> => {
const titleEscrowContract = TitleEscrow__factory.connect(address, provider);
const isTitleEscrow = await titleEscrowContract.supportsInterface("0x079dff60");
if (!isTitleEscrow) throw new Error(`Contract ${address} is not a title escrow contract`);
// https://ethereum.stackexchange.com/questions/109326/combine-multiple-event-filters-in-ethersjs
const holderChangeLogsDeferred = await fetchHolderTransfers(titleEscrowContract, provider);
const ownerChangeLogsDeferred = await fetchOwnerTransfers(titleEscrowContract, provider);
const holderChangeLogsDeferred = await fetchHolderTransfers(titleEscrowContract, provider, fromBlockNumber);
const ownerChangeLogsDeferred = await fetchOwnerTransfers(titleEscrowContract, provider, fromBlockNumber);
const [holderChangeLogs, ownerChangeLogs] = await Promise.all([holderChangeLogsDeferred, ownerChangeLogsDeferred]);
return [...holderChangeLogs, ...ownerChangeLogs];
};
Expand All @@ -22,11 +23,11 @@ export const fetchEscrowTransfers = async (
*/
export const fetchOwnerTransfers = async (
titleEscrowContract: TitleEscrow,
provider: providers.Provider
provider: providers.Provider,
fromBlockNumber: number
): Promise<TitleEscrowTransferEvent[]> => {
const ownerChangeFilter = titleEscrowContract.filters.BeneficiaryTransfer(null, null);
const ownerChangeLogs = await provider.getLogs({ ...ownerChangeFilter, fromBlock: 0 });

const ownerChangeLogs = await provider.getLogs({ ...ownerChangeFilter, fromBlock: fromBlockNumber });
const ownerChangeLogsParsed = getParsedLogs(ownerChangeLogs, titleEscrowContract);
return ownerChangeLogsParsed.map((event) => ({
type: "TRANSFER_BENEFICIARY",
Expand Down Expand Up @@ -68,10 +69,11 @@ export const getParsedLogs = (logs: providers.Log[], titleEscrow: TitleEscrow):
*/
export const fetchHolderTransfers = async (
titleEscrowContract: TitleEscrow,
provider: providers.Provider
provider: providers.Provider,
fromBlockNumber: number
): Promise<TitleEscrowTransferEvent[]> => {
const holderChangeFilter = titleEscrowContract.filters.HolderTransfer(null, null);
const holderChangeLogs = await provider.getLogs({ ...holderChangeFilter, fromBlock: 0 });
const holderChangeLogs = await provider.getLogs({ ...holderChangeFilter, fromBlock: fromBlockNumber });
const holderChangeLogsParsed = getParsedLogs(holderChangeLogs, titleEscrowContract);
return holderChangeLogsParsed.map((event) => ({
type: "TRANSFER_HOLDER",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,13 @@ describe("Fetch Token Transfers", () => {
"0x71D28767662cB233F887aD2Bb65d048d760bA694",
amoyProvider
);
const blockNo = 6000000;
if (!tokenRegistry) throw new Error("Unable to connect to token registry: Test Failed");
const tokenTransfers = await fetchTokenTransfers(
amoyProvider,
tokenRegistry,
"0xe8b9fb84485cbf9dd59eabe1dcddf44d9e3ff820aedb7d02a138ef4a116f0ec9"
"0xe8b9fb84485cbf9dd59eabe1dcddf44d9e3ff820aedb7d02a138ef4a116f0ec9",
blockNo
);
expect(tokenTransfers).toEqual([
{
Expand Down
7 changes: 5 additions & 2 deletions src/common/hooks/useEndorsementChain/fetchTokenTransfer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,19 @@ import { LogDescription } from "ethers/lib/utils";
import { BurnAddress, InitialAddress } from "../../../constants/chain-info";
import { TokenTransferEvent, TokenTransferEventType } from "../../../types";
import { sortLogChain } from "./helpers";
import { providers } from "ethers";

export const fetchTokenTransfers = async (
provider: providers.Provider,
tokenRegistry: TradeTrustToken,
tokenId: string
tokenId: string,
fromBlockNumber: number
): Promise<TokenTransferEvent[]> => {
// Fetch transfer logs from token registry
const tokenRegistryAddress = tokenRegistry.address;
const identifyTokenTransferEvents = identifyTokenTransferEventsFunction(tokenRegistryAddress);
const transferLogFilter = tokenRegistry.filters.Transfer(null, null, tokenId);
const logs = await tokenRegistry.queryFilter(transferLogFilter, 0);
const logs = await tokenRegistry.queryFilter(transferLogFilter, fromBlockNumber);
if (logs.length === 0) {
throw new Error("Unminted Title Escrow");
}
Expand Down
8 changes: 5 additions & 3 deletions src/common/hooks/useEndorsementChain/useEndorsementChain.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { fetchTokenTransfers } from "./fetchTokenTransfer";
import { getEndorsementChain } from "./retrieveEndorsementChain";
import { retrieveTitleEscrowAddressOnFactory } from "../useTitleEscrowContract";
import { getErrorMessage } from "../../utils/errorHandling";

import { ChainId, ChainInfo } from "../../../constants/chain-info";
export const useEndorsementChain = (
tokenRegistryAddress: string,
tokenId: string
Expand All @@ -31,9 +31,11 @@ export const useEndorsementChain = (
setEndorsementChain(undefined);
setPending(true);
try {
const tokenLogs = await fetchTokenTransfers(tokenRegistry, tokenId);
const chainId: ChainId = (await provider.getNetwork()).chainId;
const fromBlockNumber = ChainInfo[chainId]?.blockNumber ?? 0;
const tokenLogs = await fetchTokenTransfers(provider, tokenRegistry, tokenId, fromBlockNumber);
const escrowAddress = await retrieveTitleEscrowAddressOnFactory(tokenRegistry, tokenId, providerOrSigner);
const titleEscrowLogs = await fetchEscrowTransfers(provider, escrowAddress);
const titleEscrowLogs = await fetchEscrowTransfers(provider, escrowAddress, fromBlockNumber);
const transferEvents = mergeTransfers([...titleEscrowLogs, ...tokenLogs]);
const retrievedEndorsementChain = await getEndorsementChain(provider, transferEvents);
setEndorsementChain(retrievedEndorsementChain);
Expand Down
3 changes: 3 additions & 0 deletions src/constants/chain-info.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ export interface ChainInfoObject {
chainId: ChainId;
networkName: string; // network name that aligns with existing NETWORK_NAME
networkLabel: string;
blockNumber?: number;
explorerUrl: string;
rpcUrl?: string;
nativeCurrency?: {
Expand Down Expand Up @@ -113,6 +114,7 @@ export const ChainInfo: ChainInfo = {
iconImage: "/static/images/networks/xdc.png",
networkName: "xdc",
networkLabel: "XDC Network",
blockNumber: 60000000,
explorerUrl: "https://xdcscan.io",
rpcUrl: "https://rpc.ankr.com/xdc",
nativeCurrency: {
Expand All @@ -127,6 +129,7 @@ export const ChainInfo: ChainInfo = {
iconImage: "/static/images/networks/xdc.png",
networkName: "xdcapothem",
networkLabel: "XDC Testnet Apothem",
blockNumber: 50000000,
explorerUrl: "https://apothem.xdcscan.io",
rpcUrl: "https://rpc.ankr.com/xdc_testnet",
nativeCurrency: {
Expand Down