mirror of
https://seed.radicle.dev/rad:z4V1sjrXqjvFdnCUbxPFqd5p4DtH5.git
synced 2026-10-18 19:30:27 +08:00
Use Alchemy as fallback provider
This commit is contained in:
Generated
+7
-7
@@ -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
@@ -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"
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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
@@ -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>
|
||||||
|
|||||||
@@ -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
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -70,7 +70,7 @@
|
|||||||
<Modal floating>
|
<Modal floating>
|
||||||
<div slot="title">
|
<div slot="title">
|
||||||
{#if mismatchError}
|
{#if mismatchError}
|
||||||
🦉
|
👻
|
||||||
{:else}
|
{:else}
|
||||||
🖊️
|
🖊️
|
||||||
{/if}
|
{/if}
|
||||||
|
|||||||
+2
-1
@@ -8,7 +8,8 @@
|
|||||||
"node_modules/*"
|
"node_modules/*"
|
||||||
],
|
],
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"target": "es2019",
|
"target": "es2020",
|
||||||
|
"module": "es2020",
|
||||||
"types": [
|
"types": [
|
||||||
"svelte"
|
"svelte"
|
||||||
],
|
],
|
||||||
|
|||||||
Reference in New Issue
Block a user