@ensdomains/ensjs 3.6.0 → 4.0.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.
- package/dist/cjs/errors/version.js +1 -1
- package/dist/cjs/functions/subgraph/client.js +29 -20
- package/dist/cjs/functions/subgraph/client.js.map +1 -1
- package/dist/cjs/functions/wallet/createSubname.js +57 -1
- package/dist/cjs/functions/wallet/createSubname.js.map +1 -1
- package/dist/cjs/utils/wrapper.js +8 -1
- package/dist/cjs/utils/wrapper.js.map +1 -1
- package/dist/esm/errors/version.js +1 -1
- package/dist/esm/functions/subgraph/client.js +31 -21
- package/dist/esm/functions/subgraph/client.js.map +1 -1
- package/dist/esm/functions/wallet/createSubname.js +59 -3
- package/dist/esm/functions/wallet/createSubname.js.map +1 -1
- package/dist/esm/utils/wrapper.js +6 -0
- package/dist/esm/utils/wrapper.js.map +1 -1
- package/dist/types/errors/version.d.ts +1 -1
- package/dist/types/functions/subgraph/client.d.ts.map +1 -1
- package/dist/types/functions/wallet/createSubname.d.ts.map +1 -1
- package/dist/types/utils/wrapper.d.ts +1 -0
- package/dist/types/utils/wrapper.d.ts.map +1 -1
- package/package.json +3 -4
- package/src/errors/version.ts +1 -1
- package/src/functions/subgraph/client.ts +36 -22
- package/src/functions/wallet/createSubname.ts +71 -4
- package/src/utils/wrapper.ts +7 -0
|
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.createSubgraphClient = exports.responseMiddleware = exports.requestMiddleware = void 0;
|
|
4
4
|
const graphql_request_1 = require("graphql-request");
|
|
5
5
|
const index_js_1 = require("graphql/language/index.js");
|
|
6
|
-
const traverse_1 = require("traverse");
|
|
7
6
|
const normalise_js_1 = require("../../utils/normalise.js");
|
|
8
7
|
const generateSelection = (selection) => ({
|
|
9
8
|
kind: 'Field',
|
|
@@ -51,27 +50,37 @@ const requestMiddleware = (request) => {
|
|
|
51
50
|
};
|
|
52
51
|
exports.requestMiddleware = requestMiddleware;
|
|
53
52
|
const responseMiddleware = (response) => {
|
|
54
|
-
|
|
55
|
-
if (
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
53
|
+
const traverse = (obj) => {
|
|
54
|
+
if (obj && typeof obj === 'object') {
|
|
55
|
+
for (const key in obj) {
|
|
56
|
+
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
57
|
+
const value = obj[key];
|
|
58
|
+
if (value && typeof value === 'object') {
|
|
59
|
+
traverse(value);
|
|
60
|
+
}
|
|
61
|
+
if (value instanceof Object &&
|
|
62
|
+
'name' in value &&
|
|
63
|
+
value.name &&
|
|
64
|
+
typeof value.name === 'string') {
|
|
65
|
+
if (value.name.includes('[')) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
let hashedName = '[Invalid ENS Name]';
|
|
69
|
+
try {
|
|
70
|
+
hashedName = (0, normalise_js_1.namehash)(value.name);
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
73
|
+
obj[key] = { ...value, name: hashedName, invalidName: true };
|
|
74
|
+
}
|
|
75
|
+
if ('id' in value && value.id !== hashedName) {
|
|
76
|
+
obj[key] = { ...value, name: hashedName, invalidName: true };
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
72
80
|
}
|
|
73
81
|
}
|
|
74
|
-
}
|
|
82
|
+
};
|
|
83
|
+
traverse(response);
|
|
75
84
|
};
|
|
76
85
|
exports.responseMiddleware = responseMiddleware;
|
|
77
86
|
const createSubgraphClient = ({ client }) => new graphql_request_1.GraphQLClient(client.chain.subgraphs.ens.url, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/functions/subgraph/client.ts"],"names":[],"mappings":";;;AAEA,qDAA+C;AAC/C,wDAA+D;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/functions/subgraph/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,8 @@ const fuses_js_1 = require("../../utils/fuses.js");
|
|
|
11
11
|
const getNameType_js_1 = require("../../utils/getNameType.js");
|
|
12
12
|
const makeLabelNodeAndParent_js_1 = require("../../utils/makeLabelNodeAndParent.js");
|
|
13
13
|
const wrapper_js_1 = require("../../utils/wrapper.js");
|
|
14
|
+
const getWrapperData_js_1 = require("../public/getWrapperData.js");
|
|
15
|
+
const base_js_1 = require("../../errors/base.js");
|
|
14
16
|
const makeFunctionData = (wallet, { name, contract, owner, resolverAddress = (0, getChainContractAddress_js_1.getChainContractAddress)({
|
|
15
17
|
client: wallet,
|
|
16
18
|
contract: 'ensPublicResolver',
|
|
@@ -44,7 +46,9 @@ const makeFunctionData = (wallet, { name, contract, owner, resolverAddress = (0,
|
|
|
44
46
|
case 'nameWrapper': {
|
|
45
47
|
(0, wrapper_js_1.wrappedLabelLengthCheck)(label);
|
|
46
48
|
const generatedFuses = fuses ? (0, fuses_js_1.encodeFuses)({ input: fuses }) : 0;
|
|
47
|
-
const generatedExpiry = expiry
|
|
49
|
+
const generatedExpiry = expiry
|
|
50
|
+
? (0, wrapper_js_1.expiryToBigInt)(expiry)
|
|
51
|
+
: (0, wrapper_js_1.makeDefaultExpiry)(generatedFuses);
|
|
48
52
|
return {
|
|
49
53
|
to: (0, getChainContractAddress_js_1.getChainContractAddress)({
|
|
50
54
|
client: wallet,
|
|
@@ -73,7 +77,59 @@ const makeFunctionData = (wallet, { name, contract, owner, resolverAddress = (0,
|
|
|
73
77
|
}
|
|
74
78
|
};
|
|
75
79
|
exports.makeFunctionData = makeFunctionData;
|
|
80
|
+
class CreateSubnamePermissionDeniedError extends base_js_1.BaseError {
|
|
81
|
+
constructor({ parentName }) {
|
|
82
|
+
super(`Create subname error: ${parentName} as burned CANNOT_CREATE_SUBDOMAIN fuse`);
|
|
83
|
+
Object.defineProperty(this, "parentName", {
|
|
84
|
+
enumerable: true,
|
|
85
|
+
configurable: true,
|
|
86
|
+
writable: true,
|
|
87
|
+
value: void 0
|
|
88
|
+
});
|
|
89
|
+
Object.defineProperty(this, "name", {
|
|
90
|
+
enumerable: true,
|
|
91
|
+
configurable: true,
|
|
92
|
+
writable: true,
|
|
93
|
+
value: 'CreateSubnamePermissionDeniedError'
|
|
94
|
+
});
|
|
95
|
+
this.parentName = parentName;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
class CreateSubnameParentNotLockedError extends base_js_1.BaseError {
|
|
99
|
+
constructor({ parentName }) {
|
|
100
|
+
super(`Create subname error: Cannot burn PARENT_CANNOT_CONTROL when ${parentName} has not burned CANNOT_UNWRAP fuse`);
|
|
101
|
+
Object.defineProperty(this, "parentName", {
|
|
102
|
+
enumerable: true,
|
|
103
|
+
configurable: true,
|
|
104
|
+
writable: true,
|
|
105
|
+
value: void 0
|
|
106
|
+
});
|
|
107
|
+
Object.defineProperty(this, "name", {
|
|
108
|
+
enumerable: true,
|
|
109
|
+
configurable: true,
|
|
110
|
+
writable: true,
|
|
111
|
+
value: 'CreateSubnameParentNotLockedError'
|
|
112
|
+
});
|
|
113
|
+
this.parentName = parentName;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
const checkCanCreateSubname = async (wallet, { name, fuses, contract, }) => {
|
|
117
|
+
if (contract !== 'nameWrapper')
|
|
118
|
+
return;
|
|
119
|
+
const parentName = name.split('.').slice(1).join('.');
|
|
120
|
+
if (parentName === 'eth')
|
|
121
|
+
return;
|
|
122
|
+
const parentWrapperData = await (0, getWrapperData_js_1.default)(wallet, { name: parentName });
|
|
123
|
+
if (parentWrapperData?.fuses?.child?.CANNOT_CREATE_SUBDOMAIN)
|
|
124
|
+
throw new CreateSubnamePermissionDeniedError({ parentName });
|
|
125
|
+
const generatedFuses = fuses ? (0, fuses_js_1.encodeFuses)({ input: fuses }) : 0;
|
|
126
|
+
const isBurningPCC = fuses && BigInt(generatedFuses) & fuses_js_1.ParentFuses.PARENT_CANNOT_CONTROL;
|
|
127
|
+
const isParentCannotUnwrapBurned = parentWrapperData?.fuses?.child?.CANNOT_UNWRAP;
|
|
128
|
+
if (isBurningPCC && !isParentCannotUnwrapBurned)
|
|
129
|
+
throw new CreateSubnameParentNotLockedError({ parentName });
|
|
130
|
+
};
|
|
76
131
|
async function createSubname(wallet, { name, contract, owner, resolverAddress, expiry, fuses, ...txArgs }) {
|
|
132
|
+
await checkCanCreateSubname(wallet, { name, fuses, contract });
|
|
77
133
|
const data = (0, exports.makeFunctionData)(wallet, {
|
|
78
134
|
name,
|
|
79
135
|
contract,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createSubname.js","sourceRoot":"","sources":["../../../../src/functions/wallet/createSubname.ts"],"names":[],"mappings":";;;AAAA,+BAOa;AACb,0CAA8C;
|
|
1
|
+
{"version":3,"file":"createSubname.js","sourceRoot":"","sources":["../../../../src/functions/wallet/createSubname.ts"],"names":[],"mappings":";;;AAAA,+BAOa;AACb,0CAA8C;AAM9C,2FAAoF;AACpF,mEAAmF;AACnF,6DAA6E;AAC7E,wDAGgC;AAOhC,mDAI6B;AAC7B,+DAAwD;AACxD,qFAA8E;AAC9E,uDAI+B;AAC/B,mEAAwD;AACxD,kDAAgD;AA6CzC,MAAM,gBAAgB,GAAG,CAI9B,MAAsD,EACtD,EACE,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,eAAe,GAAG,IAAA,oDAAuB,EAAC;IACxC,MAAM,EAAE,MAAM;IACd,QAAQ,EAAE,mBAAmB;CAC9B,CAAC,EACF,MAAM,EACN,KAAK,GACuB,EACD,EAAE;IAC/B,MAAM,QAAQ,GAAG,IAAA,4BAAW,EAAC,IAAI,CAAC,CAAA;IAClC,IAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,MAAM;QAC3C,MAAM,IAAI,qCAAwB,CAAC;YACjC,QAAQ;YACR,kBAAkB,EAAE;gBAClB,SAAS;gBACT,aAAa;gBACb,WAAW;gBACX,eAAe;aAChB;SACF,CAAC,CAAA;IAEJ,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,IAAA,kDAAsB,EAAC,IAAI,CAAC,CAAA;IAErE,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,OAAO;gBACL,EAAE,EAAE,IAAA,oDAAuB,EAAC;oBAC1B,MAAM,EAAE,MAAM;oBACd,QAAQ,EAAE,aAAa;iBACxB,CAAC;gBACF,IAAI,EAAE,IAAA,yBAAkB,EAAC;oBACvB,GAAG,EAAE,6CAA+B;oBACpC,YAAY,EAAE,kBAAkB;oBAChC,IAAI,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;iBACjE,CAAC;aACH,CAAA;QACH,CAAC;QACD,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,IAAA,oCAAuB,EAAC,KAAK,CAAC,CAAA;YAC9B,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC,IAAA,sBAAW,EAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YAChE,MAAM,eAAe,GAAG,MAAM;gBAC5B,CAAC,CAAC,IAAA,2BAAc,EAAC,MAAM,CAAC;gBACxB,CAAC,CAAC,IAAA,8BAAiB,EAAC,cAAc,CAAC,CAAA;YACrC,OAAO;gBACL,EAAE,EAAE,IAAA,oDAAuB,EAAC;oBAC1B,MAAM,EAAE,MAAM;oBACd,QAAQ,EAAE,gBAAgB;iBAC3B,CAAC;gBACF,IAAI,EAAE,IAAA,yBAAkB,EAAC;oBACvB,GAAG,EAAE,mDAAkC;oBACvC,YAAY,EAAE,kBAAkB;oBAChC,IAAI,EAAE;wBACJ,UAAU;wBACV,KAAK;wBACL,KAAK;wBACL,eAAe;wBACf,MAAM,CAAC,CAAC,CAAC;wBACT,cAAc;wBACd,eAAe;qBAChB;iBACF,CAAC;aACH,CAAA;QACH,CAAC;QACD;YACE,MAAM,IAAI,qCAAwB,CAAC;gBACjC,YAAY,EAAE,QAAQ;gBACtB,sBAAsB,EAAE,CAAC,UAAU,EAAE,aAAa,CAAC;aACpD,CAAC,CAAA;IACN,CAAC;AACH,CAAC,CAAA;AA7EY,QAAA,gBAAgB,oBA6E5B;AAED,MAAM,kCAAmC,SAAQ,mBAAS;IAKxD,YAAY,EAAE,UAAU,EAA0B;QAChD,KAAK,CACH,yBAAyB,UAAU,yCAAyC,CAC7E,CAAA;QAPH;;;;;WAAkB;QAET;;;;mBAAO,oCAAoC;WAAA;QAMlD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;IAC9B,CAAC;CACF;AAED,MAAM,iCAAkC,SAAQ,mBAAS;IAKvD,YAAY,EAAE,UAAU,EAA0B;QAChD,KAAK,CACH,gEAAgE,UAAU,oCAAoC,CAC/G,CAAA;QAPH;;;;;WAAkB;QAET;;;;mBAAO,mCAAmC;WAAA;QAMjD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;IAC9B,CAAC;CACF;AAED,MAAM,qBAAqB,GAAG,KAAK,EACjC,MAAqB,EACrB,EACE,IAAI,EACJ,KAAK,EACL,QAAQ,GAC6D,EACxD,EAAE;IACjB,IAAI,QAAQ,KAAK,aAAa;QAAE,OAAM;IAEtC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACrD,IAAI,UAAU,KAAK,KAAK;QAAE,OAAM;IAEhC,MAAM,iBAAiB,GAAG,MAAM,IAAA,2BAAc,EAAC,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAA;IAC5E,IAAI,iBAAiB,EAAE,KAAK,EAAE,KAAK,EAAE,uBAAuB;QAC1D,MAAM,IAAI,kCAAkC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAA;IAE9D,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC,IAAA,sBAAW,EAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAChE,MAAM,YAAY,GAChB,KAAK,IAAI,MAAM,CAAC,cAAc,CAAC,GAAG,sBAAW,CAAC,qBAAqB,CAAA;IACrE,MAAM,0BAA0B,GAC9B,iBAAiB,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,CAAA;IAChD,IAAI,YAAY,IAAI,CAAC,0BAA0B;QAC7C,MAAM,IAAI,iCAAiC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAA;AAC/D,CAAC,CAAA;AAyBD,KAAK,UAAU,aAAa,CAK1B,MAAsD,EACtD,EACE,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,eAAe,EACf,MAAM,EACN,KAAK,EACL,GAAG,MAAM,EACiD;IAE5D,MAAM,qBAAqB,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;IAE9D,MAAM,IAAI,GAAG,IAAA,wBAAgB,EAAC,MAAM,EAAE;QACpC,IAAI;QACJ,QAAQ;QACR,KAAK;QACL,eAAe;QACf,MAAM;QACN,KAAK;KACyB,CAAC,CAAA;IACjC,MAAM,SAAS,GAAG;QAChB,GAAG,IAAI;QACP,GAAG,MAAM;KACqD,CAAA;IAEhE,OAAO,IAAA,yBAAe,EAAC,MAAM,EAAE,SAAS,CAAC,CAAA;AAC3C,CAAC;AAED,aAAa,CAAC,gBAAgB,GAAG,wBAAgB,CAAA;AAEjD,kBAAe,aAAa,CAAA"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.wrappedLabelLengthCheck = exports.expiryToBigInt = exports.MAX_EXPIRY = void 0;
|
|
3
|
+
exports.makeDefaultExpiry = exports.wrappedLabelLengthCheck = exports.expiryToBigInt = exports.MAX_EXPIRY = void 0;
|
|
4
4
|
const viem_1 = require("viem");
|
|
5
5
|
const utils_js_1 = require("../errors/utils.js");
|
|
6
|
+
const fuses_js_1 = require("./fuses.js");
|
|
6
7
|
exports.MAX_EXPIRY = 2n ** 64n - 1n;
|
|
7
8
|
const expiryToBigInt = (expiry, defaultValue = 0n) => {
|
|
8
9
|
if (!expiry)
|
|
@@ -22,4 +23,10 @@ const wrappedLabelLengthCheck = (label) => {
|
|
|
22
23
|
throw new utils_js_1.WrappedLabelTooLargeError({ label, byteLength: bytes.byteLength });
|
|
23
24
|
};
|
|
24
25
|
exports.wrappedLabelLengthCheck = wrappedLabelLengthCheck;
|
|
26
|
+
const makeDefaultExpiry = (fuses) => {
|
|
27
|
+
if (fuses && BigInt(fuses) & fuses_js_1.ParentFuses.PARENT_CANNOT_CONTROL)
|
|
28
|
+
return exports.MAX_EXPIRY;
|
|
29
|
+
return 0n;
|
|
30
|
+
};
|
|
31
|
+
exports.makeDefaultExpiry = makeDefaultExpiry;
|
|
25
32
|
//# sourceMappingURL=wrapper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrapper.js","sourceRoot":"","sources":["../../../src/utils/wrapper.ts"],"names":[],"mappings":";;;AAAA,+BAAoC;AACpC,iDAA8D;
|
|
1
|
+
{"version":3,"file":"wrapper.js","sourceRoot":"","sources":["../../../src/utils/wrapper.ts"],"names":[],"mappings":";;;AAAA,+BAAoC;AACpC,iDAA8D;AAE9D,yCAAwC;AAE3B,QAAA,UAAU,GAAG,EAAE,IAAI,GAAG,GAAG,EAAE,CAAA;AAEjC,MAAM,cAAc,GAAG,CAAC,MAAgB,EAAE,YAAY,GAAG,EAAE,EAAU,EAAE;IAC5E,IAAI,CAAC,MAAM;QAAE,OAAO,YAAY,CAAA;IAChC,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAA;IAC7C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ;QAC1D,OAAO,MAAM,CAAC,MAAM,CAAC,CAAA;IACvB,IAAI,MAAM,YAAY,IAAI;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,CAAA;IAC9E,MAAM,IAAI,SAAS,CAAC,iDAAiD,CAAC,CAAA;AACxE,CAAC,CAAA;AAPY,QAAA,cAAc,kBAO1B;AAEM,MAAM,uBAAuB,GAAG,CAAC,KAAa,EAAE,EAAE;IACvD,MAAM,KAAK,GAAG,IAAA,oBAAa,EAAC,KAAK,CAAC,CAAA;IAClC,IAAI,KAAK,CAAC,UAAU,GAAG,GAAG;QACxB,MAAM,IAAI,oCAAyB,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAA;AAChF,CAAC,CAAA;AAJY,QAAA,uBAAuB,2BAInC;AAEM,MAAM,iBAAiB,GAAG,CAAC,KAAc,EAAU,EAAE;IAC1D,IAAI,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,sBAAW,CAAC,qBAAqB;QAC5D,OAAO,kBAAU,CAAA;IACnB,OAAO,EAAE,CAAA;AACX,CAAC,CAAA;AAJY,QAAA,iBAAiB,qBAI7B"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const version = '
|
|
1
|
+
export const version = 'v4.0.0';
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { GraphQLClient } from 'graphql-request';
|
|
2
2
|
import { parse, print, visit } from 'graphql/language/index.js';
|
|
3
|
-
import traverse from 'traverse';
|
|
4
3
|
import { namehash } from '../../utils/normalise.js';
|
|
5
4
|
const generateSelection = (selection) => ({
|
|
6
5
|
kind: 'Field',
|
|
@@ -49,28 +48,39 @@ export const requestMiddleware = (request) => {
|
|
|
49
48
|
};
|
|
50
49
|
};
|
|
51
50
|
export const responseMiddleware = (response) => {
|
|
52
|
-
traverse
|
|
53
|
-
if (
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
51
|
+
const traverse = (obj) => {
|
|
52
|
+
if (obj && typeof obj === 'object') {
|
|
53
|
+
for (const key in obj) {
|
|
54
|
+
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
55
|
+
const value = obj[key];
|
|
56
|
+
if (value && typeof value === 'object') {
|
|
57
|
+
traverse(value);
|
|
58
|
+
}
|
|
59
|
+
if (value instanceof Object &&
|
|
60
|
+
'name' in value &&
|
|
61
|
+
value.name &&
|
|
62
|
+
typeof value.name === 'string') {
|
|
63
|
+
// Name already in hashed form
|
|
64
|
+
if (value.name.includes('[')) {
|
|
65
|
+
// eslint-disable-next-line no-continue
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
let hashedName = '[Invalid ENS Name]';
|
|
69
|
+
try {
|
|
70
|
+
hashedName = namehash(value.name);
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
73
|
+
obj[key] = { ...value, name: hashedName, invalidName: true };
|
|
74
|
+
}
|
|
75
|
+
if ('id' in value && value.id !== hashedName) {
|
|
76
|
+
obj[key] = { ...value, name: hashedName, invalidName: true };
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
71
80
|
}
|
|
72
81
|
}
|
|
73
|
-
}
|
|
82
|
+
};
|
|
83
|
+
traverse(response);
|
|
74
84
|
};
|
|
75
85
|
export const createSubgraphClient = ({ client }) => new GraphQLClient(client.chain.subgraphs.ens.url, {
|
|
76
86
|
requestMiddleware,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/functions/subgraph/client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/functions/subgraph/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,10 +4,12 @@ import { getChainContractAddress } from '../../contracts/getChainContractAddress
|
|
|
4
4
|
import { nameWrapperSetSubnodeRecordSnippet } from '../../contracts/nameWrapper.js';
|
|
5
5
|
import { registrySetSubnodeRecordSnippet } from '../../contracts/registry.js';
|
|
6
6
|
import { InvalidContractTypeError, UnsupportedNameTypeError, } from '../../errors/general.js';
|
|
7
|
-
import { encodeFuses } from '../../utils/fuses.js';
|
|
7
|
+
import { encodeFuses, ParentFuses, } from '../../utils/fuses.js';
|
|
8
8
|
import { getNameType } from '../../utils/getNameType.js';
|
|
9
9
|
import { makeLabelNodeAndParent } from '../../utils/makeLabelNodeAndParent.js';
|
|
10
|
-
import {
|
|
10
|
+
import { expiryToBigInt, wrappedLabelLengthCheck, makeDefaultExpiry, } from '../../utils/wrapper.js';
|
|
11
|
+
import getWrapperData from '../public/getWrapperData.js';
|
|
12
|
+
import { BaseError } from '../../errors/base.js';
|
|
11
13
|
export const makeFunctionData = (wallet, { name, contract, owner, resolverAddress = getChainContractAddress({
|
|
12
14
|
client: wallet,
|
|
13
15
|
contract: 'ensPublicResolver',
|
|
@@ -41,7 +43,9 @@ export const makeFunctionData = (wallet, { name, contract, owner, resolverAddres
|
|
|
41
43
|
case 'nameWrapper': {
|
|
42
44
|
wrappedLabelLengthCheck(label);
|
|
43
45
|
const generatedFuses = fuses ? encodeFuses({ input: fuses }) : 0;
|
|
44
|
-
const generatedExpiry = expiry
|
|
46
|
+
const generatedExpiry = expiry
|
|
47
|
+
? expiryToBigInt(expiry)
|
|
48
|
+
: makeDefaultExpiry(generatedFuses);
|
|
45
49
|
return {
|
|
46
50
|
to: getChainContractAddress({
|
|
47
51
|
client: wallet,
|
|
@@ -69,6 +73,57 @@ export const makeFunctionData = (wallet, { name, contract, owner, resolverAddres
|
|
|
69
73
|
});
|
|
70
74
|
}
|
|
71
75
|
};
|
|
76
|
+
class CreateSubnamePermissionDeniedError extends BaseError {
|
|
77
|
+
constructor({ parentName }) {
|
|
78
|
+
super(`Create subname error: ${parentName} as burned CANNOT_CREATE_SUBDOMAIN fuse`);
|
|
79
|
+
Object.defineProperty(this, "parentName", {
|
|
80
|
+
enumerable: true,
|
|
81
|
+
configurable: true,
|
|
82
|
+
writable: true,
|
|
83
|
+
value: void 0
|
|
84
|
+
});
|
|
85
|
+
Object.defineProperty(this, "name", {
|
|
86
|
+
enumerable: true,
|
|
87
|
+
configurable: true,
|
|
88
|
+
writable: true,
|
|
89
|
+
value: 'CreateSubnamePermissionDeniedError'
|
|
90
|
+
});
|
|
91
|
+
this.parentName = parentName;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
class CreateSubnameParentNotLockedError extends BaseError {
|
|
95
|
+
constructor({ parentName }) {
|
|
96
|
+
super(`Create subname error: Cannot burn PARENT_CANNOT_CONTROL when ${parentName} has not burned CANNOT_UNWRAP fuse`);
|
|
97
|
+
Object.defineProperty(this, "parentName", {
|
|
98
|
+
enumerable: true,
|
|
99
|
+
configurable: true,
|
|
100
|
+
writable: true,
|
|
101
|
+
value: void 0
|
|
102
|
+
});
|
|
103
|
+
Object.defineProperty(this, "name", {
|
|
104
|
+
enumerable: true,
|
|
105
|
+
configurable: true,
|
|
106
|
+
writable: true,
|
|
107
|
+
value: 'CreateSubnameParentNotLockedError'
|
|
108
|
+
});
|
|
109
|
+
this.parentName = parentName;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
const checkCanCreateSubname = async (wallet, { name, fuses, contract, }) => {
|
|
113
|
+
if (contract !== 'nameWrapper')
|
|
114
|
+
return;
|
|
115
|
+
const parentName = name.split('.').slice(1).join('.');
|
|
116
|
+
if (parentName === 'eth')
|
|
117
|
+
return;
|
|
118
|
+
const parentWrapperData = await getWrapperData(wallet, { name: parentName });
|
|
119
|
+
if (parentWrapperData?.fuses?.child?.CANNOT_CREATE_SUBDOMAIN)
|
|
120
|
+
throw new CreateSubnamePermissionDeniedError({ parentName });
|
|
121
|
+
const generatedFuses = fuses ? encodeFuses({ input: fuses }) : 0;
|
|
122
|
+
const isBurningPCC = fuses && BigInt(generatedFuses) & ParentFuses.PARENT_CANNOT_CONTROL;
|
|
123
|
+
const isParentCannotUnwrapBurned = parentWrapperData?.fuses?.child?.CANNOT_UNWRAP;
|
|
124
|
+
if (isBurningPCC && !isParentCannotUnwrapBurned)
|
|
125
|
+
throw new CreateSubnameParentNotLockedError({ parentName });
|
|
126
|
+
};
|
|
72
127
|
/**
|
|
73
128
|
* Creates a subname
|
|
74
129
|
* @param wallet - {@link ClientWithAccount}
|
|
@@ -93,6 +148,7 @@ export const makeFunctionData = (wallet, { name, contract, owner, resolverAddres
|
|
|
93
148
|
* // 0x...
|
|
94
149
|
*/
|
|
95
150
|
async function createSubname(wallet, { name, contract, owner, resolverAddress, expiry, fuses, ...txArgs }) {
|
|
151
|
+
await checkCanCreateSubname(wallet, { name, fuses, contract });
|
|
96
152
|
const data = makeFunctionData(wallet, {
|
|
97
153
|
name,
|
|
98
154
|
contract,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createSubname.js","sourceRoot":"","sources":["../../../../src/functions/wallet/createSubname.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,GAMnB,MAAM,MAAM,CAAA;AACb,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"createSubname.js","sourceRoot":"","sources":["../../../../src/functions/wallet/createSubname.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { stringToBytes } from 'viem';
|
|
2
2
|
import { WrappedLabelTooLargeError } from '../errors/utils.js';
|
|
3
|
+
import { ParentFuses } from './fuses.js';
|
|
3
4
|
export const MAX_EXPIRY = 2n ** 64n - 1n;
|
|
4
5
|
export const expiryToBigInt = (expiry, defaultValue = 0n) => {
|
|
5
6
|
if (!expiry)
|
|
@@ -17,4 +18,9 @@ export const wrappedLabelLengthCheck = (label) => {
|
|
|
17
18
|
if (bytes.byteLength > 255)
|
|
18
19
|
throw new WrappedLabelTooLargeError({ label, byteLength: bytes.byteLength });
|
|
19
20
|
};
|
|
21
|
+
export const makeDefaultExpiry = (fuses) => {
|
|
22
|
+
if (fuses && BigInt(fuses) & ParentFuses.PARENT_CANNOT_CONTROL)
|
|
23
|
+
return MAX_EXPIRY;
|
|
24
|
+
return 0n;
|
|
25
|
+
};
|
|
20
26
|
//# sourceMappingURL=wrapper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrapper.js","sourceRoot":"","sources":["../../../src/utils/wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,MAAM,CAAA;AACpC,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"wrapper.js","sourceRoot":"","sources":["../../../src/utils/wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,MAAM,CAAA;AACpC,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAA;AAE9D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAExC,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,IAAI,GAAG,GAAG,EAAE,CAAA;AAExC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAgB,EAAE,YAAY,GAAG,EAAE,EAAU,EAAE;IAC5E,IAAI,CAAC,MAAM;QAAE,OAAO,YAAY,CAAA;IAChC,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAA;IAC7C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ;QAC1D,OAAO,MAAM,CAAC,MAAM,CAAC,CAAA;IACvB,IAAI,MAAM,YAAY,IAAI;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,CAAA;IAC9E,MAAM,IAAI,SAAS,CAAC,iDAAiD,CAAC,CAAA;AACxE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,KAAa,EAAE,EAAE;IACvD,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAA;IAClC,IAAI,KAAK,CAAC,UAAU,GAAG,GAAG;QACxB,MAAM,IAAI,yBAAyB,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAA;AAChF,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAc,EAAU,EAAE;IAC1D,IAAI,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,qBAAqB;QAC5D,OAAO,UAAU,CAAA;IACnB,OAAO,EAAE,CAAA;AACX,CAAC,CAAA"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const version = "
|
|
1
|
+
export declare const version = "v4.0.0";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/functions/subgraph/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/functions/subgraph/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAmC9D,eAAO,MAAM,iBAAiB,EAAE,iBAgB/B,CAAA;AAED,eAAO,MAAM,kBAAkB,EAAE,kBAwChC,CAAA;AAED,eAAO,MAAM,oBAAoB;YAA0B,aAAa;mBAIpE,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createSubname.d.ts","sourceRoot":"","sources":["../../../../src/functions/wallet/createSubname.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,OAAO,EACZ,KAAK,OAAO,EACZ,KAAK,IAAI,EAET,KAAK,SAAS,EACf,MAAM,MAAM,CAAA;AAEb,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"createSubname.d.ts","sourceRoot":"","sources":["../../../../src/functions/wallet/createSubname.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,OAAO,EACZ,KAAK,OAAO,EACZ,KAAK,IAAI,EAET,KAAK,SAAS,EACf,MAAM,MAAM,CAAA;AAEb,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EAElB,MAAM,2BAA2B,CAAA;AAQlC,OAAO,KAAK,EACV,OAAO,EACP,QAAQ,EACR,wBAAwB,EACxB,0BAA0B,EAC3B,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAGL,KAAK,sBAAsB,EAC5B,MAAM,sBAAsB,CAAA;AAW7B,KAAK,+BAA+B,GAAG;IACrC,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,2BAA2B;IAC3B,KAAK,EAAE,OAAO,CAAA;IACd,oCAAoC;IACpC,QAAQ,EAAE,UAAU,GAAG,aAAa,CAAA;IACpC,8BAA8B;IAC9B,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,yCAAyC;IACzC,KAAK,CAAC,EAAE,sBAAsB,CAAA;CAC/B,CAAA;AAED,KAAK,mCAAmC,GAAG;IACzC,QAAQ,EAAE,UAAU,CAAA;IACpB,MAAM,CAAC,EAAE,KAAK,CAAA;IACd,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAED,KAAK,sCAAsC,GAAG;IAC5C,QAAQ,EAAE,aAAa,CAAA;IACvB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,sBAAsB,CAAA;CAC/B,CAAA;AAED,MAAM,MAAM,2BAA2B,GAAG,+BAA+B,GACvE,CAAC,mCAAmC,GAAG,sCAAsC,CAAC,CAAA;AAEhF,MAAM,MAAM,2BAA2B,GAAG,wBAAwB,CAAA;AAElE,MAAM,MAAM,uBAAuB,CACjC,MAAM,SAAS,YAAY,EAC3B,QAAQ,SAAS,OAAO,GAAG,SAAS,EACpC,cAAc,SAAS,YAAY,GAAG,SAAS,IAC7C,QAAQ,CACV,2BAA2B,GACzB,0BAA0B,CAAC,MAAM,EAAE,QAAQ,EAAE,cAAc,CAAC,CAC/D,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG,IAAI,CAAA;AAE1C,eAAO,MAAM,gBAAgB,0LAexB,2BAA2B,KAC7B,2BA6DF,CAAA;AAsDD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,iBAAe,aAAa,CAC1B,MAAM,SAAS,YAAY,EAC3B,QAAQ,SAAS,OAAO,GAAG,SAAS,EACpC,cAAc,SAAS,YAAY,GAAG,SAAS,GAAG,YAAY,EAE9D,MAAM,EAAE,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EACtD,EACE,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,eAAe,EACf,MAAM,EACN,KAAK,EACL,GAAG,MAAM,EACV,EAAE,uBAAuB,CAAC,MAAM,EAAE,QAAQ,EAAE,cAAc,CAAC,GAC3D,OAAO,CAAC,uBAAuB,CAAC,CAiBlC;kBAhCc,aAAa;;;AAoC5B,eAAe,aAAa,CAAA"}
|
|
@@ -2,4 +2,5 @@ import type { AnyDate } from '../types.js';
|
|
|
2
2
|
export declare const MAX_EXPIRY: bigint;
|
|
3
3
|
export declare const expiryToBigInt: (expiry?: AnyDate, defaultValue?: bigint) => bigint;
|
|
4
4
|
export declare const wrappedLabelLengthCheck: (label: string) => void;
|
|
5
|
+
export declare const makeDefaultExpiry: (fuses?: number) => bigint;
|
|
5
6
|
//# sourceMappingURL=wrapper.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrapper.d.ts","sourceRoot":"","sources":["../../../src/utils/wrapper.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"wrapper.d.ts","sourceRoot":"","sources":["../../../src/utils/wrapper.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAG1C,eAAO,MAAM,UAAU,QAAiB,CAAA;AAExC,eAAO,MAAM,cAAc,YAAa,OAAO,4BAAsB,MAOpE,CAAA;AAED,eAAO,MAAM,uBAAuB,UAAW,MAAM,SAIpD,CAAA;AAED,eAAO,MAAM,iBAAiB,WAAY,MAAM,KAAG,MAIlD,CAAA"}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@ensdomains/ensjs",
|
|
3
3
|
"description": "ENS javascript library for contract interaction",
|
|
4
4
|
"dependencies": {
|
|
5
|
-
"@adraffy/ens-normalize": "1.
|
|
5
|
+
"@adraffy/ens-normalize": "1.10.1",
|
|
6
6
|
"@ensdomains/address-encoder": "1.1.1",
|
|
7
7
|
"@ensdomains/content-hash": "3.1.0-rc.1",
|
|
8
8
|
"@ensdomains/dnsprovejs": "^0.5.1",
|
|
@@ -10,13 +10,12 @@
|
|
|
10
10
|
"dns-packet": "^5.3.1",
|
|
11
11
|
"graphql": "^16.3.0",
|
|
12
12
|
"graphql-request": "6.1.0",
|
|
13
|
-
"pako": "^2.1.0"
|
|
14
|
-
"traverse": "^0.6.8"
|
|
13
|
+
"pako": "^2.1.0"
|
|
15
14
|
},
|
|
16
15
|
"peerDependencies": {
|
|
17
16
|
"viem": "^2.9.2"
|
|
18
17
|
},
|
|
19
|
-
"version": "
|
|
18
|
+
"version": "4.0.0",
|
|
20
19
|
"files": [
|
|
21
20
|
"dist/",
|
|
22
21
|
"src/",
|
package/src/errors/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = '
|
|
1
|
+
export const version = 'v4.0.0'
|
|
@@ -2,7 +2,6 @@ import type { Kind, SelectionNode, SelectionSetNode } from 'graphql'
|
|
|
2
2
|
import type { RequestMiddleware, ResponseMiddleware } from 'graphql-request'
|
|
3
3
|
import { GraphQLClient } from 'graphql-request'
|
|
4
4
|
import { parse, print, visit } from 'graphql/language/index.js'
|
|
5
|
-
import traverse from 'traverse'
|
|
6
5
|
import type { ClientWithEns } from '../../contracts/consts.js'
|
|
7
6
|
import { namehash } from '../../utils/normalise.js'
|
|
8
7
|
|
|
@@ -57,30 +56,45 @@ export const requestMiddleware: RequestMiddleware = (request) => {
|
|
|
57
56
|
}
|
|
58
57
|
|
|
59
58
|
export const responseMiddleware: ResponseMiddleware = (response) => {
|
|
60
|
-
traverse
|
|
61
|
-
if (
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
typeof responseItem.name === 'string'
|
|
66
|
-
) {
|
|
67
|
-
// Name already in hashed form
|
|
68
|
-
if (responseItem.name && responseItem.name.includes('[')) {
|
|
69
|
-
return
|
|
70
|
-
}
|
|
59
|
+
const traverse = (obj: Record<string, any>) => {
|
|
60
|
+
if (obj && typeof obj === 'object') {
|
|
61
|
+
for (const key in obj) {
|
|
62
|
+
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
63
|
+
const value = obj[key]
|
|
71
64
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
65
|
+
if (value && typeof value === 'object') {
|
|
66
|
+
traverse(value)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (
|
|
70
|
+
value instanceof Object &&
|
|
71
|
+
'name' in value &&
|
|
72
|
+
value.name &&
|
|
73
|
+
typeof value.name === 'string'
|
|
74
|
+
) {
|
|
75
|
+
// Name already in hashed form
|
|
76
|
+
if (value.name.includes('[')) {
|
|
77
|
+
// eslint-disable-next-line no-continue
|
|
78
|
+
continue
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
let hashedName = '[Invalid ENS Name]'
|
|
82
|
+
try {
|
|
83
|
+
hashedName = namehash(value.name)
|
|
84
|
+
} catch (e) {
|
|
85
|
+
obj[key] = { ...value, name: hashedName, invalidName: true }
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if ('id' in value && value.id !== hashedName) {
|
|
89
|
+
obj[key] = { ...value, name: hashedName, invalidName: true }
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
81
93
|
}
|
|
82
94
|
}
|
|
83
|
-
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
traverse(response)
|
|
84
98
|
}
|
|
85
99
|
|
|
86
100
|
export const createSubgraphClient = ({ client }: { client: ClientWithEns }) =>
|
|
@@ -7,7 +7,11 @@ import {
|
|
|
7
7
|
type Transport,
|
|
8
8
|
} from 'viem'
|
|
9
9
|
import { sendTransaction } from 'viem/actions'
|
|
10
|
-
import type {
|
|
10
|
+
import type {
|
|
11
|
+
ChainWithEns,
|
|
12
|
+
ClientWithAccount,
|
|
13
|
+
ClientWithEns,
|
|
14
|
+
} from '../../contracts/consts.js'
|
|
11
15
|
import { getChainContractAddress } from '../../contracts/getChainContractAddress.js'
|
|
12
16
|
import { nameWrapperSetSubnodeRecordSnippet } from '../../contracts/nameWrapper.js'
|
|
13
17
|
import { registrySetSubnodeRecordSnippet } from '../../contracts/registry.js'
|
|
@@ -21,14 +25,20 @@ import type {
|
|
|
21
25
|
SimpleTransactionRequest,
|
|
22
26
|
WriteTransactionParameters,
|
|
23
27
|
} from '../../types.js'
|
|
24
|
-
import {
|
|
28
|
+
import {
|
|
29
|
+
encodeFuses,
|
|
30
|
+
ParentFuses,
|
|
31
|
+
type EncodeFusesInputObject,
|
|
32
|
+
} from '../../utils/fuses.js'
|
|
25
33
|
import { getNameType } from '../../utils/getNameType.js'
|
|
26
34
|
import { makeLabelNodeAndParent } from '../../utils/makeLabelNodeAndParent.js'
|
|
27
35
|
import {
|
|
28
|
-
MAX_EXPIRY,
|
|
29
36
|
expiryToBigInt,
|
|
30
37
|
wrappedLabelLengthCheck,
|
|
38
|
+
makeDefaultExpiry,
|
|
31
39
|
} from '../../utils/wrapper.js'
|
|
40
|
+
import getWrapperData from '../public/getWrapperData.js'
|
|
41
|
+
import { BaseError } from '../../errors/base.js'
|
|
32
42
|
|
|
33
43
|
type BaseCreateSubnameDataParameters = {
|
|
34
44
|
/** Subname to create */
|
|
@@ -121,7 +131,9 @@ export const makeFunctionData = <
|
|
|
121
131
|
case 'nameWrapper': {
|
|
122
132
|
wrappedLabelLengthCheck(label)
|
|
123
133
|
const generatedFuses = fuses ? encodeFuses({ input: fuses }) : 0
|
|
124
|
-
const generatedExpiry = expiry
|
|
134
|
+
const generatedExpiry = expiry
|
|
135
|
+
? expiryToBigInt(expiry)
|
|
136
|
+
: makeDefaultExpiry(generatedFuses)
|
|
125
137
|
return {
|
|
126
138
|
to: getChainContractAddress({
|
|
127
139
|
client: wallet,
|
|
@@ -150,6 +162,58 @@ export const makeFunctionData = <
|
|
|
150
162
|
}
|
|
151
163
|
}
|
|
152
164
|
|
|
165
|
+
class CreateSubnamePermissionDeniedError extends BaseError {
|
|
166
|
+
parentName: string
|
|
167
|
+
|
|
168
|
+
override name = 'CreateSubnamePermissionDeniedError'
|
|
169
|
+
|
|
170
|
+
constructor({ parentName }: { parentName: string }) {
|
|
171
|
+
super(
|
|
172
|
+
`Create subname error: ${parentName} as burned CANNOT_CREATE_SUBDOMAIN fuse`,
|
|
173
|
+
)
|
|
174
|
+
this.parentName = parentName
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
class CreateSubnameParentNotLockedError extends BaseError {
|
|
179
|
+
parentName: string
|
|
180
|
+
|
|
181
|
+
override name = 'CreateSubnameParentNotLockedError'
|
|
182
|
+
|
|
183
|
+
constructor({ parentName }: { parentName: string }) {
|
|
184
|
+
super(
|
|
185
|
+
`Create subname error: Cannot burn PARENT_CANNOT_CONTROL when ${parentName} has not burned CANNOT_UNWRAP fuse`,
|
|
186
|
+
)
|
|
187
|
+
this.parentName = parentName
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
const checkCanCreateSubname = async (
|
|
192
|
+
wallet: ClientWithEns,
|
|
193
|
+
{
|
|
194
|
+
name,
|
|
195
|
+
fuses,
|
|
196
|
+
contract,
|
|
197
|
+
}: Pick<BaseCreateSubnameDataParameters, 'name' | 'contract' | 'fuses'>,
|
|
198
|
+
): Promise<void> => {
|
|
199
|
+
if (contract !== 'nameWrapper') return
|
|
200
|
+
|
|
201
|
+
const parentName = name.split('.').slice(1).join('.')
|
|
202
|
+
if (parentName === 'eth') return
|
|
203
|
+
|
|
204
|
+
const parentWrapperData = await getWrapperData(wallet, { name: parentName })
|
|
205
|
+
if (parentWrapperData?.fuses?.child?.CANNOT_CREATE_SUBDOMAIN)
|
|
206
|
+
throw new CreateSubnamePermissionDeniedError({ parentName })
|
|
207
|
+
|
|
208
|
+
const generatedFuses = fuses ? encodeFuses({ input: fuses }) : 0
|
|
209
|
+
const isBurningPCC =
|
|
210
|
+
fuses && BigInt(generatedFuses) & ParentFuses.PARENT_CANNOT_CONTROL
|
|
211
|
+
const isParentCannotUnwrapBurned =
|
|
212
|
+
parentWrapperData?.fuses?.child?.CANNOT_UNWRAP
|
|
213
|
+
if (isBurningPCC && !isParentCannotUnwrapBurned)
|
|
214
|
+
throw new CreateSubnameParentNotLockedError({ parentName })
|
|
215
|
+
}
|
|
216
|
+
|
|
153
217
|
/**
|
|
154
218
|
* Creates a subname
|
|
155
219
|
* @param wallet - {@link ClientWithAccount}
|
|
@@ -189,6 +253,8 @@ async function createSubname<
|
|
|
189
253
|
...txArgs
|
|
190
254
|
}: CreateSubnameParameters<TChain, TAccount, TChainOverride>,
|
|
191
255
|
): Promise<CreateSubnameReturnType> {
|
|
256
|
+
await checkCanCreateSubname(wallet, { name, fuses, contract })
|
|
257
|
+
|
|
192
258
|
const data = makeFunctionData(wallet, {
|
|
193
259
|
name,
|
|
194
260
|
contract,
|
|
@@ -201,6 +267,7 @@ async function createSubname<
|
|
|
201
267
|
...data,
|
|
202
268
|
...txArgs,
|
|
203
269
|
} as SendTransactionParameters<TChain, TAccount, TChainOverride>
|
|
270
|
+
|
|
204
271
|
return sendTransaction(wallet, writeArgs)
|
|
205
272
|
}
|
|
206
273
|
|
package/src/utils/wrapper.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { stringToBytes } from 'viem'
|
|
2
2
|
import { WrappedLabelTooLargeError } from '../errors/utils.js'
|
|
3
3
|
import type { AnyDate } from '../types.js'
|
|
4
|
+
import { ParentFuses } from './fuses.js'
|
|
4
5
|
|
|
5
6
|
export const MAX_EXPIRY = 2n ** 64n - 1n
|
|
6
7
|
|
|
@@ -18,3 +19,9 @@ export const wrappedLabelLengthCheck = (label: string) => {
|
|
|
18
19
|
if (bytes.byteLength > 255)
|
|
19
20
|
throw new WrappedLabelTooLargeError({ label, byteLength: bytes.byteLength })
|
|
20
21
|
}
|
|
22
|
+
|
|
23
|
+
export const makeDefaultExpiry = (fuses?: number): bigint => {
|
|
24
|
+
if (fuses && BigInt(fuses) & ParentFuses.PARENT_CANNOT_CONTROL)
|
|
25
|
+
return MAX_EXPIRY
|
|
26
|
+
return 0n
|
|
27
|
+
}
|