@midnames/sdk 0.1.2 → 0.1.4

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/README.md CHANGED
@@ -1,46 +1,114 @@
1
1
  ># @midnames/sdk
2
2
 
3
- SDK to resolve Midnames domains, and render a profile widget.
3
+ SDK to resolve Midnames domains and render profile widgets with a clean, provider-optional API.
4
4
 
5
- ## Build
5
+ ## Quick Start
6
6
 
7
- Run the `build` script with `npm`, `bun`, etc.
7
+ ```ts
8
+ import { getDomainProfile, setupDefaultProvider } from '@midnames/sdk';
8
9
 
9
- ## Usage
10
+ // One-liner setup with testnet defaults
11
+ setupDefaultProvider();
10
12
 
11
- Resolve a domain:
13
+ // Now use functions without provider
14
+ const result = await getDomainProfile('alice.night');
15
+ if (result.success) {
16
+ console.log(result.data.fields);
17
+ }
18
+ ```
12
19
 
13
- ```ts
14
- import { resolveDomain, getDomainProfile } from '@midnames/sdk';
15
- import type { PublicDataProvider } from '@midnight-ntwrk/midnight-js-types';
20
+ ## Installation
16
21
 
17
- async function demo(provider: PublicDataProvider) {
18
- const target = await resolveDomain(provider, 'alice.night');
19
- const profile = await getDomainProfile(provider, 'id.alice.night');
20
- console.log(target, profile.fields);
21
- }
22
+ ```bash
23
+ npm install @midnames/sdk
22
24
  ```
23
25
 
24
- React widget:
26
+ ## Usage Examples
25
27
 
26
- ```tsx
27
- import '@midnames/sdk/styles.css';
28
- import { DomainProfileWidget } from '@midnames/sdk/react';
28
+ ### Basic Usage
29
29
 
30
- <DomainProfileWidget fullDomain="id.alice.night" publicDataProvider={provider} />
31
- ```
30
+ ```ts
31
+ import { resolveDomain, getDomainProfile, setupDefaultProvider } from '@midnames/sdk';
32
32
 
33
- Fields recognized for display: `name`, `bio`, `avatar`, `banner`, `website`, `twitter`, `github`, `location`, and `epk`.
33
+ // Setup once
34
+ setupDefaultProvider();
34
35
 
35
- ## API
36
+ // Use without provider
37
+ const target = await resolveDomain('alice.night');
38
+ const profile = await getDomainProfile('alice.night');
36
39
 
37
- - `resolveDomain(provider, domain): Promise<string|null>`
38
- - `getDomainProfile(provider, fullDomain): Promise<{ fullDomain, resolvedTarget, info, fields, settings }>`
40
+ if (profile.success) {
41
+ console.log('Domain:', profile.data.fullDomain);
42
+ console.log('Owner:', profile.data.info?.owner);
43
+ console.log('Fields:', profile.data.fields);
44
+ }
45
+ ```
46
+
47
+ ### Custom Provider
39
48
 
40
49
  ```ts
41
- export interface DomainInfo { owner: string; resolver: string; contractAddress?: string; }
42
- export interface DomainSettings { coinColor: Uint8Array; domainCost: bigint; }
50
+ import { getDomainProfile, setupDefaultProvider, setDefaultProvider } from '@midnames/sdk';
51
+
52
+ // Manually create and set your own provider
53
+ setupDefaultProvider({
54
+ indexerUrl: 'https://custom-indexer.com',
55
+ indexerWsUrl: 'wss://custom-indexer.com'
56
+ });
57
+
58
+ // Or pass per-call
59
+ const profile = await getDomainProfile('alice.night', { provider });
43
60
  ```
44
61
 
45
- Notes: Uses TestNet TLD contract by default. Provide a custom TLD address in `resolveDomain` if needed.
62
+ ### React Widget
63
+
64
+ ```tsx
65
+ import '@midnames/sdk/styles.css';
66
+ import { DomainProfileWidget, HolographicCard } from '@midnames/sdk/react';
67
+ import { setupDefaultProvider } from '@midnames/sdk';
68
+
69
+ // Setup provider once globally
70
+ setupDefaultProvider();
71
+
72
+ // Now widgets work without provider prop
73
+ <DomainProfileWidget
74
+ fullDomain="alice.night"
75
+ variant="compact"
76
+ showStatus={true}
77
+ />
78
+
79
+ <HolographicCard
80
+ domain="alice.night"
81
+ enableTilt={true}
82
+ />
83
+
84
+ // Or pass custom provider
85
+ <DomainProfileWidget
86
+ fullDomain="alice.night"
87
+ publicDataProvider={customProvider}
88
+ />
89
+ ```
46
90
 
91
+ ## Widget Configuration
92
+
93
+ The React widget recognizes these profile fields:
94
+ - `name`, `bio`, `avatar`, `banner`
95
+ - `website`, `twitter`, `github`, `location`
96
+ - `epk` (Electronic Press Kit)
97
+
98
+ ### Widget Props
99
+
100
+ #### DomainProfileWidget
101
+ - `fullDomain`: Domain to display (required)
102
+ - `publicDataProvider?`: Provider (optional if default is set)
103
+ - `variant?`: `'full' | 'compact' | 'inline' | 'minimal'`
104
+ - `showStatus?`: Show loading/error states
105
+ - `showBanner?`: Display banner image
106
+ - `onError?`: Error callback
107
+
108
+ #### HolographicCard
109
+ - `domain`: Domain to display (required)
110
+ - `publicDataProvider?`: Provider (optional if default is set)
111
+ - `enableTilt?`: Enable 3D tilt effect
112
+ - `behindGradient?`: Background gradient
113
+ - `innerGradient?`: Card gradient
114
+ - `onError?`: Error callback
package/dist/core.d.ts CHANGED
@@ -1,10 +1,5 @@
1
- import type { PublicDataProvider } from '@midnight-ntwrk/midnight-js-types';
2
- import type { DomainInfo, DomainSettings, DomainProfileData, Result } from './types.js';
3
- export declare const TESTNET_TLD_ADDRESS = "02003c6d04b83541c303f9d8aad271dd0f77525a41c63747a5ef94235d2f2fe8c170";
4
- export declare function resolveDomain(publicDataProvider: PublicDataProvider, domain: string, tldAddress?: string): Promise<Result<string>>;
5
- export declare function getDomainInfo(publicDataProvider: PublicDataProvider, contractAddress: string, domainName: string): Promise<Result<DomainInfo>>;
6
- export declare function getDomainInfoByResolving(publicDataProvider: PublicDataProvider, fullDomain: string): Promise<Result<DomainInfo>>;
7
- export declare function getDomainFields(publicDataProvider: PublicDataProvider, contractAddress: string): Promise<Result<Array<[string, string]>>>;
8
- export declare function getNamespacedDomainFields(publicDataProvider: PublicDataProvider, _parentContractAddress: string, fullDomainName: string): Promise<Result<Array<[string, string]>>>;
9
- export declare function getDomainSettings(publicDataProvider: PublicDataProvider, contractAddress: string): Promise<Result<DomainSettings>>;
10
- export declare function getDomainProfile(publicDataProvider: PublicDataProvider, fullDomain: string): Promise<Result<DomainProfileData>>;
1
+ export { resolveDomain, TESTNET_TLD_ADDRESS } from './modules/core.js';
2
+ export { setDefaultProvider, getDefaultProvider, setupDefaultProvider } from './provider.js';
3
+ export type { Result } from './types.js';
4
+ export { success, failure, isSuccess, isError, unwrap, unwrapOr } from './types.js';
5
+ export { MidNamesError, NetworkError, ContractNotFoundError, DomainNotFoundError, InvalidDomainError, ProviderError } from './types.js';
package/dist/core.js CHANGED
@@ -1,204 +1,4 @@
1
- import { getNetworkId, getZswapNetworkId, NetworkId } from '@midnight-ntwrk/midnight-js-network-id';
2
- import { ShieldedCoinPublicKey } from '@midnight-ntwrk/wallet-sdk-address-format';
3
- import { ledger } from '../managed/index.js';
4
- import { formatContractAddress } from './utils/address.js';
5
- import { normalizeDomain, parseFullDomain } from './utils/domain.js';
6
- import { success, failure, NetworkError, ContractNotFoundError, DomainNotFoundError, InvalidDomainError, ProviderError } from './types.js';
7
- const TLD = 'night';
8
- export const TESTNET_TLD_ADDRESS = '02003c6d04b83541c303f9d8aad271dd0f77525a41c63747a5ef94235d2f2fe8c170';
9
- function getDefaultTldAddress() {
10
- const currentNetwork = getNetworkId();
11
- switch (currentNetwork) {
12
- case NetworkId.TestNet:
13
- return TESTNET_TLD_ADDRESS;
14
- default:
15
- throw new Error('Provide an address to use the resolver on a Standalone Network.');
16
- }
17
- }
18
- function getTargetFromLedger(contractLedger) {
19
- const target = contractLedger.DOMAIN_TARGET;
20
- if (target.is_left) {
21
- const coinPublicKey = new ShieldedCoinPublicKey(Buffer.from(target.left.bytes));
22
- return ShieldedCoinPublicKey.codec.encode(getZswapNetworkId(), coinPublicKey).asString();
23
- }
24
- else {
25
- return formatContractAddress(target.right.bytes);
26
- }
27
- }
28
- async function queryContractStateSafely(publicDataProvider, contractAddress) {
29
- try {
30
- const contractState = await publicDataProvider.queryContractState(contractAddress);
31
- if (contractState == null) {
32
- return failure(new ContractNotFoundError(contractAddress));
33
- }
34
- return success(contractState);
35
- }
36
- catch (error) {
37
- return failure(new ProviderError(`Failed to query contract state: ${error instanceof Error ? error.message : String(error)}`, error));
38
- }
39
- }
40
- async function getResolverAddress(publicDataProvider, fullDomain) {
41
- try {
42
- const tldAddress = getDefaultTldAddress();
43
- const domainParts = fullDomain.split('.');
44
- const traversalParts = domainParts.slice(0, -1).reverse();
45
- if (traversalParts.length === 0)
46
- return success(tldAddress);
47
- let currentResolver = tldAddress;
48
- for (const part of traversalParts) {
49
- const contractStateResult = await queryContractStateSafely(publicDataProvider, currentResolver);
50
- if (!contractStateResult.success) {
51
- return failure(contractStateResult.error);
52
- }
53
- const contractLedger = ledger(contractStateResult.data.data);
54
- if (!contractLedger.domains.member(part)) {
55
- return failure(new DomainNotFoundError(`${part} in ${currentResolver}`));
56
- }
57
- const domainData = contractLedger.domains.lookup(part);
58
- const resolverBytes = domainData.resolver.bytes;
59
- currentResolver = formatContractAddress(resolverBytes);
60
- }
61
- return success(currentResolver);
62
- }
63
- catch (error) {
64
- return failure(new NetworkError(`Failed to get resolver address: ${error instanceof Error ? error.message : String(error)}`, error));
65
- }
66
- }
67
- export async function resolveDomain(publicDataProvider, domain, tldAddress) {
68
- const tldContractAddress = tldAddress || getDefaultTldAddress();
69
- const fullDomain = normalizeDomain(domain);
70
- try {
71
- const domainParts = fullDomain.split('.');
72
- if (domainParts[domainParts.length - 1] !== TLD) {
73
- return failure(new InvalidDomainError(fullDomain, `Domain must end with .${TLD}`));
74
- }
75
- const parsedDomain = domainParts.slice(0, -1).reverse();
76
- let currentResolver = tldContractAddress;
77
- if (parsedDomain.length === 0) {
78
- const contractStateResult = await queryContractStateSafely(publicDataProvider, currentResolver);
79
- if (!contractStateResult.success)
80
- return failure(contractStateResult.error);
81
- const contractLedger = ledger(contractStateResult.data.data);
82
- return success(getTargetFromLedger(contractLedger));
83
- }
84
- for (const part of parsedDomain) {
85
- const contractStateResult = await queryContractStateSafely(publicDataProvider, currentResolver);
86
- if (!contractStateResult.success)
87
- return failure(contractStateResult.error);
88
- const contractLedger = ledger(contractStateResult.data.data);
89
- if (!contractLedger.domains.member(part)) {
90
- return failure(new DomainNotFoundError(`${part} in ${fullDomain}`));
91
- }
92
- const domainData = contractLedger.domains.lookup(part);
93
- const resolverBytes = domainData.resolver.bytes;
94
- currentResolver = formatContractAddress(resolverBytes);
95
- }
96
- const finalContractStateResult = await queryContractStateSafely(publicDataProvider, currentResolver);
97
- if (!finalContractStateResult.success)
98
- return failure(finalContractStateResult.error);
99
- const finalLedger = ledger(finalContractStateResult.data.data);
100
- return success(getTargetFromLedger(finalLedger));
101
- }
102
- catch (error) {
103
- return failure(new NetworkError(`Failed to resolve domain: ${error instanceof Error ? error.message : String(error)}`, error));
104
- }
105
- }
106
- export async function getDomainInfo(publicDataProvider, contractAddress, domainName) {
107
- try {
108
- const contractStateResult = await queryContractStateSafely(publicDataProvider, contractAddress);
109
- if (!contractStateResult.success)
110
- return failure(contractStateResult.error);
111
- const contractLedger = ledger(contractStateResult.data.data);
112
- if (!contractLedger.domains.member(domainName)) {
113
- return failure(new DomainNotFoundError(domainName));
114
- }
115
- const domainData = contractLedger.domains.lookup(domainName);
116
- const ownerCoinPublicKey = new ShieldedCoinPublicKey(Buffer.from(domainData.owner.bytes));
117
- const ownerAddress = ShieldedCoinPublicKey.codec.encode(getZswapNetworkId(), ownerCoinPublicKey).asString();
118
- return success({ owner: ownerAddress, resolver: formatContractAddress(domainData.resolver.bytes) });
119
- }
120
- catch (error) {
121
- return failure(new NetworkError(`Failed to get domain info: ${error instanceof Error ? error.message : String(error)}`, error));
122
- }
123
- }
124
- export async function getDomainInfoByResolving(publicDataProvider, fullDomain) {
125
- try {
126
- const normalizedDomain = normalizeDomain(fullDomain);
127
- const parsed = parseFullDomain(normalizedDomain);
128
- if (!parsed.isValid) {
129
- return failure(new InvalidDomainError(fullDomain, 'Invalid domain format'));
130
- }
131
- const parentContractAddressResult = await getResolverAddress(publicDataProvider, parsed.parentDomainPath);
132
- if (!parentContractAddressResult.success)
133
- return failure(parentContractAddressResult.error);
134
- const infoResult = await getDomainInfo(publicDataProvider, parentContractAddressResult.data, parsed.domainName);
135
- if (!infoResult.success)
136
- return failure(infoResult.error);
137
- return success({ ...infoResult.data, contractAddress: parentContractAddressResult.data });
138
- }
139
- catch (error) {
140
- return failure(new NetworkError(`Failed to get domain info by resolving: ${error instanceof Error ? error.message : String(error)}`, error));
141
- }
142
- }
143
- export async function getDomainFields(publicDataProvider, contractAddress) {
144
- try {
145
- const contractStateResult = await queryContractStateSafely(publicDataProvider, contractAddress);
146
- if (!contractStateResult.success)
147
- return failure(contractStateResult.error);
148
- const contractLedger = ledger(contractStateResult.data.data);
149
- const fields = [];
150
- for (const [key, value] of contractLedger.fields)
151
- fields.push([key, value]);
152
- return success(fields);
153
- }
154
- catch (error) {
155
- return failure(new NetworkError(`Failed to get domain fields: ${error instanceof Error ? error.message : String(error)}`, error));
156
- }
157
- }
158
- export async function getNamespacedDomainFields(publicDataProvider, _parentContractAddress, fullDomainName) {
159
- try {
160
- const domainContractAddressResult = await getResolverAddress(publicDataProvider, fullDomainName);
161
- if (!domainContractAddressResult.success)
162
- return failure(domainContractAddressResult.error);
163
- return await getDomainFields(publicDataProvider, domainContractAddressResult.data);
164
- }
165
- catch (error) {
166
- return failure(new NetworkError(`Failed to get namespaced domain fields: ${error instanceof Error ? error.message : String(error)}`, error));
167
- }
168
- }
169
- export async function getDomainSettings(publicDataProvider, contractAddress) {
170
- try {
171
- const contractStateResult = await queryContractStateSafely(publicDataProvider, contractAddress);
172
- if (!contractStateResult.success)
173
- return failure(contractStateResult.error);
174
- const contractLedger = ledger(contractStateResult.data.data);
175
- return success({ coinColor: contractLedger.COIN_COLOR, domainCost: contractLedger.DOMAIN_COST });
176
- }
177
- catch (error) {
178
- return failure(new NetworkError(`Failed to get domain settings: ${error instanceof Error ? error.message : String(error)}`, error));
179
- }
180
- }
181
- export async function getDomainProfile(publicDataProvider, fullDomain) {
182
- try {
183
- const normalized = normalizeDomain(fullDomain);
184
- const [resolvedTargetResult, infoResult] = await Promise.all([
185
- resolveDomain(publicDataProvider, normalized),
186
- getDomainInfoByResolving(publicDataProvider, normalized)
187
- ]);
188
- const resolvedTarget = resolvedTargetResult.success ? resolvedTargetResult.data : null;
189
- const info = infoResult.success ? infoResult.data : null;
190
- if (info && info.contractAddress) {
191
- const [fieldsResult, settingsResult] = await Promise.all([
192
- getNamespacedDomainFields(publicDataProvider, info.contractAddress, normalized),
193
- getDomainSettings(publicDataProvider, info.resolver)
194
- ]);
195
- const fields = fieldsResult.success ? fieldsResult.data : [];
196
- const settings = settingsResult.success ? settingsResult.data : null;
197
- return success({ fullDomain: normalized, resolvedTarget, info, fields, settings });
198
- }
199
- return success({ fullDomain: normalized, resolvedTarget, info, fields: [], settings: null });
200
- }
201
- catch (error) {
202
- return failure(new NetworkError(`Failed to get domain profile: ${error instanceof Error ? error.message : String(error)}`, error));
203
- }
204
- }
1
+ export { resolveDomain, TESTNET_TLD_ADDRESS } from './modules/core.js';
2
+ export { setDefaultProvider, getDefaultProvider, setupDefaultProvider } from './provider.js';
3
+ export { success, failure, isSuccess, isError, unwrap, unwrapOr } from './types.js';
4
+ export { MidNamesError, NetworkError, ContractNotFoundError, DomainNotFoundError, InvalidDomainError, ProviderError } from './types.js';
package/dist/index.d.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  export * from './types.js';
2
2
  export * from './utils/domain.js';
3
3
  export * from './utils/address.js';
4
- export * from './core.js';
4
+ export { setDefaultProvider, getDefaultProvider, setupDefaultProvider } from './provider.js';
5
+ export { resolveDomain, getDomainInfo, getDomainInfoByResolving, getDomainFields, getNamespacedDomainFields, getDomainSettings, getDomainProfile } from './modules/index.js';
6
+ export { TESTNET_TLD_ADDRESS } from './modules/core.js';
package/dist/index.js CHANGED
@@ -1,4 +1,10 @@
1
+ // Types and utilities
1
2
  export * from './types.js';
2
3
  export * from './utils/domain.js';
3
4
  export * from './utils/address.js';
4
- export * from './core.js';
5
+ // Provider management
6
+ export { setDefaultProvider, getDefaultProvider, setupDefaultProvider } from './provider.js';
7
+ // Simplified API (provider optional)
8
+ export { resolveDomain, getDomainInfo, getDomainInfoByResolving, getDomainFields, getNamespacedDomainFields, getDomainSettings, getDomainProfile } from './modules/index.js';
9
+ // Constants
10
+ export { TESTNET_TLD_ADDRESS } from './modules/core.js';
package/dist/info.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ export { getDomainInfo, getDomainInfoByResolving, getDomainFields, getNamespacedDomainFields, getDomainSettings, getDomainProfile, } from './modules/info.js';
2
+ export { setDefaultProvider, getDefaultProvider, setupDefaultProvider } from './provider.js';
3
+ export type { DomainInfo, DomainSettings, DomainProfileData, Result } from './types.js';
4
+ export { success, failure, isSuccess, isError, unwrap, unwrapOr } from './types.js';
5
+ export { MidNamesError, NetworkError, ContractNotFoundError, DomainNotFoundError, InvalidDomainError, ProviderError } from './types.js';
package/dist/info.js ADDED
@@ -0,0 +1,5 @@
1
+ // Info module - domain info and profile functions
2
+ export { getDomainInfo, getDomainInfoByResolving, getDomainFields, getNamespacedDomainFields, getDomainSettings, getDomainProfile, } from './modules/info.js';
3
+ export { setDefaultProvider, getDefaultProvider, setupDefaultProvider } from './provider.js';
4
+ export { success, failure, isSuccess, isError, unwrap, unwrapOr } from './types.js';
5
+ export { MidNamesError, NetworkError, ContractNotFoundError, DomainNotFoundError, InvalidDomainError, ProviderError } from './types.js';
@@ -0,0 +1,8 @@
1
+ import type { PublicDataProvider } from '@midnight-ntwrk/midnight-js-types';
2
+ import type { Result } from '../types.js';
3
+ export declare const TESTNET_TLD_ADDRESS = "0200c46ddd9a7fe134e7126132bf48d573e3e70a06fc2b82edb2c9f31584536efa01";
4
+ export declare function getDefaultTldAddress(): string;
5
+ export declare function resolveDomain(domain: string, options?: {
6
+ provider?: PublicDataProvider;
7
+ tldAddress?: string;
8
+ }): Promise<Result<string>>;
@@ -0,0 +1,80 @@
1
+ import { getNetworkId, getZswapNetworkId, NetworkId } from '@midnight-ntwrk/midnight-js-network-id';
2
+ import { ShieldedCoinPublicKey } from '@midnight-ntwrk/wallet-sdk-address-format';
3
+ import { ledger } from '../../managed/index.js';
4
+ import { formatContractAddress } from '../utils/address.js';
5
+ import { normalizeDomain } from '../utils/domain.js';
6
+ import { success, failure, NetworkError, ContractNotFoundError, DomainNotFoundError, InvalidDomainError, ProviderError } from '../types.js';
7
+ import { getProviderOrThrow } from '../provider.js';
8
+ const TLD = 'night';
9
+ export const TESTNET_TLD_ADDRESS = '0200c46ddd9a7fe134e7126132bf48d573e3e70a06fc2b82edb2c9f31584536efa01';
10
+ export function getDefaultTldAddress() {
11
+ const currentNetwork = getNetworkId();
12
+ switch (currentNetwork) {
13
+ case NetworkId.TestNet:
14
+ return TESTNET_TLD_ADDRESS;
15
+ default:
16
+ throw new Error('Provide an address to use the resolver on a Standalone Network.');
17
+ }
18
+ }
19
+ function getTargetFromLedger(contractLedger) {
20
+ const target = contractLedger.DOMAIN_TARGET;
21
+ if (target.is_left) {
22
+ const coinPublicKey = new ShieldedCoinPublicKey(Buffer.from(target.left.bytes));
23
+ return ShieldedCoinPublicKey.codec.encode(getZswapNetworkId(), coinPublicKey).asString();
24
+ }
25
+ else {
26
+ return formatContractAddress(target.right.bytes);
27
+ }
28
+ }
29
+ async function queryContractStateSafely(publicDataProvider, contractAddress) {
30
+ try {
31
+ const contractState = await publicDataProvider.queryContractState(contractAddress);
32
+ if (contractState == null) {
33
+ return failure(new ContractNotFoundError(contractAddress));
34
+ }
35
+ return success(contractState);
36
+ }
37
+ catch (error) {
38
+ return failure(new ProviderError(`Failed to query contract state: ${error instanceof Error ? error.message : String(error)}`, error));
39
+ }
40
+ }
41
+ export async function resolveDomain(domain, options = {}) {
42
+ const publicDataProvider = getProviderOrThrow(options.provider);
43
+ const tldContractAddress = options.tldAddress || getDefaultTldAddress();
44
+ const fullDomain = normalizeDomain(domain);
45
+ try {
46
+ const domainParts = fullDomain.split('.');
47
+ if (domainParts[domainParts.length - 1] !== TLD) {
48
+ return failure(new InvalidDomainError(fullDomain, `Domain must end with .${TLD}`));
49
+ }
50
+ const parsedDomain = domainParts.slice(0, -1).reverse();
51
+ let currentResolver = tldContractAddress;
52
+ if (parsedDomain.length === 0) {
53
+ const contractStateResult = await queryContractStateSafely(publicDataProvider, currentResolver);
54
+ if (!contractStateResult.success)
55
+ return failure(contractStateResult.error);
56
+ const contractLedger = ledger(contractStateResult.data.data);
57
+ return success(getTargetFromLedger(contractLedger));
58
+ }
59
+ for (const part of parsedDomain) {
60
+ const contractStateResult = await queryContractStateSafely(publicDataProvider, currentResolver);
61
+ if (!contractStateResult.success)
62
+ return failure(contractStateResult.error);
63
+ const contractLedger = ledger(contractStateResult.data.data);
64
+ if (!contractLedger.domains.member(part)) {
65
+ return failure(new DomainNotFoundError(`${part} in ${fullDomain}`));
66
+ }
67
+ const domainData = contractLedger.domains.lookup(part);
68
+ const resolverBytes = domainData.resolver.bytes;
69
+ currentResolver = formatContractAddress(resolverBytes);
70
+ }
71
+ const finalContractStateResult = await queryContractStateSafely(publicDataProvider, currentResolver);
72
+ if (!finalContractStateResult.success)
73
+ return failure(finalContractStateResult.error);
74
+ const finalLedger = ledger(finalContractStateResult.data.data);
75
+ return success(getTargetFromLedger(finalLedger));
76
+ }
77
+ catch (error) {
78
+ return failure(new NetworkError(`Failed to resolve domain: ${error instanceof Error ? error.message : String(error)}`, error));
79
+ }
80
+ }
@@ -0,0 +1,3 @@
1
+ export * from './core.js';
2
+ export * from './info.js';
3
+ export * from '../provider.js';
@@ -0,0 +1,6 @@
1
+ // Core resolution functions
2
+ export * from './core.js';
3
+ // Domain info functions
4
+ export * from './info.js';
5
+ // Re-export provider utilities
6
+ export * from '../provider.js';
@@ -0,0 +1,20 @@
1
+ import type { PublicDataProvider } from '@midnight-ntwrk/midnight-js-types';
2
+ import type { DomainInfo, DomainSettings, DomainProfileData, Result } from '../types.js';
3
+ export declare function getDomainInfo(contractAddress: string, domainName: string, options?: {
4
+ provider?: PublicDataProvider;
5
+ }): Promise<Result<DomainInfo>>;
6
+ export declare function getDomainInfoByResolving(fullDomain: string, options?: {
7
+ provider?: PublicDataProvider;
8
+ }): Promise<Result<DomainInfo>>;
9
+ export declare function getDomainFields(contractAddress: string, options?: {
10
+ provider?: PublicDataProvider;
11
+ }): Promise<Result<Array<[string, string]>>>;
12
+ export declare function getNamespacedDomainFields(_parentContractAddress: string, fullDomainName: string, options?: {
13
+ provider?: PublicDataProvider;
14
+ }): Promise<Result<Array<[string, string]>>>;
15
+ export declare function getDomainSettings(contractAddress: string, options?: {
16
+ provider?: PublicDataProvider;
17
+ }): Promise<Result<DomainSettings>>;
18
+ export declare function getDomainProfile(fullDomain: string, options?: {
19
+ provider?: PublicDataProvider;
20
+ }): Promise<Result<DomainProfileData>>;