Use Alchemy as fallback provider

This commit is contained in:
Alexis Sellier
2021-05-21 15:06:14 +02:00
parent 4728a0ca72
commit 8e73432703
11 changed files with 112 additions and 50 deletions
+7 -7
View File
@@ -13,7 +13,7 @@
"devDependencies": { "devDependencies": {
"@snowpack/plugin-svelte": "^3.5.2", "@snowpack/plugin-svelte": "^3.5.2",
"@tsconfig/svelte": "^1.0.10", "@tsconfig/svelte": "^1.0.10",
"snowpack": "^3.0.1", "snowpack": "^3.5.0",
"svelte-check": "^1.5.2", "svelte-check": "^1.5.2",
"svelte-preprocess": "^4.7.2", "svelte-preprocess": "^4.7.2",
"typescript": "^4.2.4" "typescript": "^4.2.4"
@@ -2943,9 +2943,9 @@
} }
}, },
"node_modules/snowpack": { "node_modules/snowpack": {
"version": "3.3.7", "version": "3.5.0",
"resolved": "https://registry.npmjs.org/snowpack/-/snowpack-3.3.7.tgz", "resolved": "https://registry.npmjs.org/snowpack/-/snowpack-3.5.0.tgz",
"integrity": "sha512-7I5wznB6wGKq2fi6pxU3UZLEe3R0a5IChO8x+w0iYT7/oERubkbzc/SXTMXm6lVvtYMs2W1AkE+0VHP1KI0IEw==", "integrity": "sha512-RlQbyXlILgGKYkvlYHzDydM1V2xAgQ5ZQsb/BUlkzAqNlbFSbyM2Genfw3eWTfk6o5kG0BrpdAmyGcTpN1Q+UQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"cli-spinners": "^2.5.0", "cli-spinners": "^2.5.0",
@@ -5632,9 +5632,9 @@
"dev": true "dev": true
}, },
"snowpack": { "snowpack": {
"version": "3.3.7", "version": "3.5.0",
"resolved": "https://registry.npmjs.org/snowpack/-/snowpack-3.3.7.tgz", "resolved": "https://registry.npmjs.org/snowpack/-/snowpack-3.5.0.tgz",
"integrity": "sha512-7I5wznB6wGKq2fi6pxU3UZLEe3R0a5IChO8x+w0iYT7/oERubkbzc/SXTMXm6lVvtYMs2W1AkE+0VHP1KI0IEw==", "integrity": "sha512-RlQbyXlILgGKYkvlYHzDydM1V2xAgQ5ZQsb/BUlkzAqNlbFSbyM2Genfw3eWTfk6o5kG0BrpdAmyGcTpN1Q+UQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"cli-spinners": "^2.5.0", "cli-spinners": "^2.5.0",
+1 -1
View File
@@ -8,7 +8,7 @@
"devDependencies": { "devDependencies": {
"@snowpack/plugin-svelte": "^3.5.2", "@snowpack/plugin-svelte": "^3.5.2",
"@tsconfig/svelte": "^1.0.10", "@tsconfig/svelte": "^1.0.10",
"snowpack": "^3.0.1", "snowpack": "^3.5.0",
"svelte-check": "^1.5.2", "svelte-check": "^1.5.2",
"svelte-preprocess": "^4.7.2", "svelte-preprocess": "^4.7.2",
"typescript": "^4.2.4" "typescript": "^4.2.4"
+1
View File
@@ -43,6 +43,7 @@
--color-foreground-6: #d3dee8; --color-foreground-6: #d3dee8;
--color-background: #0b131a; --color-background: #0b131a;
--color-glow: #5555ff22; --color-glow: #5555ff22;
--color-glow-error: #ff555522;
--color-subtle: #777; --color-subtle: #777;
--font-family-sans-serif: Inter, sans-serif; --font-family-sans-serif: Inter, sans-serif;
+3
View File
@@ -1,5 +1,8 @@
/** @type {import("snowpack").SnowpackUserConfig } */ /** @type {import("snowpack").SnowpackUserConfig } */
module.exports = { module.exports = {
env: {
RADICLE_ALCHEMY_API_KEY: process.env.RADICLE_ALCHEMY_API_KEY,
},
mount: { mount: {
public: '/', public: '/',
src: '/dist', src: '/dist',
+22 -8
View File
@@ -10,6 +10,8 @@
import Orgs from '@app/base/orgs/Routes.svelte'; import Orgs from '@app/base/orgs/Routes.svelte';
import Resolver from '@app/base/resolver/Routes.svelte'; import Resolver from '@app/base/resolver/Routes.svelte';
import Header from '@app/Header.svelte'; import Header from '@app/Header.svelte';
import Loading from '@app/Loading.svelte';
import Modal from '@app/Modal.svelte';
function handleKeydown(event: KeyboardEvent) { function handleKeydown(event: KeyboardEvent) {
if (event.key === 'Enter') { if (event.key === 'Enter') {
@@ -30,10 +32,11 @@
</style> </style>
<svelte:window on:keydown={handleKeydown} /> <svelte:window on:keydown={handleKeydown} />
{#await getConfig()} <div class="app">
<!-- Loading wallet --> {#await getConfig()}
{:then config} <!-- Loading wallet -->
<div class="app"> <Loading center />
{:then config}
<Header session={$session} {config} /> <Header session={$session} {config} />
<div class="wrapper"> <div class="wrapper">
<Router> <Router>
@@ -48,7 +51,18 @@
<Resolver {config} /> <Resolver {config} />
</Router> </Router>
</div> </div>
</div> {:catch err}
{:catch} <div class="wrapper">
<!-- Show error --> <Modal error subtle>
{/await} <span slot="title">
<h3>👻</h3>
<div>Error connecting to network</div>
</span>
<span slot="body">
{err}
</span>
</Modal>
</div>
{/await}
</div>
+2 -1
View File
@@ -10,11 +10,12 @@
export let subtitle: string = ""; export let subtitle: string = "";
export let message: string = ""; export let message: string = "";
export let floating = false; export let floating = false;
export let subtle = false;
let body = message || (error && error.message) || ""; let body = message || (error && error.message) || "";
</script> </script>
<Modal on:close error {floating}> <Modal on:close error {floating} {subtle}>
<span slot="title"> <span slot="title">
{title} {title}
</span> </span>
+18 -5
View File
@@ -13,7 +13,9 @@
import type { Config } from '@app/config'; import type { Config } from '@app/config';
export let session: Session | null; export let session: Session | null;
export let config: Config; export let config: Config | null;
console.log(config);
let sessionButton: HTMLElement | null = null; let sessionButton: HTMLElement | null = null;
let sessionButtonHover = false; let sessionButtonHover = false;
@@ -78,6 +80,13 @@
margin: 0 2rem; margin: 0 2rem;
border-radius: var(--border-radius); border-radius: var(--border-radius);
} }
.network.unavailable {
color: #888;
background-color: #ffffff11;
}
.network:last-child {
margin-right: 0;
}
</style> </style>
{#if $error} {#if $error}
@@ -98,17 +107,21 @@
<div class="nav"> <div class="nav">
<a use:link href="/registrations">Register</a> <a use:link href="/registrations">Register</a>
<a use:link href="/vesting/">Vesting</a> <a use:link href="/vesting/">Vesting</a>
{#if config.network.name === 'ropsten'} {#if config && config.network.name === 'ropsten'}
<a use:link href="/orgs/">Orgs</a> <a use:link href="/orgs/">Orgs</a>
{/if} {/if}
</div> </div>
</div> </div>
<div> <div>
{#if config.network.name == 'ropsten'} {#if config && config.network.name == 'ropsten'}
<span class="network">Ropsten</span> <span class="network">Ropsten</span>
{:else if config.network.name == 'rinkeby'} {:else if config && config.network.name == 'rinkeby'}
<span class="network">Rinkeby</span> <span class="network">Rinkeby</span>
{:else if config && config.network.name == 'homestead'}
<!-- Don't show anything -->
{:else}
<span class="network unavailable">No Network</span>
{/if} {/if}
{#if address} {#if address}
@@ -127,7 +140,7 @@
{formatAddress(address)} {formatAddress(address)}
{/if} {/if}
</button> </button>
{:else} {:else if config}
<Connect className="small" {config} /> <Connect className="small" {config} />
{/if} {/if}
</div> </div>
+6
View File
@@ -40,6 +40,12 @@
transparent 70% transparent 70%
); );
} }
.modal.modal-subtle.error {
background: radial-gradient(
var(--color-glow-error) 0%,
transparent 70%
);
}
.modal-title { .modal-title {
font-size: 1.25rem; font-size: 1.25rem;
font-weight: bold; font-weight: bold;
+49 -26
View File
@@ -7,17 +7,45 @@ declare global {
ethereum: any; ethereum: any;
registrarState: any; registrarState: any;
} }
interface ImportMeta {
env: {
RADICLE_ALCHEMY_API_KEY: string | null,
}
}
} }
export type Config = { export class Config {
network: { name: string, chainId: number }, network: { name: string, chainId: number };
registrar: { address: string, domain: string }, registrar: { address: string, domain: string };
radToken: { address: string }, radToken: { address: string };
orgFactory: { address: string }, orgFactory: { address: string };
gasLimits: { createOrg: number }, gasLimits: { createOrg: number };
provider: ethers.providers.JsonRpcProvider, provider: ethers.providers.JsonRpcProvider;
signer: ethers.Signer & TypedDataSigner, signer: ethers.Signer & TypedDataSigner | null;
};
constructor(
network: { name: string, chainId: number },
provider: ethers.providers.JsonRpcProvider
) {
let cfg = (<Record<string, any>> config)[network.name];
let signer = null;
try {
signer = provider.getSigner();
} catch (e) {
console.log(e.message);
}
this.network = network;
this.registrar = cfg.registrar;
this.radToken = cfg.radToken;
this.orgFactory = cfg.orgFactory;
this.provider = provider;
this.signer = signer;
this.gasLimits = gasLimits;
}
}
/// Gas limits for various transactions. /// Gas limits for various transactions.
const gasLimits = { const gasLimits = {
@@ -30,26 +58,21 @@ function isMetamaskInstalled(): boolean {
} }
export async function getConfig(): Promise<Config> { export async function getConfig(): Promise<Config> {
let config: Config;
if (isMetamaskInstalled()) { if (isMetamaskInstalled()) {
const provider = new ethers.providers.Web3Provider(window.ethereum); const provider = new ethers.providers.Web3Provider(window.ethereum);
const network = await provider.ready;
let network = await provider.ready; config = new Config(network, provider);
let cfg = (<Record<string, any>> config)[network.name];
if (cfg) {
return {
network,
registrar: cfg.registrar,
radToken: cfg.radToken,
orgFactory: cfg.orgFactory,
provider: provider,
signer: provider.getSigner(),
gasLimits: gasLimits,
};
} else {
throw `Wrong network: ${network.name}`;
}
} else { } else {
throw "No provider available"; const network = { name: "homestead", chainId: 1 };
const apiKey = import.meta.env.RADICLE_ALCHEMY_API_KEY;
const provider = new ethers.providers.AlchemyProvider(network.name, apiKey);
config = new Config(network, provider);
} }
console.log(config);
return config;
} }
+1 -1
View File
@@ -70,7 +70,7 @@
<Modal floating> <Modal floating>
<div slot="title"> <div slot="title">
{#if mismatchError} {#if mismatchError}
🦉 👻
{:else} {:else}
🖊️ 🖊️
{/if} {/if}
+2 -1
View File
@@ -8,7 +8,8 @@
"node_modules/*" "node_modules/*"
], ],
"compilerOptions": { "compilerOptions": {
"target": "es2019", "target": "es2020",
"module": "es2020",
"types": [ "types": [
"svelte" "svelte"
], ],