🍌
EVM-XCM Jungle Toolkit
  • πŸ“—Introduction
    • 🌴What is the EVM-XCM Jungle Toolkit?
    • 🧐Why use this toolkit?
    • πŸ‘ͺWho is this toolkit made for?
    • βš’οΈWhat tools are this toolkit made of?
  • ↔️Build an EVM+Substrate wallet compatible architecture in your dApp
    • ⁉️Two different standards
      • ℹ️Addresses Format
      • 🎭Public Key vs Hash-based
      • πŸ“©Multichain compatibility
      • ⚑Account Types
    • β˜‘οΈRecommended wallets
      • 🦊MetaMask
      • ☸️SubWallet
      • 🀚Talisman
    • 🟒The EVM address standard
      • πŸ”Get an address for a Signer
        • πŸ‘οΈCheck the validity of the address
      • πŸ’°Get the native balance of a Signer
        • Get an ERC20 token's balance
      • πŸŽ‡Get the chain information for a Signer
    • πŸ”΅The Substrate address standard
      • πŸ”Get an address for a Signer
        • πŸ‘οΈCheck the validity of the address
      • πŸ’°Get the native balance of a Signer
      • πŸŽ‡Get the chain information for a Signer
    • πŸ“§Mapping of addresses
    • 🀝Implement multiple wallet support on your dApp front-end
      • πŸ’šUnderstanding the EVM provider/signer concepts
      • ❀️Understanding the Keyring concept
      • πŸ”‘Sign and send EVM transactions
      • πŸ—οΈSign and send Substrate extrinsics
    • πŸ“šRessources
  • ➑️Build a cross-chain transaction from any EVM-chain to a Substrate-based chain using IBC and XCM
    • ⁉️Understanding the flow
    • πŸ¦‘Transfer tokens to Moonbeam Parachain using Squid SDK from any EVM chain
    • πŸͺCreate & execute a transaction on the source chain before bridging tokens (pre-hook)
    • πŸͺCreate & execute a transaction on Moonbeam after bridging tokens (post-hook)
    • ✨Create & execute a swap using Stellaswap pools to obtain xcTokens
    • πŸ™ŒWrap-up
    • πŸ“šRessources
  • ⬅️Build a cross-chain transaction from a Substrate-based chain to Moonbeam chain
    • ⁉️Understanding the flow
    • πŸ’‘Using LightSpell API to generate valid XCM calls
    • πŸŒ‰Transfer tokens between parachains (or relay chain) using XCM and ParaSpell SDK
    • πŸ™ŒWrap up
    • πŸ“šRessources
  • ⏩Build batches on source and destination chains using Squid and batch precompile
    • ⁉️Understanding the flow
    • πŸ‘ŒUnderstanding the batch precompile
    • βœ…Create a batch transaction compatible with Squid router
    • πŸͺIntegrate a batch into a Hook using Squid
    • πŸ™ŒWrap up
    • πŸ“šRessources
  • πŸ”Build a gas-less transaction from/to an EVM/Substrate chain using callPermit
    • ⁉️Understanding the flow
    • πŸ”‹Generating the data to sign
    • ✍️Collecting the signature
    • 🌐Relaying the signature
    • ⚑Executing the transaction
    • πŸ™ŒWrap up
    • πŸ“šRessources
  • πŸ”€Build a custodial solution to make your dApp wallet-less & gas-less using EIP-712
    • ⁉️Understanding the flow
    • ⛓️Smart contract
    • βš™οΈBack end
  • πŸ”½Examples of working cross-chain dApps made using the Jungle Toolkit
    • 🌴Case Study: The Great Escape
      • The Player Structure
      • The xDeposit Function
      • The xRegister Function
Powered by GitBook
On this page
  1. Examples of working cross-chain dApps made using the Jungle Toolkit
  2. Case Study: The Great Escape

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 1 year ago

πŸ”½
🌴