@@ -3,6 +3,7 @@ export interface IEthereumRequestAccountsResult {
33 selectedAddress : string | null
44 info : {
55 extensionFound : boolean
6+ uniqueChainName ?: UNIQUE_CHAIN ,
67 chainId ?: string
78 chainIdNumber ?: number
89 userRejected ?: boolean
@@ -23,6 +24,20 @@ export interface AddEthereumChainParameter {
2324 iconUrls ?: string [ ] // Currently ignored
2425}
2526
27+ type UNIQUE_CHAIN = 'unique' | 'quartz' | 'opal' | 'sapphire'
28+ const UNIQUE_CHAIN_IDS : Record < UNIQUE_CHAIN , number > = {
29+ unique : 8880 ,
30+ quartz : 8881 ,
31+ opal : 8882 ,
32+ sapphire : 8883
33+ }
34+ const chainNameByChainId : Record < number , UNIQUE_CHAIN > = {
35+ 8880 : 'unique' ,
36+ 8881 : 'quartz' ,
37+ 8882 : 'opal' ,
38+ 8883 : 'sapphire'
39+ }
40+
2641
2742export const requestAccounts = async ( ) : Promise < IEthereumRequestAccountsResult > => {
2843 if ( typeof window === 'undefined' || ! ( window as any ) . ethereum ) {
@@ -32,13 +47,16 @@ export const requestAccounts = async (): Promise<IEthereumRequestAccountsResult>
3247 let accounts : string [ ] = [ ]
3348 try {
3449 accounts = await ethereum . request ( { method : 'eth_requestAccounts' } )
50+ const chainIdNumber = parseInt ( ethereum . chainId , 16 )
51+
3552 return {
3653 accounts,
3754 selectedAddress : ethereum . selectedAddress ,
3855 info : {
3956 extensionFound : true ,
4057 chainId : ethereum . chainId ,
41- chainIdNumber : parseInt ( ethereum . chainId , 16 ) ,
58+ chainIdNumber,
59+ uniqueChainName : chainNameByChainId [ chainIdNumber ] ,
4260 } ,
4361 }
4462 } catch ( error : any ) {
@@ -71,7 +89,7 @@ export const getAccounts = async (): Promise<IEthereumRequestAccountsResult> =>
7189 }
7290}
7391
74- export const addChainToMetamask = async ( chainData : AddEthereumChainParameter ) : Promise < void > => {
92+ export const addChainToMetamask = async ( chainData : AddEthereumChainParameter ) : Promise < void > => {
7593 const safeGetAccountsResult = await getAccounts ( )
7694 if ( ! safeGetAccountsResult . info . extensionFound ) {
7795 throw new Error ( `No browser extension found` )
@@ -94,8 +112,74 @@ export const addChainToMetamask = async(chainData: AddEthereumChainParameter): P
94112 }
95113}
96114
115+
116+ export const UNIQUE_CHAINS_DATA_FOR_EXTENSIONS : Record < UNIQUE_CHAIN , AddEthereumChainParameter > = {
117+ unique : {
118+ chainId : "0x22b0" ,
119+ chainName : 'Unique' ,
120+ nativeCurrency : {
121+ name : 'Unique' ,
122+ symbol : 'UNQ' ,
123+ decimals : 18 ,
124+ } ,
125+ rpcUrls : [ `https://rpc.unique.network` ] ,
126+ iconUrls : [ `https://ipfs.unique.network/ipfs/QmbJ7CGZ2GxWMp7s6jy71UGzRsMe4w3KANKXDAExYWdaFR` ] ,
127+ blockExplorerUrls : [ 'https://uniquescan.io/unique/' ] ,
128+ } ,
129+
130+
131+ quartz : {
132+ chainId : "0x22b1" ,
133+ chainName : "Quartz by Unique" ,
134+ nativeCurrency : {
135+ name : 'Quartz' ,
136+ symbol : 'QTZ' ,
137+ decimals : 18 ,
138+ } ,
139+ rpcUrls : [ `https://rpc-quartz.unique.network` ] ,
140+ iconUrls : [ `https://ipfs.unique.network/ipfs/QmaGPdccULQEFcCGxzstnmE8THfac2kSiGwvWRAiaRq4dp` ] ,
141+ blockExplorerUrls : [ 'https://uniquescan.io/quartz/' ] ,
142+ } ,
143+ opal : {
144+ chainId : "0x22b2" ,
145+ chainName : "Opal by Unique" ,
146+ nativeCurrency : {
147+ name : 'Opal' ,
148+ symbol : 'OPL' ,
149+ decimals : 18 ,
150+ } ,
151+ rpcUrls : [ `https://rpc-opal.unique.network` ] ,
152+ iconUrls : [ `https://ipfs.unique.network/ipfs/QmYJDpmWyjDa3H6BxweFmQXk4fU8b1GU7M9EqYcaUNvXzc` ] ,
153+ blockExplorerUrls : [ 'https://uniquescan.io/opal/' ] ,
154+ } ,
155+ sapphire : {
156+ chainId : "0x22b3" ,
157+ chainName : "Sapphire by Unique" ,
158+ nativeCurrency : {
159+ name : 'Quartz' ,
160+ symbol : 'QTZ' ,
161+ decimals : 18 ,
162+ } ,
163+ rpcUrls : [ `https://rpc-sapphire.unique.network` ] ,
164+ iconUrls : [ `https://ipfs.unique.network/ipfs/Qmd1PGt4cDRjFbh4ihP5QKEd4XQVwN1MkebYKdF56V74pf` ] ,
165+ blockExplorerUrls : [ 'https://uniquescan.io/sapphire/' ] ,
166+ } ,
167+ }
168+
169+ const AddUniqueChainToMetamask : Record < UNIQUE_CHAIN , ( ) => Promise < void > > = {
170+ unique : ( ) => addChainToMetamask ( UNIQUE_CHAINS_DATA_FOR_EXTENSIONS . unique ) ,
171+ quartz : ( ) => addChainToMetamask ( UNIQUE_CHAINS_DATA_FOR_EXTENSIONS . quartz ) ,
172+ opal : ( ) => addChainToMetamask ( UNIQUE_CHAINS_DATA_FOR_EXTENSIONS . opal ) ,
173+ sapphire : ( ) => addChainToMetamask ( UNIQUE_CHAINS_DATA_FOR_EXTENSIONS . sapphire ) ,
174+ }
175+
176+ export type { UNIQUE_CHAIN }
177+
97178export const Ethereum = {
98179 requestAccounts,
99180 getAccounts,
100181 addChainToMetamask,
182+ UNIQUE_CHAIN_IDS ,
183+ UNIQUE_CHAINS_DATA_FOR_EXTENSIONS ,
184+ AddUniqueChainToMetamask,
101185}
0 commit comments