softwarecurator / svelte-wagmi

69 stars 8 forks source link

Svelte Wagmi

Svelte Wagmi is a package that provides a collection of Svelte stores and functions for interacting with the Ethereum network. It utilizes the @wagmi/core library for connecting to Ethereum networks and signing transactions.

Installation

To install the package and its peer dependencies, run the following command:

npm install svelte-wagmi viem @wagmi/core @wagmi/connectors

Usages

connected

The connected store indicates whether the application is currently connected to an Ethereum provider. It is a boolean store that is set to true when the application is connected and false otherwise.

Example usage:

<script>
    import { connected } from 'svelte-wagmi';
</script>

{#if $connected}
    <p>Connected to Ethereum</p>
{:else}
    <p>Not connected to Ethereum</p>
{/if}

wagmiLoaded

The wagmiLoaded store indicates whether the @wagmi/core library has been loaded and initialized. It is a boolean store that is set to true when the library is loaded and false otherwise.

Example usage:

<script>
    import { wagmiLoaded } from 'svelte-wagmi';
</script>

{#if $wagmiLoaded}
    <p>@wagmi/core is loaded and initialized</p>
{:else}
    <p>@wagmi/core is not yet loaded</p>
{/if}

chainId

The chainId store contains the current chain ID of the connected Ethereum provider. It is a number store that is set to null if the provider is not connected or if the chain ID is unknown.

Example usage:

<script>
    import { chainId } from 'svelte-wagmi';
</script>

{#if $chainId}
    <p>Current chain ID: {$chainId}</p>
{:else}
    <p>Chain ID not yet available</p>
{/if}

signerAddress

The signerAddress store contains the current signer address of the connected Ethereum provider. It is a string store that is set to null if the provider is not connected or if the signer address is unknown.

Example usage:

<script>
    import { signerAddress } from 'svelte-wagmi';
</script>

{#if $signerAddress}
    <p>Current signer address: {$signerAddress}</p>
{:else}
    <p>Signer address not yet available</p>
{/if}

loading

The loading store indicates whether the application is currently loading data from the Ethereum provider. It is a boolean store that is set to true when the application is loading and false otherwise.

Example usage:

<script>
    import { loading } from 'svelte-wagmi';
</script>

{#if $loading}
    <p>Loading data...</p>
{:else}
    <p>Data loaded</p>
{/if}

web3Modal

The web3Modal store contains an instance of the Web3Modal class from the @web3modal/html package. It is used to display a modal for connecting to an Ethereum provider using WalletConnect or other methods. Example usage:

<script>
    import { web3Modal } from 'svelte-wagmi';
</script>

{#if $web3Modal}
    <button on:click={() => $web3Modal.open()}> Connect to Ethereum</button>
{:else}
    <p>Web3Modal not yet available</p>
{/if}

defaultConfig

The defaultConfig function is used to configure the @wagmi/core library and initialize the Svelte stores. It takes an optional options object that can be used to configure the behavior of the function.

Return Value:

The defaultConfig function returns an object with the following properties:

Example usage:

<script>
    import { defaultConfig } from 'svelte-wagmi';
    import { onMount } from 'svelte';
    import { PUBLIC_WALLETCONNECT_ID, PUBLIC_ALCHEMY_ID } from '$env/static/public';
    import { injected } from '@wagmi/connectors';

    onMount(async () => {
        const erckit = defaultConfig({
            appName: 'erc.kit',
            walletConnectProjectId: PUBLIC_WALLETCONNECT_ID,
            alchemyId: PUBLIC_ALCHEMY_ID,
            connectors: [injected()]
        });
    });

    await erckit.init();
</script>

configuredConnectors

The configuredConnectors are store value array

Example usage:

<script>
    import { configuredConnectors } from 'svelte-wagmi';

    for (const connector of $configuredConnectors) {
        console.log(connector);
    }
</script>

<button on:click={connectToEthereum}>Connect to Ethereum</button>

WC

The WC function is used to connect to an Ethereum provider using WalletConnect. It takes one parameter:

<script>
    import { WC } from 'svelte-wagmi';

    async function connectToEthereum() {
        await WC('Sign in to the app with Ethereum');
    }
</script>

<button on:click={connectToEthereum}>Connect to Ethereum</button>

disconnectWagmi

The disconnectWagmi function is used to disconnect from the Ethereum provider and clear the Svelte stores. Example usage:

<script>
    import { disconnectWagmi } from 'svelte-wagmi';

    async function disconnectFromEthereum() {
        await disconnectWagmi();
    }
</script>

<button on:click={disconnectFromEthereum}>Disconnect from Ethereum</button>

Svelte stores

The svelte-wagmi library also provides several Svelte stores that can be used to retrieve information about the user's Ethereum connection:

<script>
    import { connected, chainId, signerAddress } from 'svelte-wagmi';

    $: console.log('Connected:', $connected);
    $: console.log('Chain ID:', $chainId);
    $: console.log('Signer address:', $signerAddress);
</script>

<p>Connected: {$connected ? 'Yes' : 'No'}</p>
<p>Chain ID: {$chainId}</p>
<p>Signer address: {$signerAddress}</p>

Using @wagmi/core

You can use any wagmi/core functions by passing $wagmiConfig from svelte-wagmi

<script>
    import { getAccount, switchNetwork } from '@wagmi/core';
    import { wagmiConfig } from 'svelte-wagmi';

    const account = getAccount($wagmiConfig);

    const network = await switchNetwork($wagmiConfig, {
        chainId: 69
    });
</script>

Note

changing network using @wagmi/core will also chage the svelte-wagmi: chainId store

$signerAddress and getAccount() are the same ETH address.

If you experience an error from @Web3Modal/connectors that "process is not defined", a workaround is to defined process.env explicitly in your vite.config.ts

export default defineConfig({
    // ... rest of your config
    define: {
        'process.env': {}
    }
});

Roadmap

this is a basic package I made for projects and can add more features if people like this.