Skip to content

LearnWeb3

LearnWeb3 is a platform that allows users to claim testnet tokens for different networks.

lib/learnweb3.ts
import axios from "axios";
 
export const BASE_TX_FRAME_URL = "https://tx-receipt.vercel.app";
export const SUPPORTED_NETWORKS = [
  "arbitrum_goerli",
  "arbitrum_sepolia",
  "base_goerli",
  "base_sepolia",
  "base_sepolia_usdc",
  "celo_alfajores",
  "fantom_testnet",
  "goerli",
  "holesky",
  "linea_goerli",
  "linea_sepolia",
  "manta_testnet",
  "mode_sepolia",
  "morph_sepolia",
  "optimism_goerli",
  "optimism_sepolia",
  "polygon_amoy",
  "polygon_mumbai",
  "polygon_zkevm",
  "scroll_sepolia",
  "sepolia",
  "taiko_jolnir",
  "zksync_sepolia",
  "zora_sepolia",
] as const;
 
export const CLAIM_EVERY = 24 * 60 * 60 * 1000; // 24 hours
 
export const ONE_DAY = 24 * 60 * 60 * 1000; // 24 hours
 
export const FIVE_MINUTES = 5 * 60 * 1000; // 5 minutes
 
export const EVM_TOKENS = ["ETH", "MATIC", "USDC", "CELO", "BERA"];
 
export interface Network {
  networkId: string;
  networkName: string;
  networkLogo: string;
  tokenName: string;
  dripAmount: number;
  address: string;
  isERC20: boolean;
  erc20Address?: string;
  erc20Decimals?: number;
  isActive: boolean;
  balance: string;
}
export interface DripTokensResponse {
  ok: boolean;
  error?: string;
  value?: string;
}
 
export class LearnWeb3Client {
  public BASE_URL = "https://learnweb3.io/api/faucet";
  private apiKey = process.env.LEARN_WEB3_API_KEY;
  constructor() {
    if (!process.env.LEARN_WEB3_API_KEY) {
      throw new Error("Please set the LEARN_WEB3_API_KEY environment variable");
    }
    this.apiKey = process.env.LEARN_WEB3_API_KEY;
  }
 
  async getNetworks(onlyEvm = true): Promise<Network[]> {
    const response = await axios(`${this.BASE_URL}/networks`);
    const data: Network[] = response.data;
    if (onlyEvm) {
      return data.filter(
        (network) =>
          EVM_TOKENS.some((t) =>
            network.tokenName.toLowerCase().includes(t.toLowerCase())
          ) && network.isActive
      );
    }
    return data.filter((network) => network.isActive);
  }
 
  async dripTokens(
    networkId: string,
    recipientAddress: string
  ): Promise<DripTokensResponse> {
    const response = await axios.post(
      `${this.BASE_URL}/drip`,
      { networkId, recipientAddress },
      {
        headers: {
          authorization: `Bearer ${this.apiKey}`,
        },
      }
    );
    return response.data;
  }
}