@secondlayer/stacks 0.0.4 → 0.2.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/shared/{stacks-zm0b3tgy.js → stacks-0hqzpm29.js} +7 -7
- package/dist/shared/{stacks-zm0b3tgy.js.map → stacks-0hqzpm29.js.map} +2 -2
- package/dist/shared/{stacks-bnvfmt7y.cjs → stacks-2gdt3aqj.cjs} +15 -2
- package/dist/shared/{stacks-8m9byk2j.js.map → stacks-2gdt3aqj.cjs.map} +1 -1
- package/dist/shared/stacks-61rvzkz1.cjs.map +1 -1
- package/dist/shared/stacks-709tra19.js.map +2 -2
- package/dist/shared/{stacks-n2g56wgg.js → stacks-8qhfd37f.js} +13 -13
- package/dist/shared/{stacks-n2g56wgg.js.map → stacks-8qhfd37f.js.map} +3 -3
- package/dist/shared/stacks-9g0jhab3.cjs.map +2 -2
- package/dist/shared/stacks-an5k8n4t.cjs.map +2 -2
- package/dist/shared/stacks-b008c3w8.cjs.map +2 -2
- package/dist/shared/stacks-gck1sq7h.cjs.map +2 -2
- package/dist/shared/stacks-gjvbq6w7.js.map +2 -2
- package/dist/shared/{stacks-74k8cxgb.cjs → stacks-hfem9dck.cjs} +46 -2
- package/dist/shared/stacks-hfem9dck.cjs.map +13 -0
- package/dist/shared/stacks-j2cy7qtt.js.map +2 -2
- package/dist/shared/stacks-k58k970n.js.map +2 -2
- package/dist/shared/{stacks-zyv9qqme.cjs → stacks-kgesjxq4.cjs} +3 -5
- package/dist/shared/stacks-kgesjxq4.cjs.map +11 -0
- package/dist/shared/{stacks-f7wdrzs3.js → stacks-nbz193yk.js} +18 -21
- package/dist/shared/stacks-nbz193yk.js.map +11 -0
- package/dist/shared/stacks-njvyj3ab.js +23 -0
- package/dist/shared/{stacks-bnvfmt7y.cjs.map → stacks-njvyj3ab.js.map} +1 -1
- package/dist/shared/{stacks-dxhntr76.js → stacks-ph4a6322.js} +54 -11
- package/dist/shared/stacks-ph4a6322.js.map +10 -0
- package/dist/shared/stacks-qvg7c24g.cjs.map +2 -2
- package/dist/shared/{stacks-4py5pm0r.cjs → stacks-v3zy6zds.cjs} +42 -2
- package/dist/shared/stacks-v3zy6zds.cjs.map +10 -0
- package/dist/shared/stacks-v9jqcpd4.js.map +2 -2
- package/dist/shared/stacks-vdfag81a.cjs.map +2 -2
- package/dist/shared/{stacks-yfgsm6ap.js → stacks-xtz0n62y.js} +58 -3
- package/dist/shared/stacks-xtz0n62y.js.map +13 -0
- package/dist/shared/stacks-ya3x01yd.cjs.map +2 -2
- package/dist/shared/{stacks-vdfs3e5v.js → stacks-zhd20wgz.js} +2 -2
- package/dist/shared/stacks-zhd20wgz.js.map +10 -0
- package/dist/src/accounts/index.js +1 -1
- package/dist/src/actions/index.d.cts +46 -7
- package/dist/src/actions/index.d.ts +46 -7
- package/dist/src/actions/index.js +7 -7
- package/dist/src/bns/index.cjs +13 -13
- package/dist/src/bns/index.cjs.map +3 -3
- package/dist/src/bns/index.js +22 -22
- package/dist/src/bns/index.js.map +3 -3
- package/dist/src/chains/index.js +1 -1
- package/dist/src/clarity/index.cjs +326 -1
- package/dist/src/clarity/index.cjs.map +5 -3
- package/dist/src/clarity/index.d.cts +24 -5
- package/dist/src/clarity/index.d.ts +24 -5
- package/dist/src/clarity/index.js +264 -13
- package/dist/src/clarity/index.js.map +5 -3
- package/dist/src/connect/index.cjs.map +2 -2
- package/dist/src/connect/index.d.cts +7 -1
- package/dist/src/connect/index.d.ts +7 -1
- package/dist/src/connect/index.js.map +2 -2
- package/dist/src/connect/walletconnect/index.cjs +4 -4
- package/dist/src/connect/walletconnect/index.cjs.map +7 -7
- package/dist/src/connect/walletconnect/index.d.cts +5 -5
- package/dist/src/connect/walletconnect/index.d.ts +5 -5
- package/dist/src/connect/walletconnect/index.js +4 -4
- package/dist/src/connect/walletconnect/index.js.map +7 -7
- package/dist/src/index.cjs +1 -1
- package/dist/src/index.cjs.map +4 -4
- package/dist/src/index.d.cts +44 -3
- package/dist/src/index.d.ts +44 -3
- package/dist/src/index.js +12 -11
- package/dist/src/index.js.map +5 -5
- package/dist/src/postconditions/index.cjs +117 -1
- package/dist/src/postconditions/index.cjs.map +4 -3
- package/dist/src/postconditions/index.js +119 -6
- package/dist/src/postconditions/index.js.map +4 -3
- package/dist/src/pox/index.cjs +9 -9
- package/dist/src/pox/index.cjs.map +4 -4
- package/dist/src/pox/index.js +17 -17
- package/dist/src/pox/index.js.map +4 -4
- package/dist/src/stackingdao/index.cjs +13 -13
- package/dist/src/stackingdao/index.cjs.map +4 -4
- package/dist/src/stackingdao/index.d.cts +18 -7
- package/dist/src/stackingdao/index.d.ts +18 -7
- package/dist/src/stackingdao/index.js +21 -21
- package/dist/src/stackingdao/index.js.map +4 -4
- package/dist/src/subscriptions/index.js +1 -1
- package/dist/src/transactions/index.cjs +5 -1
- package/dist/src/transactions/index.cjs.map +1 -1
- package/dist/src/transactions/index.d.cts +40 -2
- package/dist/src/transactions/index.d.ts +40 -2
- package/dist/src/transactions/index.js +18 -10
- package/dist/src/transactions/index.js.map +1 -1
- package/dist/src/utils/index.cjs.map +2 -2
- package/dist/src/utils/index.d.cts +4 -4
- package/dist/src/utils/index.d.ts +4 -4
- package/dist/src/utils/index.js +5 -5
- package/dist/src/utils/index.js.map +3 -3
- package/package.json +1 -1
- package/dist/shared/stacks-2ar4prfz.cjs +0 -328
- package/dist/shared/stacks-2ar4prfz.cjs.map +0 -11
- package/dist/shared/stacks-4py5pm0r.cjs.map +0 -10
- package/dist/shared/stacks-74k8cxgb.cjs.map +0 -13
- package/dist/shared/stacks-8m9byk2j.js +0 -7
- package/dist/shared/stacks-dr5en54r.cjs +0 -119
- package/dist/shared/stacks-dr5en54r.cjs.map +0 -10
- package/dist/shared/stacks-dxhntr76.js.map +0 -10
- package/dist/shared/stacks-f3tk2k5s.js +0 -27
- package/dist/shared/stacks-f3tk2k5s.js.map +0 -9
- package/dist/shared/stacks-f7wdrzs3.js.map +0 -11
- package/dist/shared/stacks-g9mcjcqg.cjs +0 -3
- package/dist/shared/stacks-g9mcjcqg.cjs.map +0 -9
- package/dist/shared/stacks-tjxmrssa.js +0 -282
- package/dist/shared/stacks-tjxmrssa.js.map +0 -11
- package/dist/shared/stacks-vdfs3e5v.js.map +0 -10
- package/dist/shared/stacks-yfgsm6ap.js.map +0 -13
- package/dist/shared/stacks-yfveb68e.js +0 -121
- package/dist/shared/stacks-yfveb68e.js.map +0 -10
- package/dist/shared/stacks-zyv9qqme.cjs.map +0 -11
package/dist/src/bns/index.js
CHANGED
|
@@ -1,17 +1,12 @@
|
|
|
1
|
-
import"../../shared/stacks-tjxmrssa.js";
|
|
2
1
|
import"../../shared/stacks-k58k970n.js";
|
|
3
2
|
import {
|
|
4
3
|
ContractResponseError,
|
|
5
4
|
getContract
|
|
6
|
-
} from "../../shared/stacks-
|
|
7
|
-
import"../../shared/stacks-
|
|
5
|
+
} from "../../shared/stacks-zhd20wgz.js";
|
|
6
|
+
import"../../shared/stacks-0hqzpm29.js";
|
|
8
7
|
import"../../shared/stacks-709tra19.js";
|
|
9
8
|
import"../../shared/stacks-d1fmkv3p.js";
|
|
10
|
-
import
|
|
11
|
-
Pc
|
|
12
|
-
} from "../../shared/stacks-yfveb68e.js";
|
|
13
|
-
import"../../shared/stacks-f7wdrzs3.js";
|
|
14
|
-
import"../../shared/stacks-yfgsm6ap.js";
|
|
9
|
+
import"../../shared/stacks-nbz193yk.js";
|
|
15
10
|
import {
|
|
16
11
|
Cl
|
|
17
12
|
} from "../../shared/stacks-j2cy7qtt.js";
|
|
@@ -22,7 +17,12 @@ import {
|
|
|
22
17
|
} from "../../shared/stacks-bycy6t9k.js";
|
|
23
18
|
import"../../shared/stacks-gjvbq6w7.js";
|
|
24
19
|
import"../../shared/stacks-nqytwfcc.js";
|
|
25
|
-
import"../../shared/stacks-
|
|
20
|
+
import"../../shared/stacks-njvyj3ab.js";
|
|
21
|
+
import"../clarity/index.js";
|
|
22
|
+
import {
|
|
23
|
+
Pc
|
|
24
|
+
} from "../postconditions/index.js";
|
|
25
|
+
import"../../shared/stacks-xtz0n62y.js";
|
|
26
26
|
|
|
27
27
|
// src/bns/abi.ts
|
|
28
28
|
var BNS_ABI = {
|
|
@@ -364,7 +364,7 @@ async function resolveName(client, nameOrFQN) {
|
|
|
364
364
|
const { name, namespace } = parseFQN(nameOrFQN);
|
|
365
365
|
const bns = getBnsContract(client);
|
|
366
366
|
try {
|
|
367
|
-
return await bns.read
|
|
367
|
+
return await bns.read.getOwnerName({
|
|
368
368
|
name: stringToBytes(name),
|
|
369
369
|
namespace: stringToBytes(namespace)
|
|
370
370
|
});
|
|
@@ -377,7 +377,7 @@ async function resolveName(client, nameOrFQN) {
|
|
|
377
377
|
async function getPrimaryName(client, address) {
|
|
378
378
|
const bns = getBnsContract(client);
|
|
379
379
|
try {
|
|
380
|
-
const result = await bns.read
|
|
380
|
+
const result = await bns.read.getPrimary({
|
|
381
381
|
owner: address
|
|
382
382
|
});
|
|
383
383
|
if (result === null)
|
|
@@ -398,7 +398,7 @@ async function canRegister(client, nameOrFQN) {
|
|
|
398
398
|
const { name, namespace } = parseFQN(nameOrFQN);
|
|
399
399
|
const bns = getBnsContract(client);
|
|
400
400
|
try {
|
|
401
|
-
await bns.read
|
|
401
|
+
await bns.read.canResolveName({
|
|
402
402
|
namespace: stringToBytes(namespace),
|
|
403
403
|
name: stringToBytes(name)
|
|
404
404
|
});
|
|
@@ -413,7 +413,7 @@ async function getNamePrice(client, nameOrFQN) {
|
|
|
413
413
|
}
|
|
414
414
|
const { name, namespace } = parseFQN(nameOrFQN);
|
|
415
415
|
const bns = getBnsContract(client);
|
|
416
|
-
const result = await bns.read
|
|
416
|
+
const result = await bns.read.getNamePrice({
|
|
417
417
|
namespace: stringToBytes(namespace),
|
|
418
418
|
name: stringToBytes(name)
|
|
419
419
|
});
|
|
@@ -428,7 +428,7 @@ async function getNameId(client, nameOrFQN) {
|
|
|
428
428
|
const { name, namespace } = parseFQN(nameOrFQN);
|
|
429
429
|
const bns = getBnsContract(client);
|
|
430
430
|
try {
|
|
431
|
-
return await bns.read
|
|
431
|
+
return await bns.read.getIdFromBns({
|
|
432
432
|
name: stringToBytes(name),
|
|
433
433
|
namespace: stringToBytes(namespace)
|
|
434
434
|
});
|
|
@@ -453,7 +453,7 @@ async function preorder(client, params) {
|
|
|
453
453
|
const salt = providedSalt ?? generateSalt();
|
|
454
454
|
const hashedSaltedFqn = hashPreorder(name, namespace, salt);
|
|
455
455
|
const bns = getBnsContract(client);
|
|
456
|
-
const txid = await bns.call
|
|
456
|
+
const txid = await bns.call.namePreorder({
|
|
457
457
|
hashedSaltedFqn,
|
|
458
458
|
stxToBurn: price
|
|
459
459
|
}, {
|
|
@@ -469,7 +469,7 @@ async function register(client, params) {
|
|
|
469
469
|
}
|
|
470
470
|
const { name, namespace } = parseFQN(fqn);
|
|
471
471
|
const bns = getBnsContract(client);
|
|
472
|
-
return bns.call
|
|
472
|
+
return bns.call.nameRegister({
|
|
473
473
|
name: stringToBytes(name),
|
|
474
474
|
namespace: stringToBytes(namespace),
|
|
475
475
|
salt
|
|
@@ -488,7 +488,7 @@ async function claimFast(client, params) {
|
|
|
488
488
|
}
|
|
489
489
|
const price = await getNamePrice(client, fqn);
|
|
490
490
|
const bns = getBnsContract(client);
|
|
491
|
-
return bns.call
|
|
491
|
+
return bns.call.nameClaimFast({
|
|
492
492
|
name: stringToBytes(name),
|
|
493
493
|
namespace: stringToBytes(namespace),
|
|
494
494
|
sendTo: recipient
|
|
@@ -537,7 +537,7 @@ async function setPrimary(client, params) {
|
|
|
537
537
|
throw new Error(`Name ${fqn} does not exist`);
|
|
538
538
|
}
|
|
539
539
|
const bns = getBnsContract(client);
|
|
540
|
-
return bns.call
|
|
540
|
+
return bns.call.setPrimaryName({ primaryNameId: id });
|
|
541
541
|
}
|
|
542
542
|
async function getZonefile(client, nameOrFQN) {
|
|
543
543
|
if (!validateFQN(nameOrFQN)) {
|
|
@@ -546,7 +546,7 @@ async function getZonefile(client, nameOrFQN) {
|
|
|
546
546
|
const { name, namespace } = parseFQN(nameOrFQN);
|
|
547
547
|
const zonefile = getZonefileContract(client);
|
|
548
548
|
try {
|
|
549
|
-
const result = await zonefile.read
|
|
549
|
+
const result = await zonefile.read.resolveName({
|
|
550
550
|
name: stringToBytes(name),
|
|
551
551
|
namespace: stringToBytes(namespace)
|
|
552
552
|
});
|
|
@@ -574,7 +574,7 @@ async function updateZonefile(client, params) {
|
|
|
574
574
|
throw new Error(`Zonefile too large: ${zonefileBytes.length} bytes (max 8192)`);
|
|
575
575
|
}
|
|
576
576
|
}
|
|
577
|
-
return zonefileContract.call
|
|
577
|
+
return zonefileContract.call.updateZonefile({
|
|
578
578
|
name: stringToBytes(name),
|
|
579
579
|
namespace: stringToBytes(namespace),
|
|
580
580
|
newZonefile: zonefileBytes
|
|
@@ -586,7 +586,7 @@ async function revokeZonefile(client, nameOrFQN) {
|
|
|
586
586
|
}
|
|
587
587
|
const { name, namespace } = parseFQN(nameOrFQN);
|
|
588
588
|
const zonefileContract = getZonefileContract(client);
|
|
589
|
-
return zonefileContract.call
|
|
589
|
+
return zonefileContract.call.revokeName({
|
|
590
590
|
name: stringToBytes(name),
|
|
591
591
|
namespace: stringToBytes(namespace)
|
|
592
592
|
});
|
|
@@ -625,5 +625,5 @@ export {
|
|
|
625
625
|
BNS_CONTRACTS
|
|
626
626
|
};
|
|
627
627
|
|
|
628
|
-
//# debugId=
|
|
628
|
+
//# debugId=5838568A4B2757A664756E2164756E21
|
|
629
629
|
//# sourceMappingURL=index.js.map
|
|
@@ -6,10 +6,10 @@
|
|
|
6
6
|
"import type { AbiContract } from \"../clarity/abi/contract.ts\";\n\n/**\n * BNS v2 Zonefile Resolver ABI\n * Manages DNS-like records for BNS names (up to 8192 bytes).\n * Separate contract from BNS-V2 for decoupled zonefile management.\n */\nexport const ZONEFILE_RESOLVER_ABI = {\n functions: [\n {\n name: \"resolve-name\",\n access: \"read-only\",\n args: [\n { name: \"name\", type: { buff: { length: 48 } } },\n { name: \"namespace\", type: { buff: { length: 20 } } },\n ],\n outputs: {\n response: {\n ok: { optional: { buff: { length: 8192 } } },\n error: \"uint128\",\n },\n },\n },\n {\n name: \"update-zonefile\",\n access: \"public\",\n args: [\n { name: \"name\", type: { buff: { length: 48 } } },\n { name: \"namespace\", type: { buff: { length: 20 } } },\n { name: \"new-zonefile\", type: { optional: { buff: { length: 8192 } } } },\n ],\n outputs: { response: { ok: \"bool\", error: \"uint128\" } },\n },\n {\n name: \"revoke-name\",\n access: \"public\",\n args: [\n { name: \"name\", type: { buff: { length: 48 } } },\n { name: \"namespace\", type: { buff: { length: 20 } } },\n ],\n outputs: { response: { ok: \"bool\", error: \"uint128\" } },\n },\n ],\n} as const satisfies AbiContract;\n",
|
|
7
7
|
"export const BNS_CONTRACTS = {\n mainnet: {\n address: \"SP2QEZ06AGJ3RKJPBV14SY1V5BBFNAW33D96YPGZF\",\n name: \"BNS-V2\",\n },\n testnet: {\n address: \"ST2QEZ06AGJ3RKJPBV14SY1V5BBFNAW33D9SZJQ0M\",\n name: \"BNS-V2\",\n },\n} as const;\n\nexport const ZONEFILE_RESOLVER_CONTRACTS = {\n mainnet: {\n address: \"SP2QEZ06AGJ3RKJPBV14SY1V5BBFNAW33D96YPGZF\",\n name: \"zonefile-resolver\",\n },\n testnet: {\n address: \"ST2QEZ06AGJ3RKJPBV14SY1V5BBFNAW33D9SZJQ0M\",\n name: \"zonefile-resolver\",\n },\n} as const;\n\n// BNS v2 uses .btc namespace primarily\nexport const DEFAULT_NAMESPACE = \"btc\";\n",
|
|
8
8
|
"import type { FullyQualifiedName } from \"./types.ts\";\nimport { DEFAULT_NAMESPACE } from \"./constants.ts\";\nimport { hash160 } from \"../utils/hash.ts\";\n\n/**\n * Parse a fully qualified name string into components.\n * Supports:\n * - \"name.namespace\" → { name: \"name\", namespace: \"namespace\" }\n * - \"name\" → { name: \"name\", namespace: \"btc\" } (default)\n */\nexport function parseFQN(fqn: string): FullyQualifiedName {\n const parts = fqn.split(\".\");\n\n if (parts.length === 1) {\n return {\n name: parts[0]!,\n namespace: DEFAULT_NAMESPACE,\n };\n }\n\n if (parts.length === 2) {\n return {\n name: parts[0]!,\n namespace: parts[1]!,\n };\n }\n\n throw new Error(\n `Invalid fully qualified name: ${fqn}. Expected format: \"name.namespace\" or \"name\"`\n );\n}\n\n/**\n * Format name components into FQN string.\n */\nexport function formatFQN(name: string, namespace: string): string {\n return `${name}.${namespace}`;\n}\n\n/**\n * Validate name format.\n * Names must be:\n * - 1-48 characters\n * - Lowercase alphanumeric, hyphens, underscores\n * - Cannot start or end with hyphen/underscore\n */\nexport function validateName(name: string): boolean {\n if (name.length < 1 || name.length > 48) return false;\n\n const regex = /^[a-z0-9]([a-z0-9_-]*[a-z0-9])?$/;\n return regex.test(name);\n}\n\n/**\n * Validate namespace format.\n * Namespaces must be:\n * - 1-20 characters\n * - Lowercase alphanumeric\n */\nexport function validateNamespace(namespace: string): boolean {\n if (namespace.length < 1 || namespace.length > 20) return false;\n\n const regex = /^[a-z0-9]+$/;\n return regex.test(namespace);\n}\n\n/**\n * Validate a fully qualified name.\n */\nexport function validateFQN(fqn: string): boolean {\n try {\n const { name, namespace } = parseFQN(fqn);\n return validateName(name) && validateNamespace(namespace);\n } catch {\n return false;\n }\n}\n\n/**\n * Generate a random 20-byte salt for name preorders.\n * @returns Random Uint8Array of length 20\n */\nexport function generateSalt(): Uint8Array {\n const salt = new Uint8Array(20);\n crypto.getRandomValues(salt);\n return salt;\n}\n\n/**\n * Calculate hash160 for name preorder commitment.\n * Hash format: hash160(name + namespace + salt)\n *\n * @param name - BNS name (without namespace)\n * @param namespace - BNS namespace (e.g., \"btc\")\n * @param salt - 20-byte random salt\n * @returns 20-byte hash160 commitment\n */\nexport function hashPreorder(\n name: string,\n namespace: string,\n salt: Uint8Array\n): Uint8Array {\n const nameBytes = new TextEncoder().encode(name);\n const namespaceBytes = new TextEncoder().encode(namespace);\n\n // Concatenate: name + namespace + salt\n const combined = new Uint8Array(\n nameBytes.length + namespaceBytes.length + salt.length\n );\n combined.set(nameBytes, 0);\n combined.set(namespaceBytes, nameBytes.length);\n combined.set(salt, nameBytes.length + namespaceBytes.length);\n\n return hash160(combined);\n}\n",
|
|
9
|
-
"import type { Client } from \"../clients/types.ts\";\nimport { getContract } from \"../actions/getContract.ts\";\nimport { BNS_ABI } from \"./abi.ts\";\nimport { ZONEFILE_RESOLVER_ABI } from \"./zonefile-abi.ts\";\nimport { BNS_CONTRACTS, ZONEFILE_RESOLVER_CONTRACTS } from \"./constants.ts\";\nimport {\n parseFQN,\n validateFQN,\n formatFQN,\n generateSalt,\n hashPreorder,\n} from \"./utils.ts\";\nimport type {\n ClaimFastParams,\n TransferParams,\n SetPrimaryParams,\n PreorderParams,\n RegisterParams,\n UpdateZonefileParams,\n} from \"./types.ts\";\nimport { Pc } from \"../postconditions/index.ts\";\nimport { Cl } from \"../clarity/index.ts\";\nimport { ContractResponseError } from \"../actions/getContract.ts\";\n\nfunction getBnsContract(client: Client) {\n if (!client.chain) {\n throw new Error(\"Client must have a chain configured\");\n }\n const network = client.chain.network;\n const contract =\n network === \"mainnet\" ? BNS_CONTRACTS.mainnet : BNS_CONTRACTS.testnet;\n\n return getContract({\n client,\n address: contract.address,\n name: contract.name,\n abi: BNS_ABI,\n });\n}\n\nfunction getZonefileContract(client: Client) {\n if (!client.chain) {\n throw new Error(\"Client must have a chain configured\");\n }\n const network = client.chain.network;\n const contract =\n network === \"mainnet\"\n ? ZONEFILE_RESOLVER_CONTRACTS.mainnet\n : ZONEFILE_RESOLVER_CONTRACTS.testnet;\n\n return getContract({\n client,\n address: contract.address,\n name: contract.name,\n abi: ZONEFILE_RESOLVER_ABI,\n });\n}\n\nfunction stringToBytes(str: string): Uint8Array {\n return new TextEncoder().encode(str);\n}\n\n/**\n * Resolve a BNS name to its owner address.\n * @example\n * const owner = await resolveName(client, \"alice.btc\");\n */\nexport async function resolveName(\n client: Client,\n nameOrFQN: string\n): Promise<string | null> {\n if (!validateFQN(nameOrFQN)) {\n throw new Error(`Invalid name format: ${nameOrFQN}`);\n }\n\n const { name, namespace } = parseFQN(nameOrFQN);\n const bns = getBnsContract(client);\n\n try {\n return (await bns.read[\"get-owner-name\"]({\n name: stringToBytes(name),\n namespace: stringToBytes(namespace),\n })) as string | null;\n } catch (e) {\n if (e instanceof ContractResponseError) return null;\n throw e;\n }\n}\n\n/**\n * Get the primary name for an address.\n * @example\n * const primary = await getPrimaryName(client, \"SP2J6...\");\n */\nexport async function getPrimaryName(\n client: Client,\n address: string\n): Promise<string | null> {\n const bns = getBnsContract(client);\n\n try {\n const result = (await bns.read[\"get-primary\"]({\n owner: address,\n })) as { name: Uint8Array; namespace: Uint8Array } | null;\n\n if (result === null) return null;\n\n const name = new TextDecoder().decode(result.name);\n const namespace = new TextDecoder().decode(result.namespace);\n\n return formatFQN(name, namespace);\n } catch (e) {\n if (e instanceof ContractResponseError) return null;\n throw e;\n }\n}\n\n/**\n * Check if a name is available for registration.\n * @example\n * const available = await canRegister(client, \"bob.btc\");\n */\nexport async function canRegister(\n client: Client,\n nameOrFQN: string\n): Promise<boolean> {\n if (!validateFQN(nameOrFQN)) {\n throw new Error(`Invalid name format: ${nameOrFQN}`);\n }\n\n const { name, namespace } = parseFQN(nameOrFQN);\n const bns = getBnsContract(client);\n\n // No can-register-name function — use can-resolve-name instead.\n // If it resolves, the name is taken. If it errors, it's available.\n try {\n await bns.read[\"can-resolve-name\"]({\n namespace: stringToBytes(namespace),\n name: stringToBytes(name),\n });\n return false; // resolved = taken\n } catch {\n return true; // error = available\n }\n}\n\n/**\n * Get the price to register a name in microSTX.\n * @example\n * const price = await getNamePrice(client, \"bob.btc\");\n */\nexport async function getNamePrice(\n client: Client,\n nameOrFQN: string\n): Promise<bigint> {\n if (!validateFQN(nameOrFQN)) {\n throw new Error(`Invalid name format: ${nameOrFQN}`);\n }\n\n const { name, namespace } = parseFQN(nameOrFQN);\n const bns = getBnsContract(client);\n\n // get-name-price returns a nested response: (ok (ok uint))\n const result = (await bns.read[\"get-name-price\"]({\n namespace: stringToBytes(namespace),\n name: stringToBytes(name),\n })) as { ok: bigint } | { err: bigint };\n\n if (\"ok\" in result) return result.ok;\n throw new Error(`Failed to get name price for ${nameOrFQN}`);\n}\n\n/**\n * Get the NFT token ID for a name.\n * @example\n * const id = await getNameId(client, \"alice.btc\");\n */\nexport async function getNameId(\n client: Client,\n nameOrFQN: string\n): Promise<bigint | null> {\n if (!validateFQN(nameOrFQN)) {\n throw new Error(`Invalid name format: ${nameOrFQN}`);\n }\n\n const { name, namespace } = parseFQN(nameOrFQN);\n const bns = getBnsContract(client);\n\n try {\n return (await bns.read[\"get-id-from-bns\"]({\n name: stringToBytes(name),\n namespace: stringToBytes(namespace),\n })) as bigint | null;\n } catch (e) {\n if (e instanceof ContractResponseError) return null;\n throw e;\n }\n}\n\n/**\n * Preorder a name (step 1 of secure registration).\n * Commits to a name with a salted hash, preventing front-running.\n * Must wait 1 Bitcoin block (~10 min) before calling register().\n *\n * @example\n * const { txid, salt } = await preorder(client, {\n * name: \"bob.btc\",\n * });\n * // Save salt! You'll need it for register()\n * // Wait ~10 minutes (1 Bitcoin block)\n * await register(client, { name: \"bob.btc\", salt });\n */\nexport async function preorder(\n client: Client,\n params: PreorderParams\n): Promise<{ txid: string; salt: Uint8Array }> {\n const { name: nameInput, namespace: namespaceInput, salt: providedSalt } = params;\n const fqn = namespaceInput ? `${nameInput}.${namespaceInput}` : nameInput;\n\n if (!validateFQN(fqn)) {\n throw new Error(`Invalid name format: ${fqn}`);\n }\n\n const { name, namespace } = parseFQN(fqn);\n\n // Check availability\n const available = await canRegister(client, fqn);\n if (!available) {\n throw new Error(`Name ${fqn} is not available for registration`);\n }\n\n // Get price\n const price = await getNamePrice(client, fqn);\n\n // Generate or use provided salt\n const salt = providedSalt ?? generateSalt();\n\n // Calculate hash commitment\n const hashedSaltedFqn = hashPreorder(name, namespace, salt);\n\n const bns = getBnsContract(client);\n\n const txid = await bns.call[\"name-preorder\"](\n {\n hashedSaltedFqn,\n stxToBurn: price,\n },\n {\n postConditions: [Pc.principal(client.account!.address).willSendLte(price).ustx()],\n }\n );\n\n return { txid, salt };\n}\n\n/**\n * Register a name (step 2 of secure registration).\n * Reveals the name after preorder. Must wait 1 Bitcoin block after preorder.\n *\n * @example\n * const { txid } = await register(client, {\n * name: \"bob.btc\",\n * salt, // from preorder()\n * });\n */\nexport async function register(\n client: Client,\n params: RegisterParams\n): Promise<string> {\n const { name: nameInput, namespace: namespaceInput, salt } = params;\n const fqn = namespaceInput ? `${nameInput}.${namespaceInput}` : nameInput;\n\n if (!validateFQN(fqn)) {\n throw new Error(`Invalid name format: ${fqn}`);\n }\n\n const { name, namespace } = parseFQN(fqn);\n\n const bns = getBnsContract(client);\n\n return bns.call[\"name-register\"]({\n name: stringToBytes(name),\n namespace: stringToBytes(namespace),\n salt,\n });\n}\n\n/**\n * Claim a name instantly (fast but snipeable).\n * Burns STX to register the name immediately.\n * @example\n * const txid = await claimFast(client, {\n * name: \"bob.btc\",\n * recipient: account.address,\n * });\n */\nexport async function claimFast(\n client: Client,\n params: ClaimFastParams\n): Promise<string> {\n const { name: nameInput, namespace: namespaceInput, recipient } = params;\n const fqn = namespaceInput ? `${nameInput}.${namespaceInput}` : nameInput;\n\n if (!validateFQN(fqn)) {\n throw new Error(`Invalid name format: ${fqn}`);\n }\n\n const { name, namespace } = parseFQN(fqn);\n\n // Check availability\n const available = await canRegister(client, fqn);\n if (!available) {\n throw new Error(`Name ${fqn} is not available for registration`);\n }\n\n // Get price\n const price = await getNamePrice(client, fqn);\n\n const bns = getBnsContract(client);\n\n return bns.call[\"name-claim-fast\"](\n {\n name: stringToBytes(name),\n namespace: stringToBytes(namespace),\n sendTo: recipient,\n },\n {\n postConditions: [Pc.principal(recipient).willSendLte(price).ustx()],\n }\n );\n}\n\n/**\n * Transfer a name to a new owner.\n * @example\n * const txid = await transfer(client, {\n * name: \"alice.btc\",\n * recipient: \"SP3FBR...\",\n * });\n */\nexport async function transfer(\n client: Client,\n params: TransferParams\n): Promise<string> {\n const { name: nameInput, namespace: namespaceInput, recipient } = params;\n const fqn = namespaceInput ? `${nameInput}.${namespaceInput}` : nameInput;\n\n if (!validateFQN(fqn)) {\n throw new Error(`Invalid name format: ${fqn}`);\n }\n\n const id = await getNameId(client, fqn);\n if (id === null) {\n throw new Error(`Name ${fqn} does not exist`);\n }\n\n const currentOwner = await resolveName(client, fqn);\n if (!currentOwner) {\n throw new Error(`Cannot determine owner of ${fqn}`);\n }\n\n const bns = getBnsContract(client);\n if (!client.chain) {\n throw new Error(\"Client must have a chain configured\");\n }\n const network = client.chain.network;\n const contract =\n network === \"mainnet\" ? BNS_CONTRACTS.mainnet : BNS_CONTRACTS.testnet;\n\n return bns.call.transfer(\n {\n id,\n owner: currentOwner,\n recipient,\n },\n {\n postConditions: [\n Pc.principal(currentOwner)\n .willSendAsset()\n .nft(`${contract.address}.${contract.name}::BNS-V2`, Cl.uint(id)),\n ],\n }\n );\n}\n\n/**\n * Set a name as your primary name.\n * @example\n * const txid = await setPrimary(client, {\n * name: \"alice.btc\",\n * });\n */\nexport async function setPrimary(\n client: Client,\n params: SetPrimaryParams\n): Promise<string> {\n const { name: nameInput, namespace: namespaceInput } = params;\n const fqn = namespaceInput ? `${nameInput}.${namespaceInput}` : nameInput;\n\n if (!validateFQN(fqn)) {\n throw new Error(`Invalid name format: ${fqn}`);\n }\n\n const id = await getNameId(client, fqn);\n if (id === null) {\n throw new Error(`Name ${fqn} does not exist`);\n }\n\n const bns = getBnsContract(client);\n\n return bns.call[\"set-primary-name\"]({ primaryNameId: id });\n}\n\n/**\n * Get the zonefile for a name.\n * Zonefiles contain DNS-like records (up to 8192 bytes).\n *\n * @example\n * const zonefile = await getZonefile(client, \"alice.btc\");\n * if (zonefile) {\n * console.log(new TextDecoder().decode(zonefile));\n * }\n */\nexport async function getZonefile(\n client: Client,\n nameOrFQN: string\n): Promise<Uint8Array | null> {\n if (!validateFQN(nameOrFQN)) {\n throw new Error(`Invalid name format: ${nameOrFQN}`);\n }\n\n const { name, namespace } = parseFQN(nameOrFQN);\n const zonefile = getZonefileContract(client);\n\n try {\n const result = (await zonefile.read[\"resolve-name\"]({\n name: stringToBytes(name),\n namespace: stringToBytes(namespace),\n })) as Uint8Array | null;\n\n return result;\n } catch {\n // Contract returns (err 101) when no zonefile is set\n return null;\n }\n}\n\n/**\n * Update or clear the zonefile for a name.\n * Only the name owner can update the zonefile.\n *\n * @example\n * // Update zonefile\n * await updateZonefile(client, {\n * name: \"alice.btc\",\n * zonefile: \"$ORIGIN alice.btc\\n$TTL 3600\\n...\",\n * });\n *\n * // Clear zonefile\n * await updateZonefile(client, {\n * name: \"alice.btc\",\n * zonefile: null,\n * });\n */\nexport async function updateZonefile(\n client: Client,\n params: UpdateZonefileParams\n): Promise<string> {\n const { name: nameInput, namespace: namespaceInput, zonefile } = params;\n const fqn = namespaceInput ? `${nameInput}.${namespaceInput}` : nameInput;\n\n if (!validateFQN(fqn)) {\n throw new Error(`Invalid name format: ${fqn}`);\n }\n\n const { name, namespace } = parseFQN(fqn);\n\n // Verify ownership\n const currentOwner = await resolveName(client, fqn);\n if (!currentOwner) {\n throw new Error(`Name ${fqn} does not exist`);\n }\n\n const zonefileContract = getZonefileContract(client);\n\n // Convert zonefile to Uint8Array or null\n let zonefileBytes: Uint8Array | null = null;\n if (zonefile !== null) {\n zonefileBytes =\n typeof zonefile === \"string\"\n ? new TextEncoder().encode(zonefile)\n : zonefile;\n\n if (zonefileBytes.length > 8192) {\n throw new Error(\n `Zonefile too large: ${zonefileBytes.length} bytes (max 8192)`\n );\n }\n }\n\n return zonefileContract.call[\"update-zonefile\"]({\n name: stringToBytes(name),\n namespace: stringToBytes(namespace),\n newZonefile: zonefileBytes,\n });\n}\n\n/**\n * Revoke (clear) the zonefile for a name.\n * Alias for updateZonefile with zonefile: null.\n *\n * @example\n * await revokeZonefile(client, \"alice.btc\");\n */\nexport async function revokeZonefile(\n client: Client,\n nameOrFQN: string\n): Promise<string> {\n if (!validateFQN(nameOrFQN)) {\n throw new Error(`Invalid name format: ${nameOrFQN}`);\n }\n\n const { name, namespace } = parseFQN(nameOrFQN);\n const zonefileContract = getZonefileContract(client);\n\n return zonefileContract.call[\"revoke-name\"]({\n name: stringToBytes(name),\n namespace: stringToBytes(namespace),\n });\n}\n",
|
|
9
|
+
"import type { Client } from \"../clients/types.ts\";\nimport { getContract } from \"../actions/getContract.ts\";\nimport { BNS_ABI } from \"./abi.ts\";\nimport { ZONEFILE_RESOLVER_ABI } from \"./zonefile-abi.ts\";\nimport { BNS_CONTRACTS, ZONEFILE_RESOLVER_CONTRACTS } from \"./constants.ts\";\nimport {\n parseFQN,\n validateFQN,\n formatFQN,\n generateSalt,\n hashPreorder,\n} from \"./utils.ts\";\nimport type {\n ClaimFastParams,\n TransferParams,\n SetPrimaryParams,\n PreorderParams,\n RegisterParams,\n UpdateZonefileParams,\n} from \"./types.ts\";\nimport { Pc } from \"../postconditions/index.ts\";\nimport { Cl } from \"../clarity/index.ts\";\nimport { ContractResponseError } from \"../actions/getContract.ts\";\n\nfunction getBnsContract(client: Client) {\n if (!client.chain) {\n throw new Error(\"Client must have a chain configured\");\n }\n const network = client.chain.network;\n const contract =\n network === \"mainnet\" ? BNS_CONTRACTS.mainnet : BNS_CONTRACTS.testnet;\n\n return getContract({\n client,\n address: contract.address,\n name: contract.name,\n abi: BNS_ABI,\n });\n}\n\nfunction getZonefileContract(client: Client) {\n if (!client.chain) {\n throw new Error(\"Client must have a chain configured\");\n }\n const network = client.chain.network;\n const contract =\n network === \"mainnet\"\n ? ZONEFILE_RESOLVER_CONTRACTS.mainnet\n : ZONEFILE_RESOLVER_CONTRACTS.testnet;\n\n return getContract({\n client,\n address: contract.address,\n name: contract.name,\n abi: ZONEFILE_RESOLVER_ABI,\n });\n}\n\nfunction stringToBytes(str: string): Uint8Array {\n return new TextEncoder().encode(str);\n}\n\n/**\n * Resolve a BNS name to its owner address.\n * @example\n * const owner = await resolveName(client, \"alice.btc\");\n */\nexport async function resolveName(\n client: Client,\n nameOrFQN: string\n): Promise<string | null> {\n if (!validateFQN(nameOrFQN)) {\n throw new Error(`Invalid name format: ${nameOrFQN}`);\n }\n\n const { name, namespace } = parseFQN(nameOrFQN);\n const bns = getBnsContract(client);\n\n try {\n return (await bns.read.getOwnerName({\n name: stringToBytes(name),\n namespace: stringToBytes(namespace),\n })) as string | null;\n } catch (e) {\n if (e instanceof ContractResponseError) return null;\n throw e;\n }\n}\n\n/**\n * Get the primary name for an address.\n * @example\n * const primary = await getPrimaryName(client, \"SP2J6...\");\n */\nexport async function getPrimaryName(\n client: Client,\n address: string\n): Promise<string | null> {\n const bns = getBnsContract(client);\n\n try {\n const result = (await bns.read.getPrimary({\n owner: address,\n })) as { name: Uint8Array; namespace: Uint8Array } | null;\n\n if (result === null) return null;\n\n const name = new TextDecoder().decode(result.name);\n const namespace = new TextDecoder().decode(result.namespace);\n\n return formatFQN(name, namespace);\n } catch (e) {\n if (e instanceof ContractResponseError) return null;\n throw e;\n }\n}\n\n/**\n * Check if a name is available for registration.\n * @example\n * const available = await canRegister(client, \"bob.btc\");\n */\nexport async function canRegister(\n client: Client,\n nameOrFQN: string\n): Promise<boolean> {\n if (!validateFQN(nameOrFQN)) {\n throw new Error(`Invalid name format: ${nameOrFQN}`);\n }\n\n const { name, namespace } = parseFQN(nameOrFQN);\n const bns = getBnsContract(client);\n\n // No can-register-name function — use can-resolve-name instead.\n // If it resolves, the name is taken. If it errors, it's available.\n try {\n await bns.read.canResolveName({\n namespace: stringToBytes(namespace),\n name: stringToBytes(name),\n });\n return false; // resolved = taken\n } catch {\n return true; // error = available\n }\n}\n\n/**\n * Get the price to register a name in microSTX.\n * @example\n * const price = await getNamePrice(client, \"bob.btc\");\n */\nexport async function getNamePrice(\n client: Client,\n nameOrFQN: string\n): Promise<bigint> {\n if (!validateFQN(nameOrFQN)) {\n throw new Error(`Invalid name format: ${nameOrFQN}`);\n }\n\n const { name, namespace } = parseFQN(nameOrFQN);\n const bns = getBnsContract(client);\n\n // get-name-price returns a nested response: (ok (ok uint))\n const result = (await bns.read.getNamePrice({\n namespace: stringToBytes(namespace),\n name: stringToBytes(name),\n })) as { ok: bigint } | { err: bigint };\n\n if (\"ok\" in result) return result.ok;\n throw new Error(`Failed to get name price for ${nameOrFQN}`);\n}\n\n/**\n * Get the NFT token ID for a name.\n * @example\n * const id = await getNameId(client, \"alice.btc\");\n */\nexport async function getNameId(\n client: Client,\n nameOrFQN: string\n): Promise<bigint | null> {\n if (!validateFQN(nameOrFQN)) {\n throw new Error(`Invalid name format: ${nameOrFQN}`);\n }\n\n const { name, namespace } = parseFQN(nameOrFQN);\n const bns = getBnsContract(client);\n\n try {\n return (await bns.read.getIdFromBns({\n name: stringToBytes(name),\n namespace: stringToBytes(namespace),\n })) as bigint | null;\n } catch (e) {\n if (e instanceof ContractResponseError) return null;\n throw e;\n }\n}\n\n/**\n * Preorder a name (step 1 of secure registration).\n * Commits to a name with a salted hash, preventing front-running.\n * Must wait 1 Bitcoin block (~10 min) before calling register().\n *\n * @example\n * const { txid, salt } = await preorder(client, {\n * name: \"bob.btc\",\n * });\n * // Save salt! You'll need it for register()\n * // Wait ~10 minutes (1 Bitcoin block)\n * await register(client, { name: \"bob.btc\", salt });\n */\nexport async function preorder(\n client: Client,\n params: PreorderParams\n): Promise<{ txid: string; salt: Uint8Array }> {\n const { name: nameInput, namespace: namespaceInput, salt: providedSalt } = params;\n const fqn = namespaceInput ? `${nameInput}.${namespaceInput}` : nameInput;\n\n if (!validateFQN(fqn)) {\n throw new Error(`Invalid name format: ${fqn}`);\n }\n\n const { name, namespace } = parseFQN(fqn);\n\n // Check availability\n const available = await canRegister(client, fqn);\n if (!available) {\n throw new Error(`Name ${fqn} is not available for registration`);\n }\n\n // Get price\n const price = await getNamePrice(client, fqn);\n\n // Generate or use provided salt\n const salt = providedSalt ?? generateSalt();\n\n // Calculate hash commitment\n const hashedSaltedFqn = hashPreorder(name, namespace, salt);\n\n const bns = getBnsContract(client);\n\n const txid = await bns.call.namePreorder(\n {\n hashedSaltedFqn,\n stxToBurn: price,\n },\n {\n postConditions: [Pc.principal(client.account!.address).willSendLte(price).ustx()],\n }\n );\n\n return { txid, salt };\n}\n\n/**\n * Register a name (step 2 of secure registration).\n * Reveals the name after preorder. Must wait 1 Bitcoin block after preorder.\n *\n * @example\n * const { txid } = await register(client, {\n * name: \"bob.btc\",\n * salt, // from preorder()\n * });\n */\nexport async function register(\n client: Client,\n params: RegisterParams\n): Promise<string> {\n const { name: nameInput, namespace: namespaceInput, salt } = params;\n const fqn = namespaceInput ? `${nameInput}.${namespaceInput}` : nameInput;\n\n if (!validateFQN(fqn)) {\n throw new Error(`Invalid name format: ${fqn}`);\n }\n\n const { name, namespace } = parseFQN(fqn);\n\n const bns = getBnsContract(client);\n\n return bns.call.nameRegister({\n name: stringToBytes(name),\n namespace: stringToBytes(namespace),\n salt,\n });\n}\n\n/**\n * Claim a name instantly (fast but snipeable).\n * Burns STX to register the name immediately.\n * @example\n * const txid = await claimFast(client, {\n * name: \"bob.btc\",\n * recipient: account.address,\n * });\n */\nexport async function claimFast(\n client: Client,\n params: ClaimFastParams\n): Promise<string> {\n const { name: nameInput, namespace: namespaceInput, recipient } = params;\n const fqn = namespaceInput ? `${nameInput}.${namespaceInput}` : nameInput;\n\n if (!validateFQN(fqn)) {\n throw new Error(`Invalid name format: ${fqn}`);\n }\n\n const { name, namespace } = parseFQN(fqn);\n\n // Check availability\n const available = await canRegister(client, fqn);\n if (!available) {\n throw new Error(`Name ${fqn} is not available for registration`);\n }\n\n // Get price\n const price = await getNamePrice(client, fqn);\n\n const bns = getBnsContract(client);\n\n return bns.call.nameClaimFast(\n {\n name: stringToBytes(name),\n namespace: stringToBytes(namespace),\n sendTo: recipient,\n },\n {\n postConditions: [Pc.principal(recipient).willSendLte(price).ustx()],\n }\n );\n}\n\n/**\n * Transfer a name to a new owner.\n * @example\n * const txid = await transfer(client, {\n * name: \"alice.btc\",\n * recipient: \"SP3FBR...\",\n * });\n */\nexport async function transfer(\n client: Client,\n params: TransferParams\n): Promise<string> {\n const { name: nameInput, namespace: namespaceInput, recipient } = params;\n const fqn = namespaceInput ? `${nameInput}.${namespaceInput}` : nameInput;\n\n if (!validateFQN(fqn)) {\n throw new Error(`Invalid name format: ${fqn}`);\n }\n\n const id = await getNameId(client, fqn);\n if (id === null) {\n throw new Error(`Name ${fqn} does not exist`);\n }\n\n const currentOwner = await resolveName(client, fqn);\n if (!currentOwner) {\n throw new Error(`Cannot determine owner of ${fqn}`);\n }\n\n const bns = getBnsContract(client);\n if (!client.chain) {\n throw new Error(\"Client must have a chain configured\");\n }\n const network = client.chain.network;\n const contract =\n network === \"mainnet\" ? BNS_CONTRACTS.mainnet : BNS_CONTRACTS.testnet;\n\n return bns.call.transfer(\n {\n id,\n owner: currentOwner,\n recipient,\n },\n {\n postConditions: [\n Pc.principal(currentOwner)\n .willSendAsset()\n .nft(`${contract.address}.${contract.name}::BNS-V2`, Cl.uint(id)),\n ],\n }\n );\n}\n\n/**\n * Set a name as your primary name.\n * @example\n * const txid = await setPrimary(client, {\n * name: \"alice.btc\",\n * });\n */\nexport async function setPrimary(\n client: Client,\n params: SetPrimaryParams\n): Promise<string> {\n const { name: nameInput, namespace: namespaceInput } = params;\n const fqn = namespaceInput ? `${nameInput}.${namespaceInput}` : nameInput;\n\n if (!validateFQN(fqn)) {\n throw new Error(`Invalid name format: ${fqn}`);\n }\n\n const id = await getNameId(client, fqn);\n if (id === null) {\n throw new Error(`Name ${fqn} does not exist`);\n }\n\n const bns = getBnsContract(client);\n\n return bns.call.setPrimaryName({ primaryNameId: id });\n}\n\n/**\n * Get the zonefile for a name.\n * Zonefiles contain DNS-like records (up to 8192 bytes).\n *\n * @example\n * const zonefile = await getZonefile(client, \"alice.btc\");\n * if (zonefile) {\n * console.log(new TextDecoder().decode(zonefile));\n * }\n */\nexport async function getZonefile(\n client: Client,\n nameOrFQN: string\n): Promise<Uint8Array | null> {\n if (!validateFQN(nameOrFQN)) {\n throw new Error(`Invalid name format: ${nameOrFQN}`);\n }\n\n const { name, namespace } = parseFQN(nameOrFQN);\n const zonefile = getZonefileContract(client);\n\n try {\n const result = (await zonefile.read.resolveName({\n name: stringToBytes(name),\n namespace: stringToBytes(namespace),\n })) as Uint8Array | null;\n\n return result;\n } catch {\n // Contract returns (err 101) when no zonefile is set\n return null;\n }\n}\n\n/**\n * Update or clear the zonefile for a name.\n * Only the name owner can update the zonefile.\n *\n * @example\n * // Update zonefile\n * await updateZonefile(client, {\n * name: \"alice.btc\",\n * zonefile: \"$ORIGIN alice.btc\\n$TTL 3600\\n...\",\n * });\n *\n * // Clear zonefile\n * await updateZonefile(client, {\n * name: \"alice.btc\",\n * zonefile: null,\n * });\n */\nexport async function updateZonefile(\n client: Client,\n params: UpdateZonefileParams\n): Promise<string> {\n const { name: nameInput, namespace: namespaceInput, zonefile } = params;\n const fqn = namespaceInput ? `${nameInput}.${namespaceInput}` : nameInput;\n\n if (!validateFQN(fqn)) {\n throw new Error(`Invalid name format: ${fqn}`);\n }\n\n const { name, namespace } = parseFQN(fqn);\n\n // Verify ownership\n const currentOwner = await resolveName(client, fqn);\n if (!currentOwner) {\n throw new Error(`Name ${fqn} does not exist`);\n }\n\n const zonefileContract = getZonefileContract(client);\n\n // Convert zonefile to Uint8Array or null\n let zonefileBytes: Uint8Array | null = null;\n if (zonefile !== null) {\n zonefileBytes =\n typeof zonefile === \"string\"\n ? new TextEncoder().encode(zonefile)\n : zonefile;\n\n if (zonefileBytes.length > 8192) {\n throw new Error(\n `Zonefile too large: ${zonefileBytes.length} bytes (max 8192)`\n );\n }\n }\n\n return zonefileContract.call.updateZonefile({\n name: stringToBytes(name),\n namespace: stringToBytes(namespace),\n newZonefile: zonefileBytes,\n });\n}\n\n/**\n * Revoke (clear) the zonefile for a name.\n * Alias for updateZonefile with zonefile: null.\n *\n * @example\n * await revokeZonefile(client, \"alice.btc\");\n */\nexport async function revokeZonefile(\n client: Client,\n nameOrFQN: string\n): Promise<string> {\n if (!validateFQN(nameOrFQN)) {\n throw new Error(`Invalid name format: ${nameOrFQN}`);\n }\n\n const { name, namespace } = parseFQN(nameOrFQN);\n const zonefileContract = getZonefileContract(client);\n\n return zonefileContract.call.revokeName({\n name: stringToBytes(name),\n namespace: stringToBytes(namespace),\n });\n}\n",
|
|
10
10
|
"import type { Client } from \"../clients/types.ts\";\nimport {\n resolveName,\n getPrimaryName,\n canRegister,\n getNamePrice,\n getNameId,\n preorder,\n register,\n claimFast,\n transfer,\n setPrimary,\n getZonefile,\n updateZonefile,\n revokeZonefile,\n} from \"./actions.ts\";\nimport type {\n ClaimFastParams,\n TransferParams,\n SetPrimaryParams,\n PreorderParams,\n RegisterParams,\n UpdateZonefileParams,\n} from \"./types.ts\";\n\nexport type {\n ClaimFastParams,\n TransferParams,\n SetPrimaryParams,\n PreorderParams,\n RegisterParams,\n UpdateZonefileParams,\n};\n\n/** Actions provided by the BNS extension. */\nexport type BnsActions = {\n bns: {\n resolveName: (name: string) => Promise<string | null>;\n getPrimaryName: (address: string) => Promise<string | null>;\n canRegister: (name: string) => Promise<boolean>;\n getNamePrice: (name: string) => Promise<bigint>;\n getNameId: (name: string) => Promise<bigint | null>;\n preorder: (params: PreorderParams) => Promise<{ txid: string; salt: Uint8Array }>;\n register: (params: RegisterParams) => Promise<string>;\n claimFast: (params: ClaimFastParams) => Promise<string>;\n transfer: (params: TransferParams) => Promise<string>;\n setPrimary: (params: SetPrimaryParams) => Promise<string>;\n getZonefile: (name: string) => Promise<Uint8Array | null>;\n updateZonefile: (params: UpdateZonefileParams) => Promise<string>;\n revokeZonefile: (name: string) => Promise<string>;\n };\n};\n\nexport { BNS_CONTRACTS, ZONEFILE_RESOLVER_CONTRACTS } from \"./constants.ts\";\nexport {\n parseFQN,\n formatFQN,\n validateName,\n validateNamespace,\n validateFQN,\n generateSalt,\n hashPreorder,\n} from \"./utils.ts\";\n\n/**\n * BNS v2 extension for Stacks client.\n * Provides name resolution, registration, and management.\n *\n * @example\n * import { createWalletClient, http, mainnet } from \"stacks\";\n * import { bns } from \"stacks/bns\";\n * import { privateKeyToAccount } from \"stacks/accounts\";\n *\n * const account = privateKeyToAccount(\"0x...\");\n * const client = createWalletClient({\n * account,\n * chain: mainnet,\n * transport: http(),\n * }).extend(bns());\n *\n * // Resolve names\n * const owner = await client.bns.resolveName(\"alice.btc\");\n *\n * // Register names\n * const txid = await client.bns.claimFast({\n * name: \"bob.btc\",\n * recipient: account.address,\n * });\n *\n * // Transfer names\n * await client.bns.transfer({\n * name: \"alice.btc\",\n * recipient: \"SP3FBR...\",\n * });\n */\nexport function bns(): (client: Client) => BnsActions {\n return (client: Client) => ({\n bns: {\n /**\n * Resolve a BNS name to its owner address.\n * @param name - Fully qualified name (e.g., \"alice.btc\" or \"alice\")\n * @returns Owner address or null if name doesn't exist\n */\n resolveName: (name: string) => resolveName(client, name),\n\n /**\n * Get the primary name for an address.\n * @param address - Stacks address\n * @returns Primary name or null if no primary set\n */\n getPrimaryName: (address: string) => getPrimaryName(client, address),\n\n /**\n * Check if a name is available for registration.\n * @param name - Fully qualified name to check\n * @returns True if available, false otherwise\n */\n canRegister: (name: string) => canRegister(client, name),\n\n /**\n * Get the price to register a name in microSTX.\n * @param name - Fully qualified name\n * @returns Price in microSTX\n */\n getNamePrice: (name: string) => getNamePrice(client, name),\n\n /**\n * Get the NFT token ID for a name.\n * @param name - Fully qualified name\n * @returns Token ID or null if name doesn't exist\n */\n getNameId: (name: string) => getNameId(client, name),\n\n /**\n * Preorder a name (step 1 of secure registration).\n * Commits to a name with a salted hash, preventing front-running.\n * Must wait 1 Bitcoin block (~10 min) before calling register().\n * Requires wallet client with account.\n * @param params - Preorder parameters\n * @returns Transaction ID and salt (save salt for register step!)\n */\n preorder: (params: PreorderParams) => preorder(client, params),\n\n /**\n * Register a name (step 2 of secure registration).\n * Reveals the name after preorder. Must wait 1 Bitcoin block after preorder.\n * Requires wallet client with account.\n * @param params - Register parameters (must include salt from preorder)\n * @returns Transaction ID\n */\n register: (params: RegisterParams) => register(client, params),\n\n /**\n * Claim a name instantly (fast but snipeable).\n * Burns STX to register the name immediately.\n * Requires wallet client with account.\n * @param params - Registration parameters\n * @returns Transaction ID\n */\n claimFast: (params: ClaimFastParams) => claimFast(client, params),\n\n /**\n * Transfer a name to a new owner.\n * Requires wallet client with account.\n * @param params - Transfer parameters\n * @returns Transaction ID\n */\n transfer: (params: TransferParams) => transfer(client, params),\n\n /**\n * Set a name as your primary name.\n * Requires wallet client with account.\n * @param params - Primary name parameters\n * @returns Transaction ID\n */\n setPrimary: (params: SetPrimaryParams) => setPrimary(client, params),\n\n /**\n * Get the zonefile for a name.\n * Zonefiles contain DNS-like records (up to 8192 bytes).\n * @param name - Fully qualified name\n * @returns Zonefile bytes or null if not set\n */\n getZonefile: (name: string) => getZonefile(client, name),\n\n /**\n * Update or clear the zonefile for a name.\n * Only the name owner can update the zonefile.\n * Requires wallet client with account.\n * @param params - Zonefile update parameters\n * @returns Transaction ID\n */\n updateZonefile: (params: UpdateZonefileParams) =>\n updateZonefile(client, params),\n\n /**\n * Revoke (clear) the zonefile for a name.\n * Requires wallet client with account.\n * @param name - Fully qualified name\n * @returns Transaction ID\n */\n revokeZonefile: (name: string) => revokeZonefile(client, name),\n },\n });\n}\n"
|
|
11
11
|
],
|
|
12
|
-
"mappings": "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",
|
|
13
|
-
"debugId": "
|
|
12
|
+
"mappings": "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",
|
|
13
|
+
"debugId": "5838568A4B2757A664756E2164756E21",
|
|
14
14
|
"names": []
|
|
15
15
|
}
|
package/dist/src/chains/index.js
CHANGED
|
@@ -1,3 +1,328 @@
|
|
|
1
|
+
// src/clarity/index.ts
|
|
2
|
+
var exports_clarity = {};
|
|
3
|
+
__export(exports_clarity, {
|
|
4
|
+
validateArgsArray: () => validateArgsArray,
|
|
5
|
+
validateArgs: () => validateArgs,
|
|
6
|
+
uintCV: () => uintCV,
|
|
7
|
+
tupleCV: () => tupleCV,
|
|
8
|
+
trueCV: () => trueCV,
|
|
9
|
+
toCamelCase: () => toCamelCase,
|
|
10
|
+
stringUtf8CV: () => stringUtf8CV,
|
|
11
|
+
stringAsciiCV: () => stringAsciiCV,
|
|
12
|
+
standardPrincipalCV: () => standardPrincipalCV,
|
|
13
|
+
someCV: () => someCV,
|
|
14
|
+
sip013Abi: () => sip013Abi,
|
|
15
|
+
sip010Abi: () => sip010Abi,
|
|
16
|
+
sip009Abi: () => sip009Abi,
|
|
17
|
+
serializeCVBytes: () => serializeCVBytes,
|
|
18
|
+
serializeCV: () => serializeCV,
|
|
19
|
+
responseOkCV: () => responseOkCV,
|
|
20
|
+
responseErrorCV: () => responseErrorCV,
|
|
21
|
+
prettyPrint: () => prettyPrint,
|
|
22
|
+
prepareArgs: () => prepareArgs,
|
|
23
|
+
noneCV: () => noneCV,
|
|
24
|
+
listCV: () => listCV,
|
|
25
|
+
jsToClarityValue: () => jsToClarityValue,
|
|
26
|
+
jsToClarity: () => jsToClarity,
|
|
27
|
+
isUint8Array: () => isUint8Array,
|
|
28
|
+
isUint128: () => isUint128,
|
|
29
|
+
isTraitReference: () => isTraitReference,
|
|
30
|
+
isString: () => isString,
|
|
31
|
+
isStandardPrincipal: () => isStandardPrincipal,
|
|
32
|
+
isResponse: () => isResponse,
|
|
33
|
+
isPrincipal: () => isPrincipal,
|
|
34
|
+
isOptional: () => isOptional,
|
|
35
|
+
isOkResponse: () => isOkResponse,
|
|
36
|
+
isInt128: () => isInt128,
|
|
37
|
+
isErrResponse: () => isErrResponse,
|
|
38
|
+
isContractPrincipal: () => isContractPrincipal,
|
|
39
|
+
isBool: () => isBool,
|
|
40
|
+
isArray: () => isArray,
|
|
41
|
+
isAbiTuple: () => isAbiTuple,
|
|
42
|
+
isAbiTraitReference: () => isAbiTraitReference,
|
|
43
|
+
isAbiStringUtf8: () => isAbiStringUtf8,
|
|
44
|
+
isAbiStringAscii: () => isAbiStringAscii,
|
|
45
|
+
isAbiResponse: () => isAbiResponse,
|
|
46
|
+
isAbiOptional: () => isAbiOptional,
|
|
47
|
+
isAbiList: () => isAbiList,
|
|
48
|
+
isAbiBuffer: () => isAbiBuffer,
|
|
49
|
+
intCV: () => intCV,
|
|
50
|
+
falseCV: () => falseCV,
|
|
51
|
+
deserializeCVBytes: () => deserializeCVBytes,
|
|
52
|
+
deserializeCV: () => deserializeCV,
|
|
53
|
+
cvToValue: () => cvToValue,
|
|
54
|
+
cvToJSON: () => cvToJSON,
|
|
55
|
+
contractPrincipalCV: () => contractPrincipalCV,
|
|
56
|
+
clarityValueToJS: () => clarityValueToJS,
|
|
57
|
+
clarityTypeFromByte: () => clarityTypeFromByte,
|
|
58
|
+
bufferCV: () => bufferCV,
|
|
59
|
+
boolCV: () => boolCV,
|
|
60
|
+
SIP013_ABI: () => SIP013_ABI,
|
|
61
|
+
SIP010_ABI: () => SIP010_ABI,
|
|
62
|
+
SIP009_ABI: () => SIP009_ABI,
|
|
63
|
+
ClarityWireType: () => ClarityWireType,
|
|
64
|
+
ClarityConversionError: () => ClarityConversionError,
|
|
65
|
+
Cl: () => Cl,
|
|
66
|
+
CONTRACT_NAME_REGEX: () => CONTRACT_NAME_REGEX
|
|
67
|
+
});
|
|
68
|
+
module.exports = __toCommonJS(exports_clarity);
|
|
1
69
|
|
|
2
|
-
|
|
70
|
+
// src/clarity/prettyPrint.ts
|
|
71
|
+
function prettyPrint(val, encoding = "hex") {
|
|
72
|
+
switch (val.type) {
|
|
73
|
+
case "true":
|
|
74
|
+
return "true";
|
|
75
|
+
case "false":
|
|
76
|
+
return "false";
|
|
77
|
+
case "int":
|
|
78
|
+
return val.value.toString();
|
|
79
|
+
case "uint":
|
|
80
|
+
return `u${val.value.toString()}`;
|
|
81
|
+
case "buffer":
|
|
82
|
+
if (encoding === "tryAscii") {
|
|
83
|
+
const str = bytesToAscii(hexToBytes(val.value));
|
|
84
|
+
if (/^[ -~]*$/.test(str))
|
|
85
|
+
return JSON.stringify(str);
|
|
86
|
+
}
|
|
87
|
+
return `0x${val.value}`;
|
|
88
|
+
case "none":
|
|
89
|
+
return "none";
|
|
90
|
+
case "some":
|
|
91
|
+
return `(some ${prettyPrint(val.value, encoding)})`;
|
|
92
|
+
case "ok":
|
|
93
|
+
return `(ok ${prettyPrint(val.value, encoding)})`;
|
|
94
|
+
case "err":
|
|
95
|
+
return `(err ${prettyPrint(val.value, encoding)})`;
|
|
96
|
+
case "address":
|
|
97
|
+
case "contract":
|
|
98
|
+
return val.value;
|
|
99
|
+
case "list":
|
|
100
|
+
return `(list ${val.value.map((v) => prettyPrint(v, encoding)).join(" ")})`;
|
|
101
|
+
case "tuple":
|
|
102
|
+
return `(tuple ${Object.keys(val.value).map((key) => `(${key} ${prettyPrint(val.value[key], encoding)})`).join(" ")})`;
|
|
103
|
+
case "ascii":
|
|
104
|
+
return `"${val.value}"`;
|
|
105
|
+
case "utf8":
|
|
106
|
+
return `u"${val.value}"`;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
function cvToJSON(val) {
|
|
110
|
+
switch (val.type) {
|
|
111
|
+
case "true":
|
|
112
|
+
return { type: "bool", value: true };
|
|
113
|
+
case "false":
|
|
114
|
+
return { type: "bool", value: false };
|
|
115
|
+
case "int":
|
|
116
|
+
return { type: "int", value: val.value.toString() };
|
|
117
|
+
case "uint":
|
|
118
|
+
return { type: "uint", value: val.value.toString() };
|
|
119
|
+
case "buffer":
|
|
120
|
+
return { type: `(buff ${Math.ceil(val.value.length / 2)})`, value: `0x${val.value}` };
|
|
121
|
+
case "none":
|
|
122
|
+
return { type: "(optional none)", value: null };
|
|
123
|
+
case "some":
|
|
124
|
+
return { type: `(optional)`, value: cvToJSON(val.value) };
|
|
125
|
+
case "ok":
|
|
126
|
+
return { type: "(response)", value: cvToJSON(val.value), success: true };
|
|
127
|
+
case "err":
|
|
128
|
+
return { type: "(response)", value: cvToJSON(val.value), success: false };
|
|
129
|
+
case "address":
|
|
130
|
+
case "contract":
|
|
131
|
+
return { type: "principal", value: val.value };
|
|
132
|
+
case "list":
|
|
133
|
+
return { type: "(list)", value: val.value.map(cvToJSON) };
|
|
134
|
+
case "tuple": {
|
|
135
|
+
const result = {};
|
|
136
|
+
for (const key of Object.keys(val.value)) {
|
|
137
|
+
result[key] = cvToJSON(val.value[key]);
|
|
138
|
+
}
|
|
139
|
+
return { type: "(tuple)", value: result };
|
|
140
|
+
}
|
|
141
|
+
case "ascii":
|
|
142
|
+
return { type: `(string-ascii ${asciiToBytes(val.value).length})`, value: val.value };
|
|
143
|
+
case "utf8":
|
|
144
|
+
return { type: `(string-utf8 ${utf8ToBytes(val.value).length})`, value: val.value };
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
function cvToValue(val) {
|
|
148
|
+
switch (val.type) {
|
|
149
|
+
case "true":
|
|
150
|
+
return true;
|
|
151
|
+
case "false":
|
|
152
|
+
return false;
|
|
153
|
+
case "int":
|
|
154
|
+
case "uint":
|
|
155
|
+
return val.value;
|
|
156
|
+
case "buffer":
|
|
157
|
+
return `0x${val.value}`;
|
|
158
|
+
case "none":
|
|
159
|
+
return null;
|
|
160
|
+
case "some":
|
|
161
|
+
return cvToValue(val.value);
|
|
162
|
+
case "ok":
|
|
163
|
+
case "err":
|
|
164
|
+
return cvToValue(val.value);
|
|
165
|
+
case "address":
|
|
166
|
+
case "contract":
|
|
167
|
+
return val.value;
|
|
168
|
+
case "list":
|
|
169
|
+
return val.value.map(cvToValue);
|
|
170
|
+
case "tuple": {
|
|
171
|
+
const result = {};
|
|
172
|
+
for (const key of Object.keys(val.value)) {
|
|
173
|
+
result[key] = cvToValue(val.value[key]);
|
|
174
|
+
}
|
|
175
|
+
return result;
|
|
176
|
+
}
|
|
177
|
+
case "ascii":
|
|
178
|
+
case "utf8":
|
|
179
|
+
return val.value;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// src/clarity/abi/converters.ts
|
|
183
|
+
class ClarityConversionError extends Error {
|
|
184
|
+
type;
|
|
185
|
+
value;
|
|
186
|
+
constructor(message, type, value) {
|
|
187
|
+
super(message);
|
|
188
|
+
this.type = type;
|
|
189
|
+
this.value = value;
|
|
190
|
+
this.name = "ClarityConversionError";
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
function jsToClarity(type, value) {
|
|
194
|
+
if (type === "none")
|
|
195
|
+
return null;
|
|
196
|
+
if (type === "uint128") {
|
|
197
|
+
if (!isUint128(value))
|
|
198
|
+
throw new ClarityConversionError("Invalid uint128 value", type, value);
|
|
199
|
+
return value;
|
|
200
|
+
}
|
|
201
|
+
if (type === "int128") {
|
|
202
|
+
if (!isInt128(value))
|
|
203
|
+
throw new ClarityConversionError("Invalid int128 value", type, value);
|
|
204
|
+
return value;
|
|
205
|
+
}
|
|
206
|
+
if (type === "bool") {
|
|
207
|
+
if (!isBool(value))
|
|
208
|
+
throw new ClarityConversionError("Invalid bool value", type, value);
|
|
209
|
+
return value;
|
|
210
|
+
}
|
|
211
|
+
if (type === "principal") {
|
|
212
|
+
if (!isPrincipal(value))
|
|
213
|
+
throw new ClarityConversionError("Invalid principal value", type, value);
|
|
214
|
+
return value;
|
|
215
|
+
}
|
|
216
|
+
if (type === "trait_reference") {
|
|
217
|
+
if (!isPrincipal(value))
|
|
218
|
+
throw new ClarityConversionError("Invalid trait_reference value", type, value);
|
|
219
|
+
return value;
|
|
220
|
+
}
|
|
221
|
+
if (isAbiStringAscii(type)) {
|
|
222
|
+
if (!isString(value))
|
|
223
|
+
throw new ClarityConversionError("Invalid string-ascii value", type, value);
|
|
224
|
+
const str = value;
|
|
225
|
+
for (let i = 0;i < str.length; i++) {
|
|
226
|
+
if (str.charCodeAt(i) > 127) {
|
|
227
|
+
throw new ClarityConversionError(`Non-ASCII character at position ${i}: '${str[i]}' (code ${str.charCodeAt(i)})`, type, value);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
if (str.length > type["string-ascii"].length) {
|
|
231
|
+
throw new ClarityConversionError(`String length ${str.length} exceeds max ${type["string-ascii"].length}`, type, value);
|
|
232
|
+
}
|
|
233
|
+
return value;
|
|
234
|
+
}
|
|
235
|
+
if (isAbiStringUtf8(type)) {
|
|
236
|
+
if (!isString(value))
|
|
237
|
+
throw new ClarityConversionError("Invalid string-utf8 value", type, value);
|
|
238
|
+
const str = value;
|
|
239
|
+
const byteLength = new TextEncoder().encode(str).length;
|
|
240
|
+
if (byteLength > type["string-utf8"].length) {
|
|
241
|
+
throw new ClarityConversionError(`String byte length ${byteLength} exceeds max ${type["string-utf8"].length}`, type, value);
|
|
242
|
+
}
|
|
243
|
+
return value;
|
|
244
|
+
}
|
|
245
|
+
if (isAbiBuffer(type)) {
|
|
246
|
+
if (!isUint8Array(value))
|
|
247
|
+
throw new ClarityConversionError("Invalid buffer value", type, value);
|
|
248
|
+
const buff = value;
|
|
249
|
+
if (buff.length > type.buff.length) {
|
|
250
|
+
throw new ClarityConversionError(`Buffer length ${buff.length} exceeds max ${type.buff.length}`, type, value);
|
|
251
|
+
}
|
|
252
|
+
return value;
|
|
253
|
+
}
|
|
254
|
+
if (isAbiList(type)) {
|
|
255
|
+
if (!Array.isArray(value))
|
|
256
|
+
throw new ClarityConversionError("Expected array for list type", type, value);
|
|
257
|
+
if (value.length > type.list.length) {
|
|
258
|
+
throw new ClarityConversionError(`List length ${value.length} exceeds max ${type.list.length}`, type, value);
|
|
259
|
+
}
|
|
260
|
+
return value.map((item) => jsToClarity(type.list.type, item));
|
|
261
|
+
}
|
|
262
|
+
if (isAbiTuple(type)) {
|
|
263
|
+
if (typeof value !== "object" || value === null)
|
|
264
|
+
throw new ClarityConversionError("Expected object for tuple type", type, value);
|
|
265
|
+
const result = {};
|
|
266
|
+
for (const field of type.tuple) {
|
|
267
|
+
const camelKey = toCamelCase(field.name);
|
|
268
|
+
const hasOriginal = field.name in value;
|
|
269
|
+
const hasCamel = camelKey in value;
|
|
270
|
+
if (!hasOriginal && !hasCamel) {
|
|
271
|
+
throw new ClarityConversionError(`Missing tuple field: ${field.name}`, type, value);
|
|
272
|
+
}
|
|
273
|
+
const fieldValue = hasOriginal ? value[field.name] : value[camelKey];
|
|
274
|
+
result[field.name] = jsToClarity(field.type, fieldValue);
|
|
275
|
+
}
|
|
276
|
+
return result;
|
|
277
|
+
}
|
|
278
|
+
if (isAbiOptional(type)) {
|
|
279
|
+
if (value === null || value === undefined)
|
|
280
|
+
return null;
|
|
281
|
+
return jsToClarity(type.optional, value);
|
|
282
|
+
}
|
|
283
|
+
if (isAbiResponse(type)) {
|
|
284
|
+
if (typeof value !== "object" || value === null)
|
|
285
|
+
throw new ClarityConversionError("Expected object for response type", type, value);
|
|
286
|
+
const hasOk = "ok" in value;
|
|
287
|
+
const hasErr = "err" in value;
|
|
288
|
+
if (hasOk && !hasErr) {
|
|
289
|
+
return {
|
|
290
|
+
ok: jsToClarity(type.response.ok, value.ok)
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
if (hasErr && !hasOk) {
|
|
294
|
+
return {
|
|
295
|
+
err: jsToClarity(type.response.error, value.err)
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
throw new ClarityConversionError("Response must have exactly 'ok' or 'err' property", type, value);
|
|
299
|
+
}
|
|
300
|
+
throw new ClarityConversionError(`Unknown Clarity type`, type, value);
|
|
301
|
+
}
|
|
302
|
+
function prepareArgs(func, args) {
|
|
303
|
+
return func.args.map((arg) => {
|
|
304
|
+
if (!(arg.name in args)) {
|
|
305
|
+
throw new ClarityConversionError(`Missing argument: ${arg.name}`, arg.type, undefined);
|
|
306
|
+
}
|
|
307
|
+
return jsToClarity(arg.type, args[arg.name]);
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
function validateArgs(func, args) {
|
|
311
|
+
for (const arg of func.args) {
|
|
312
|
+
if (!(arg.name in args)) {
|
|
313
|
+
throw new ClarityConversionError(`Missing argument: ${arg.name}`, arg.type, undefined);
|
|
314
|
+
}
|
|
315
|
+
jsToClarity(arg.type, args[arg.name]);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
function validateArgsArray(func, args) {
|
|
319
|
+
if (args.length !== func.args.length) {
|
|
320
|
+
throw new ClarityConversionError(`Expected ${func.args.length} arguments, got ${args.length}`, func.args[0]?.type ?? "bool", args);
|
|
321
|
+
}
|
|
322
|
+
func.args.forEach((arg, i) => {
|
|
323
|
+
jsToClarity(arg.type, args[i]);
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
//# debugId=2002F9940E8CCE2964756E2164756E21
|
|
3
328
|
//# sourceMappingURL=index.cjs.map
|