Line data Source code
1 : import 'package:walletkit_dart/src/crypto/evm/entities/abi/ens/ens_registry_contract.dart';
2 : import 'package:walletkit_dart/src/crypto/evm/entities/contract/contract_abi.dart';
3 : import 'package:walletkit_dart/src/crypto/evm/entities/contract/internal_contract.dart';
4 : import 'package:walletkit_dart/src/domain/constants.dart';
5 :
6 3 : final ensResoloverABI = ContractABI.fromAbi('''[
7 : {
8 : "inputs": [
9 : { "internalType": "contract ENS", "name": "_ens", "type": "address" },
10 : {
11 : "internalType": "contract INameWrapper",
12 : "name": "wrapperAddress",
13 : "type": "address"
14 : },
15 : {
16 : "internalType": "address",
17 : "name": "_trustedETHController",
18 : "type": "address"
19 : },
20 : {
21 : "internalType": "address",
22 : "name": "_trustedReverseRegistrar",
23 : "type": "address"
24 : }
25 : ],
26 : "stateMutability": "nonpayable",
27 : "type": "constructor"
28 : },
29 : {
30 : "anonymous": false,
31 : "inputs": [
32 : {
33 : "indexed": true,
34 : "internalType": "bytes32",
35 : "name": "node",
36 : "type": "bytes32"
37 : },
38 : {
39 : "indexed": true,
40 : "internalType": "uint256",
41 : "name": "contentType",
42 : "type": "uint256"
43 : }
44 : ],
45 : "name": "ABIChanged",
46 : "type": "event"
47 : },
48 : {
49 : "anonymous": false,
50 : "inputs": [
51 : {
52 : "indexed": true,
53 : "internalType": "bytes32",
54 : "name": "node",
55 : "type": "bytes32"
56 : },
57 : {
58 : "indexed": false,
59 : "internalType": "address",
60 : "name": "a",
61 : "type": "address"
62 : }
63 : ],
64 : "name": "AddrChanged",
65 : "type": "event"
66 : },
67 : {
68 : "anonymous": false,
69 : "inputs": [
70 : {
71 : "indexed": true,
72 : "internalType": "bytes32",
73 : "name": "node",
74 : "type": "bytes32"
75 : },
76 : {
77 : "indexed": false,
78 : "internalType": "uint256",
79 : "name": "coinType",
80 : "type": "uint256"
81 : },
82 : {
83 : "indexed": false,
84 : "internalType": "bytes",
85 : "name": "newAddress",
86 : "type": "bytes"
87 : }
88 : ],
89 : "name": "AddressChanged",
90 : "type": "event"
91 : },
92 : {
93 : "anonymous": false,
94 : "inputs": [
95 : {
96 : "indexed": true,
97 : "internalType": "address",
98 : "name": "owner",
99 : "type": "address"
100 : },
101 : {
102 : "indexed": true,
103 : "internalType": "address",
104 : "name": "operator",
105 : "type": "address"
106 : },
107 : {
108 : "indexed": false,
109 : "internalType": "bool",
110 : "name": "approved",
111 : "type": "bool"
112 : }
113 : ],
114 : "name": "ApprovalForAll",
115 : "type": "event"
116 : },
117 : {
118 : "anonymous": false,
119 : "inputs": [
120 : {
121 : "indexed": false,
122 : "internalType": "address",
123 : "name": "owner",
124 : "type": "address"
125 : },
126 : {
127 : "indexed": true,
128 : "internalType": "bytes32",
129 : "name": "node",
130 : "type": "bytes32"
131 : },
132 : {
133 : "indexed": true,
134 : "internalType": "address",
135 : "name": "delegate",
136 : "type": "address"
137 : },
138 : {
139 : "indexed": true,
140 : "internalType": "bool",
141 : "name": "approved",
142 : "type": "bool"
143 : }
144 : ],
145 : "name": "Approved",
146 : "type": "event"
147 : },
148 : {
149 : "anonymous": false,
150 : "inputs": [
151 : {
152 : "indexed": true,
153 : "internalType": "bytes32",
154 : "name": "node",
155 : "type": "bytes32"
156 : },
157 : {
158 : "indexed": false,
159 : "internalType": "bytes",
160 : "name": "hash",
161 : "type": "bytes"
162 : }
163 : ],
164 : "name": "ContenthashChanged",
165 : "type": "event"
166 : },
167 : {
168 : "anonymous": false,
169 : "inputs": [
170 : {
171 : "indexed": true,
172 : "internalType": "bytes32",
173 : "name": "node",
174 : "type": "bytes32"
175 : },
176 : {
177 : "indexed": false,
178 : "internalType": "bytes",
179 : "name": "name",
180 : "type": "bytes"
181 : },
182 : {
183 : "indexed": false,
184 : "internalType": "uint16",
185 : "name": "resource",
186 : "type": "uint16"
187 : },
188 : {
189 : "indexed": false,
190 : "internalType": "bytes",
191 : "name": "record",
192 : "type": "bytes"
193 : }
194 : ],
195 : "name": "DNSRecordChanged",
196 : "type": "event"
197 : },
198 : {
199 : "anonymous": false,
200 : "inputs": [
201 : {
202 : "indexed": true,
203 : "internalType": "bytes32",
204 : "name": "node",
205 : "type": "bytes32"
206 : },
207 : {
208 : "indexed": false,
209 : "internalType": "bytes",
210 : "name": "name",
211 : "type": "bytes"
212 : },
213 : {
214 : "indexed": false,
215 : "internalType": "uint16",
216 : "name": "resource",
217 : "type": "uint16"
218 : }
219 : ],
220 : "name": "DNSRecordDeleted",
221 : "type": "event"
222 : },
223 : {
224 : "anonymous": false,
225 : "inputs": [
226 : {
227 : "indexed": true,
228 : "internalType": "bytes32",
229 : "name": "node",
230 : "type": "bytes32"
231 : },
232 : {
233 : "indexed": false,
234 : "internalType": "bytes",
235 : "name": "lastzonehash",
236 : "type": "bytes"
237 : },
238 : {
239 : "indexed": false,
240 : "internalType": "bytes",
241 : "name": "zonehash",
242 : "type": "bytes"
243 : }
244 : ],
245 : "name": "DNSZonehashChanged",
246 : "type": "event"
247 : },
248 : {
249 : "anonymous": false,
250 : "inputs": [
251 : {
252 : "indexed": true,
253 : "internalType": "bytes32",
254 : "name": "node",
255 : "type": "bytes32"
256 : },
257 : {
258 : "indexed": true,
259 : "internalType": "bytes4",
260 : "name": "interfaceID",
261 : "type": "bytes4"
262 : },
263 : {
264 : "indexed": false,
265 : "internalType": "address",
266 : "name": "implementer",
267 : "type": "address"
268 : }
269 : ],
270 : "name": "InterfaceChanged",
271 : "type": "event"
272 : },
273 : {
274 : "anonymous": false,
275 : "inputs": [
276 : {
277 : "indexed": true,
278 : "internalType": "bytes32",
279 : "name": "node",
280 : "type": "bytes32"
281 : },
282 : {
283 : "indexed": false,
284 : "internalType": "string",
285 : "name": "name",
286 : "type": "string"
287 : }
288 : ],
289 : "name": "NameChanged",
290 : "type": "event"
291 : },
292 : {
293 : "anonymous": false,
294 : "inputs": [
295 : {
296 : "indexed": true,
297 : "internalType": "bytes32",
298 : "name": "node",
299 : "type": "bytes32"
300 : },
301 : {
302 : "indexed": false,
303 : "internalType": "bytes32",
304 : "name": "x",
305 : "type": "bytes32"
306 : },
307 : {
308 : "indexed": false,
309 : "internalType": "bytes32",
310 : "name": "y",
311 : "type": "bytes32"
312 : }
313 : ],
314 : "name": "PubkeyChanged",
315 : "type": "event"
316 : },
317 : {
318 : "anonymous": false,
319 : "inputs": [
320 : {
321 : "indexed": true,
322 : "internalType": "bytes32",
323 : "name": "node",
324 : "type": "bytes32"
325 : },
326 : {
327 : "indexed": true,
328 : "internalType": "string",
329 : "name": "indexedKey",
330 : "type": "string"
331 : },
332 : {
333 : "indexed": false,
334 : "internalType": "string",
335 : "name": "key",
336 : "type": "string"
337 : },
338 : {
339 : "indexed": false,
340 : "internalType": "string",
341 : "name": "value",
342 : "type": "string"
343 : }
344 : ],
345 : "name": "TextChanged",
346 : "type": "event"
347 : },
348 : {
349 : "anonymous": false,
350 : "inputs": [
351 : {
352 : "indexed": true,
353 : "internalType": "bytes32",
354 : "name": "node",
355 : "type": "bytes32"
356 : },
357 : {
358 : "indexed": false,
359 : "internalType": "uint64",
360 : "name": "newVersion",
361 : "type": "uint64"
362 : }
363 : ],
364 : "name": "VersionChanged",
365 : "type": "event"
366 : },
367 : {
368 : "inputs": [
369 : { "internalType": "bytes32", "name": "node", "type": "bytes32" },
370 : { "internalType": "uint256", "name": "contentTypes", "type": "uint256" }
371 : ],
372 : "name": "ABI",
373 : "outputs": [
374 : { "internalType": "uint256", "name": "", "type": "uint256" },
375 : { "internalType": "bytes", "name": "", "type": "bytes" }
376 : ],
377 : "stateMutability": "view",
378 : "type": "function"
379 : },
380 : {
381 : "inputs": [
382 : { "internalType": "bytes32", "name": "node", "type": "bytes32" }
383 : ],
384 : "name": "addr",
385 : "outputs": [
386 : { "internalType": "address payable", "name": "", "type": "address" }
387 : ],
388 : "stateMutability": "view",
389 : "type": "function"
390 : },
391 : {
392 : "inputs": [
393 : { "internalType": "bytes32", "name": "node", "type": "bytes32" },
394 : { "internalType": "uint256", "name": "coinType", "type": "uint256" }
395 : ],
396 : "name": "addr",
397 : "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],
398 : "stateMutability": "view",
399 : "type": "function"
400 : },
401 : {
402 : "inputs": [
403 : { "internalType": "bytes32", "name": "node", "type": "bytes32" },
404 : { "internalType": "address", "name": "delegate", "type": "address" },
405 : { "internalType": "bool", "name": "approved", "type": "bool" }
406 : ],
407 : "name": "approve",
408 : "outputs": [],
409 : "stateMutability": "nonpayable",
410 : "type": "function"
411 : },
412 : {
413 : "inputs": [
414 : { "internalType": "bytes32", "name": "node", "type": "bytes32" }
415 : ],
416 : "name": "clearRecords",
417 : "outputs": [],
418 : "stateMutability": "nonpayable",
419 : "type": "function"
420 : },
421 : {
422 : "inputs": [
423 : { "internalType": "bytes32", "name": "node", "type": "bytes32" }
424 : ],
425 : "name": "contenthash",
426 : "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],
427 : "stateMutability": "view",
428 : "type": "function"
429 : },
430 : {
431 : "inputs": [
432 : { "internalType": "bytes32", "name": "node", "type": "bytes32" },
433 : { "internalType": "bytes32", "name": "name", "type": "bytes32" },
434 : { "internalType": "uint16", "name": "resource", "type": "uint16" }
435 : ],
436 : "name": "dnsRecord",
437 : "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],
438 : "stateMutability": "view",
439 : "type": "function"
440 : },
441 : {
442 : "inputs": [
443 : { "internalType": "bytes32", "name": "node", "type": "bytes32" },
444 : { "internalType": "bytes32", "name": "name", "type": "bytes32" }
445 : ],
446 : "name": "hasDNSRecords",
447 : "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
448 : "stateMutability": "view",
449 : "type": "function"
450 : },
451 : {
452 : "inputs": [
453 : { "internalType": "bytes32", "name": "node", "type": "bytes32" },
454 : { "internalType": "bytes4", "name": "interfaceID", "type": "bytes4" }
455 : ],
456 : "name": "interfaceImplementer",
457 : "outputs": [{ "internalType": "address", "name": "", "type": "address" }],
458 : "stateMutability": "view",
459 : "type": "function"
460 : },
461 : {
462 : "inputs": [
463 : { "internalType": "address", "name": "owner", "type": "address" },
464 : { "internalType": "bytes32", "name": "node", "type": "bytes32" },
465 : { "internalType": "address", "name": "delegate", "type": "address" }
466 : ],
467 : "name": "isApprovedFor",
468 : "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
469 : "stateMutability": "view",
470 : "type": "function"
471 : },
472 : {
473 : "inputs": [
474 : { "internalType": "address", "name": "account", "type": "address" },
475 : { "internalType": "address", "name": "operator", "type": "address" }
476 : ],
477 : "name": "isApprovedForAll",
478 : "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
479 : "stateMutability": "view",
480 : "type": "function"
481 : },
482 : {
483 : "inputs": [
484 : { "internalType": "bytes[]", "name": "data", "type": "bytes[]" }
485 : ],
486 : "name": "multicall",
487 : "outputs": [
488 : { "internalType": "bytes[]", "name": "results", "type": "bytes[]" }
489 : ],
490 : "stateMutability": "nonpayable",
491 : "type": "function"
492 : },
493 : {
494 : "inputs": [
495 : { "internalType": "bytes32", "name": "nodehash", "type": "bytes32" },
496 : { "internalType": "bytes[]", "name": "data", "type": "bytes[]" }
497 : ],
498 : "name": "multicallWithNodeCheck",
499 : "outputs": [
500 : { "internalType": "bytes[]", "name": "results", "type": "bytes[]" }
501 : ],
502 : "stateMutability": "nonpayable",
503 : "type": "function"
504 : },
505 : {
506 : "inputs": [
507 : { "internalType": "bytes32", "name": "node", "type": "bytes32" }
508 : ],
509 : "name": "name",
510 : "outputs": [{ "internalType": "string", "name": "", "type": "string" }],
511 : "stateMutability": "view",
512 : "type": "function"
513 : },
514 : {
515 : "inputs": [
516 : { "internalType": "bytes32", "name": "node", "type": "bytes32" }
517 : ],
518 : "name": "pubkey",
519 : "outputs": [
520 : { "internalType": "bytes32", "name": "x", "type": "bytes32" },
521 : { "internalType": "bytes32", "name": "y", "type": "bytes32" }
522 : ],
523 : "stateMutability": "view",
524 : "type": "function"
525 : },
526 : {
527 : "inputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }],
528 : "name": "recordVersions",
529 : "outputs": [{ "internalType": "uint64", "name": "", "type": "uint64" }],
530 : "stateMutability": "view",
531 : "type": "function"
532 : },
533 : {
534 : "inputs": [
535 : { "internalType": "bytes32", "name": "node", "type": "bytes32" },
536 : { "internalType": "uint256", "name": "contentType", "type": "uint256" },
537 : { "internalType": "bytes", "name": "data", "type": "bytes" }
538 : ],
539 : "name": "setABI",
540 : "outputs": [],
541 : "stateMutability": "nonpayable",
542 : "type": "function"
543 : },
544 : {
545 : "inputs": [
546 : { "internalType": "bytes32", "name": "node", "type": "bytes32" },
547 : { "internalType": "uint256", "name": "coinType", "type": "uint256" },
548 : { "internalType": "bytes", "name": "a", "type": "bytes" }
549 : ],
550 : "name": "setAddr",
551 : "outputs": [],
552 : "stateMutability": "nonpayable",
553 : "type": "function"
554 : },
555 : {
556 : "inputs": [
557 : { "internalType": "bytes32", "name": "node", "type": "bytes32" },
558 : { "internalType": "address", "name": "a", "type": "address" }
559 : ],
560 : "name": "setAddr",
561 : "outputs": [],
562 : "stateMutability": "nonpayable",
563 : "type": "function"
564 : },
565 : {
566 : "inputs": [
567 : { "internalType": "address", "name": "operator", "type": "address" },
568 : { "internalType": "bool", "name": "approved", "type": "bool" }
569 : ],
570 : "name": "setApprovalForAll",
571 : "outputs": [],
572 : "stateMutability": "nonpayable",
573 : "type": "function"
574 : },
575 : {
576 : "inputs": [
577 : { "internalType": "bytes32", "name": "node", "type": "bytes32" },
578 : { "internalType": "bytes", "name": "hash", "type": "bytes" }
579 : ],
580 : "name": "setContenthash",
581 : "outputs": [],
582 : "stateMutability": "nonpayable",
583 : "type": "function"
584 : },
585 : {
586 : "inputs": [
587 : { "internalType": "bytes32", "name": "node", "type": "bytes32" },
588 : { "internalType": "bytes", "name": "data", "type": "bytes" }
589 : ],
590 : "name": "setDNSRecords",
591 : "outputs": [],
592 : "stateMutability": "nonpayable",
593 : "type": "function"
594 : },
595 : {
596 : "inputs": [
597 : { "internalType": "bytes32", "name": "node", "type": "bytes32" },
598 : { "internalType": "bytes4", "name": "interfaceID", "type": "bytes4" },
599 : { "internalType": "address", "name": "implementer", "type": "address" }
600 : ],
601 : "name": "setInterface",
602 : "outputs": [],
603 : "stateMutability": "nonpayable",
604 : "type": "function"
605 : },
606 : {
607 : "inputs": [
608 : { "internalType": "bytes32", "name": "node", "type": "bytes32" },
609 : { "internalType": "string", "name": "newName", "type": "string" }
610 : ],
611 : "name": "setName",
612 : "outputs": [],
613 : "stateMutability": "nonpayable",
614 : "type": "function"
615 : },
616 : {
617 : "inputs": [
618 : { "internalType": "bytes32", "name": "node", "type": "bytes32" },
619 : { "internalType": "bytes32", "name": "x", "type": "bytes32" },
620 : { "internalType": "bytes32", "name": "y", "type": "bytes32" }
621 : ],
622 : "name": "setPubkey",
623 : "outputs": [],
624 : "stateMutability": "nonpayable",
625 : "type": "function"
626 : },
627 : {
628 : "inputs": [
629 : { "internalType": "bytes32", "name": "node", "type": "bytes32" },
630 : { "internalType": "string", "name": "key", "type": "string" },
631 : { "internalType": "string", "name": "value", "type": "string" }
632 : ],
633 : "name": "setText",
634 : "outputs": [],
635 : "stateMutability": "nonpayable",
636 : "type": "function"
637 : },
638 : {
639 : "inputs": [
640 : { "internalType": "bytes32", "name": "node", "type": "bytes32" },
641 : { "internalType": "bytes", "name": "hash", "type": "bytes" }
642 : ],
643 : "name": "setZonehash",
644 : "outputs": [],
645 : "stateMutability": "nonpayable",
646 : "type": "function"
647 : },
648 : {
649 : "inputs": [
650 : { "internalType": "bytes4", "name": "interfaceID", "type": "bytes4" }
651 : ],
652 : "name": "supportsInterface",
653 : "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
654 : "stateMutability": "view",
655 : "type": "function"
656 : },
657 : {
658 : "inputs": [
659 : { "internalType": "bytes32", "name": "node", "type": "bytes32" },
660 : { "internalType": "string", "name": "key", "type": "string" }
661 : ],
662 : "name": "text",
663 : "outputs": [{ "internalType": "string", "name": "", "type": "string" }],
664 : "stateMutability": "view",
665 : "type": "function"
666 : },
667 : {
668 : "inputs": [
669 : { "internalType": "bytes32", "name": "node", "type": "bytes32" }
670 : ],
671 : "name": "zonehash",
672 : "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],
673 : "stateMutability": "view",
674 : "type": "function"
675 : }
676 : ]
677 : ''');
678 :
679 : class EnsResolverContract extends InternalContract {
680 1 : EnsResolverContract({
681 : required super.contractAddress,
682 : required super.rpc,
683 1 : }) : super(
684 1 : abi: ensResoloverABI,
685 : );
686 :
687 1 : Future<String?> addr({required String name}) async {
688 3 : final function = abi.functions[1];
689 :
690 3 : assert(function.functionSelectorHex == "3b3b57de");
691 :
692 1 : final node = namehash(name);
693 :
694 1 : final result = await readSafe(
695 2 : function: function.addValues(values: [node]),
696 : );
697 :
698 3 : final address = result.outputs.first.value as String;
699 :
700 1 : if (address == nullAddress) {
701 : return null;
702 : }
703 :
704 : return address;
705 : }
706 : }
|