Precompiles

Documentation on the special precompiles that are available at the Humanode Network.

Currency Swap precompile

Use this precompile to transfer the funds from your EVM account to any Native account.

Property
Description

Address

0x0000000000000000000000000000000000000900

Input

See contract interface.

Output

See contract interface.

Contract interface

https://github.com/humanode-network/humanode/blob/master/crates/precompile-currency-swap/CurrencySwap.sol

// SPDX-License-Identifier: UNLICENSED

pragma solidity >=0.7.0 <0.9.0;

/**
 * @title Currency Swap Interface
 *
 * An interface enabling swapping the funds from EVM accounts to
 * native Substrate accounts.
 *
 * Address: 0x0000000000000000000000000000000000000900
 */
interface CurrencySwap {
  /**
   * Transfer the funds from an EVM account to native substrate account.
   * Selector: 76467cbd
   *
   * @param nativeAddress The native address to send the funds to.
   * @return success Whether or not the swap was successful.
   */
  function swap(bytes32 nativeAddress) external payable returns (bool success);
}

Bioauth status check precompile

Use this precompile to check if the specified address has an active bioauth. Takes the validator public key (type AccountId in the Humanode runtime code, also known as native - or Substrate - account).

Property
Description

Address

0x0000000000000000000000000000000000000800

Input

AccountId (Substrate account address); 32 bytes The public key to check.

Output

bool; 1 byte 1 if bioauth is active for the address, 0 if bioauth is inactive for the address.

Helper Library

You can use the helper library below together with your smart contract code to simplify invoking the precompile.

// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.0;

library bioauth {
    function isAuthenticated(bytes32 accountId) public view returns (bool result) {
        address precompile = 0x0000000000000000000000000000000000000800;
        bytes memory payload = abi.encodePacked(accountId);
        (bool success, bytes memory returnData) = precompile.staticcall(payload);
        assert(success);
        assert(returnData.length == 1);
        return (returnData[0] != 0);
    }
}

EVM to native account mapping precompile

Use this precompile to find a corresponding mapped native AccountId for provided EVM address. This is useful to be used in combination with Bioauth precompile as you don't need to worry about a proper AccountId to do bioauth check.

Description

Property
Description

Address

0x0000000000000000000000000000000000000801

Input

evmAddress (EVM address); 20 bytes

Output

(bool, bytes32);

  • (true, 0x12..9): indicates that the evm adress has been mapped where 0x12..9 is the mapped native account itself.

  • (false, 0x00..0): indicates that the evm addres hasn't been mapped.

Helper Library

You can use the helper library below together with your smart contract code to simplify invoking the precompile.

// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.0;

library evmAccounts {
    function claimedNativeAccount(bytes20 evmAddress) public view returns (bool, bytes32) {
        address precompile = 0x0000000000000000000000000000000000000801;
        bytes memory payload = abi.encodePacked(evmAddress);
        (bool success, bytes memory returnData) = precompile.staticcall(payload);
        assert(success);
        if (returnData.length == 0) {
            return (false, 0x0);
        } 
        bytes32 nativeAccount = abi.decode(returnData, (bytes32));
        return (true, nativeAccount);
    }
}

Last updated