@ensdomains/ensjs 4.0.2 → 4.0.3-alpha.0

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 (63) hide show
  1. package/dist/cjs/contracts/consts.js +26 -0
  2. package/dist/cjs/contracts/consts.js.map +1 -1
  3. package/dist/cjs/contracts/legacyEthRegistrarController.js +153 -0
  4. package/dist/cjs/contracts/legacyEthRegistrarController.js.map +1 -0
  5. package/dist/cjs/errors/register.js +23 -0
  6. package/dist/cjs/errors/register.js.map +1 -0
  7. package/dist/cjs/errors/version.js +1 -1
  8. package/dist/cjs/functions/wallet/legacyCommitName.js +50 -0
  9. package/dist/cjs/functions/wallet/legacyCommitName.js.map +1 -0
  10. package/dist/cjs/functions/wallet/legacyRegisterName.js +58 -0
  11. package/dist/cjs/functions/wallet/legacyRegisterName.js.map +1 -0
  12. package/dist/cjs/utils/index.js +6 -1
  13. package/dist/cjs/utils/index.js.map +1 -1
  14. package/dist/cjs/utils/legacyRegisterHelpers.js +45 -0
  15. package/dist/cjs/utils/legacyRegisterHelpers.js.map +1 -0
  16. package/dist/cjs/wallet.js +5 -1
  17. package/dist/cjs/wallet.js.map +1 -1
  18. package/dist/esm/contracts/consts.js +26 -0
  19. package/dist/esm/contracts/consts.js.map +1 -1
  20. package/dist/esm/contracts/legacyEthRegistrarController.js +150 -0
  21. package/dist/esm/contracts/legacyEthRegistrarController.js.map +1 -0
  22. package/dist/esm/errors/register.js +19 -0
  23. package/dist/esm/errors/register.js.map +1 -0
  24. package/dist/esm/errors/version.js +1 -1
  25. package/dist/esm/functions/wallet/legacyCommitName.js +72 -0
  26. package/dist/esm/functions/wallet/legacyCommitName.js.map +1 -0
  27. package/dist/esm/functions/wallet/legacyRegisterName.js +94 -0
  28. package/dist/esm/functions/wallet/legacyRegisterName.js.map +1 -0
  29. package/dist/esm/utils/index.js +1 -0
  30. package/dist/esm/utils/index.js.map +1 -1
  31. package/dist/esm/utils/legacyRegisterHelpers.js +37 -0
  32. package/dist/esm/utils/legacyRegisterHelpers.js.map +1 -0
  33. package/dist/esm/wallet.js +2 -0
  34. package/dist/esm/wallet.js.map +1 -1
  35. package/dist/types/clients/decorators/wallet.d.ts +4 -4
  36. package/dist/types/clients/wallet.d.ts +4 -4
  37. package/dist/types/contracts/consts.d.ts +27 -1
  38. package/dist/types/contracts/consts.d.ts.map +1 -1
  39. package/dist/types/contracts/legacyEthRegistrarController.d.ts +168 -0
  40. package/dist/types/contracts/legacyEthRegistrarController.d.ts.map +1 -0
  41. package/dist/types/errors/register.d.ts +10 -0
  42. package/dist/types/errors/register.d.ts.map +1 -0
  43. package/dist/types/errors/version.d.ts +1 -1
  44. package/dist/types/functions/wallet/legacyCommitName.d.ts +41 -0
  45. package/dist/types/functions/wallet/legacyCommitName.d.ts.map +1 -0
  46. package/dist/types/functions/wallet/legacyRegisterName.d.ts +60 -0
  47. package/dist/types/functions/wallet/legacyRegisterName.d.ts.map +1 -0
  48. package/dist/types/utils/index.d.ts +1 -0
  49. package/dist/types/utils/index.d.ts.map +1 -1
  50. package/dist/types/utils/legacyRegisterHelpers.d.ts +41 -0
  51. package/dist/types/utils/legacyRegisterHelpers.d.ts.map +1 -0
  52. package/dist/types/wallet.d.ts +2 -0
  53. package/dist/types/wallet.d.ts.map +1 -1
  54. package/package.json +1 -1
  55. package/src/contracts/consts.ts +28 -0
  56. package/src/contracts/legacyEthRegistrarController.ts +159 -0
  57. package/src/errors/register.ts +22 -0
  58. package/src/errors/version.ts +1 -1
  59. package/src/functions/wallet/legacyCommitName.ts +127 -0
  60. package/src/functions/wallet/legacyRegisterName.ts +160 -0
  61. package/src/utils/index.ts +9 -0
  62. package/src/utils/legacyRegisterHelpers.ts +134 -0
  63. package/src/wallet.ts +14 -0
@@ -1 +1 @@
1
- export const version = 'v4.0.2-alpha.5'
1
+ export const version = 'v4.0.3-alpha.0'
@@ -0,0 +1,127 @@
1
+ import {
2
+ encodeFunctionData,
3
+ type Account,
4
+ type Hash,
5
+ type SendTransactionParameters,
6
+ type Transport,
7
+ } from 'viem'
8
+ import { sendTransaction } from 'viem/actions'
9
+ import type { ChainWithEns, ClientWithAccount } from '../../contracts/consts.js'
10
+ import { legacyEthRegistrarControllerCommitSnippet } from '../../contracts/legacyEthRegistrarController.js'
11
+ import { getChainContractAddress } from '../../contracts/getChainContractAddress.js'
12
+ import { UnsupportedNameTypeError } from '../../errors/general.js'
13
+ import type {
14
+ Prettify,
15
+ SimpleTransactionRequest,
16
+ WriteTransactionParameters,
17
+ } from '../../types.js'
18
+ import { getNameType } from '../../utils/getNameType.js'
19
+ import {
20
+ makeLegacyCommitment,
21
+ type LegacyRegistrationParameters,
22
+ } from '../../utils/legacyRegisterHelpers.js'
23
+ import { EMPTY_ADDRESS } from '../../utils/consts.js'
24
+
25
+ export type LegacyCommitNameDataParameters = LegacyRegistrationParameters
26
+
27
+ export type LegacyCommitNameDataReturnType = SimpleTransactionRequest
28
+
29
+ export type LegacyCommitNameParameters<
30
+ TChain extends ChainWithEns,
31
+ TAccount extends Account | undefined,
32
+ TChainOverride extends ChainWithEns | undefined,
33
+ > = Prettify<
34
+ LegacyCommitNameDataParameters &
35
+ WriteTransactionParameters<TChain, TAccount, TChainOverride>
36
+ >
37
+
38
+ export type LegacyCommitNameReturnType = Hash
39
+
40
+ export const makeFunctionData = <
41
+ TChain extends ChainWithEns,
42
+ TAccount extends Account | undefined,
43
+ >(
44
+ wallet: ClientWithAccount<Transport, TChain, TAccount>,
45
+ args: LegacyCommitNameDataParameters,
46
+ ): LegacyCommitNameDataReturnType => {
47
+ const nameType = getNameType(args.name)
48
+ if (nameType !== 'eth-2ld')
49
+ throw new UnsupportedNameTypeError({
50
+ nameType,
51
+ supportedNameTypes: ['eth-2ld'],
52
+ details: 'Only 2ld-eth name registration is supported',
53
+ })
54
+
55
+ return {
56
+ to: getChainContractAddress({
57
+ client: wallet,
58
+ contract: 'legacyEthRegistrarController',
59
+ }),
60
+ data: encodeFunctionData({
61
+ abi: legacyEthRegistrarControllerCommitSnippet,
62
+ functionName: 'commit',
63
+ args: [makeLegacyCommitment(args)],
64
+ }),
65
+ }
66
+ }
67
+
68
+ /**
69
+ * Commits a name to be registered
70
+ * @param wallet - {@link ClientWithAccount}
71
+ * @param parameters - {@link LegacyCommitNameParameters}
72
+ * @returns Transaction hash. {@link LegacyCommitNameReturnType}
73
+ *
74
+ * @example
75
+ * import { createWalletClient, custom } from 'viem'
76
+ * import { mainnet } from 'viem/chains'
77
+ * import { addEnsContracts } from '@ensdomains/ensjs'
78
+ * import { commitName } from '@ensdomains/ensjs/wallet'
79
+ * import { randomSecret } from '@ensdomains/ensjs/utils'
80
+ *
81
+ * const wallet = createWalletClient({
82
+ * chain: addEnsContracts(mainnet),
83
+ * transport: custom(window.ethereum),
84
+ * })
85
+ * const secret = randomSecret()
86
+ * const hash = await commitName(wallet, {
87
+ * name: 'example.eth',
88
+ * owner: '0xFe89cc7aBB2C4183683ab71653C4cdc9B02D44b7',
89
+ * duration: 31536000, // 1 year
90
+ * secret,
91
+ * })
92
+ * // 0x...
93
+ */
94
+ async function legacyCommitName<
95
+ TChain extends ChainWithEns,
96
+ TAccount extends Account | undefined,
97
+ TChainOverride extends ChainWithEns | undefined = ChainWithEns,
98
+ >(
99
+ wallet: ClientWithAccount<Transport, TChain, TAccount>,
100
+ {
101
+ name,
102
+ owner,
103
+ duration,
104
+ secret,
105
+ resolverAddress = EMPTY_ADDRESS,
106
+ address = EMPTY_ADDRESS,
107
+ ...txArgs
108
+ }: LegacyCommitNameParameters<TChain, TAccount, TChainOverride>,
109
+ ): Promise<LegacyCommitNameReturnType> {
110
+ const data = makeFunctionData(wallet, {
111
+ name,
112
+ owner,
113
+ duration,
114
+ secret,
115
+ resolverAddress,
116
+ address,
117
+ })
118
+ const writeArgs = {
119
+ ...data,
120
+ ...txArgs,
121
+ } as SendTransactionParameters<TChain, TAccount, TChainOverride>
122
+ return sendTransaction(wallet, writeArgs)
123
+ }
124
+
125
+ legacyCommitName.makeFunctionData = makeFunctionData
126
+
127
+ export default legacyCommitName
@@ -0,0 +1,160 @@
1
+ import {
2
+ encodeFunctionData,
3
+ type Account,
4
+ type Hash,
5
+ type SendTransactionParameters,
6
+ type Transport,
7
+ } from 'viem'
8
+ import { sendTransaction } from 'viem/actions'
9
+ import type { ChainWithEns, ClientWithAccount } from '../../contracts/consts.js'
10
+ import { getChainContractAddress } from '../../contracts/getChainContractAddress.js'
11
+ import { UnsupportedNameTypeError } from '../../errors/general.js'
12
+ import type {
13
+ Prettify,
14
+ SimpleTransactionRequest,
15
+ WriteTransactionParameters,
16
+ } from '../../types.js'
17
+ import { getNameType } from '../../utils/getNameType.js'
18
+ import {
19
+ makeLegacyRegistrationTuple,
20
+ type LegacyRegistrationParameters,
21
+ isLegacyRegistrationWithConfig,
22
+ } from '../../utils/legacyRegisterHelpers.js'
23
+ import {
24
+ legacyEthRegistrarControllerRegisterSnippet,
25
+ legacyEthRegistrarControllerRegisterWithConfigSnippet,
26
+ } from '../../contracts/legacyEthRegistrarController.js'
27
+
28
+ export type LegacyRegisterNameDataParameters = LegacyRegistrationParameters & {
29
+ /** Value of registration */
30
+ value: bigint
31
+ }
32
+
33
+ export type LegacyRegisterNameDataReturnType = SimpleTransactionRequest & {
34
+ value: bigint
35
+ }
36
+
37
+ export type LegacyRegisterNameParameters<
38
+ TChain extends ChainWithEns,
39
+ TAccount extends Account | undefined,
40
+ TChainOverride extends ChainWithEns | undefined,
41
+ > = Prettify<
42
+ LegacyRegisterNameDataParameters &
43
+ WriteTransactionParameters<TChain, TAccount, TChainOverride>
44
+ >
45
+
46
+ export type LegacyRegisterNameReturnType = Hash
47
+
48
+ export const makeFunctionData = <
49
+ TChain extends ChainWithEns,
50
+ TAccount extends Account | undefined,
51
+ >(
52
+ wallet: ClientWithAccount<Transport, TChain, TAccount>,
53
+ { value, ...args }: LegacyRegisterNameDataParameters,
54
+ ): LegacyRegisterNameDataReturnType => {
55
+ const nameType = getNameType(args.name)
56
+ if (nameType !== 'eth-2ld')
57
+ throw new UnsupportedNameTypeError({
58
+ nameType,
59
+ supportedNameTypes: ['eth-2ld'],
60
+ details: 'Only 2ld-eth name registration is supported',
61
+ })
62
+
63
+ const data = isLegacyRegistrationWithConfig(args)
64
+ ? encodeFunctionData({
65
+ abi: legacyEthRegistrarControllerRegisterWithConfigSnippet,
66
+ functionName: 'registerWithConfig',
67
+ args: makeLegacyRegistrationTuple(args),
68
+ })
69
+ : encodeFunctionData({
70
+ abi: legacyEthRegistrarControllerRegisterSnippet,
71
+ functionName: 'register',
72
+ args: makeLegacyRegistrationTuple(args),
73
+ })
74
+
75
+ return {
76
+ to: getChainContractAddress({
77
+ client: wallet,
78
+ contract: 'legacyEthRegistrarController',
79
+ }),
80
+ data,
81
+ value,
82
+ }
83
+ }
84
+
85
+ /**
86
+ * Registers a name on ENS
87
+ * @param wallet - {@link ClientWithAccount}
88
+ * @param parameters - {@link RegisterNameParameters}
89
+ * @returns Transaction hash. {@link LegacyRegisterNameReturnType}
90
+ *
91
+ * @example
92
+ * import { createPublicClient, createWalletClient, http, custom } from 'viem'
93
+ * import { mainnet } from 'viem/chains'
94
+ * import { addEnsContracts } from '@ensdomains/ensjs'
95
+ * import { getPrice } from '@ensdomains/ensjs/public'
96
+ * import { randomSecret } from '@ensdomains/ensjs/utils'
97
+ * import { commitName, registerName } from '@ensdomains/ensjs/wallet'
98
+ *
99
+ * const mainnetWithEns = addEnsContracts(mainnet)
100
+ * const client = createPublicClient({
101
+ * chain: mainnetWithEns,
102
+ * transport: http(),
103
+ * })
104
+ * const wallet = createWalletClient({
105
+ * chain: mainnetWithEns,
106
+ * transport: custom(window.ethereum),
107
+ * })
108
+ * const secret = randomSecret()
109
+ * const params = {
110
+ * name: 'example.eth',
111
+ * owner: '0xFe89cc7aBB2C4183683ab71653C4cdc9B02D44b7',
112
+ * duration: 31536000, // 1 year
113
+ * secret,
114
+ * }
115
+ *
116
+ * const commitmentHash = await commitName(wallet, params)
117
+ * await client.waitForTransactionReceipt({ hash: commitmentHash }) // wait for commitment to finalise
118
+ * await new Promise((resolve) => setTimeout(resolve, 60 * 1_000)) // wait for commitment to be valid
119
+ *
120
+ * const { base, premium } = await getPrice(client, { nameOrNames: params.name, duration: params.duration })
121
+ * const value = (base + premium) * 110n / 100n // add 10% to the price for buffer
122
+ * const hash = await registerName(wallet, { ...params, value })
123
+ * // 0x...
124
+ */
125
+ async function legacyRegisterName<
126
+ TChain extends ChainWithEns,
127
+ TAccount extends Account | undefined,
128
+ TChainOverride extends ChainWithEns | undefined = ChainWithEns,
129
+ >(
130
+ wallet: ClientWithAccount<Transport, TChain, TAccount>,
131
+ {
132
+ name,
133
+ owner,
134
+ duration,
135
+ secret,
136
+ resolverAddress,
137
+ address,
138
+ value,
139
+ ...txArgs
140
+ }: LegacyRegisterNameParameters<TChain, TAccount, TChainOverride>,
141
+ ): Promise<LegacyRegisterNameReturnType> {
142
+ const data = makeFunctionData(wallet, {
143
+ name,
144
+ owner,
145
+ duration,
146
+ secret,
147
+ resolverAddress,
148
+ address,
149
+ value,
150
+ })
151
+ const writeArgs = {
152
+ ...data,
153
+ ...txArgs,
154
+ } as SendTransactionParameters<TChain, TAccount, TChainOverride>
155
+ return sendTransaction(wallet, writeArgs)
156
+ }
157
+
158
+ legacyRegisterName.makeFunctionData = makeFunctionData
159
+
160
+ export default legacyRegisterName
@@ -104,6 +104,15 @@ export {
104
104
  saveLabel,
105
105
  saveName,
106
106
  } from './labels.js'
107
+ export {
108
+ makeLegacyCommitment,
109
+ makeLegacyCommitmentFromTuple,
110
+ makeLegacyCommitmentTuple,
111
+ makeLegacyRegistrationTuple,
112
+ type LegacyCommitmentTuple,
113
+ type LegacyRegistrationParameters,
114
+ type LegacyRegistrationTuple,
115
+ } from './legacyRegisterHelpers.js'
107
116
  export { makeSafeSecondsDate } from './makeSafeSecondsDate.js'
108
117
  export {
109
118
  beautify,
@@ -0,0 +1,134 @@
1
+ import {
2
+ keccak256,
3
+ labelhash,
4
+ type Address,
5
+ type Hex,
6
+ encodePacked,
7
+ } from 'viem'
8
+ import { EMPTY_ADDRESS } from './consts.js'
9
+ import { LegacyRegistrationInvalidConfigError } from '../errors/register.js'
10
+
11
+ export type LegacyRegistrationBaseParameters = {
12
+ /** Name to register */
13
+ name: string
14
+ /** Address to set owner to */
15
+ owner: Address
16
+ /** Duration of registration */
17
+ duration: number
18
+ /** Random 32 bytes to use for registration */
19
+ secret: Hex
20
+ /** Custom resolver address, defaults to empty address */
21
+ resolverAddress?: Address
22
+ /** Address to set upon registration, defaults to empty address */
23
+ address?: Address
24
+ }
25
+
26
+ export type LegacyRegistrationWithConfigParameters =
27
+ LegacyRegistrationBaseParameters & {
28
+ resolverAddress: Address
29
+ address?: Address
30
+ }
31
+
32
+ export type LegacyRegistrationParameters =
33
+ | LegacyRegistrationBaseParameters
34
+ | LegacyRegistrationWithConfigParameters
35
+
36
+ export const isLegacyRegistrationWithConfig = (
37
+ params: LegacyRegistrationParameters,
38
+ ): params is LegacyRegistrationWithConfigParameters => {
39
+ const { resolverAddress = EMPTY_ADDRESS, address = EMPTY_ADDRESS } =
40
+ params as LegacyRegistrationWithConfigParameters
41
+
42
+ if (resolverAddress === EMPTY_ADDRESS && address !== EMPTY_ADDRESS)
43
+ throw new LegacyRegistrationInvalidConfigError({
44
+ resolverAddress,
45
+ address,
46
+ })
47
+ return resolverAddress !== EMPTY_ADDRESS || address !== EMPTY_ADDRESS
48
+ }
49
+
50
+ export type LegacyCommitmentTuple =
51
+ | [label: string, owner: Address, secret: Hex]
52
+ | [
53
+ label: string,
54
+ owner: Address,
55
+ resolverAddress: Address,
56
+ address: Address,
57
+ secret: Hex,
58
+ ]
59
+
60
+ export type LegacyRegistrationTuple =
61
+ | [label: string, owner: Address, duration: bigint, secret: Hex]
62
+ | [
63
+ label: string,
64
+ owner: Address,
65
+ duration: bigint,
66
+ secret: Hex,
67
+ resolverAddress: Address,
68
+ address: Address,
69
+ ]
70
+
71
+ export const makeLegacyCommitmentTuple = (
72
+ params: LegacyRegistrationParameters,
73
+ ): LegacyCommitmentTuple => {
74
+ const {
75
+ name,
76
+ owner,
77
+ secret,
78
+ resolverAddress = EMPTY_ADDRESS,
79
+ address = EMPTY_ADDRESS,
80
+ } = params as LegacyRegistrationWithConfigParameters
81
+
82
+ const label = name.split('.')[0]
83
+
84
+ if (isLegacyRegistrationWithConfig(params)) {
85
+ return [label, owner, secret, resolverAddress, address]
86
+ }
87
+ return [label, owner, secret]
88
+ }
89
+
90
+ export const makeLegacyRegistrationTuple = (
91
+ params: LegacyRegistrationParameters,
92
+ ): LegacyRegistrationTuple => {
93
+ const {
94
+ name,
95
+ owner,
96
+ secret,
97
+ duration,
98
+ resolverAddress = EMPTY_ADDRESS,
99
+ address = EMPTY_ADDRESS,
100
+ } = params as LegacyRegistrationWithConfigParameters
101
+ const label = name.split('.')[0]
102
+ if (isLegacyRegistrationWithConfig(params))
103
+ return [label, owner, BigInt(duration), secret, resolverAddress, address]
104
+ return [label, owner, BigInt(params.duration), secret]
105
+ }
106
+
107
+ export const makeLegacyCommitmentFromTuple = ([
108
+ label,
109
+ ...others
110
+ ]: LegacyCommitmentTuple): Hex => {
111
+ const labelHash = labelhash(label)
112
+ const params = [labelHash, ...others] as const
113
+
114
+ if (params.length === 3)
115
+ return keccak256(encodePacked(['bytes32', 'address', 'bytes32'], params))
116
+
117
+ const [
118
+ owner,
119
+ secret,
120
+ resolverAddress = EMPTY_ADDRESS,
121
+ address = EMPTY_ADDRESS,
122
+ ] = others
123
+
124
+ return keccak256(
125
+ encodePacked(
126
+ ['bytes32', 'address', 'address', 'address', 'bytes32'],
127
+ [labelHash, owner, resolverAddress, address, secret],
128
+ ),
129
+ )
130
+ }
131
+
132
+ export const makeLegacyCommitment = (
133
+ params: LegacyRegistrationParameters,
134
+ ): Hex => makeLegacyCommitmentFromTuple(makeLegacyCommitmentTuple(params))
package/src/wallet.ts CHANGED
@@ -26,6 +26,20 @@ export {
26
26
  type DeleteSubnameParameters,
27
27
  type DeleteSubnameReturnType,
28
28
  } from './functions/wallet/deleteSubname.js'
29
+ export {
30
+ default as legacyCommitName,
31
+ type LegacyCommitNameDataParameters,
32
+ type LegacyCommitNameDataReturnType,
33
+ type LegacyCommitNameParameters,
34
+ type LegacyCommitNameReturnType,
35
+ } from './functions/wallet/legacyCommitName.js'
36
+ export {
37
+ default as legacyRegisterName,
38
+ type LegacyRegisterNameDataParameters,
39
+ type LegacyRegisterNameDataReturnType,
40
+ type LegacyRegisterNameParameters,
41
+ type LegacyRegisterNameReturnType,
42
+ } from './functions/wallet/legacyRegisterName.js'
29
43
  export {
30
44
  default as registerName,
31
45
  type RegisterNameDataParameters,