🍌
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
  • The mirror structure (web3 link)
  • Structure example:
  • Mapping examples:
  • Modifier example:
  • Registration function example:
  1. Build a custodial solution to make your dApp wallet-less & gas-less using EIP-712

Smart contract

In this section, we'll look at how to create a smart-contract using Solidity, which will enable the use of mirrors wallets.

The mirror structure (web3 link)

The 1st way to implement the wallet mirror is to create a direct link between the user's address and that of the wallet mirror. This is the most efficient way, as it enables the user to interact with the smart-contract using his wallet. As a result, it is perhaps less efficient than web2 integration for onboarding.

To implement this technique, you'll need

  • A structure with the information you need for your dApp,

  • A mapping linking the address to the structure,

  • A reversed mapping to force the transaction to be sent via the mirror.

Structure example:

    /// @notice User storage structure
    struct User {
            /// @notice mirror address used to sign txns
        address internalAddress;
        
    // additional extra data can be stored too
            /// @notice example counter for games played by this user
        uint gamesPlayed;
            /// @notice amount of token loaded inside the game contract
        uint tokenAvailable;
    }

Mapping examples:

    /// @notice Real Player Wallet -> Player Data
    mapping(address => Player) public players;

    /// @notice Internal Wallet -> Real Player Wallet
    mapping(address => address) public playersReversed;

Modifier example:

        address sender = msg.sender;
        address realPlayer = playersReversed[sender];

Registration function example:

    /**
     * @notice Necessary to create the mirror wallet
     * @dev Deployer Required
     * @param _playerWallet: real EOA of user
     * @param _internalWallet: walled used to relay txns
    */
    function createPlayer(address _playerWallet, address _internalWallet) public payable onlyOwner {
        require(players[_playerWallet].internalAddress == 0x0000000000000000000000000000000000000000, "Player already exists");
        players[_playerWallet].internalAddress = _internalWallet;
        playersReversed[_internalWallet] = _playerWallet;
    }

Last updated 1 year ago

You'll find more details about mapping and modifiers in the section.

πŸ”€
⛓️
Mapping of addresses