Skip to content

Commit

Permalink
Change from infura to generic RPC URLS (#636)
Browse files Browse the repository at this point in the history
* Changed unfuraUrl to rpcUrlFromChain in UmbraJs

* Switched to use env vars for RPC URLs instead of infura URLs

* Switch to RPC URLs for CNS resolution related calls

* Updated UmbraJS Umbra.ts with env var names matching frontend usage for consistency

* Update .env.example and README.md files for both frontend and umbra-js

---------

Co-authored-by: Ben DiFrancesco <[email protected]>
  • Loading branch information
jferas and apbendi authored Jan 30, 2024
1 parent 75ec7f4 commit ff8f824
Show file tree
Hide file tree
Showing 10 changed files with 97 additions and 32 deletions.
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';
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

0 comments on commit ff8f824

Please sign in to comment.