Plug and play

Plug and play

Installation

npm install @winr-labs/games @winr-labs/web3-games @winr-labs/web3

Example project

addresses file:

import { Address } from 'viem';
import { NetworkMode, NetworkName } from './networks';
 
export type AddressName =
  | 'coinFlip'
  | 'dice'
  | 'keno'
  | 'limbo'
  | 'plinko'
  | 'roll'
  | 'roulette'
  | 'rps'
  | 'winrBonanza'
  | 'uiOperator'
  | 'cashier'
  | 'controller'
  | 'entryPoint'
  | 'factory'
  | 'weth'
  | 'baccarat'
  | 'videoPoker'
  | 'mines'
  | 'wheel'
  | 'blackjack'
  | 'blackjackReader'
  | 'horseRace'
  | 'lock'
  | 'reward'
  | 'rewardReader'
  | 'badge'
  | 'crash'
  | 'rankMiddleware'
  | 'statisticsStore'
  | 'referral'
  | 'singleBlackjack'
  | 'singleBlackjackReader'
  | 'holdemPoker'
  | 'vauldAdapter'
  | 'shareToken'
  | 'liquidityManager'
  | 'bankrollVault'
  | 'paymaster'
  | 'rewardConditional'
  | 'rewardConditionalRouter'
  | 'rewardConditionalLottery'
  | 'winrOfOlympus'
  | 'winrOfOlympus1000'
  | 'princessWinr'
  | 'singleWheel'
  | 'cashback'
  | 'strategyStore'
  | 'degensCashier'
  | 'degensController'
  | 'degensReader'
  | 'yakRouter'
  | 'winrBonanza1000';
 
export const addresses: Record<NetworkName, Record<NetworkMode, Record<AddressName, Address>>> = {
  winr: {
    mainnet: {
      coinFlip: '0x12A977A09E99A3dd259c6Cd7Ef6fD2Ef139F0FF7',
      dice: '0xeECC11E7e85AB0b061dc1fACE1A9d4173158E463',
      keno: '0x9283C3c6C4408c3682241457E9c7E1B36B61D332',
      limbo: '0xE0700c66bD73F08A09060075b672a1252d5dD91E',
      plinko: '0x68F338C1E65Cf0520b908cdFa19e43FAd37CFE4f',
      roll: '0x95Bc97547d647B64AC628970b3DD0e344d6Df38E',
      roulette: '0x791cd9e4916D82eC9e4ddd07cd2cBD6E21343B64',
      rps: '0xe14ba387C33eE35FDF3e0F92C9DB6687904A5658',
      uiOperator: '0xe7503862f9eea03892dadcdcb73634de4fc4e31b',
      cashier: '0x8c2bF4A5Cd4872b01401b7be146e7eB7f555976D',
      controller: '0x9F41ceCb160B07120B9aAaECE541CF834f95520A',
      rankMiddleware: '0xdaa44b9CE9e73ae4672397077f17c3358b2e4647',
      entryPoint: '0x4E1e998d1F1E1303bA33a0Faae64f452c43fBE81',
      factory: '0x94C7e000B746ee0B8bdAde728E3949d06448a777',
      baccarat: '0x5a6C2C3fBC5040722Be522Ece95c5A17F60a8970',
      winrBonanza: '0xd23cC0FA3cC2E54d0E101ED09B7a6B6A895eC1BA',
      weth: '0xE60256921AE414D7B35d6e881e47931f45E027cf',
      referral: '0x2426a1982caE9703358E642f5E16E26f6627154b',
      videoPoker: '0x5C51895902aA8C981dc42492f29cDc2D18336646',
      mines: '0x408453A5d47aB99EE34cF79486008C5da7D3823d',
      wheel: '0xE6d350A640DA83867D69D7186edFFE4Ed0827916',
      blackjack: '0x594e41DC8d5C22674aeBAcbFCF77Cd0d43cCad26',
      blackjackReader: '0x64E5b83a81A788C75b1E2BE743595439fB2aa2EF',
      horseRace: '0x01022c93D62D3A1ad47aEC8231A490CD9270fFc9',
      lock: '0x7f3E35B41BDF7DBA6a90661918d0EfDDC6C15c3C',
      reward: '0x5e3a5Bd6aF0BBdA5F38eFb02FBCE5fB8cCAE3BD2',
      rewardReader: '0x21920Fe60E6D66834A3006b4A1A171F7C158F172',
      badge: '0x34Ccc96436637e18a02c05D794C92952a82f3A50',
      crash: '0x0958766e1b575C13593EFd926793b3c808Aaa71C',
      statisticsStore: '0x7860CdDdB6027EffD09811e56D9E5737023805a3',
      singleBlackjack: '0xdA1aD4C30c4d827894B282ee65180d14E17A75A4',
      singleBlackjackReader: '0x14697663dC537e13ff90440fc134E843FFd610ec',
      holdemPoker: '0x1DdC72DFbe5E86c7386B2Add649B2f9aaEa771E2',
      vauldAdapter: '0xc942b79E51fe075c9D8d2c7501A596b4430b9Dd7',
      shareToken: '0x077133aad44affca628aFf96f8cFFf2483759928',
      liquidityManager: '0xa1EFEaaF8C2D05168188fe01daad0BF220F0FC40',
      bankrollVault: '0x626FD796d45b6e0af7fe6265f4162065514E9eB7',
      paymaster: '0x37C6F569A0d68C8381Eb501b79F501aDc132c144',
      rewardConditional: '0xd525BaE6de08D1f65BE9CB4C09b8b6AD91ecCADD',
      rewardConditionalRouter: '0x860dec012b577C7fF62b6899581581CB4089AAf7',
      rewardConditionalLottery: '0x8d8Dd780dFa7413ac33aFc79053e4b6ad0c689dc',
      winrOfOlympus: '0xeA377dE584CDfb86F544A37D35FA19481a856f5e',
      winrOfOlympus1000: '0x26e423BC0b1915423B3C2FCF07C4150d6bB32c6b',
      princessWinr: '0x17D57C62480F2950b5938C5DbB4C62d55a18ED1f',
      cashback: '0xe36D7aFAc9e9B9a3aA2f93CD1625dB3A82c15aFb',
      singleWheel: '0x',
      degensCashier: '0x8A7bcB0F02bb72282bf76a6E0E8692048d344342',
      degensController: '0x7b654aEddAD827b9E82850F37619Ee1099A308C7',
      degensReader: '0x947146d9e368AF09C160d5c043779dB798dC488b',
      strategyStore: '0x662fb4d9b5d8eaf280af00c2fe8b02f8e5a86e80',
      yakRouter: '0x2b59Eb03865D18d8B62a5956BBbFaE352fc1C148',
      winrBonanza1000: '0x38cBDC6DdAD430D11b3c6bb6A646770DfC725630',
    },
    testnet: {
      coinFlip: '0x2403740b4EAf1A2d89f2251e027Fe9C9736C841f',
      dice: '0x522F05DCe25100A16dc8870e282CF411707a6f21',
      keno: '0x858d619B8C6f92379B36052246F9410AbB082B1F',
      limbo: '0x2F33BC506D5bF760Fdd80464038D54f54F7cC528',
      plinko: '0x2F33BC506D5bF760Fdd80464038D54f54F7cC528',
      roll: '0x8A6090Ba71c6C05c2037Df4D3e7A1f1A7fb41D98',
      roulette: '0x10C7CB73b4D1d5338d8300B2fA89f32BbE14d367',
      rps: '0xf46A69554D911464987b11564c02f2FA0Cf0F3a4',
      uiOperator: '0xe7503862f9eea03892dadcdcb73634de4fc4e31b',
      cashier: '0x9de35dB710241BCe0808C1aa45D21e89209c5Ea3',
      controller: '0x9ec95EF997a389e4aD7ab30EC2268eDf955Afc1A',
      rankMiddleware: '0x908494a89E52DE141f1B8d172CA6241671b058e4',
      entryPoint: '0x4E1e998d1F1E1303bA33a0Faae64f452c43fBE81',
      factory: '0x94C7e000B746ee0B8bdAde728E3949d06448a777',
      baccarat: '0xD08EEaA02B5f212D2aEa4BF79c6e7e7d2c1cA542',
      winrBonanza: '0x879657Cb4984A31a6e9752Cf6B1016da18357F45',
      weth: '0x20Bc56F6476d92AF81a7152cc7a6bdD69fB2ef51',
      referral: '0xB8bEF8087399b37077d0Ab91656df4762eC6D89e',
      videoPoker: '0xAcA4fb3D6c80F15002c5c33e968BbAf84Dbe2E69',
      mines: '0x1DC783a08625CdC0D966FD597C3af55ba67B7931',
      wheel: '0x836127Bb0AD228598e19f3d941a0C54D37e798b5',
      blackjack: '0xcE470b97AD132F9eD287439894B1B92dE731263a',
      blackjackReader: '0x8455C5a1B1E87eFBEaE0c9f6aBcAf1E9CaE36cbb',
      horseRace: '0x008fa4110262ae4eC0492CAd4fAF1cca361B983E',
      lock: '0x751C265c17B657E088D74219c5DA772fcFeDBB74',
      reward: '0x49BAD2394FD68AB3C4A5101714DA2B5702EA3c78',
      rewardReader: '0xFBbEfA7ad947850F1E50A31d3343d4eD7071c9AE',
      badge: '0x6a83b86408BcE0b1Da2aD9002dc92BEa8d692106',
      crash: '0xBE9a73c2f4c035d488Ad68Cb5837b182872D77d0',
      statisticsStore: '0x458519b7e9b5305563D8917Bd25A8F33b8a44b92',
      singleBlackjack: '0xEAfF4bc87D6637c66071266239A7F1f963a3B850',
      singleBlackjackReader: '0xFa510900690cEb60ccb3Bc3d252aA5Df37e3bcAE',
      holdemPoker: '0x206B53aB6773BB0a61E26d817522d4635D0df588',
      vauldAdapter: '0xe0cE5959E7e9e9c8C84c691C05D252C4e5D78E65',
      shareToken: '0xA8F8Fd159de64cC0232a30634313ad31AE1b4C5f',
      liquidityManager: '0xA2eE1174c91DA23CcC7a538d0D8c3b7763255447',
      bankrollVault: '0xeC2c407aab319FDE15EE680DE08F9aa365Ef7949',
      paymaster: '0x37C6F569A0d68C8381Eb501b79F501aDc132c144',
      rewardConditional: '0xa47F665eEf9bb4805A49A6b2eB1dfA15f4F0FEDF',
      rewardConditionalRouter: '0x860dec012b577C7fF62b6899581581CB4089AAf7',
      rewardConditionalLottery: '0x8d8Dd780dFa7413ac33aFc79053e4b6ad0c689dc',
      winrOfOlympus: '0x645571804a6be763993d6BE3bd1242a924357CA8',
      winrOfOlympus1000: '0x831E85dC4fa70e0Fb804529a90cC84e633fE13AA',
      princessWinr: '0xe9525eF3ae6eE3B1727DBFF79c09Ae837962842F',
      cashback: '0xe36D7aFAc9e9B9a3aA2f93CD1625dB3A82c15aFb',
      degensCashier: '0xda9f11B4c295C5Cfe9331e4f71E73E1A5df2d081',
      degensController: '0x42772D2f6F5eDA04a4b16C5e8150aB40F14edbF6',
      singleWheel: '0x',
      degensReader: '0xcEEeEe35d916408D2F7fA11449e993a939b0b8E1',
      strategyStore: '0xa1a1779BBa12CBa48192b5F8676c3239fa96Bd74',
      yakRouter: '0x2b59Eb03865D18d8B62a5956BBbFaE352fc1C148',
      winrBonanza1000: '0x8De00886ee858BD306A4977CB592fFee266f0810',
    },
  },
};
 
export const getAllAddresses = (networkMode: NetworkMode) => {
  return addresses.winr[networkMode];
};
 
const networkMode = process.env.NEXT_PUBLIC_NETWORK_MODE as NetworkMode;
 
export const allAddresses = getAllAddresses(networkMode);

Providers: WinrlabsWeb3Provider

import { useModalsStore } from '@winrlabs/ui';
import {
  appTokens,
  defaultSelectedToken,
  getAllAddresses,
  NetworkMode,
  WINR_CHAIN_ID,
} from '../constants';
import { BundlerNetwork, WinrLabsWeb3Provider } from '@winrlabs/web3';
import { usePriceFeed } from '../common/hooks/price-feed';
 
const networkMode = process.env.NEXT_PUBLIC_NETWORK_MODE as NetworkMode;
 
const allAddresses = getAllAddresses(networkMode);
 
const bundlerUrl = process.env.NEXT_PUBLIC_BUNDLER_URL || '';
 
const network = BundlerNetwork.WINR;
 
const entryPointAddress = allAddresses.entryPoint;
 
const factoryAddress = allAddresses.factory;
 
export function WinrLabsWeb3Providers(props: { children: React.ReactNode }) {
  const { openModal } = useModalsStore();
 
  const { priceFeed } = usePriceFeed();
 
  return (
    <WinrLabsWeb3Provider
      smartAccountConfig={{
        bundlerUrl,
        network,
        entryPointAddress,
        factoryAddress,
        paymasterAddress: allAddresses.paymaster,
      }}
      onPinNotFound={() => {
        openModal('create-pin');
      }}
      bundlerVersion="v2"
      tokens={appTokens}
      selectedToken={defaultSelectedToken}
      tokenPriceFeed={priceFeed}
      globalChainId={WINR_CHAIN_ID}
      apiConfig={{
        baseUrl: process.env.NEXT_PUBLIC_GATEWAY_URL,
      }}
    >
      {props.children}
    </WinrLabsWeb3Provider>
  );
}

AllProviders in app.tsx

'use client';
 
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { useEffect, useState, type ReactNode } from 'react';
import { WagmiProvider } from 'wagmi';
import { config } from '../wagmi';
import { AudioContextProvider } from '@winrlabs/games';
import { ChatAuthProvider } from '../contexts/chat-auth-context';
import { BridgeRpcProvider } from '../common/components/modals/new-bridge/_hooks/use-bridge-rpc';
import { WinrLabsWeb3Providers } from './winrlabs-web3';
import { darkTheme, RainbowKitProvider } from '@rainbow-me/rainbowkit';
 
export function Providers(props: { children: ReactNode }) {
  const [queryClient] = useState(() => new QueryClient());
 
  const [isPreviouslyConnected, setIsPreviouslyConnected] = useState(false);
 
  useEffect(() => {
    if (!localStorage) return;
 
    if (localStorage.getItem('wagmi.recentConnectorId')?.includes('web3auth')) {
      setIsPreviouslyConnected(false);
    } else {
      setIsPreviouslyConnected(localStorage['isConnected']);
    }
  }, []);
 
  return (
    <WagmiProvider reconnectOnMount={isPreviouslyConnected} config={config}>
      <QueryClientProvider client={queryClient}>
        <RainbowKitProvider theme={darkTheme()}>
          <WinrLabsWeb3Providers>
            <BridgeRpcProvider rpcUrl={'https://bridge.winr.games/rpc'}>
              <ChatAuthProvider>
                <AudioContextProvider>{props.children}</AudioContextProvider>
              </ChatAuthProvider>
            </BridgeRpcProvider>
          </WinrLabsWeb3Providers>
        </RainbowKitProvider>
      </QueryClientProvider>
    </WagmiProvider>
  );
}