🍌
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. Build an EVM+Substrate wallet compatible architecture in your dApp

Mapping of addresses

In this section you'll see how to create a proper Solidity mapping linking two addresses (EVM/Substrate).

Solidity Example

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract PlayerRegistry {
    // Mapping to store player information
    mapping(address => Player) public players;

    // Struct to store player data
    struct Player {
        address evmAddress;
        string substrateAddress;
    }

    // Modifier to ensure that a function is callable only by the player's EVM address
    modifier onlyEvmAddress() {
        require(msg.sender == players[msg.sender].evmAddress, "Not authorized");
        _;
    }

    // Function to register a player with EVM and Substrate addresses
    function registerPlayer(address _evmAddress, string memory _substrateAddress) public {
        players[msg.sender] = Player(_evmAddress, _substrateAddress);
    }

    // Example function that can only be called by the player's EVM address
    function doSomethingRestricted() public onlyEvmAddress {
        // Only the player's EVM address can call this function
        // Add your restricted logic here
    }

    // Function to get the Substrate address for a player
    function getSubstrateAddress() public view returns (string memory) {
        return players[msg.sender].substrateAddress;
    }
}
  1. PlayerRegistry Contract:

    • mapping(address => Player) public players: This mapping stores the player information, where the key is the Ethereum address, and the value is a Player struct containing the EVM address and Substrate address.

    • struct Player: This struct defines the structure of player data, including the EVM address and Substrate address.

  2. onlyEvmAddress Modifier:

    • modifier onlyEvmAddress(): This modifier ensures that the function can only be executed by the EVM address associated with the player making the request. It checks if the msg.sender (the caller of the function) matches the stored EVM address in the player's data.

  3. registerPlayer Function:

    • function registerPlayer(address _evmAddress, string memory _substrateAddress) public: This function allows a player to register by providing their EVM address and Substrate address.

  4. doSomethingRestricted Function:

    • function doSomethingRestricted() public onlyEvmAddress: This is an example function that uses the onlyEvmAddress modifier, ensuring that only the player's EVM address can call this function. You can add your restricted logic within this function.

  5. getSubstrateAddress Function:

    • function getSubstrateAddress() public view returns (string memory): This function allows anyone to retrieve the Substrate address associated with their Ethereum address.

This contract provides a basic structure for managing player information with restricted access to certain functions based on the player's EVM address.

Last updated 1 year ago

↔️
πŸ“§