The xDeposit Function

How we're allowing players to deposit tokens from any chain to their player accounts, without leaving their favorite EVM chain.

Goals:

  • Being able to deposit GLMB (Moonbeam ERC20 token) into the game smart contract

  • Being able to deposit any other Moonbeam token into the game smart contract

  • Being able to deposit any native EVM token from any EVM chain into the game smart contract

  • Being able to deposit any Substrate-based token into the game smart contract

    /**
     * @notice Let an user deposit GLMB inside the SC linked to his mirror wallet
     * @param _glmbAmount: amount of GLMB to deposit
     * @param _beneficiary: address to deposit tokens to
    */
    function depositFunds (uint256 _glmbAmount, address _beneficiary) public payable {
        require(_glmbAmount > 0, "Amount must be greater than zero");
        require(glmbAddress.balanceOf(msg.sender) >= _glmbAmount, "Not enough GLMB");
        glmbAddress.transferFrom(msg.sender, address(this), _glmbAmount);
        players[_beneficiary].glmbAvailable += _glmbAmount;
    }

As you probably know, to be able to move ERC20 tokens on behalf of a user, we need to increase its allowance towards our smart contract beforehand. To do so, we can easily use the batch Precompile we previously described to achieve it in a single transaction.

  try {
      let internal = await gameContract.players(await addy);
      let internalAddy = await internal[0];

      if (
          (await internalAddy) == "0x0000000000000000000000000000000000000000"
      ) {
          alert("You need to register before deposit");
          window.location.replace("https://playtge.com/register");
          return;
      }
  } catch (err) {
      console.log(err);
  }

  let iface = new ethers.utils.Interface(glmbABI);

  let sGlmb = document.getElementById('amount').value.toString() // get the value from the input in the front-end
  let glmbFund = ethers.utils.parseEther(sGlmb);

  let dataGlmb = iface.encodeFunctionData("increaseAllowance", [
      gameAddressv2,
      glmbFund,
  ]);

  let iface2 = new ethers.utils.Interface(gameABIV2);
  let dataFunding = iface2.encodeFunctionData("depositFunds", [
      glmbFund,
      addy
  ]);

  try {
      let approvalTxn = await batchContract.batchAll(
          [bananasAddress, gameAddressv2],
          ["0", "0"],
          [dataGlmb, dataFunding],
          [], {
              gasLimit: 200000,
          }
      );
      await approvalTxn.wait();
      alert("Deposit successful!");
      window.location.replace("https://playtge.com/play");
  } catch (approvalErr) {
      console.log(approvalErr);
  }

Last updated