> For the complete documentation index, see [llms.txt](https://jungle-toolkit.gitbook.io/evm-xcm-jungle-toolkit/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jungle-toolkit.gitbook.io/evm-xcm-jungle-toolkit/build-an-evm+substrate-wallet-compatible-architecture-in-your-dapp/mapping-of-addresses.md).

# Mapping of addresses

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

## Solidity Example

```solidity
// 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.
