9. Waku (optional)

Imports

import {
  NETWORK_CONFIG,
  type CachedTokenFee,
  type FeeTokenDetails,
  type NetworkName,
  type SelectedBroadcaster,
  type TransactionGasDetails,
} from "@railgun-community/shared-models";
import { calculateBroadcasterFeeERC20Amount } from "@railgun-community/wallet";
const wakuModule = import("@railgun-community/waku-broadcaster-client-node");
// let wakuModule: any;

let WakuBroadcasterClient: any;
let BroadcasterTransaction: any;

let waku: any; 

Setup Waku

export const initializeBroadcasters = async (network: NetworkName) => {
  if (!waku) {
    waku = await wakuModule;
  }
  WakuBroadcasterClient = waku.WakuBroadcasterClient;
  BroadcasterTransaction = waku.BroadcasterTransaction;

  const { chain } = NETWORK_CONFIG[network];
  const options = {};
  const callback = (chain: any, status: any) => {
    if (status !== "Connected") {
      console.log(`WAKU ${chain.id}:${chain.type} ${status}`);
    }
  };
  const debugLogger = {
    log: (_msg: string) => {
      console.log(msg);
    },
    error: (error: Error) => {
      console.error(error);
    },
  };
  WakuBroadcasterClient.start(chain, options, callback, debugLogger);
};

Utility Functions

export const getBroadcasterFeeInfo = async (
  network: NetworkName,
  tokenAddress: string
): Promise<SelectedBroadcaster> => {
  const { chain } = NETWORK_CONFIG[network];
  return await WakuBroadcasterClient.findBestBroadcaster(
    chain,
    tokenAddress,
    true
  );
};

// TODO: write out broadcaster transaction cost calculation function

export const getBroadcasterFeeRecipientDetails = async (
  selectedBroadcaster: SelectedBroadcaster,
  estimatedGasDetails: TransactionGasDetails,
  feeTokenDetails: FeeTokenDetails
) => {
  const broadcasterFeeAmountDetails = calculateBroadcasterFeeERC20Amount(
    feeTokenDetails,
    estimatedGasDetails
  );

  const broadcasterFeeERC20AmountRecipient = {
    tokenAddress: broadcasterFeeAmountDetails.tokenAddress,
    amount: broadcasterFeeAmountDetails.amount,
    recipientAddress: selectedBroadcaster.railgunAddress,
  };

  return broadcasterFeeERC20AmountRecipient;
};

export const getFeeTokenDetails = async (
  network: NetworkName,
  tokenAddress: string,
  sendWithPublicWallet: boolean = true
) => {
  if (sendWithPublicWallet) {
    return {
      broadcaster: undefined,
      feeTokenDetails: undefined,
    };
  }
  const broadcaster = await getBroadcasterFeeInfo(network, tokenAddress);
  const feeTokenDetails: FeeTokenDetails = {
    tokenAddress: broadcaster.tokenAddress,
    feePerUnitGas: BigInt(broadcaster.tokenFee.feePerUnitGas),
  };

  return {
    broadcaster,
    feeTokenDetails,
  };
};

export const getBroadcasterDetails = async (
  estimatedGasDetails: TransactionGasDetails,
  selectedBroadcaster: SelectedBroadcaster | undefined,
  feeTokenDetails: FeeTokenDetails | undefined
) => {
  if (!selectedBroadcaster || !feeTokenDetails) {
    return undefined;
  }
  // gets a broadcaster from the waku client based on tokenAddress

  // const { broadcaster, feeTokenDetails } = await getFeeTokenDetails(
  //   network,
  //   tokenAddress
  // );

  const feeRecipientDetails = await getBroadcasterFeeRecipientDetails(
    selectedBroadcaster,
    estimatedGasDetails,
    feeTokenDetails
  );

  const broadcasterFeeERC20AmountRecipient = {
    tokenAddress: feeRecipientDetails.tokenAddress,
    amount: feeRecipientDetails.amount,
    recipientAddress: feeRecipientDetails.recipientAddress,
  };

  return {
    selectedBroadcaster,
    broadcasterFeeERC20AmountRecipient,
  };
};

Last updated