@ensdomains/ensjs 3.0.0-alpha.1 → 3.0.0-alpha.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (333) hide show
  1. package/README.md +2 -0
  2. package/dist/cjs/GqlManager.d.ts +3 -0
  3. package/dist/cjs/GqlManager.js +62 -2
  4. package/dist/cjs/contracts/baseRegistrar.d.ts +1 -1
  5. package/dist/cjs/contracts/index.d.ts +3 -3
  6. package/dist/cjs/contracts/multicall.d.ts +1 -1
  7. package/dist/cjs/contracts/registry.d.ts +1 -1
  8. package/dist/cjs/functions/burnFuses.d.ts +3 -2
  9. package/dist/cjs/functions/burnFuses.js +4 -8
  10. package/dist/cjs/functions/createSubname.d.ts +3 -5
  11. package/dist/cjs/functions/createSubname.js +7 -8
  12. package/dist/cjs/functions/deleteSubname.d.ts +3 -3
  13. package/dist/cjs/functions/deleteSubname.js +6 -2
  14. package/dist/cjs/functions/getDNSOwner.d.ts +7 -0
  15. package/dist/cjs/functions/getDNSOwner.js +81 -0
  16. package/dist/cjs/functions/getExpiry.d.ts +9 -2
  17. package/dist/cjs/functions/getExpiry.js +52 -7
  18. package/dist/cjs/functions/getFuses.d.ts +2 -3
  19. package/dist/cjs/functions/getFuses.js +6 -14
  20. package/dist/cjs/functions/getHistory.d.ts +0 -30
  21. package/dist/cjs/functions/getHistory.js +3 -99
  22. package/dist/cjs/functions/getName.d.ts +2 -2
  23. package/dist/cjs/functions/getName.js +1 -1
  24. package/dist/cjs/functions/getOwner.js +7 -6
  25. package/dist/cjs/functions/getProfile.d.ts +4 -1
  26. package/dist/cjs/functions/getProfile.js +102 -24
  27. package/dist/cjs/functions/getRecords.d.ts +1 -0
  28. package/dist/cjs/functions/getSpecificRecord.js +30 -6
  29. package/dist/cjs/functions/getSubnames.d.ts +1 -1
  30. package/dist/cjs/functions/getSubnames.js +7 -7
  31. package/dist/cjs/functions/setName.d.ts +4 -3
  32. package/dist/cjs/functions/setName.js +5 -10
  33. package/dist/cjs/functions/setRecord.d.ts +18 -0
  34. package/dist/cjs/functions/setRecord.js +27 -0
  35. package/dist/cjs/functions/setRecords.d.ts +4 -2
  36. package/dist/cjs/functions/setRecords.js +14 -12
  37. package/dist/cjs/functions/setResolver.d.ts +4 -4
  38. package/dist/cjs/functions/setResolver.js +6 -12
  39. package/dist/cjs/functions/transferName.d.ts +4 -3
  40. package/dist/cjs/functions/transferName.js +9 -13
  41. package/dist/cjs/functions/transferSubname.d.ts +13 -3
  42. package/dist/cjs/functions/transferSubname.js +7 -8
  43. package/dist/cjs/functions/unwrapName.d.ts +4 -3
  44. package/dist/cjs/functions/unwrapName.js +5 -9
  45. package/dist/cjs/functions/wrapName.d.ts +7 -3
  46. package/dist/cjs/functions/wrapName.js +38 -36
  47. package/dist/cjs/generated/BaseRegistrarImplementation.d.ts +222 -201
  48. package/dist/cjs/generated/DNSRegistrar.d.ts +68 -64
  49. package/dist/cjs/generated/DNSSECImpl.d.ts +111 -111
  50. package/dist/cjs/generated/DefaultReverseResolver.d.ts +17 -17
  51. package/dist/cjs/generated/ENSRegistry.d.ts +126 -111
  52. package/dist/cjs/generated/ETHRegistrarController.d.ts +111 -109
  53. package/dist/cjs/generated/Multicall.d.ts +60 -60
  54. package/dist/cjs/generated/NameWrapper.d.ts +493 -354
  55. package/dist/cjs/generated/P256SHA256Algorithm.d.ts +11 -7
  56. package/dist/cjs/generated/PublicResolver.d.ts +259 -235
  57. package/dist/cjs/generated/RSASHA1Algorithm.d.ts +11 -7
  58. package/dist/cjs/generated/RSASHA256Algorithm.d.ts +11 -7
  59. package/dist/cjs/generated/ReverseRegistrar.d.ts +112 -103
  60. package/dist/cjs/generated/Root.d.ts +77 -77
  61. package/dist/cjs/generated/SHA1Digest.d.ts +7 -7
  62. package/dist/cjs/generated/SHA1NSEC3Digest.d.ts +11 -7
  63. package/dist/cjs/generated/SHA256Digest.d.ts +7 -7
  64. package/dist/cjs/generated/StaticMetadataService.d.ts +7 -7
  65. package/dist/cjs/generated/TLDPublicSuffixList.d.ts +7 -7
  66. package/dist/cjs/generated/UniversalResolver.d.ts +31 -31
  67. package/dist/cjs/generated/common.d.ts +1 -0
  68. package/dist/cjs/generated/factories/DNSRegistrar__factory.d.ts +3 -15
  69. package/dist/cjs/generated/factories/DNSRegistrar__factory.js +3 -26
  70. package/dist/cjs/generated/factories/DNSSECImpl__factory.d.ts +3 -15
  71. package/dist/cjs/generated/factories/DNSSECImpl__factory.js +3 -26
  72. package/dist/cjs/generated/factories/ETHRegistrarController__factory.js +14 -4
  73. package/dist/cjs/generated/factories/NameWrapper__factory.js +210 -79
  74. package/dist/cjs/generated/factories/P256SHA256Algorithm__factory.d.ts +3 -15
  75. package/dist/cjs/generated/factories/P256SHA256Algorithm__factory.js +3 -26
  76. package/dist/cjs/generated/factories/RSASHA1Algorithm__factory.d.ts +3 -15
  77. package/dist/cjs/generated/factories/RSASHA1Algorithm__factory.js +3 -26
  78. package/dist/cjs/generated/factories/RSASHA256Algorithm__factory.d.ts +3 -15
  79. package/dist/cjs/generated/factories/RSASHA256Algorithm__factory.js +3 -26
  80. package/dist/cjs/generated/factories/SHA1Digest__factory.d.ts +3 -15
  81. package/dist/cjs/generated/factories/SHA1Digest__factory.js +3 -26
  82. package/dist/cjs/generated/factories/SHA1NSEC3Digest__factory.d.ts +3 -15
  83. package/dist/cjs/generated/factories/SHA1NSEC3Digest__factory.js +3 -26
  84. package/dist/cjs/generated/factories/SHA256Digest__factory.d.ts +3 -15
  85. package/dist/cjs/generated/factories/SHA256Digest__factory.js +3 -26
  86. package/dist/cjs/generated/factories/TLDPublicSuffixList__factory.d.ts +3 -15
  87. package/dist/cjs/generated/factories/TLDPublicSuffixList__factory.js +3 -26
  88. package/dist/cjs/generated/factories/index.d.ts +14 -0
  89. package/dist/cjs/generated/factories/index.js +29 -1
  90. package/dist/cjs/generated/index.d.ts +29 -1
  91. package/dist/cjs/generated/index.js +31 -3
  92. package/dist/cjs/index.d.ts +62 -84
  93. package/dist/cjs/index.js +44 -21
  94. package/dist/cjs/utils/labels.js +5 -4
  95. package/dist/cjs/utils/makeHashIndexes.js +2 -2
  96. package/dist/cjs/utils/normalise.d.ts +1 -0
  97. package/dist/cjs/utils/normalise.js +27 -1
  98. package/dist/cjs/utils/recordHelpers.d.ts +3 -0
  99. package/dist/cjs/utils/recordHelpers.js +42 -15
  100. package/dist/cjs/utils/registerHelpers.js +3 -4
  101. package/dist/cjs/utils/wrapperExpiry.d.ts +5 -0
  102. package/dist/cjs/utils/wrapperExpiry.js +30 -0
  103. package/dist/cjs/utils/writeTx.d.ts +4 -0
  104. package/dist/cjs/utils/writeTx.js +3 -0
  105. package/dist/esm/GqlManager.d.ts +3 -0
  106. package/dist/esm/GqlManager.js +58 -2
  107. package/dist/esm/contracts/baseRegistrar.d.ts +1 -1
  108. package/dist/esm/contracts/index.d.ts +3 -3
  109. package/dist/esm/contracts/multicall.d.ts +1 -1
  110. package/dist/esm/contracts/registry.d.ts +1 -1
  111. package/dist/esm/functions/burnFuses.d.ts +3 -2
  112. package/dist/esm/functions/burnFuses.js +4 -8
  113. package/dist/esm/functions/createSubname.d.ts +3 -5
  114. package/dist/esm/functions/createSubname.js +7 -8
  115. package/dist/esm/functions/deleteSubname.d.ts +3 -3
  116. package/dist/esm/functions/deleteSubname.js +6 -2
  117. package/dist/esm/functions/getDNSOwner.d.ts +7 -0
  118. package/dist/esm/functions/getDNSOwner.js +51 -0
  119. package/dist/esm/functions/getExpiry.d.ts +9 -2
  120. package/dist/esm/functions/getExpiry.js +52 -7
  121. package/dist/esm/functions/getFuses.d.ts +2 -3
  122. package/dist/esm/functions/getFuses.js +7 -15
  123. package/dist/esm/functions/getHistory.d.ts +0 -30
  124. package/dist/esm/functions/getHistory.js +2 -96
  125. package/dist/esm/functions/getName.d.ts +2 -2
  126. package/dist/esm/functions/getName.js +1 -1
  127. package/dist/esm/functions/getOwner.js +7 -6
  128. package/dist/esm/functions/getProfile.d.ts +4 -1
  129. package/dist/esm/functions/getProfile.js +102 -24
  130. package/dist/esm/functions/getRecords.d.ts +1 -0
  131. package/dist/esm/functions/getSpecificRecord.js +30 -6
  132. package/dist/esm/functions/getSubnames.d.ts +1 -1
  133. package/dist/esm/functions/getSubnames.js +4 -4
  134. package/dist/esm/functions/setName.d.ts +4 -3
  135. package/dist/esm/functions/setName.js +5 -10
  136. package/dist/esm/functions/setRecord.d.ts +18 -0
  137. package/dist/esm/functions/setRecord.js +24 -0
  138. package/dist/esm/functions/setRecords.d.ts +4 -2
  139. package/dist/esm/functions/setRecords.js +14 -12
  140. package/dist/esm/functions/setResolver.d.ts +4 -4
  141. package/dist/esm/functions/setResolver.js +6 -12
  142. package/dist/esm/functions/transferName.d.ts +4 -3
  143. package/dist/esm/functions/transferName.js +9 -13
  144. package/dist/esm/functions/transferSubname.d.ts +13 -3
  145. package/dist/esm/functions/transferSubname.js +7 -8
  146. package/dist/esm/functions/unwrapName.d.ts +4 -3
  147. package/dist/esm/functions/unwrapName.js +5 -9
  148. package/dist/esm/functions/wrapName.d.ts +7 -3
  149. package/dist/esm/functions/wrapName.js +38 -36
  150. package/dist/esm/generated/BaseRegistrarImplementation.d.ts +222 -201
  151. package/dist/esm/generated/DNSRegistrar.d.ts +68 -64
  152. package/dist/esm/generated/DNSSECImpl.d.ts +111 -111
  153. package/dist/esm/generated/DefaultReverseResolver.d.ts +17 -17
  154. package/dist/esm/generated/ENSRegistry.d.ts +126 -111
  155. package/dist/esm/generated/ETHRegistrarController.d.ts +111 -109
  156. package/dist/esm/generated/Multicall.d.ts +60 -60
  157. package/dist/esm/generated/NameWrapper.d.ts +493 -354
  158. package/dist/esm/generated/P256SHA256Algorithm.d.ts +11 -7
  159. package/dist/esm/generated/PublicResolver.d.ts +259 -235
  160. package/dist/esm/generated/RSASHA1Algorithm.d.ts +11 -7
  161. package/dist/esm/generated/RSASHA256Algorithm.d.ts +11 -7
  162. package/dist/esm/generated/ReverseRegistrar.d.ts +112 -103
  163. package/dist/esm/generated/Root.d.ts +77 -77
  164. package/dist/esm/generated/SHA1Digest.d.ts +7 -7
  165. package/dist/esm/generated/SHA1NSEC3Digest.d.ts +11 -7
  166. package/dist/esm/generated/SHA256Digest.d.ts +7 -7
  167. package/dist/esm/generated/StaticMetadataService.d.ts +7 -7
  168. package/dist/esm/generated/TLDPublicSuffixList.d.ts +7 -7
  169. package/dist/esm/generated/UniversalResolver.d.ts +31 -31
  170. package/dist/esm/generated/common.d.ts +1 -0
  171. package/dist/esm/generated/factories/DNSRegistrar__factory.d.ts +3 -15
  172. package/dist/esm/generated/factories/DNSRegistrar__factory.js +2 -25
  173. package/dist/esm/generated/factories/DNSSECImpl__factory.d.ts +3 -15
  174. package/dist/esm/generated/factories/DNSSECImpl__factory.js +2 -25
  175. package/dist/esm/generated/factories/ETHRegistrarController__factory.js +14 -4
  176. package/dist/esm/generated/factories/NameWrapper__factory.js +210 -79
  177. package/dist/esm/generated/factories/P256SHA256Algorithm__factory.d.ts +3 -15
  178. package/dist/esm/generated/factories/P256SHA256Algorithm__factory.js +2 -25
  179. package/dist/esm/generated/factories/RSASHA1Algorithm__factory.d.ts +3 -15
  180. package/dist/esm/generated/factories/RSASHA1Algorithm__factory.js +2 -25
  181. package/dist/esm/generated/factories/RSASHA256Algorithm__factory.d.ts +3 -15
  182. package/dist/esm/generated/factories/RSASHA256Algorithm__factory.js +2 -25
  183. package/dist/esm/generated/factories/SHA1Digest__factory.d.ts +3 -15
  184. package/dist/esm/generated/factories/SHA1Digest__factory.js +2 -25
  185. package/dist/esm/generated/factories/SHA1NSEC3Digest__factory.d.ts +3 -15
  186. package/dist/esm/generated/factories/SHA1NSEC3Digest__factory.js +2 -25
  187. package/dist/esm/generated/factories/SHA256Digest__factory.d.ts +3 -15
  188. package/dist/esm/generated/factories/SHA256Digest__factory.js +2 -25
  189. package/dist/esm/generated/factories/TLDPublicSuffixList__factory.d.ts +3 -15
  190. package/dist/esm/generated/factories/TLDPublicSuffixList__factory.js +2 -25
  191. package/dist/esm/generated/factories/index.d.ts +14 -0
  192. package/dist/esm/generated/factories/index.js +14 -0
  193. package/dist/esm/generated/index.d.ts +29 -1
  194. package/dist/esm/generated/index.js +15 -1
  195. package/dist/esm/index.d.ts +62 -84
  196. package/dist/esm/index.js +44 -21
  197. package/dist/esm/utils/labels.js +5 -4
  198. package/dist/esm/utils/makeHashIndexes.js +2 -2
  199. package/dist/esm/utils/normalise.d.ts +1 -0
  200. package/dist/esm/utils/normalise.js +25 -0
  201. package/dist/esm/utils/recordHelpers.d.ts +3 -0
  202. package/dist/esm/utils/recordHelpers.js +40 -14
  203. package/dist/esm/utils/registerHelpers.js +3 -4
  204. package/dist/esm/utils/wrapperExpiry.d.ts +5 -0
  205. package/dist/esm/utils/wrapperExpiry.js +26 -0
  206. package/dist/esm/utils/writeTx.d.ts +4 -0
  207. package/dist/esm/utils/writeTx.js +1 -0
  208. package/package.json +24 -14
  209. package/src/@types/dns-packet/index.d.ts +114 -0
  210. package/src/ABIs/Multicall.json +452 -0
  211. package/src/GqlManager.test.ts +170 -0
  212. package/src/GqlManager.ts +67 -2
  213. package/src/contracts/index.ts +1 -1
  214. package/src/{tests → functions}/batch.test.ts +7 -7
  215. package/src/{tests → functions}/batchWrappers.test.ts +6 -6
  216. package/src/{tests → functions}/burnFuses.test.ts +12 -15
  217. package/src/functions/burnFuses.ts +9 -11
  218. package/src/{tests → functions}/createSubname.test.ts +9 -17
  219. package/src/functions/createSubname.ts +20 -14
  220. package/src/{tests → functions}/deleteSubname.test.ts +12 -31
  221. package/src/functions/deleteSubname.ts +10 -12
  222. package/src/functions/getDNSOwner.test.ts +118 -0
  223. package/src/functions/getDNSOwner.ts +61 -0
  224. package/src/functions/getExpiry.test.ts +59 -0
  225. package/src/functions/getExpiry.ts +87 -9
  226. package/src/{tests → functions}/getFuses.test.ts +16 -37
  227. package/src/functions/getFuses.ts +12 -17
  228. package/src/functions/getHistory.test.ts +29 -0
  229. package/src/functions/getHistory.ts +2 -127
  230. package/src/{tests → functions}/getName.test.ts +6 -6
  231. package/src/functions/getName.ts +1 -1
  232. package/src/{tests → functions}/getNames.test.ts +98 -69
  233. package/src/{tests → functions}/getOwner.test.ts +21 -24
  234. package/src/functions/getOwner.ts +7 -7
  235. package/src/functions/getProfile.test.ts +143 -0
  236. package/src/functions/getProfile.ts +151 -24
  237. package/src/functions/getRecords.ts +1 -0
  238. package/src/functions/getResolver.test.ts +15 -0
  239. package/src/{tests → functions}/getSpecificRecord.test.ts +17 -14
  240. package/src/functions/getSpecificRecord.ts +38 -12
  241. package/src/functions/getSubnames.test.ts +35 -0
  242. package/src/functions/getSubnames.ts +76 -67
  243. package/src/{tests → functions}/makeCommitment.test.ts +2 -2
  244. package/src/functions/normalise.test.ts +22 -0
  245. package/src/{tests → functions}/setName.test.ts +11 -11
  246. package/src/functions/setName.ts +15 -17
  247. package/src/functions/setRecord.test.ts +103 -0
  248. package/src/functions/setRecord.ts +63 -0
  249. package/src/{tests → functions}/setRecords.test.ts +16 -13
  250. package/src/functions/setRecords.ts +22 -16
  251. package/src/{tests → functions}/setResolver.test.ts +13 -19
  252. package/src/functions/setResolver.ts +15 -20
  253. package/src/{tests → functions}/transferName.test.ts +20 -35
  254. package/src/functions/transferName.ts +19 -22
  255. package/src/{tests → functions}/transferSubname.test.ts +14 -33
  256. package/src/functions/transferSubname.ts +39 -13
  257. package/src/{tests → functions}/unwrapName.test.ts +16 -30
  258. package/src/functions/unwrapName.ts +20 -15
  259. package/src/functions/wrapName.test.ts +142 -0
  260. package/src/functions/wrapName.ts +63 -49
  261. package/src/generated/BaseRegistrarImplementation.ts +382 -296
  262. package/src/generated/DNSRegistrar.ts +103 -89
  263. package/src/generated/DNSSECImpl.ts +180 -149
  264. package/src/generated/DefaultReverseResolver.ts +37 -21
  265. package/src/generated/ENSRegistry.ts +257 -184
  266. package/src/generated/ETHRegistrarController.ts +252 -191
  267. package/src/generated/Multicall.ts +73 -57
  268. package/src/generated/NameWrapper.ts +979 -649
  269. package/src/generated/P256SHA256Algorithm.ts +21 -16
  270. package/src/generated/PublicResolver.ts +452 -362
  271. package/src/generated/RSASHA1Algorithm.ts +21 -16
  272. package/src/generated/RSASHA256Algorithm.ts +21 -16
  273. package/src/generated/ReverseRegistrar.ts +193 -141
  274. package/src/generated/Root.ts +146 -86
  275. package/src/generated/SHA1Digest.ts +12 -11
  276. package/src/generated/SHA1NSEC3Digest.ts +21 -16
  277. package/src/generated/SHA256Digest.ts +12 -11
  278. package/src/generated/StaticMetadataService.ts +22 -6
  279. package/src/generated/TLDPublicSuffixList.ts +10 -6
  280. package/src/generated/UniversalResolver.ts +44 -40
  281. package/src/generated/common.ts +2 -0
  282. package/src/generated/factories/DNSRegistrar__factory.ts +4 -56
  283. package/src/generated/factories/DNSSECImpl__factory.ts +4 -49
  284. package/src/generated/factories/ETHRegistrarController__factory.ts +14 -4
  285. package/src/generated/factories/NameWrapper__factory.ts +210 -79
  286. package/src/generated/factories/P256SHA256Algorithm__factory.ts +4 -40
  287. package/src/generated/factories/RSASHA1Algorithm__factory.ts +4 -40
  288. package/src/generated/factories/RSASHA256Algorithm__factory.ts +4 -40
  289. package/src/generated/factories/SHA1Digest__factory.ts +4 -40
  290. package/src/generated/factories/SHA1NSEC3Digest__factory.ts +4 -40
  291. package/src/generated/factories/SHA256Digest__factory.ts +4 -40
  292. package/src/generated/factories/TLDPublicSuffixList__factory.ts +4 -40
  293. package/src/generated/factories/index.ts +14 -0
  294. package/src/generated/index.ts +29 -1
  295. package/src/index.ts +117 -47
  296. package/src/tests/populateTransaction.test.ts +40 -0
  297. package/src/tests/setup.ts +17 -13
  298. package/src/tests/signerInjection.test.ts +46 -0
  299. package/src/tests/withProvider.test.ts +3 -3
  300. package/src/utils/labels.ts +6 -4
  301. package/src/utils/makeHashIndexes.ts +4 -4
  302. package/src/utils/normalise.ts +29 -0
  303. package/src/utils/recordHelpers.ts +52 -18
  304. package/src/utils/registerHelpers.ts +3 -4
  305. package/src/utils/wrapperExpiry.ts +31 -0
  306. package/src/utils/writeTx.ts +6 -0
  307. package/dist/cjs/contracts/doNotCallOnChainUniversalResolverProxy.d.ts +0 -3
  308. package/dist/cjs/contracts/doNotCallOnChainUniversalResolverProxy.js +0 -4
  309. package/dist/cjs/generated/DoNotCallOnChainUniversalResolverProxy.d.ts +0 -144
  310. package/dist/cjs/generated/DoNotCallOnChainUniversalResolverProxy.js +0 -2
  311. package/dist/cjs/generated/factories/DoNotCallOnChainUniversalResolverProxy__factory.d.ts +0 -56
  312. package/dist/cjs/generated/factories/DoNotCallOnChainUniversalResolverProxy__factory.js +0 -171
  313. package/dist/esm/contracts/doNotCallOnChainUniversalResolverProxy.d.ts +0 -3
  314. package/dist/esm/contracts/doNotCallOnChainUniversalResolverProxy.js +0 -2
  315. package/dist/esm/generated/DoNotCallOnChainUniversalResolverProxy.d.ts +0 -144
  316. package/dist/esm/generated/DoNotCallOnChainUniversalResolverProxy.js +0 -1
  317. package/dist/esm/generated/factories/DoNotCallOnChainUniversalResolverProxy__factory.d.ts +0 -56
  318. package/dist/esm/generated/factories/DoNotCallOnChainUniversalResolverProxy__factory.js +0 -167
  319. package/src/ABIs/ETHRegistrarController.json +0 -494
  320. package/src/ABIs/NameWrapper.json +0 -1183
  321. package/src/ABIs/PublicResolver.json +0 -875
  322. package/src/ABIs/ReverseRegistrar.json +0 -323
  323. package/src/ABIs/StaticMetadataService.json +0 -32
  324. package/src/ABIs/UniversalResolver.json +0 -187
  325. package/src/contracts/doNotCallOnChainUniversalResolverProxy.ts +0 -5
  326. package/src/generated/DoNotCallOnChainUniversalResolverProxy.ts +0 -285
  327. package/src/generated/factories/DoNotCallOnChainUniversalResolverProxy__factory.ts +0 -186
  328. package/src/tests/getExpiry.test.ts +0 -37
  329. package/src/tests/getHistory.test.ts +0 -101
  330. package/src/tests/getProfile.test.ts +0 -102
  331. package/src/tests/getResolver.test.ts +0 -19
  332. package/src/tests/getSubnames.test.ts +0 -31
  333. package/src/tests/wrapName.test.ts +0 -67
package/src/GqlManager.ts CHANGED
@@ -1,11 +1,76 @@
1
+ // @ts-nocheck
2
+ import { namehash } from './utils/normalise'
3
+
4
+ const generateSelection = (selection: any) => ({
5
+ kind: 'Field',
6
+ name: {
7
+ kind: 'Name',
8
+ value: selection,
9
+ },
10
+ arguments: [],
11
+ directives: [],
12
+ alias: undefined,
13
+ selectionSet: undefined,
14
+ })
15
+
16
+ export const enter = (node: any) => {
17
+ if (node.kind === 'SelectionSet') {
18
+ const id = node.selections.find((x) => x.name && x.name.value === 'id')
19
+ const name = node.selections.find((x) => x.name && x.name.value === 'name')
20
+
21
+ if (!id && name) {
22
+ node.selections = [...node.selections, generateSelection('id')]
23
+ return node
24
+ }
25
+ }
26
+ }
27
+
28
+ export const requestMiddleware = (visit, parse) => (request: any) => {
29
+ const requestBody = JSON.parse(request.body)
30
+ const rawQuery = requestBody.query
31
+ const parsedQuery = parse(rawQuery)
32
+ const updatedQuery = visit(parsedQuery, { enter })
33
+ const updatedBody = { ...requestBody, query: updatedQuery.loc.source.body }
34
+
35
+ return {
36
+ ...request,
37
+ body: JSON.stringify(updatedBody),
38
+ }
39
+ }
40
+
41
+ export const responseMiddleware = (traverse) => (response: any) => {
42
+ traverse(response).forEach(function (responseItem: any) {
43
+ if (responseItem instanceof Object && responseItem.name) {
44
+ //Name already in hashed form
45
+ if (responseItem.name && responseItem.name.includes('[')) {
46
+ return
47
+ }
48
+
49
+ const hashedName = namehash(responseItem.name)
50
+ if (responseItem.id !== hashedName) {
51
+ this.update({ ...responseItem, name: hashedName, invalidName: true })
52
+ }
53
+ }
54
+ })
55
+ return response
56
+ }
57
+
1
58
  export default class GqlManager {
2
59
  public gql: any = () => null
3
60
  public client?: any | null = null
4
61
 
5
62
  public setUrl = async (url: string | null) => {
6
63
  if (url) {
7
- const imported = await import('graphql-request')
8
- this.client = new imported.GraphQLClient(url)
64
+ const [imported, traverse, { visit, parse }] = await Promise.all([
65
+ import('graphql-request'),
66
+ import('traverse'),
67
+ import('graphql/language'),
68
+ ])
69
+
70
+ this.client = new imported.GraphQLClient(url, {
71
+ requestMiddleware: requestMiddleware(visit, parse),
72
+ responseMiddleware: responseMiddleware(traverse.default),
73
+ })
9
74
  this.gql = imported.gql
10
75
  } else {
11
76
  this.client = null
@@ -25,7 +25,7 @@ export default class ContractManager {
25
25
  private generateContractGetter = <C extends (...args: any) => any>(
26
26
  name: ContractName,
27
27
  func: C,
28
- ) => {
28
+ ): ((passedProvider?: any, address?: string) => Promise<ReturnType<C>>) => {
29
29
  return async (
30
30
  passedProvider?: any,
31
31
  address?: string,
@@ -1,5 +1,5 @@
1
1
  import { ENS } from '..'
2
- import setup from './setup'
2
+ import setup from '../tests/setup'
3
3
 
4
4
  let ENSInstance: ENS
5
5
 
@@ -10,23 +10,23 @@ beforeAll(async () => {
10
10
  describe('batch', () => {
11
11
  it('should batch calls together', async () => {
12
12
  const result = await ENSInstance.batch(
13
- ENSInstance.getText.batch('jefflau.eth', 'description'),
14
- ENSInstance.getAddr.batch('jefflau.eth'),
15
- ENSInstance.getName.batch('0x866B3c4994e1416B7C738B9818b31dC246b95eEE'),
13
+ ENSInstance.getText.batch('with-profile.eth', 'description'),
14
+ ENSInstance.getAddr.batch('with-profile.eth'),
15
+ ENSInstance.getName.batch('0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC'),
16
16
  )
17
17
  expect(result).toBeTruthy()
18
18
  if (result) {
19
19
  expect(result[0]).toBe('Hello2')
20
- expect(result[1]).toBe('0x866B3c4994e1416B7C738B9818b31dC246b95eEE')
20
+ expect(result[1]).toBe('0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC')
21
21
  expect(result[2]).toMatchObject({
22
- name: 'jefflau.eth',
22
+ name: 'with-profile.eth',
23
23
  match: true,
24
24
  })
25
25
  }
26
26
  })
27
27
  it('should batch a single call', async () => {
28
28
  const result = await ENSInstance.batch(
29
- ENSInstance.getText.batch('jefflau.eth', 'description'),
29
+ ENSInstance.getText.batch('with-profile.eth', 'description'),
30
30
  )
31
31
  expect(result).toBeTruthy()
32
32
  if (result) {
@@ -1,5 +1,5 @@
1
1
  import { ENS } from '..'
2
- import setup from './setup'
2
+ import setup from '../tests/setup'
3
3
 
4
4
  let ENSInstance: ENS
5
5
 
@@ -10,12 +10,12 @@ beforeAll(async () => {
10
10
  describe('batchWrappers', () => {
11
11
  it('should batch calls together', async () => {
12
12
  const batch = await ENSInstance.resolverMulticallWrapper.raw([
13
- await ENSInstance._getText.raw('jefflau.eth', 'description'),
14
- await ENSInstance._getText.raw('jefflau.eth', 'url'),
15
- await ENSInstance._getAddr.raw('jefflau.eth'),
13
+ await ENSInstance._getText.raw('with-profile.eth', 'description'),
14
+ await ENSInstance._getText.raw('with-profile.eth', 'url'),
15
+ await ENSInstance._getAddr.raw('with-profile.eth'),
16
16
  ])
17
17
  const universalResponse = await ENSInstance.universalWrapper(
18
- 'jefflau.eth',
18
+ 'with-profile.eth',
19
19
  batch.data,
20
20
  )
21
21
  const [batchDecoded] = await ENSInstance.resolverMulticallWrapper.decode(
@@ -26,6 +26,6 @@ describe('batchWrappers', () => {
26
26
  const decoded3 = await ENSInstance._getAddr.decode(batchDecoded[2])
27
27
  expect(decoded1).toBe('Hello2')
28
28
  expect(decoded2).toBe('twitter.com')
29
- expect(decoded3).toBe('0x866B3c4994e1416B7C738B9818b31dC246b95eEE')
29
+ expect(decoded3).toBe('0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC')
30
30
  })
31
31
  })
@@ -1,6 +1,7 @@
1
- import { BigNumber, ethers, utils } from 'ethers'
1
+ import { ethers } from 'ethers'
2
2
  import { ENS } from '..'
3
- import setup from './setup'
3
+ import setup from '../tests/setup'
4
+ import { namehash } from '../utils/normalise'
4
5
 
5
6
  let ENSInstance: ENS
6
7
  let revert: Awaited<ReturnType<typeof setup>>['revert']
@@ -21,23 +22,19 @@ describe('burnFuses', () => {
21
22
  await revert()
22
23
  })
23
24
  it('should return a burnFuses transaction and succeed', async () => {
24
- const wrapNameTx = await ENSInstance.wrapName(
25
- 'parthtejpal.eth',
26
- accounts[0],
27
- )
28
- await wrapNameTx.wait()
29
-
30
- const tx = await ENSInstance.burnFuses('parthtejpal.eth', {
31
- cannotUnwrap: true,
32
- cannotCreateSubdomain: true,
33
- cannotSetTtl: true,
25
+ const tx = await ENSInstance.burnFuses('wrapped.eth', {
26
+ fusesToBurn: {
27
+ cannotUnwrap: true,
28
+ cannotCreateSubdomain: true,
29
+ cannotSetTtl: true,
30
+ },
31
+ addressOrIndex: accounts[1],
34
32
  })
35
33
  expect(tx).toBeTruthy()
36
34
  await tx.wait()
37
35
 
38
36
  const nameWrapper = await ENSInstance.contracts!.getNameWrapper()!
39
- const result = await nameWrapper.getFuses(utils.namehash('parthtejpal.eth'))
40
- const fuseBN = result.fuses as BigNumber
41
- expect(fuseBN.toHexString()).toBe('0x71')
37
+ const [fuses] = await nameWrapper.getFuses(namehash('wrapped.eth'))
38
+ expect(fuses).toBe(113)
42
39
  })
43
40
  })
@@ -1,23 +1,21 @@
1
- import { ethers } from 'ethers'
2
1
  import { ENSArgs } from '..'
3
2
  import { FuseOptions } from '../@types/FuseOptions'
4
3
  import generateFuseInput from '../utils/generateFuseInput'
4
+ import { namehash } from '../utils/normalise'
5
5
 
6
6
  export default async function (
7
- { contracts, provider }: ENSArgs<'contracts' | 'provider'>,
7
+ { contracts, signer }: ENSArgs<'contracts' | 'signer'>,
8
8
  name: string,
9
- fusesToBurn: FuseOptions,
9
+ {
10
+ fusesToBurn,
11
+ }: {
12
+ fusesToBurn: FuseOptions
13
+ },
10
14
  ) {
11
- const signer = provider?.getSigner()
12
-
13
- if (!signer) {
14
- throw new Error('No signer found')
15
- }
16
-
17
15
  const nameWrapper = (await contracts?.getNameWrapper()!).connect(signer)
18
- const namehash = ethers.utils.namehash(name)
16
+ const hash = namehash(name)
19
17
 
20
18
  const encodedFuses = generateFuseInput(fusesToBurn)
21
19
 
22
- return nameWrapper.burnFuses(namehash, encodedFuses)
20
+ return nameWrapper.populateTransaction.setFuses(hash, encodedFuses)
23
21
  }
@@ -1,6 +1,7 @@
1
- import { ethers, utils } from 'ethers'
1
+ import { ethers } from 'ethers'
2
2
  import { ENS } from '..'
3
- import setup from './setup'
3
+ import setup from '../tests/setup'
4
+ import { namehash } from '../utils/normalise'
4
5
 
5
6
  let ENSInstance: ENS
6
7
  let revert: Awaited<ReturnType<typeof setup>>['revert']
@@ -22,38 +23,29 @@ describe('createSubname', () => {
22
23
  await revert()
23
24
  })
24
25
  it('should allow creating a subname on the registry', async () => {
25
- const tx = await ENSInstance.createSubname({
26
+ const tx = await ENSInstance.createSubname('test.test123.eth', {
26
27
  contract: 'registry',
27
- name: 'test.parthtejpal.eth',
28
28
  owner: accounts[0],
29
- options: { addressOrIndex: 0 },
29
+ addressOrIndex: 1,
30
30
  })
31
31
  expect(tx).toBeTruthy()
32
32
  await tx.wait()
33
33
 
34
34
  const registry = await ENSInstance.contracts!.getRegistry()!
35
- const result = await registry.owner(utils.namehash('test.parthtejpal.eth'))
35
+ const result = await registry.owner(namehash('test.test123.eth'))
36
36
  expect(result).toBe(accounts[0])
37
37
  })
38
38
  it('should allow creating a subname on the namewrapper', async () => {
39
- const wrapNameTx = await ENSInstance.wrapName(
40
- 'parthtejpal.eth',
41
- accounts[0],
42
- )
43
- await wrapNameTx.wait()
44
- const tx = await ENSInstance.createSubname({
39
+ const tx = await ENSInstance.createSubname('test.wrapped.eth', {
45
40
  contract: 'nameWrapper',
46
- name: 'test.parthtejpal.eth',
47
41
  owner: accounts[0],
48
- options: { addressOrIndex: 0 },
42
+ addressOrIndex: 1,
49
43
  })
50
44
  expect(tx).toBeTruthy()
51
45
  await tx.wait()
52
46
 
53
47
  const nameWrapper = await ENSInstance.contracts!.getNameWrapper()!
54
- const result = await nameWrapper.ownerOf(
55
- utils.namehash('test.parthtejpal.eth'),
56
- )
48
+ const result = await nameWrapper.ownerOf(namehash('test.wrapped.eth'))
57
49
  expect(result).toBe(accounts[0])
58
50
  })
59
51
  })
@@ -1,33 +1,33 @@
1
- import { ethers } from 'ethers'
1
+ import { BigNumber, ethers } from 'ethers'
2
2
  import { ENSArgs } from '..'
3
3
  import { FuseOptions } from '../@types/FuseOptions'
4
4
  import generateFuseInput from '../utils/generateFuseInput'
5
+ import { namehash } from '../utils/normalise'
6
+ import { Expiry, makeExpiry } from '../utils/wrapperExpiry'
5
7
 
6
8
  type BaseArgs = {
7
- name: string
8
9
  owner: string
9
10
  resolverAddress?: string
10
11
  contract: 'registry' | 'nameWrapper'
11
- options?: { addressOrIndex?: string | number }
12
12
  }
13
13
 
14
14
  type NameWrapperArgs = {
15
15
  contract: 'nameWrapper'
16
16
  fuses?: FuseOptions
17
+ expiry?: Expiry
17
18
  } & BaseArgs
18
19
 
19
20
  type Args = BaseArgs | NameWrapperArgs
20
21
 
21
22
  export default async function (
22
- { contracts, provider }: ENSArgs<'contracts' | 'provider'>,
23
- { name, owner, resolverAddress, contract, options, ...wrapperArgs }: Args,
23
+ {
24
+ contracts,
25
+ signer,
26
+ getExpiry,
27
+ }: ENSArgs<'contracts' | 'signer' | 'getExpiry'>,
28
+ name: string,
29
+ { owner, resolverAddress, contract, ...wrapperArgs }: Args,
24
30
  ) {
25
- const signer = provider?.getSigner(options?.addressOrIndex)
26
-
27
- if (!signer) {
28
- throw new Error('No signer found')
29
- }
30
-
31
31
  const labels = name.split('.')
32
32
 
33
33
  if (labels.length === 1) {
@@ -44,13 +44,13 @@ export default async function (
44
44
 
45
45
  const label = labels.shift() as string
46
46
  const labelhash = ethers.utils.solidityKeccak256(['string'], [label])
47
- const parentNodehash = ethers.utils.namehash(labels.join('.'))
47
+ const parentNodehash = namehash(labels.join('.'))
48
48
 
49
49
  switch (contract) {
50
50
  case 'registry': {
51
51
  const registry = (await contracts?.getRegistry()!).connect(signer)
52
52
 
53
- return registry.setSubnodeRecord(
53
+ return registry.populateTransaction.setSubnodeRecord(
54
54
  parentNodehash,
55
55
  labelhash,
56
56
  owner,
@@ -60,19 +60,25 @@ export default async function (
60
60
  }
61
61
  case 'nameWrapper': {
62
62
  const nameWrapper = (await contracts?.getNameWrapper()!).connect(signer)
63
+ const expiry: BigNumber = await makeExpiry(
64
+ { getExpiry },
65
+ name,
66
+ 'expiry' in wrapperArgs ? wrapperArgs.expiry : undefined,
67
+ )
63
68
 
64
69
  const generatedFuses =
65
70
  'fuses' in wrapperArgs && wrapperArgs.fuses
66
71
  ? generateFuseInput(wrapperArgs.fuses)
67
72
  : '0'
68
73
 
69
- return nameWrapper.setSubnodeRecord(
74
+ return nameWrapper.populateTransaction.setSubnodeRecord(
70
75
  parentNodehash,
71
76
  label,
72
77
  owner,
73
78
  resolverAddress,
74
79
  0,
75
80
  generatedFuses,
81
+ expiry,
76
82
  )
77
83
  }
78
84
  default: {
@@ -1,6 +1,7 @@
1
- import { ethers, utils } from 'ethers'
1
+ import { ethers } from 'ethers'
2
2
  import { ENS } from '..'
3
- import setup from './setup'
3
+ import setup from '../tests/setup'
4
+ import { namehash } from '../utils/normalise'
4
5
 
5
6
  let ENSInstance: ENS
6
7
  let revert: Awaited<ReturnType<typeof setup>>['revert']
@@ -21,51 +22,31 @@ describe('deleteSubname', () => {
21
22
  await revert()
22
23
  })
23
24
  it('should allow deleting a subname on the registry', async () => {
24
- const createSubnameTx = await ENSInstance.createSubname({
25
+ const tx = await ENSInstance.deleteSubname('test.with-subnames.eth', {
25
26
  contract: 'registry',
26
- name: 'test.parthtejpal.eth',
27
- owner: accounts[0],
28
- options: { addressOrIndex: 0 },
27
+ addressOrIndex: 1,
29
28
  })
30
- await createSubnameTx.wait()
31
-
32
- const tx = await ENSInstance.deleteSubname(
33
- 'test.parthtejpal.eth',
34
- 'registry',
35
- { addressOrIndex: 0 },
36
- )
37
29
  expect(tx).toBeTruthy()
38
30
  await tx.wait()
39
31
 
40
32
  const registry = await ENSInstance.contracts!.getRegistry()!
41
- const result = await registry.owner(utils.namehash('test.parthtejpal.eth'))
33
+ const result = await registry.owner(namehash('test.with-subnames.eth'))
42
34
  expect(result).toBe('0x0000000000000000000000000000000000000000')
43
35
  })
44
36
  it('should allow deleting a subname on the nameWrapper', async () => {
45
- const wrapNameTx = await ENSInstance.wrapName(
46
- 'parthtejpal.eth',
47
- accounts[0],
48
- )
49
- await wrapNameTx.wait()
50
- const createSubnameTx = await ENSInstance.createSubname({
51
- contract: 'nameWrapper',
52
- name: 'test.parthtejpal.eth',
53
- owner: accounts[0],
54
- options: { addressOrIndex: 0 },
55
- })
56
- await createSubnameTx.wait()
57
-
58
37
  const tx = await ENSInstance.deleteSubname(
59
- 'test.parthtejpal.eth',
60
- 'nameWrapper',
61
- { addressOrIndex: 0 },
38
+ 'test.wrapped-with-subnames.eth',
39
+ {
40
+ contract: 'nameWrapper',
41
+ addressOrIndex: 1,
42
+ },
62
43
  )
63
44
  expect(tx).toBeTruthy()
64
45
  await tx.wait()
65
46
 
66
47
  const nameWrapper = await ENSInstance.contracts!.getNameWrapper()!
67
48
  const result = await nameWrapper.ownerOf(
68
- utils.namehash('test.parthtejpal.eth'),
49
+ namehash('test.wrapped-with-subnames.eth'),
69
50
  )
70
51
  expect(result).toBe('0x0000000000000000000000000000000000000000')
71
52
  })
@@ -1,19 +1,17 @@
1
1
  import { ENSArgs } from '..'
2
2
 
3
3
  export default async function (
4
- {
5
- contracts,
6
- provider,
7
- transferSubname,
8
- }: ENSArgs<'contracts' | 'provider' | 'transferSubname'>,
4
+ { transferSubname, signer }: ENSArgs<'transferSubname' | 'signer'>,
9
5
  name: string,
10
- contract: 'registry' | 'nameWrapper',
11
- options?: { addressOrIndex?: string | number },
6
+ {
7
+ contract,
8
+ }: {
9
+ contract: 'registry' | 'nameWrapper'
10
+ },
12
11
  ) {
13
- return transferSubname(
14
- name,
12
+ return transferSubname.populateTransaction(name, {
15
13
  contract,
16
- '0x0000000000000000000000000000000000000000',
17
- options,
18
- )
14
+ owner: '0x0000000000000000000000000000000000000000',
15
+ signer,
16
+ })
19
17
  }
@@ -0,0 +1,118 @@
1
+ import nock from 'nock'
2
+ import fetch from 'node-fetch'
3
+ import getDNSOwner, { encodeURLParams } from './getDNSOwner'
4
+
5
+ function hex_decode(string: string) {
6
+ let bytes: any[] = []
7
+ string.replace(/../g, function (pair) {
8
+ bytes.push(parseInt(pair, 16))
9
+ })
10
+ return new Uint8Array(bytes).buffer
11
+ }
12
+
13
+ describe('encodeURLParams', () => {
14
+ it('should encodeURLParams', () => {
15
+ const p: { [key: string]: string } = {
16
+ a: 'b',
17
+ c: 'd',
18
+ }
19
+ const expected = 'a=b&c=d'
20
+ const actual = encodeURLParams(p)
21
+ expect(actual).toEqual(expected)
22
+ })
23
+ })
24
+
25
+ describe('getDNSOwner', () => {
26
+ beforeAll(() => {
27
+ global.fetch = fetch
28
+ })
29
+ afterAll(() => {
30
+ global.fetch = undefined
31
+ })
32
+ it('should return the address from the result of a dnsQuery', async () => {
33
+ const dnsName = 'brantly.xyz'
34
+
35
+ const scope = nock('https://cloudflare-dns.com:443', {
36
+ encodedQueryParams: true,
37
+ })
38
+ .get('/dns-query')
39
+ .query((queryObject) => {
40
+ return (
41
+ queryObject.ct === 'application/dns-udpwireformat' &&
42
+ queryObject.dns ===
43
+ 'AAEBAAABAAAAAAABBF9lbnMHYnJhbnRseQN4eXoAABAAAQAAKRAAAACAAAAA'
44
+ )
45
+ })
46
+ .reply(
47
+ 200,
48
+ Buffer.from(
49
+ hex_decode(
50
+ '000181a00001000200000001045f656e73076272616e746c790378797a0000100001c00c0010000100000e10002d2c613d307839383331313033303936323044393131373331416330393332323139616630363039316236373434c00c002e000100000e10009f0010080300000e1062df366962c23569d89d076272616e746c790378797a0039c894ca1d7a60c1356e478066d39961a78ec1edbe62e1eb0f13d7947bb72097654648dc79be075ca32625f02e60267f45e88d7c05e9c3ec0cf21ab2dca67a8fbeb8e995644726357628446b888a144cafef5cbfca120c6511fe36de9d3c62dee27680825190c5404ca503904b98dbf62d9122f6fda393dc04b14a89ceb68c7a00002904d0000080000000',
51
+ ),
52
+ ),
53
+ [
54
+ 'Server',
55
+ 'cloudflare',
56
+ 'Date',
57
+ 'Wed, 06 Jul 2022 23:37:28 GMT',
58
+ 'Content-Type',
59
+ 'application/dns-message',
60
+ 'Connection',
61
+ 'close',
62
+ 'Access-Control-Allow-Origin',
63
+ '*',
64
+ 'Content-Length',
65
+ '273',
66
+ 'CF-RAY',
67
+ '726c2b1d3bab6b74-TPE',
68
+ ],
69
+ )
70
+ expect(await getDNSOwner({}, dnsName)).toEqual(
71
+ '0x983110309620D911731Ac0932219af06091b6744',
72
+ )
73
+ })
74
+ it('should throw if there is an error in the DNS query', async () => {
75
+ const dnsName = 'nick.xyz'
76
+
77
+ const scope = nock('https://cloudflare-dns.com:443', {
78
+ encodedQueryParams: true,
79
+ })
80
+ .get('/dns-query')
81
+ .query((queryObject) => {
82
+ return (
83
+ queryObject.ct === 'application/dns-udpwireformat' &&
84
+ queryObject.dns ===
85
+ 'AAEBAAABAAAAAAABBF9lbnMEbmljawN4eXoAABAAAQAAKRAAAACAAAAA'
86
+ )
87
+ })
88
+ .reply(
89
+ 200,
90
+ Buffer.from(
91
+ hex_decode(
92
+ '000181830001000000010001045f656e73046e69636b0378797a0000100001c0110006000100000258003b046e7337310d646f6d61696e636f6e74726f6c03636f6d0003646e73056a6f6d6178036e6574007876d1800000708000001c2000093a800000025800002904d0000080000000',
93
+ ),
94
+ ),
95
+ [
96
+ 'Server',
97
+ 'cloudflare',
98
+ 'Date',
99
+ 'Wed, 06 Jul 2022 23:37:28 GMT',
100
+ 'Content-Type',
101
+ 'application/dns-message',
102
+ 'Connection',
103
+ 'close',
104
+ 'Access-Control-Allow-Origin',
105
+ '*',
106
+ 'Content-Length',
107
+ '273',
108
+ 'CF-RAY',
109
+ '726c2b1d3bab6b74-TPE',
110
+ ],
111
+ )
112
+ try {
113
+ await getDNSOwner({}, dnsName)
114
+ } catch (error) {
115
+ expect(error.message).toEqual('DNS query failed: NXDOMAIN')
116
+ }
117
+ })
118
+ })
@@ -0,0 +1,61 @@
1
+ import * as packet from 'dns-packet'
2
+
3
+ export function encodeURLParams(p: { [key: string]: string }): string {
4
+ return Object.entries(p)
5
+ .map((kv) => kv.map(encodeURIComponent).join('='))
6
+ .join('&')
7
+ }
8
+
9
+ export const getDNS = async (q: packet.Packet): Promise<packet.Packet> => {
10
+ const response = await global.fetch(
11
+ `https://cloudflare-dns.com/dns-query?${encodeURLParams({
12
+ ct: 'application/dns-udpwireformat',
13
+ dns: packet.encode(q)?.toString('base64'),
14
+ ts: Date.now().toString(),
15
+ })}`,
16
+ )
17
+ const arrayBuffer = await response.arrayBuffer()
18
+ // @ts-ignore:next-line
19
+ const fromArrayBuffer = Buffer.from(arrayBuffer);
20
+ return packet.decode(fromArrayBuffer)
21
+ }
22
+
23
+ export const dnsQuery = async (
24
+ qtype: string,
25
+ qname: string,
26
+ ): Promise<packet.Packet> => {
27
+ const query: packet.Packet = {
28
+ type: 'query',
29
+ id: 1,
30
+ flags: packet.RECURSION_DESIRED,
31
+ questions: [
32
+ {
33
+ type: qtype,
34
+ class: 'IN',
35
+ name: qname,
36
+ },
37
+ ],
38
+ additionals: [
39
+ {
40
+ type: 'OPT',
41
+ class: 'IN',
42
+ name: '.',
43
+ udpPayloadSize: 4096,
44
+ flags: packet.DNSSEC_OK,
45
+ },
46
+ ],
47
+ answers: [],
48
+ }
49
+
50
+ const response = await getDNS(query)
51
+ if (response.rcode !== 'NOERROR') {
52
+ throw new Error(`DNS query failed: ${response.rcode}`)
53
+ }
54
+ return response
55
+ }
56
+
57
+ export default async function (_: any, dnsName: string) {
58
+ const result = await dnsQuery('TXT', `_ens.${dnsName}`)
59
+ const address = result?.answers?.[0]?.data?.[0]?.toString()?.split('=')?.[1]
60
+ return address
61
+ }