25
25
import okhttp3 .OkHttpClient ;
26
26
import okhttp3 .Request ;
27
27
import okhttp3 .RequestBody ;
28
+ import okhttp3 .Response ;
28
29
import okhttp3 .ResponseBody ;
29
30
import org .slf4j .Logger ;
30
31
import org .slf4j .LoggerFactory ;
31
32
32
33
import org .web3j .abi .DefaultFunctionReturnDecoder ;
33
34
import org .web3j .abi .datatypes .ens .OffchainLookup ;
35
+ import org .web3j .crypto .Credentials ;
34
36
import org .web3j .crypto .Keys ;
35
37
import org .web3j .crypto .WalletUtils ;
36
38
import org .web3j .dto .EnsGatewayRequestDTO ;
37
39
import org .web3j .dto .EnsGatewayResponseDTO ;
38
40
import org .web3j .ens .contracts .generated .ENS ;
39
41
import org .web3j .ens .contracts .generated .OffchainResolverContract ;
40
42
import org .web3j .ens .contracts .generated .PublicResolver ;
43
+ import org .web3j .ens .contracts .generated .ReverseRegistrar ;
41
44
import org .web3j .protocol .ObjectMapperFactory ;
42
45
import org .web3j .protocol .Web3j ;
43
46
import org .web3j .protocol .core .DefaultBlockParameterName ;
44
47
import org .web3j .protocol .core .methods .response .EthBlock ;
45
48
import org .web3j .protocol .core .methods .response .EthSyncing ;
46
49
import org .web3j .protocol .core .methods .response .NetVersion ;
50
+ import org .web3j .protocol .core .methods .response .TransactionReceipt ;
47
51
import org .web3j .tx .ClientTransactionManager ;
48
52
import org .web3j .tx .TransactionManager ;
49
53
import org .web3j .tx .gas .DefaultGasProvider ;
@@ -150,6 +154,31 @@ protected OffchainResolverContract obtainOffchainResolver(String ensName) {
150
154
}
151
155
}
152
156
157
+ protected OffchainResolverContract obtainOffchainResolver (
158
+ String ensName , Credentials credentials ) {
159
+ if (isValidEnsName (ensName , addressLength )) {
160
+ boolean isSynced ;
161
+
162
+ try {
163
+ isSynced = isSynced ();
164
+ } catch (Exception e ) {
165
+ throw new EnsResolutionException ("Unable to determine sync status of node" , e );
166
+ }
167
+
168
+ if (!isSynced ) {
169
+ throw new EnsResolutionException ("Node is not currently synced" );
170
+ }
171
+
172
+ try {
173
+ return lookupOffchainResolver (ensName , credentials );
174
+ } catch (Exception e ) {
175
+ throw new EnsResolutionException ("Unable to get resolver" , e );
176
+ }
177
+ } else {
178
+ throw new EnsResolutionException ("EnsName is invalid: " + ensName );
179
+ }
180
+ }
181
+
153
182
/**
154
183
* Returns the address of the resolver for the specified node.
155
184
*
@@ -336,6 +365,19 @@ protected Request buildRequest(String url, String sender, String data)
336
365
}
337
366
}
338
367
368
+ public TransactionReceipt setReverseName (String name , Credentials credentials )
369
+ throws Exception {
370
+ ReverseRegistrar reverseRegistrar = getReverseRegistrarContract (credentials );
371
+ return reverseRegistrar .setName (name ).send ();
372
+ }
373
+
374
+ public TransactionReceipt setReverseName (
375
+ String addr , String owner , String resolver , String name , Credentials credentials )
376
+ throws Exception {
377
+ ReverseRegistrar reverseRegistrar = getReverseRegistrarContract (credentials );
378
+ return reverseRegistrar .setNameForAddr (addr , owner , resolver , name ).send ();
379
+ }
380
+
339
381
/**
340
382
* Reverse name resolution as documented in the <a
341
383
* href="https://docs.ens.domains/contract-api-reference/reverseregistrar">specification</a>.
@@ -376,13 +418,14 @@ private OffchainResolverContract lookupOffchainResolver(String ensName) throws E
376
418
getResolverAddress (ensName ), web3j , transactionManager , new DefaultGasProvider ());
377
419
}
378
420
379
- private String getResolverAddress (String ensName ) throws Exception {
380
- NetVersion netVersion = web3j .netVersion ().send ();
381
- String registryContract = Contracts .resolveRegistryContract (netVersion .getNetVersion ());
382
-
383
- ENS ensRegistry =
384
- ENS .load (registryContract , web3j , transactionManager , new DefaultGasProvider ());
421
+ private OffchainResolverContract lookupOffchainResolver (String ensName , Credentials credentials )
422
+ throws Exception {
423
+ return OffchainResolverContract .load (
424
+ getResolverAddress (ensName ), web3j , credentials , new DefaultGasProvider ());
425
+ }
385
426
427
+ public String getResolverAddress (String ensName ) throws Exception {
428
+ ENS ensRegistry = getRegistryContract ();
386
429
byte [] nameHash = NameHash .nameHashAsBytes (ensName );
387
430
String address = ensRegistry .resolver (nameHash ).send ();
388
431
@@ -393,6 +436,66 @@ private String getResolverAddress(String ensName) throws Exception {
393
436
return address ;
394
437
}
395
438
439
+ public String getOwnerAddress (String ensName ) throws Exception {
440
+ ENS ensRegistry = getRegistryContract ();
441
+ byte [] nameHash = NameHash .nameHashAsBytes (ensName );
442
+ return ensRegistry .owner (nameHash ).send ();
443
+ }
444
+
445
+ private ENS getRegistryContract () throws IOException {
446
+ NetVersion netVersion = web3j .netVersion ().send ();
447
+ String registryContract = Contracts .resolveRegistryContract (netVersion .getNetVersion ());
448
+
449
+ return ENS .load (registryContract , web3j , transactionManager , new DefaultGasProvider ());
450
+ }
451
+
452
+ protected ReverseRegistrar getReverseRegistrarContract (Credentials credentials )
453
+ throws IOException {
454
+ NetVersion netVersion = web3j .netVersion ().send ();
455
+ String reverseRegistrarContract =
456
+ ReverseRegistrarContracts .resolveReverseRegistrarContract (
457
+ netVersion .getNetVersion ());
458
+
459
+ return ReverseRegistrar .load (
460
+ reverseRegistrarContract , web3j , credentials , new DefaultGasProvider ());
461
+ }
462
+
463
+ public EnsMetadataResponse getEnsMetadata (String name ) throws IOException {
464
+ NetVersion netVersion = web3j .netVersion ().send ();
465
+ byte [] nameHash = NameHash .nameHashAsBytes (name );
466
+ String apiUrl =
467
+ NameWrapperUrl .getEnsMetadataApi (netVersion .getNetVersion ())
468
+ + Numeric .toHexString (nameHash );
469
+
470
+ Request request = new Request .Builder ().url (apiUrl ).get ().build ();
471
+
472
+ try (Response response = client .newCall (request ).execute ()) {
473
+ if (!response .isSuccessful ()) {
474
+ throw new IOException (
475
+ "Failed to fetch ENS metadata. HTTP error code: " + response .code ());
476
+ }
477
+
478
+ // Parse the JSON response
479
+ assert response .body () != null ;
480
+ String responseBody = response .body ().string ();
481
+ return new ObjectMapper ().readValue (responseBody , EnsMetadataResponse .class );
482
+ }
483
+ }
484
+
485
+ public String getEnsText (String name , String key ) throws Exception {
486
+ OffchainResolverContract offchainResolverContract = obtainOffchainResolver (name );
487
+ byte [] nameHash = NameHash .nameHashAsBytes (name );
488
+ return offchainResolverContract .text (nameHash , key ).send ();
489
+ }
490
+
491
+ public TransactionReceipt setEnsText (
492
+ String name , String key , String value , Credentials credentials ) throws Exception {
493
+ OffchainResolverContract offchainResolverContract =
494
+ obtainOffchainResolver (name , credentials );
495
+ byte [] nameHash = NameHash .nameHashAsBytes (name );
496
+ return offchainResolverContract .setText (nameHash , key , value ).send ();
497
+ }
498
+
396
499
boolean isSynced () throws Exception {
397
500
EthSyncing ethSyncing = web3j .ethSyncing ().send ();
398
501
if (ethSyncing .isSyncing ()) {
0 commit comments