contract TokenId {
    uint256 internal constant tokenIdLimit = TOKEN_ID_LIMIT;
    uint256 public constant collectionIdMultiplier =
        tokenIdLimit * tokenIdLimit;
    uint256 public constant seriesIdMultiplier = tokenIdLimit;

    // Combine the collection ID, series ID and the token's position into a
    // single token ID. For example, if the series ID is `0` and the token
    // position is `23`, generate `100000023`.
    function encodeTokenId(
        uint256 collectionId,
        uint256 seriesId,
        uint256 tokenPosition
    ) public pure returns (uint256) {
        return TokenIdLib.encodeTokenId(collectionId, seriesId, tokenPosition);
    }

    function extractEdition(uint256 tokenId) public pure returns (uint256) {
        return TokenIdLib.extractEdition(tokenId);
    }

    // Extract the series ID from the tokenId. For example, `100000010` returns
    // `0`.
    function extractSeriesId(uint256 tokenId) public pure returns (uint256) {
        return TokenIdLib.extractSeriesId(tokenId);
    }

    // Extract the series ID from the tokenId. For example, `100000010` returns
    // `0`.
    function extractCollectionId(uint256 tokenId)
        public
        pure
        returns (uint256)
    {
        return TokenIdLib.extractCollectionId(tokenId);
    }
}
function extractSeriesId(uint256 tokenId) public pure returns (uint256) {
    return TokenIdLib.extractSeriesId(tokenId);
}

// Extract the series ID from the tokenId. For example, `100000010` returns
// `0`.