How to Get a ERC20 Token Address via FewFactory

📘 Example Guide: How to Get an ERC20 Token Address via FewFactory

In Ring Swap, all tokens are wrapped using the Few Protocol and represented as FewTokens. However, there are cases where you may need to retrieve the original ERC20 token address from a given FewToken—such as when displaying token metadata, checking balances, or interacting with external protocols.

To support this, FewToken contracts expose a token() method that returns the original token address they wrap.

This allows seamless integration with systems that rely on standard ERC20 interfaces.


🔍 How to Retrieve the Original Token Address from a FewToken

📘 FewToken Interface

// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.5.0;

import './IERC20.sol';

interface IFewERC20 is IERC20 {
    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
}

🛠 Example: Solidity Code to Query the Original ERC20 Token Address

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

interface IFewWrappedToken {
    function token() external view returns (address);
}

contract OriginalTokenResolver {
    function getOriginalTokenAddress(address fewTokenAddress) external view returns (address) {
        return IFewWrappedToken(fewTokenAddress).token();
    }
}

🧪 Use Case: Displaying Token Metadata

Suppose you’re building a dashboard that shows token symbols and decimals. You must first unwrap the FewToken to get its original ERC20 address, then use that to fetch metadata via standard ERC20 interfaces:

pragma solidity >=0.5.0;

interface IERC20 {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
}
function getOriginalToken(address fewTokenAddress)
    external
    view
    returns (string memory name, string memory symbol, uint8 decimals)
{
    address original = IFewWrappedToken(fewTokenAddress).token();
    name = IERC20(original).name();
    symbol = IERC20(original).symbol();
    decimals = IERC20(original).decimals();
}

✅ Summary

  • Use the token() method on a FewToken to get the underlying ERC20 token address.

  • This is useful for:

    • UI display (name, symbol, decimals)

    • Compatibility with other protocols

    • Balance checks or external API queries

Last updated