Skip to content
Draft
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
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
"eslint": "eslint src/**/* --ext .ts,.tsx --ignore-pattern **/*.graphql --fix",
"lint": "npm run check-circular-deps && npm run eslint && npm run tsc && npm run tsc-test",
"prepare": "npm run build",
"postinstall": "node postinstall.js",
"postinstall": "node postinstall.js && patch-package",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we plan to remove this once the pr is approved right ?

"build-graphql-V2": "rm -rf src/services/railgun/quick-sync/V2/graphql/.graphclient && graphclient build --dir src/services/railgun/quick-sync/V2/graphql",
"build-graphql-V3": "rm -rf src/services/railgun/quick-sync/V3/graphql/.graphclient && graphclient build --dir src/services/railgun/quick-sync/V3/graphql",
"build-graphql-railgun-txids": "rm -rf src/services/railgun/railgun-txids/graphql/.graphclient && graphclient build --dir src/services/railgun/railgun-txids/graphql"
Expand Down Expand Up @@ -54,6 +54,7 @@
"ethers": "6.13.1",
"events": "3.3.0",
"graphql": "^16.6.0",
"patch-package": "^8.0.0",
"stream-browserify": "3.0.0"
},
"devDependencies": {
Expand Down
388 changes: 388 additions & 0 deletions patches/@railgun-community+engine+9.3.1.patch

Large diffs are not rendered by default.

241 changes: 241 additions & 0 deletions patches/@railgun-community+shared-models+7.5.0.patch

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions src/services/poi/poi-required.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import {
NetworkName,
isDefined,
} from '@railgun-community/shared-models';
import { getFallbackProviderForNetwork } from '../railgun/core/providers';
import { getProviderForNetwork } from '../railgun/core/providers';
import { POI } from '@railgun-community/engine';

export class POIRequired {
Expand All @@ -21,7 +21,7 @@ export class POIRequired {
return false;
}

const provider = getFallbackProviderForNetwork(networkName);
const provider = getProviderForNetwork(networkName);
const blockNumber = await provider.getBlockNumber();

const isRequired = poi.launchBlock < blockNumber;
Expand Down
8 changes: 4 additions & 4 deletions src/services/railgun/core/__tests__/providers.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import {
MOCK_FALLBACK_PROVIDER_JSON_CONFIG_SEPOLIA,
} from '../../../../tests/mocks.test';
import { closeTestEngine, initTestEngine } from '../../../../tests/setup.test';
import { getFallbackProviderForNetwork } from '../providers';
import { getProviderForNetwork } from '../providers';
import { loadProvider } from '../load-provider';
import { createRailgunWallet, walletForID } from '../../wallets/wallets';
import {
Expand Down Expand Up @@ -54,10 +54,10 @@ describe('providers', () => {
unshieldFeeV3: undefined,
});

expect(getFallbackProviderForNetwork(NetworkName.EthereumSepolia)).to.not.be
expect(getProviderForNetwork(NetworkName.EthereumSepolia)).to.not.be
.undefined;
expect(() =>
getFallbackProviderForNetwork(NetworkName.EthereumRopsten_DEPRECATED),
getProviderForNetwork(NetworkName.EthereumRopsten_DEPRECATED),
).to.throw;

expect(getUTXOMerkletreeForNetwork(txidVersion, NetworkName.EthereumSepolia))
Expand Down Expand Up @@ -140,6 +140,6 @@ describe('providers', () => {
NetworkName.BNBChain,
10000, // pollingInterval
),
).rejectedWith('Invalid fallback provider config for chain 56');
).rejectedWith('provider is required for single provider configuration');
});
});
139 changes: 71 additions & 68 deletions src/services/railgun/core/load-provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,82 +4,63 @@ import {
LoadProviderResponse,
NETWORK_CONFIG,
NetworkName,
ProviderJson,
TXIDVersion,
createFallbackProviderFromJsonConfig,
createProviderFromJsonConfig,
isDefined,
} from '@railgun-community/shared-models';
import { sendMessage } from '../../../utils';
import { reportAndSanitizeError } from '../../../utils/error';
import { WalletPOI } from '../../poi/wallet-poi';
import { getEngine } from './engine';
import {
PollingJsonRpcProvider,
RailgunVersionedSmartContracts,
createPollingJsonRpcProviderForListeners,
} from '@railgun-community/engine';
import { FallbackProvider } from 'ethers'
import { type Provider} from 'ethers'
import {
fallbackProviderMap,
pollingProviderMap,
setFallbackProviderForNetwork,
setPollingProviderForNetwork,
providerMap,
setProviderForNetwork,
} from './providers';
import { WalletPOINodeInterface } from '../../poi/wallet-poi-node-interface';

const createFallbackProviderForNetwork = async (
const createProviderForNetwork = async (
networkName: NetworkName,
fallbackProviderJsonConfig: FallbackProviderJsonConfig,
): Promise<FallbackProvider> => {
const existingProvider = fallbackProviderMap[networkName];
providerJsonConfig: FallbackProviderJsonConfig | ProviderJson,
pollingInterval?: number,
): Promise<Provider> => {
const existingProvider = providerMap[networkName];
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's throwing a lint error for me here

Unexpected any value in conditional. An explicit comparison or type cast is required

if (existingProvider) {
return existingProvider;
}
const fallbackProvider = createFallbackProviderFromJsonConfig(
fallbackProviderJsonConfig,
);
setFallbackProviderForNetwork(networkName, fallbackProvider);
return fallbackProvider;
};

const createPollingProviderForNetwork = async (
networkName: NetworkName,
fallbackProvider: FallbackProvider,
pollingInterval: number,
): Promise<PollingJsonRpcProvider> => {
const existingProvider = pollingProviderMap[networkName];
if (existingProvider) {
return existingProvider;
}
const network = NETWORK_CONFIG[networkName];
if (!isDefined(network)) {
throw new Error('No network found');
}
const pollingProvider = await createPollingJsonRpcProviderForListeners(
fallbackProvider,
network.chain.id,
pollingInterval,
const provider = createProviderFromJsonConfig(
providerJsonConfig,
pollingInterval
);
setPollingProviderForNetwork(networkName, pollingProvider);
return pollingProvider;
setProviderForNetwork(networkName, provider);
return provider;
};

/**
*
* @param chain
* @param networkName
* @param fallbackProviderJsonConfig
* @param pollingInterval
*/
const loadProviderForNetwork = async (
chain: Chain,
networkName: NetworkName,
fallbackProviderJsonConfig: FallbackProviderJsonConfig,
providerJsonConfig: FallbackProviderJsonConfig | ProviderJson,
pollingInterval: number,

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add deprecated to this too?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's already there if you are asking to ensure it has deprecated on it

) => {
sendMessage(`Load provider for network: ${networkName}`);

const fallbackProvider = await createFallbackProviderForNetwork(
networkName,
fallbackProviderJsonConfig,
);
const pollingProvider = await createPollingProviderForNetwork(
networkName,
fallbackProvider,
pollingInterval
);
// Create the provider from the JSON config
const provider = await createProviderForNetwork(
networkName,
providerJsonConfig,
pollingInterval,
);

const network = NETWORK_CONFIG[networkName];
const {
Expand Down Expand Up @@ -125,8 +106,8 @@ const loadProviderForNetwork = async (
poseidonMerkleAccumulatorV3Contract,
poseidonMerkleVerifierV3Contract,
tokenVaultV3Contract,
fallbackProvider,
pollingProvider,
provider, // Can be of type FallbackProvider, WebSocketProvider, or JsonRpcProvider
undefined, // pollingProvider is being deprecated

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Type error here. I do not think it's a breaking change to change the type to ? on the functions that take the now deprecated polling provider such that you no longer have to pass them

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are you saying to remove the optional param and not pass undefined? Or just stating that it is okay

It is part of the last commit to the relating engine PR Railgun-Community/engine@3e3f607

deploymentBlocks,
poi?.launchBlock,
supportsV3,
Expand All @@ -138,22 +119,25 @@ const loadProviderForNetwork = async (
* for new RAILGUN events (balance updates).
*/
export const loadProvider = async (
fallbackProviderJsonConfig: FallbackProviderJsonConfig,
providerJsonConfig: FallbackProviderJsonConfig | ProviderJson,
networkName: NetworkName,
/**
* @deprecated pollingInterval - Default ethers polling interval is used
*/
pollingInterval = 15000,
): Promise<LoadProviderResponse> => {
try {
delete fallbackProviderMap[networkName];
delete providerMap[networkName];

const { chain, supportsV3 } = NETWORK_CONFIG[networkName];
if (fallbackProviderJsonConfig.chainId !== chain.id) {
if ('chainId' in providerJsonConfig && providerJsonConfig.chainId !== chain.id) {
throw new Error('Invalid chain ID');
}

await loadProviderForNetwork(
chain,
networkName,
fallbackProviderJsonConfig,
providerJsonConfig,
pollingInterval,
);
WalletPOINodeInterface.unpause(chain);
Expand Down Expand Up @@ -197,23 +181,33 @@ export const unloadProvider = async (
networkName: NetworkName,
): Promise<void> => {
WalletPOINodeInterface.pause(NETWORK_CONFIG[networkName].chain);
await fallbackProviderMap[networkName]?.destroy();
pollingProviderMap[networkName]?.destroy();
delete fallbackProviderMap[networkName];
delete pollingProviderMap[networkName];
providerMap[networkName]?.destroy();
delete providerMap[networkName];
};

export const pauseAllPollingProviders = (
excludeNetworkName?: NetworkName,
): void => {
Object.keys(pollingProviderMap).forEach(networkName => {
Object.keys(providerMap).forEach(networkName => {
if (networkName === excludeNetworkName) {
return;
}
const pollingProvider = pollingProviderMap[networkName];
if (isDefined(pollingProvider) && !pollingProvider.paused) {
pollingProvider.pause();
const provider = providerMap[networkName];

// Check if provider exists
if (!isDefined(provider)) {
throw new Error(`No provider found for network: ${networkName}`);
}

// Ensure provider is a pausable provider
if (!('paused' in provider && 'pause' in provider)) {
throw new Error(
`Provider for network ${networkName} is not a pausable provider`,
);
}

// Safe to call pause() after type check
(provider as { pause(): void }).pause();
});
};

Expand All @@ -223,11 +217,20 @@ export const resumeIsolatedPollingProviderForNetwork = (
pauseAllPollingProviders(
networkName, // excludeNetworkName
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can we rename this to excludedNetworkName instead of just having it as a comment ?

);
const pollingProviderForNetwork = pollingProviderMap[networkName];
if (
isDefined(pollingProviderForNetwork) &&
pollingProviderForNetwork.paused
) {
pollingProviderForNetwork.resume();
const provider = providerMap[networkName];

// Check if provider exists
if (!isDefined(provider)) {
throw new Error(`No provider found for network: ${networkName}`);
}

// Ensure provider has resume functionality
if (!('paused' in provider && 'resume' in provider)) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could do a validateProvider function rather than having this statement twice, since the flow itself its pretty similar

something like

type PausableProvider extends Provider {
 pause(): voidl; 
resume(): void;
paused: boolean;  
}


function isPausableProvider(provider: Provider): provider is PausableProvider {
  return 'pause' in provider && 'resume' in provider && 'paused' in provider;
}


const validateProvider = (networkName: NetworkName, provider?: Provider) => {
  if (!isDefined(provider)) {
    throw new Error(`No provider found for network: ${networkName}`);
  }
  if (!isPausableProvider(provider)) {
    throw new Error(`Provider for network ${networkName} is not a pausable provider`);
  }
  return provider;
};

throw new Error(
`Provider for network ${networkName} is not a pausable provider`,
);
}

// Safe to call resume() after type check
(provider as { resume(): void }).resume();
};
37 changes: 8 additions & 29 deletions src/services/railgun/core/providers.ts
Original file line number Diff line number Diff line change
@@ -1,42 +1,21 @@
import { NetworkName, isDefined } from '@railgun-community/shared-models';
import { PollingJsonRpcProvider } from '@railgun-community/engine';
import { FallbackProvider } from 'ethers';
import { Provider } from 'ethers';

export const fallbackProviderMap: MapType<FallbackProvider> = {};
export const pollingProviderMap: MapType<PollingJsonRpcProvider> = {};
export const providerMap: MapType<Provider> = {};

export const getFallbackProviderForNetwork = (
export const getProviderForNetwork = (
networkName: NetworkName,
): FallbackProvider => {
const provider = fallbackProviderMap[networkName];
): Provider => {
const provider = providerMap[networkName];
if (!isDefined(provider)) {
throw new Error(`Provider not yet loaded for network ${networkName}`);
}
return provider;
};

export const getPollingProviderForNetwork = (
export const setProviderForNetwork = (
networkName: NetworkName,
): PollingJsonRpcProvider => {
const provider = pollingProviderMap[networkName];
if (!isDefined(provider)) {
throw new Error(
`Polling provider not yet loaded for network ${networkName}`,
);
}
return provider;
};

export const setFallbackProviderForNetwork = (
networkName: NetworkName,
provider: FallbackProvider,
): void => {
fallbackProviderMap[networkName] = provider;
};

export const setPollingProviderForNetwork = (
networkName: NetworkName,
provider: PollingJsonRpcProvider,
provider: Provider,
): void => {
pollingProviderMap[networkName] = provider;
providerMap[networkName] = provider;
};
16 changes: 8 additions & 8 deletions src/services/transactions/__tests__/tx-gas-details.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import chaiAsPromised from 'chai-as-promised';
import Sinon, { SinonStub } from 'sinon';
import {
CommitmentSummary,
createFallbackProviderFromJsonConfig,
createProviderFromJsonConfig,
EVMGasType,
NetworkName,
TransactionGasDetails,
Expand All @@ -17,7 +17,7 @@ import {
getGasEstimate,
setGasDetailsForTransaction,
} from '../tx-gas-details';
import { setFallbackProviderForNetwork } from '../../railgun';
import { setProviderForNetwork } from '../../railgun';
import { ContractTransaction, FallbackProvider } from 'ethers';
import { getTestTXIDVersion } from '../../../tests/helper.test';

Expand All @@ -43,11 +43,11 @@ describe('tx-gas', () => {

it('Should format gas estimate response', async () => {
const transaction = {} as ContractTransaction;
const fallbackProvider = createFallbackProviderFromJsonConfig(
const fallbackProvider = createProviderFromJsonConfig(
MOCK_FALLBACK_PROVIDER_JSON_CONFIG_POLYGON,
);

setFallbackProviderForNetwork(
setProviderForNetwork(
NetworkName.Polygon,
fallbackProvider as unknown as FallbackProvider,
);
Expand Down Expand Up @@ -78,10 +78,10 @@ describe('tx-gas', () => {

it('Should pull gas estimate for basic transaction - self-signed', async () => {
stubGasEstimateSuccess();
const fallbackProvider = createFallbackProviderFromJsonConfig(
const fallbackProvider = createProviderFromJsonConfig(
MOCK_FALLBACK_PROVIDER_JSON_CONFIG_POLYGON,
);
setFallbackProviderForNetwork(
setProviderForNetwork(
NetworkName.Polygon,
fallbackProvider as unknown as FallbackProvider,
);
Expand Down Expand Up @@ -111,10 +111,10 @@ describe('tx-gas', () => {

it('Should pull gas estimate for basic transaction - broadcaster', async () => {
stubGasEstimateSuccess();
const fallbackProvider = createFallbackProviderFromJsonConfig(
const fallbackProvider = createProviderFromJsonConfig(
MOCK_FALLBACK_PROVIDER_JSON_CONFIG_POLYGON,
);
setFallbackProviderForNetwork(
setProviderForNetwork(
NetworkName.Polygon,
fallbackProvider as unknown as FallbackProvider,
);
Expand Down
Loading
Loading