Developer Hub
🔮 For applications
Guides & Tutorials
Advanced integration
Prematch
Redeem Bets

Redeem Bets

When a user places a bet on Azuro, their tokens are transferred to the LP contract, and they receive a non-fungible token (NFT) called AzuroBet-NFT as proof of their bet.

Once the outcome is resolved, users whose bets have won can redeem their winnings by calling the withdrawPayout function in the LP contract and providing the betId of the bet they want to redeem. If a game or a specific condition on the outcome of which a bet was made is canceled, users can retrieve their tokens back by calling the same function.

The bet NFT also serves as a way to display users' betting history and allows them to track their bets and winnings.

General required structure

withdrawPayout(
  core: string,
  tokenId: BigNumberish,
  overrides?: Overrides & { from?: string }
): Promise<ContractTransaction>
query Bets {
  bets {
    betId
    payout
    amount
    status
    result
    isRedeemable
    isRedeemed
    core {
      address
      liquidityPool {
        address
      }
    }
    freebet {
      freebetId
      freebetContractAddress
    }
  }
}

Regular bets

Customer can redeem bet if it was canceled (bet.status = BetStatus.Canceled) or if result = BetResult.Win. There are two flags to simplify the process: bet.isRedeemable (customer can redeem) & bet.isRedeemed (already redeemed)

You should ensure that freebet field is null. If it exists, use freebet redeem

const isFreebet = Boolean(bet.freebet)
 
if (!isFreebet && bet.isRedeemable) {
  const tx = await lpContract.connect(signer).withdrawPayout(
    bet.core.address,
    bet.betId,
  )
}

coreAddress is required to specify on which Core contract user wants to redeem the bet.

Batch Redeem

🚨

Please be advised of a critical issue with the withdrawPayouts method on the ProxyFront smart contract. Ensure that ONLY non-freebet bets are redeemed using this function. We are working on fixing this problem!

To redeem multiple bets at once, you can use withdrawPayouts method on the ProxyFront smart contract.

withdrawPayouts(
  data: Array<{
    core: string,
    tokenId: BigNumberish,
    // @deprecated
    isNative: false // param exists in current version of contract but doesn't work with combo bets.
  }>
)
const data = bets.map(({ coreAddress, betId }) => ({
  core: coreAddress,
  tokenId: betId,
  isNative: false,
}))
 
const tx = await proxyFrontContract.connect(signer).withdrawPayouts(data)

Freebet redeem

Note that customer will only receive profit from the bet: bet.payout - bet.amount, the body of bet (amount) will be returned to freebet contract.

To redeem freebet use freebet contract.

const isFreebet = Boolean(bet.freebet)
 
if (isFreebet) {
  const freebetContract = new Contract(bet.freebet.freebetContractAddress, freebetABI)
 
  const tx = await freebetContract.connect(signer).withdrawPayout(bet.freebet.freebetId)
}