TokenRegistry
Motivation
Precompiles like spotBalance, spotPx and more, all require either a token index (for spotBalance) or a spot market index (for spotPx) as an input parameter. Bridging an EVM token to HyperCore uses its token index to derive its system address.
Natively, there is no way to derive the token index given a token's contract address, requiring developers to store it manually in their contracts, or pass it in as a parameter whenever needed.
Solution
The TokenRegistry solves this by providing a deployed onchain mapping from EVM contract addresses to their HyperCore token indices.
Note: The stored data is populated using precompile calls as the sole source of truth, and can be populated by anyone calling setTokenInfo() or batchSetTokenIndex()
function getTokenIndex(address evmContract) external view returns (uint32 index) {
TokenData memory data = addressToIndex[evmContract];
if (!data.isSet) {
revert TokenNotFound(evmContract);
}
return data.index;
}
/**
* @notice Register a token by passing in its index
* @param tokenIndex The index of the token to register
* @dev Calls the token info precompile and stores the mapping
*/
function setTokenInfo(uint32 tokenIndex) public {
// call the precompile
address evmContract = getTokenAddress(tokenIndex);
if (evmContract == address(0)) {
revert NoEvmContract(tokenIndex);
}
addressToIndex[evmContract] = TokenData({index: tokenIndex, isSet: true});
}The contract is deployed on HyperEVM mainnet and testnet at 0x0b51d1a9098cf8a72c325003f44c194d41d7a85b.
Usage
Direct Usage:ITokenRegistry tokenRegistry = ITokenRegistry(0x0b51d1a9098cf8a72c325003f44c194d41d7a85b);
// Get the token index for an evm token address
uint32 tokenIdx = tokenRegistry.getTokenIndex(tokenAddress);The PrecompileLib exposes a getTokenIndex function to read from the TokenRegistry, and can be used instead of directly interacting with the TokenRegistry contract.
uint64 tokenIdx = PrecompileLib.getTokenIndex(tokenAddress);