Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Change from infura to generic RPC URLS #636

Merged
merged 5 commits into from
Jan 30, 2024
Merged
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
4 changes: 4 additions & 0 deletions frontend/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ PORTIS_API_KEY=yourKeyHere

MAINNET_RPC_URL=yourRpcUrlHere
POLYGON_RPC_URL=yourRpcUrlHere
OPTIMISM_RPC_URL=yourRpcUrlHere
GNOSIS_CHAIN_RPC_URL=yourRpcUrlHere
ARBITRUM_ONE_RPC_URL=yourRpcUrlHere
SEPOLIA_RPC_URL=yourSepoliaRpcUrl
WALLET_CONNECT_PROJECT_ID=yourId

LOG_LEVEL=DEBUG
Expand Down
9 changes: 7 additions & 2 deletions frontend/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,13 @@ cp .env.example .env

The required parameters are:

`INFURA_ID` - A valid Infura App Identifier <br />
`BLOCKNATIVE_API_KEY` - A Blocknative API key
`BLOCKNATIVE_API_KEY` - A Blocknative API key <br />
`MAINNET_RPC_URL` - Network RPC URLs <br />
`POLYGON_RPC_URL` <br />
`OPTIMISM_RPC_URL` <br />
`GNOSIS_CHAIN_RPC_URL` <br />
`ARBITRUM_ONE_RPC_URL` <br />
`SEPOLIA_RPC_URL` <br />

Optional parameters are:

Expand Down
22 changes: 15 additions & 7 deletions frontend/src/components/models.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,15 @@ import { BigNumber } from 'src/utils/ethers';
import { JsonRpcSigner, Web3Provider } from 'src/utils/ethers';
apbendi marked this conversation as resolved.
Show resolved Hide resolved
import type { TokenList, TokenInfo } from '@uniswap/token-lists/dist/types';
import { UmbraLogger } from 'components/logger';
import { ETH_NETWORK_LOGO } from 'src/utils/constants';
import {
ETH_NETWORK_LOGO,
MAINNET_RPC_URL,
POLYGON_RPC_URL,
OPTIMISM_RPC_URL,
SEPOLIA_RPC_URL,
ARBITRUM_ONE_RPC_URL,
GNOSIS_CHAIN_RPC_URL,
} from 'src/utils/constants';

export type { TokenList, TokenInfo } from '@uniswap/token-lists/dist/types';
export { BigNumber } from 'src/utils/ethers';
Expand Down Expand Up @@ -50,7 +58,7 @@ export const supportedChains: Array<Chain> = [
decimals: 18,
logoURI: ETH_NETWORK_LOGO,
},
rpcUrls: [`https://mainnet.infura.io/v3/${String(process.env.INFURA_ID)}`],
rpcUrls: [MAINNET_RPC_URL],
blockExplorerUrls: ['https://etherscan.io'],
iconUrls: [ETH_NETWORK_LOGO],
logoURI: ETH_NETWORK_LOGO,
Expand All @@ -65,7 +73,7 @@ export const supportedChains: Array<Chain> = [
decimals: 18,
logoURI: ETH_NETWORK_LOGO,
},
rpcUrls: [`https://sepolia.infura.io/v3/${String(process.env.INFURA_ID)}`],
rpcUrls: [SEPOLIA_RPC_URL],
blockExplorerUrls: ['https://sepolia.etherscan.io'],
iconUrls: [ETH_NETWORK_LOGO],
logoURI: ETH_NETWORK_LOGO,
Expand All @@ -80,7 +88,7 @@ export const supportedChains: Array<Chain> = [
decimals: 18,
logoURI: ETH_NETWORK_LOGO,
},
rpcUrls: ['https://mainnet.optimism.io', `https://optimism-mainnet.infura.io/v3/${String(process.env.INFURA_ID)}`],
rpcUrls: ['https://mainnet.optimism.io', OPTIMISM_RPC_URL],
blockExplorerUrls: ['https://optimistic.etherscan.io'],
iconUrls: ['/networks/optimism.svg'],
logoURI: '/networks/optimism.svg',
Expand All @@ -95,7 +103,7 @@ export const supportedChains: Array<Chain> = [
decimals: 18,
logoURI: 'https://docs.gnosischain.com/img/tokens/xdai.png',
},
rpcUrls: ['https://rpc.ankr.com/gnosis'],
rpcUrls: ['https://rpc.ankr.com/gnosis', GNOSIS_CHAIN_RPC_URL],
blockExplorerUrls: ['https://gnosisscan.io'],
iconUrls: ['/networks/gnosis.svg'],
logoURI: '/networks/gnosis.svg',
Expand All @@ -110,7 +118,7 @@ export const supportedChains: Array<Chain> = [
decimals: 18,
logoURI: '/tokens/polygon.png',
},
rpcUrls: ['https://polygon-rpc.com/', `https://polygon-mainnet.infura.io/v3/${String(process.env.INFURA_ID)}`],
rpcUrls: ['https://polygon-rpc.com/', POLYGON_RPC_URL],
blockExplorerUrls: ['https://polygonscan.com'],
iconUrls: ['/networks/polygon.svg'],
logoURI: '/networks/polygon.svg',
Expand All @@ -125,7 +133,7 @@ export const supportedChains: Array<Chain> = [
decimals: 18,
logoURI: ETH_NETWORK_LOGO,
},
rpcUrls: ['https://arb1.arbitrum.io/rpc', `https://arbitrum-mainnet.infura.io/v3/${String(process.env.INFURA_ID)}`],
rpcUrls: ['https://arb1.arbitrum.io/rpc', ARBITRUM_ONE_RPC_URL],
blockExplorerUrls: ['https://arbiscan.io'],
iconUrls: ['/networks/arbitrum.svg'],
logoURI: '/networks/arbitrum.svg',
Expand Down
27 changes: 25 additions & 2 deletions frontend/src/utils/address.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,14 @@ import {
import { getChainById, jsonFetch } from 'src/utils/utils';
import { tc } from '../boot/i18n';
import Resolution from '@unstoppabledomains/resolution';
import { MAINNET_PROVIDER, POLYGON_PROVIDER, MULTICALL_ABI, MULTICALL_ADDRESS } from 'src/utils/constants';
import {
MAINNET_PROVIDER,
POLYGON_PROVIDER,
MULTICALL_ABI,
MULTICALL_ADDRESS,
MAINNET_RPC_URL,
POLYGON_RPC_URL,
} from 'src/utils/constants';
import { AddressZero, defaultAbiCoder } from 'src/utils/ethers';
import { UmbraApi } from 'src/utils/umbra-api';

Expand Down Expand Up @@ -49,7 +56,23 @@ export const lookupEnsName = async (address: string, provider: Provider | Static
export const lookupCnsName = async (address: string) => {
try {
// Send request to get names
const resolution = Resolution.infura(String(process.env.INFURA_ID));

const resolution = new Resolution({
sourceConfig: {
uns: {
locations: {
Layer1: {
url: MAINNET_RPC_URL,
network: 'mainnet',
},
Layer2: {
url: POLYGON_RPC_URL,
network: 'polygon-mainnet',
},
},
},
},
});
const domain = await resolution.reverse(address);
return domain;
} catch (err) {
Expand Down
4 changes: 4 additions & 0 deletions frontend/src/utils/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ export const MAINNET_RPC_URL = String(process.env.MAINNET_RPC_URL);
export const MAINNET_PROVIDER = new StaticJsonRpcProvider(MAINNET_RPC_URL);
export const POLYGON_RPC_URL = String(process.env.POLYGON_RPC_URL);
export const POLYGON_PROVIDER = new StaticJsonRpcProvider(POLYGON_RPC_URL);
export const OPTIMISM_RPC_URL = String(process.env.OPTIMISM_RPC_URL);
export const ARBITRUM_ONE_RPC_URL = String(process.env.ARBITRUM_ONE_RPC_URL);
export const SEPOLIA_RPC_URL = String(process.env.SEPOLIA_RPC_URL);
export const GNOSIS_CHAIN_RPC_URL = String(process.env.GNOSIS_CHAIN_RPC_URL);

console.log(`MAINNET_RPC_URL ${MAINNET_RPC_URL}`);

Expand Down
3 changes: 2 additions & 1 deletion frontend/src/utils/payment-links.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@ import { providerExport as provider, relayerExport as relayer, tokensExport as t
import { notifyUser } from 'src/utils/alerts';
import { BigNumber, StaticJsonRpcProvider } from 'src/utils/ethers';
import { UmbraApi } from 'src/utils/umbra-api';
import { MAINNET_RPC_URL } from 'src/utils/constants';

/**
* @notice Returns a provider, falling back to a mainnet provider if user's wallet is not connected
*/
function getProvider() {
return provider || new StaticJsonRpcProvider(`https://mainnet.infura.io/v3/${String(process.env.INFURA_ID)}`);
return provider || new StaticJsonRpcProvider(MAINNET_RPC_URL);
}

/**
Expand Down
6 changes: 6 additions & 0 deletions umbra-js/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,9 @@ POLYGONSCAN_API_KEY=yourPolygonscanApiKey
ARBISCAN_API_KEY=yourArbiscanApiKey
GNOSISSCAN_API_KEY=yourGnosisSafeScanApiKey
INFURA_ID=zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
MAINNET_RPC_URL=yourMainnetRpcUrl
OPTIMISM_RPC_URL=yourOptimismRpcUrl
GNOSIS_CHAIN_RPC_URL=yourGnosisChainRpcUrl
POLYGON_RPC_URL=yourPolygonRpcUrl
ARBITRUM_ONE_RPC_URL=yourArbitrumOneRpcUrl
SEPOLIA_RPC_URL=yourSepoliaRpcUrl
10 changes: 6 additions & 4 deletions umbra-js/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -222,9 +222,11 @@ the resulting `umbra-js/docs/index.html` file in your browser to view the docume

## Development

1. Create a file in this directory called `.env` that looks like the one below.
```bash
INFURA_ID=yourInfuraId
```
1. Copy the `.env.example` to `.env` and populate it with your own configuration parameters.

```bash
cp .env.example .env
```

2. Run `yarn` to install packages
3. Run `yarn test` to run all tests.
22 changes: 10 additions & 12 deletions umbra-js/src/classes/Umbra.ts
Original file line number Diff line number Diff line change
Expand Up @@ -119,18 +119,18 @@ const isEth = (token: string) => {
};

/**
* @notice Returns the Infura RPC URL for the provided chainId and Infura ID
* @notice Returns an RPC URL for the provided chainId
*/
const infuraUrl = (chainId: BigNumberish, infuraId: string) => {
const rpcUrlFromChain = (chainId: BigNumberish) => {
chainId = BigNumber.from(chainId).toNumber();
// For Hardhat, we just use the mainnet chain ID to avoid errors in tests, but this doesn't affect anything.
if (chainId === 1 || chainId === 1337) return `https://mainnet.infura.io/v3/${infuraId}`;
if (chainId === 10) return `https://optimism-mainnet.infura.io/v3/${infuraId}`;
if (chainId === 100) return 'https://rpc.ankr.com/gnosis';
if (chainId === 137) return `https://polygon-mainnet.infura.io/v3/${infuraId}`;
if (chainId === 42161) return `https://arbitrum-mainnet.infura.io/v3/${infuraId}`;
if (chainId === 11155111) return `https://sepolia.infura.io/v3/${infuraId}`;
throw new Error(`No Infura URL for chainId ${chainId}.`);
if (chainId === 1 || chainId === 1337) return String(process.env.MAINNET_RPC_URL);
if (chainId === 10) return String(process.env.OPTIMISM_RPC_URL);
if (chainId === 100) return String(process.env.GNOSIS_CHAIN_RPC_URL);
if (chainId === 137) return String(process.env.POLYGON_RPC_URL);
if (chainId === 42161) return String(process.env.ARBITRUM_ONE_RPC_URL);
if (chainId === 11155111) return String(process.env.SEPOLIA_RPC_URL);
throw new Error(`No RPC URL for chainId ${chainId}.`);
};

export class Umbra {
Expand All @@ -154,9 +154,7 @@ export class Umbra {
if (this.chainConfig.batchSendAddress) {
this.batchSendContract = new Contract(this.chainConfig.batchSendAddress, UMBRA_BATCH_SEND_ABI, provider);
}
this.fallbackProvider = new StaticJsonRpcProvider(
infuraUrl(this.chainConfig.chainId, String(process.env.INFURA_ID))
);
this.fallbackProvider = new StaticJsonRpcProvider(rpcUrlFromChain(this.chainConfig.chainId));
}

// ==================================== CONTRACT INTERACTION =====================================
Expand Down
22 changes: 18 additions & 4 deletions umbra-js/src/utils/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -329,7 +329,22 @@ export function isDomain(name: string) {
*/

function getResolutionInstance() {
return Resolution.infura(String(process.env.INFURA_ID));
return new Resolution({
sourceConfig: {
uns: {
locations: {
Layer1: {
url: String(process.env.MAINNET_RPC_URL),
network: 'mainnet',
},
Layer2: {
url: String(process.env.POLYGON_RPC_URL),
network: 'polygon-mainnet',
},
},
},
},
});
}

/**
Expand All @@ -345,8 +360,7 @@ async function resolveEns(name: string, provider: EthersProvider) {
// and overriding with a mainnet provider otherwise. This ensures ENS resolution is always done
// against L1, as explained here: https://twitter.com/makoto_inoue/status/1453737962110275598
const { chainId } = await provider.getNetwork();
if (chainId !== 1)
provider = new StaticJsonRpcProvider(`https://mainnet.infura.io/v3/${String(process.env.INFURA_ID)}`);
if (chainId !== 1) provider = new StaticJsonRpcProvider(String(process.env.MAINNET_RPC_URL));
const address = await provider.resolveName(name);
return address || null;
} catch (e) {
Expand Down Expand Up @@ -536,7 +550,7 @@ export async function checkSupportedAddresses(recipientIds: string[]) {
// If there are a lot of ENS or CNS names here this will send too many RPC requests and trigger
// errors. The current use case of this method takes addresses, so this should not be a problem.
// If it becomes a problem, add a batched version of toAddress.
const provider = new StaticJsonRpcProvider(`https://mainnet.infura.io/v3/${String(process.env.INFURA_ID)}`);
const provider = new StaticJsonRpcProvider(String(process.env.MAINNET_RPC_URL));
const addresses = await Promise.all(recipientIds.map((recipientId) => toAddress(recipientId, provider)));

// Initialize output, start by assuming all are supported.
Expand Down
Loading