@@ -2,6 +2,7 @@ import { hashPersonalMessage } from '@ethereumjs/util'
22import { ObservableStore } from '@metamask/obs-store'
33import { SafeEventEmitter } from '@toruslabs/openlogin-jrpc'
44import deepmerge from 'deepmerge'
5+ import { ethers } from 'ethers'
56import { cloneDeep } from 'lodash'
67import log from 'loglevel'
78import Web3 from 'web3'
@@ -16,7 +17,9 @@ import {
1617 ACTIVITY_ACTION_TOPUP ,
1718 ERROR_TIME ,
1819 ETHERSCAN_SUPPORTED_NETWORKS ,
20+ RSK_MAINNET ,
1921 SUCCESS_TIME ,
22+ SUPPORTED_NETWORK_TYPES ,
2023 THEME_LIGHT_BLUE_NAME ,
2124} from '../utils/enums'
2225import { notifyUser } from '../utils/notifications'
@@ -68,6 +71,8 @@ class PreferencesController extends SafeEventEmitter {
6871 this . web3 = new Web3 ( provider )
6972 this . api = new ApiHelpers ( options . storeDispatch )
7073 this . signMessage = signMessage
74+ this . rskProvider = null
75+ this . rnsRegistryContract = null
7176
7277 this . interval = options . interval || DEFAULT_INTERVAL
7378 this . store = new ObservableStore ( { selectedAddress : '' } ) // Account specific object
@@ -826,6 +831,95 @@ class PreferencesController extends SafeEventEmitter {
826831 return this . api . get ( url . href , this . headers ( ) , { useAPIKey : true } )
827832 }
828833
834+ // This approach considers resolution for tokens
835+ getRnsChainIdFromPluginId = ( pluginId ) => {
836+ switch ( pluginId ) {
837+ case 'RBTC' :
838+ return 137
839+ case 'ETH' :
840+ return 60
841+ case 'ETHC' :
842+ return 61
843+ case 'BTC' :
844+ return 0
845+ case 'LTC' :
846+ return 2
847+ case 'dash' :
848+ return 5
849+ case 'XRP' :
850+ return 144
851+ case 'BCH' :
852+ return 145
853+ case 'BNB' :
854+ return 714
855+ case 'XLM' :
856+ return 148
857+ case 'MATIC' :
858+ return 966
859+ case 'AVAX' :
860+ return 9000
861+ case 'GXC' :
862+ return 2303
863+ case 'OKT' :
864+ return 996
865+ case 'DAI' :
866+ return 700
867+ default :
868+ return - 1
869+ }
870+ }
871+
872+ async getRnsAddress ( { domain, coinType } ) {
873+ try {
874+ const pluginId = this . getRnsChainIdFromPluginId ( coinType )
875+ if ( pluginId === - 1 ) {
876+ return null
877+ }
878+ if ( ! this . rskProvider ) {
879+ const rskRpcServerUrl = SUPPORTED_NETWORK_TYPES [ RSK_MAINNET ] . rpcUrl
880+ this . rskProvider = new ethers . providers . JsonRpcProvider ( rskRpcServerUrl )
881+ }
882+ if ( ! this . rnsRegistryContract ) {
883+ // REF: https://developers.rsk.co/rif/rns/architecture/registry/
884+ const RNS_REGISTRY_ADDRESS = '0xcb868aeabd31e2b66f74e9a55cf064abb31a4ad5' // hardcoded RNS registry address
885+ this . rnsRegistryContract = new ethers . Contract (
886+ RNS_REGISTRY_ADDRESS ,
887+ [ 'function resolver(bytes32 node) public view returns (address)' ] ,
888+ this . rskProvider
889+ )
890+ }
891+ const nameHash = ethers . utils . namehash ( domain )
892+ const resolverAddress = await this . rnsRegistryContract . resolver ( nameHash )
893+ if ( resolverAddress === ethers . constants . AddressZero ) {
894+ return null
895+ }
896+ // Check if current selected currency is on RSK chain 137 if not check for multichain address
897+ let address = null
898+ if ( pluginId === 137 ) {
899+ const addrResolverContract = new ethers . Contract (
900+ resolverAddress ,
901+ [ 'function addr(bytes32 node) public view returns (address)' ] ,
902+ this . rskProvider
903+ )
904+ address = await addrResolverContract . addr ( nameHash )
905+ } else {
906+ const multichainAddrResolverContract = new ethers . Contract (
907+ resolverAddress ,
908+ [ 'function addr(bytes32 node, uint coinType) external view returns(bytes memory)' ] ,
909+ this . rskProvider
910+ )
911+ address = await multichainAddrResolverContract . addr ( nameHash , pluginId )
912+ }
913+ if ( address === undefined || address === null ) {
914+ return null
915+ }
916+ return address . toLowerCase ( )
917+ } catch ( error ) {
918+ log . error ( error )
919+ return null
920+ }
921+ }
922+
829923 async getTorusLookupAddress ( { verifier, verifierId, walletVerifier, network } ) {
830924 const url = new URL ( `${ config . api } /lookup/torus` )
831925 url . searchParams . append ( 'verifier' , verifier )
0 commit comments