# bmc-games-dev-sdk

## Installation

```bash
yarn add bmc-games-dev-sdk
```
## BackOffice

## Load SDK wrappers

```typescript
import { BmcGamesSDK, AdminWrapper } from "bmc-games-dev-sdk";
import { SolanaProvider } from "@saberhq/solana-contrib";

const wallet = useWallet();
const { connection } = useConnection();

const provider = SolanaProvider.init({
  connection,
  wallet: wallet as any,
  opts: {
    preflightCommitment: "finalized",
    commitment: "finalized",
  },
});
const bmcGamesSDK = BmcGamesSDK.load({ provider });
const adminWrapper = new AdminWrapper(bmcGamesSDK, wallet.publickKey.toString()); // wallet.publickKey should be String
```

### Add game partner - Admin Wallet
```typescript
  const tx = await adminWrapper.addGamePartner({
    partnerWalletStr,
    partnerWithdrawalTokenMintAddressStr,
  });
```

### Change voter wallets - Admin Wallet
```typescript
  const tx = await adminWrapper.changeVoterWithdrawalWallets({
    wallet1Str,
    wallet2Str,
    wallet3Str,
    wallet4Str,
    wallet5Str,
    approvalChin, // number
  });
```

### Decrease liquidity - Withdrawal Wallet

> token and amount depends on pool which is going to decrease

```typescript
  const tx = await adminWrapper.decreaseLiquidity({
    withdrawAmount, // token amount; ex: 3.412
    withdrawalTokenMintAddress, // Pubkey. not string
  });
```

### Increase liquidity - Withdrawal Wallet

> token and amount depends on pool which is going to increase

```typescript
  const tx = await adminWrapper.increaseLiquidity({
    depositAmount, // token amount; ex: 3.412
    depositTokenMintAddress, // Pubkey. not string
  });
```

### Update By Admin - Admin Wallet
```typescript
  const tx = await adminWrapper.updateByAdmin({
    botWalletStr, // String
    isEnabledVoting, // boolean
    isEmergencyStatus, // boolean
  });
```

### Set deposit token - Admin Wallet
```typescript
  const tx = await adminWrapper.setDepositToken({
    newDepositTokenMintAddress // Pubkey
  });
```

### Set game partner status - Admin Wallet
```typescript
  const tx = await adminWrapper.setGamePartnerStatus({
    partnerWalletStr, // String
    isEnabled // boolean
  });
```

### Set game partner token - Admin Wallet
```typescript
  const tx = await adminWrapper.setGamePartnerToken({
    partnerWalletStr, // String
    newPartnerWithdrawalTokenMintAddress // Pubkey
  });
```

### Set platform withdrawal token - Admin Wallet
> :warning: **Warning**
>~~**setPlatformWithdrawalToken()**;~~
>This function is **deprecated**.
```typescript
  // const tx = await adminWrapper.setPlatformWithdrawalToken({
  //   newPlatformWithdrawalTokenMintAddress // Pubkey
  // });
```

### Set reward token - Admin Wallet
```typescript
  const tx = await adminWrapper.setRewardToken({
    newRewardWithdrawalTokenMintAddress // Pubkey
  });
```

### Set user status - Admin Wallet
```typescript
  const tx = await adminWrapper.setUserStatus({
    userWalletStr, // String
    isUnblocked,  // boolean
  });
```

### Start voting withdrawal wallet - Admin Wallet
```typescript
  const tx = await adminWrapper.startVotingWithdrawalWallet({
    newWithdrawalWalletStr, // String
  });
```

### Withdraw platform fund - Withdrawal Wallet
```typescript
  const tx = await adminWrapper.withdrawPlatformFund({
    withdrawAmount, // token amount; ex: 3.412
  });
```

### Get global states - admin wrapper
```typescript
  let info = await adminWrapper.getGlobalInfo();
```

### Get fund status - admin wrapper
```typescript
  let info = await adminWrapper.calcInsufficientWithdrawalTokenAmount();
```


## Bmc
```typescript
import { BmcGamesSDK, BmcWrapper } from "bmc-games-dev-sdk";
import { SolanaProvider } from "@saberhq/solana-contrib";

const wallet = useWallet();
const { connection } = useConnection();

const provider = SolanaProvider.init({
  connection,
  wallet: wallet as any,
  opts: {
    preflightCommitment: "finalized",
    commitment: "finalized",
  },
});
const bmcGamesSDK = BmcGamesSDK.load({ provider });
const bmcWrapper = new BmcWrapper(bmcGamesSDK, wallet.publickKey.toString()); // wallet.publickKey should be String

```

### Vote withdrawal wallet - voter Wallet
```typescript
  const tx = await bmcWrapper.voteWithdrawalWallet();
```

### Get voting status - bmc wrapper
```typescript
  let info = await bmcWrapper.getVoteWalletInfo();
```


## Bot
```typescript
import { BmcGamesSDK, BotWrapper } from "bmc-games-dev-sdk";
import { SolanaProvider } from "@saberhq/solana-contrib";

const wallet = useWallet();
const { connection } = useConnection();

const provider = SolanaProvider.init({
  connection,
  wallet: wallet as any,
  opts: {
    preflightCommitment: "finalized",
    commitment: "finalized",
  },
});
const bmcGamesSDK = BmcGamesSDK.load({ provider });
const botWrapper = new BotWrapper(bmcGamesSDK, wallet.publickKey.toString()); // wallet.publickKey should be String

```

### Add user - bot Wallet
```typescript
  const tx = await botWrapper.addUser({
    userWalletStr // String
  });
```

### End season (unlock partner funds) - bot Wallet

> token and amount depends on depositToken

```typescript
  const tx = await botWrapper.endSeasonGamePartner({
    partnerWalletStr, // String
    unlockedAmount, // token amount; ex: 3.412
  });
```

### End season (unlock platform funds) - bot Wallet

> token and amount depends on depositToken

```typescript
  const tx = await botWrapper.endSeasonPlatform({
    unlockedAmount, // token amount; ex: 3.412
  });
```

### End season (unlock user reward ticket) - bot Wallet

> token and amount depends on depositToken

```typescript
  const tx = await botWrapper.endSeasonUser({
    userWalletStr, // String
    unlockedAmount, // token amount; ex: 3.412 - based on beamo depositToken
  });
```

### Purchase game item (deposit from Beamo) - beamo & bot Wallet

> token and amount depends on depositToken

```typescript
  const tx = await botWrapper.purchaseGameItem({
    gamePartnerWalletStr, // String
    depositAmount, // token amount; ex: 3.412 - based on beamo depositToken
    gameStudioPercentage, // 100% = 10000
    rewardPercentage, // 100% = 10000, if isSeasonGame == true then 0%
    isSeasonGame, // boolean
  });
```


## Partner
```typescript
import { BmcGamesSDK, PartnerWrapper } from "bmc-games-dev-sdk";
import { SolanaProvider } from "@saberhq/solana-contrib";

const wallet = useWallet();
const { connection } = useConnection();

const provider = SolanaProvider.init({
  connection,
  wallet: wallet as any,
  opts: {
    preflightCommitment: "finalized",
    commitment: "finalized",
  },
});
const bmcGamesSDK = BmcGamesSDK.load({ provider });
const partnerWrapper = new PartnerWrapper(bmcGamesSDK, wallet.publickKey.toString()); // wallet.publickKey should be String

```

### Claim game partner fund - partner Wallet

> Amount depends on depositToken.
> Partner will receive with partnerWithdrawalToken.
> Signers will be partner-wallet and bot-wallet.
> **If smartContract returns InsufficientTokenAmount error, insufficient_withdrawal_pool = true and then send message to admin via slack bot channel.**
> **Check diagram.xlsx [checklist] No.4**

```typescript
  const tx = await partnerWrapper.claimGamePartnerFund({
    rewardAmount  // token amount; ex: 3.412
  });
```

### Get partners list - partner wrapper
```typescript
  let partners = await partnerWrapper.getPartnersInfo();
```

### Get a partner info - partner wrapper

> The unit of token amount in returned array is same with depositToken

```typescript
  let partner = await partnerWrapper.getPartnerInfo(
    partnerWalletStr // String
  );
```

## User
```typescript
import { BmcGamesSDK, UserWrapper } from "bmc-games-dev-sdk";
import { SolanaProvider } from "@saberhq/solana-contrib";

const wallet = useWallet();
const { connection } = useConnection();

const provider = SolanaProvider.init({
  connection,
  wallet: wallet as any,
  opts: {
    preflightCommitment: "finalized",
    commitment: "finalized",
  },
});
const bmcGamesSDK = BmcGamesSDK.load({ provider });
const userWrapper = new UserWrapper(bmcGamesSDK, wallet.publickKey.toString()); // wallet.publickKey should be String

```

### Claim user reward ticket - user Wallet

> Amount depends on depositToken.
> User will receive with rewardToken.
> Signers will be user-wallet and bot-wallet.
> **If smartContract returns InsufficientTokenAmount error, insufficient_withdrawal_pool = true and then send message to admin via slack bot channel.**
> **Check diagram.xlsx [checklist] No.4**

```typescript
  const tx = await userWrapper.claimUserReward({
    rewardAmount  // token amount; ex: 3.412
  });
```

### Get users list - user wrapper
```typescript
  let users = await userWrapper.getUsersInfo();
```

### Get a user info - user wrapper

> The unit of token amount in returned array is same with depositToken

```typescript
  let user = await userWrapper.getUserInfo(
    userWalletStr // String
  );
```
