Plug and play
Installation
npm install @winr-labs/games @winr-labs/web3-games @winr-labs/web3Example 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>
);
}