@midnames/sdk 0.1.8 → 0.2.1
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/core.d.ts +2 -5
- package/dist/core.js +37 -58
- package/dist/provider.d.ts +0 -1
- package/dist/provider.js +5 -6
- package/dist/react/DomainProfileWidget/index.d.ts +2 -0
- package/dist/react/DomainProfileWidget/index.js +1 -0
- package/dist/react/HolographicCard/index.d.ts +3 -0
- package/dist/react/HolographicCard/index.js +2 -0
- package/dist/utils/address.d.ts +1 -0
- package/dist/utils/address.js +3 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +2 -0
- package/exported.md +6 -11
- package/managed/index.js +6 -0
- package/managed/index.js.map +1 -0
- package/managed/leaf.compact +258 -0
- package/managed/managed/leaf/contract/index.cjs +2789 -0
- package/managed/managed/leaf/contract/index.cjs.map +8 -0
- package/managed/managed/leaf/contract/index.d.cts +146 -0
- package/managed/witnesses.js +3 -0
- package/managed/witnesses.js.map +1 -0
- package/package.json +43 -7
- package/tsconfig.tsbuildinfo +1 -1
- package/exports.json +0 -7717
- package/midnames-sdk-0.1.8.tgz +0 -0
package/dist/core.d.ts
CHANGED
|
@@ -5,18 +5,15 @@ export declare function resolveDomain(domain: string, options?: {
|
|
|
5
5
|
provider?: PublicDataProvider;
|
|
6
6
|
tldAddress?: string;
|
|
7
7
|
}): Promise<Result<string>>;
|
|
8
|
-
export declare function
|
|
8
|
+
export declare function getDomainInfoInContract(contractAddress: string, domainName: string, options?: {
|
|
9
9
|
provider?: PublicDataProvider;
|
|
10
10
|
}): Promise<Result<DomainInfo>>;
|
|
11
|
-
export declare function
|
|
11
|
+
export declare function getDomainInfo(fullDomain: string, options?: {
|
|
12
12
|
provider?: PublicDataProvider;
|
|
13
13
|
}): Promise<Result<DomainInfo>>;
|
|
14
14
|
export declare function getDomainFields(contractAddress: string, options?: {
|
|
15
15
|
provider?: PublicDataProvider;
|
|
16
16
|
}): Promise<Result<Array<[string, string]>>>;
|
|
17
|
-
export declare function getNamespacedDomainFields(fullDomainName: string, options?: {
|
|
18
|
-
provider?: PublicDataProvider;
|
|
19
|
-
}): Promise<Result<Array<[string, string]>>>;
|
|
20
17
|
export declare function getDomainSettings(contractAddress: string, options?: {
|
|
21
18
|
provider?: PublicDataProvider;
|
|
22
19
|
}): Promise<Result<DomainSettings>>;
|
package/dist/core.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { getNetworkId, getZswapNetworkId, NetworkId } from '@midnight-ntwrk/midnight-js-network-id';
|
|
2
2
|
import { ShieldedCoinPublicKey } from '@midnight-ntwrk/wallet-sdk-address-format';
|
|
3
|
-
import { ledger } from '
|
|
3
|
+
import { ledger } from './managed/index.js';
|
|
4
4
|
import { formatContractAddress } from './utils/address.js';
|
|
5
5
|
import { normalizeDomain, parseFullDomain } from './utils/domain.js';
|
|
6
6
|
import { success, failure, NetworkError, ContractNotFoundError, DomainNotFoundError, InvalidDomainError, ProviderError } from './types.js';
|
|
@@ -38,14 +38,24 @@ async function queryContractStateSafely(publicDataProvider, contractAddress) {
|
|
|
38
38
|
return failure(new ProviderError(`Failed to query contract state: ${error instanceof Error ? error.message : String(error)}`, error));
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
|
-
async function
|
|
41
|
+
async function traverseDomainHierarchy(publicDataProvider, fullDomain, returnFinalTarget = false) {
|
|
42
42
|
try {
|
|
43
43
|
const tldAddress = getDefaultTldAddress();
|
|
44
44
|
const domainParts = fullDomain.split('.');
|
|
45
45
|
const traversalParts = domainParts.slice(0, -1).reverse();
|
|
46
|
-
if (traversalParts.length === 0)
|
|
47
|
-
return success(tldAddress);
|
|
48
46
|
let currentResolver = tldAddress;
|
|
47
|
+
// If we're resolving the TLD itself and want the target
|
|
48
|
+
if (traversalParts.length === 0) {
|
|
49
|
+
if (returnFinalTarget) {
|
|
50
|
+
const contractStateResult = await queryContractStateSafely(publicDataProvider, currentResolver);
|
|
51
|
+
if (!contractStateResult.success)
|
|
52
|
+
return failure(contractStateResult.error);
|
|
53
|
+
const contractLedger = ledger(contractStateResult.data.data);
|
|
54
|
+
return success(getTargetFromLedger(contractLedger));
|
|
55
|
+
}
|
|
56
|
+
return success(tldAddress);
|
|
57
|
+
}
|
|
58
|
+
// Traverse the domain hierarchy
|
|
49
59
|
for (const part of traversalParts) {
|
|
50
60
|
const contractStateResult = await queryContractStateSafely(publicDataProvider, currentResolver);
|
|
51
61
|
if (!contractStateResult.success) {
|
|
@@ -53,59 +63,40 @@ async function getResolverAddress(publicDataProvider, fullDomain) {
|
|
|
53
63
|
}
|
|
54
64
|
const contractLedger = ledger(contractStateResult.data.data);
|
|
55
65
|
if (!contractLedger.domains.member(part)) {
|
|
56
|
-
return failure(new DomainNotFoundError(`${part} in ${
|
|
66
|
+
return failure(new DomainNotFoundError(`${part} in ${fullDomain}`));
|
|
57
67
|
}
|
|
58
68
|
const domainData = contractLedger.domains.lookup(part);
|
|
59
69
|
const resolverBytes = domainData.resolver.bytes;
|
|
60
70
|
currentResolver = formatContractAddress(resolverBytes);
|
|
61
71
|
}
|
|
72
|
+
// Return either the final resolver address or the target it points to
|
|
73
|
+
if (returnFinalTarget) {
|
|
74
|
+
const finalContractStateResult = await queryContractStateSafely(publicDataProvider, currentResolver);
|
|
75
|
+
if (!finalContractStateResult.success)
|
|
76
|
+
return failure(finalContractStateResult.error);
|
|
77
|
+
const finalLedger = ledger(finalContractStateResult.data.data);
|
|
78
|
+
return success(getTargetFromLedger(finalLedger));
|
|
79
|
+
}
|
|
62
80
|
return success(currentResolver);
|
|
63
81
|
}
|
|
64
82
|
catch (error) {
|
|
65
|
-
return failure(new NetworkError(`Failed to
|
|
83
|
+
return failure(new NetworkError(`Failed to traverse domain hierarchy: ${error instanceof Error ? error.message : String(error)}`, error));
|
|
66
84
|
}
|
|
67
85
|
}
|
|
86
|
+
async function getResolverAddress(publicDataProvider, fullDomain) {
|
|
87
|
+
return traverseDomainHierarchy(publicDataProvider, fullDomain, false);
|
|
88
|
+
}
|
|
68
89
|
export async function resolveDomain(domain, options = {}) {
|
|
69
90
|
const publicDataProvider = options.provider || getDefaultProvider();
|
|
70
|
-
const tldContractAddress = options.tldAddress || getDefaultTldAddress();
|
|
71
91
|
const fullDomain = normalizeDomain(domain);
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
}
|
|
77
|
-
const parsedDomain = domainParts.slice(0, -1).reverse();
|
|
78
|
-
let currentResolver = tldContractAddress;
|
|
79
|
-
if (parsedDomain.length === 0) {
|
|
80
|
-
const contractStateResult = await queryContractStateSafely(publicDataProvider, currentResolver);
|
|
81
|
-
if (!contractStateResult.success)
|
|
82
|
-
return failure(contractStateResult.error);
|
|
83
|
-
const contractLedger = ledger(contractStateResult.data.data);
|
|
84
|
-
return success(getTargetFromLedger(contractLedger));
|
|
85
|
-
}
|
|
86
|
-
for (const part of parsedDomain) {
|
|
87
|
-
const contractStateResult = await queryContractStateSafely(publicDataProvider, currentResolver);
|
|
88
|
-
if (!contractStateResult.success)
|
|
89
|
-
return failure(contractStateResult.error);
|
|
90
|
-
const contractLedger = ledger(contractStateResult.data.data);
|
|
91
|
-
if (!contractLedger.domains.member(part)) {
|
|
92
|
-
return failure(new DomainNotFoundError(`${part} in ${fullDomain}`));
|
|
93
|
-
}
|
|
94
|
-
const domainData = contractLedger.domains.lookup(part);
|
|
95
|
-
const resolverBytes = domainData.resolver.bytes;
|
|
96
|
-
currentResolver = formatContractAddress(resolverBytes);
|
|
97
|
-
}
|
|
98
|
-
const finalContractStateResult = await queryContractStateSafely(publicDataProvider, currentResolver);
|
|
99
|
-
if (!finalContractStateResult.success)
|
|
100
|
-
return failure(finalContractStateResult.error);
|
|
101
|
-
const finalLedger = ledger(finalContractStateResult.data.data);
|
|
102
|
-
return success(getTargetFromLedger(finalLedger));
|
|
103
|
-
}
|
|
104
|
-
catch (error) {
|
|
105
|
-
return failure(new NetworkError(`Failed to resolve domain: ${error instanceof Error ? error.message : String(error)}`, error));
|
|
92
|
+
// Validate TLD
|
|
93
|
+
const domainParts = fullDomain.split('.');
|
|
94
|
+
if (domainParts[domainParts.length - 1] !== TLD) {
|
|
95
|
+
return failure(new InvalidDomainError(fullDomain, `Domain must end with .${TLD}`));
|
|
106
96
|
}
|
|
97
|
+
return traverseDomainHierarchy(publicDataProvider, fullDomain, true);
|
|
107
98
|
}
|
|
108
|
-
export async function
|
|
99
|
+
export async function getDomainInfoInContract(contractAddress, domainName, options = {}) {
|
|
109
100
|
const publicDataProvider = options.provider || getDefaultProvider();
|
|
110
101
|
try {
|
|
111
102
|
const contractStateResult = await queryContractStateSafely(publicDataProvider, contractAddress);
|
|
@@ -124,7 +115,7 @@ export async function getDomainInfo(contractAddress, domainName, options = {}) {
|
|
|
124
115
|
return failure(new NetworkError(`Failed to get domain info: ${error instanceof Error ? error.message : String(error)}`, error));
|
|
125
116
|
}
|
|
126
117
|
}
|
|
127
|
-
export async function
|
|
118
|
+
export async function getDomainInfo(fullDomain, options = {}) {
|
|
128
119
|
const publicDataProvider = options.provider || getDefaultProvider();
|
|
129
120
|
try {
|
|
130
121
|
const normalizedDomain = normalizeDomain(fullDomain);
|
|
@@ -135,7 +126,7 @@ export async function getDomainInfoByResolving(fullDomain, options = {}) {
|
|
|
135
126
|
const parentContractAddressResult = await getResolverAddress(publicDataProvider, parsed.parentDomainPath);
|
|
136
127
|
if (!parentContractAddressResult.success)
|
|
137
128
|
return failure(parentContractAddressResult.error);
|
|
138
|
-
const infoResult = await
|
|
129
|
+
const infoResult = await getDomainInfoInContract(parentContractAddressResult.data, parsed.domainName, { provider: publicDataProvider });
|
|
139
130
|
if (!infoResult.success)
|
|
140
131
|
return failure(infoResult.error);
|
|
141
132
|
return success({ ...infoResult.data, contractAddress: parentContractAddressResult.data });
|
|
@@ -160,18 +151,6 @@ export async function getDomainFields(contractAddress, options = {}) {
|
|
|
160
151
|
return failure(new NetworkError(`Failed to get domain fields: ${error instanceof Error ? error.message : String(error)}`, error));
|
|
161
152
|
}
|
|
162
153
|
}
|
|
163
|
-
export async function getNamespacedDomainFields(fullDomainName, options = {}) {
|
|
164
|
-
const publicDataProvider = options.provider || getDefaultProvider();
|
|
165
|
-
try {
|
|
166
|
-
const domainContractAddressResult = await getResolverAddress(publicDataProvider, fullDomainName);
|
|
167
|
-
if (!domainContractAddressResult.success)
|
|
168
|
-
return failure(domainContractAddressResult.error);
|
|
169
|
-
return await getDomainFields(domainContractAddressResult.data, { provider: publicDataProvider });
|
|
170
|
-
}
|
|
171
|
-
catch (error) {
|
|
172
|
-
return failure(new NetworkError(`Failed to get namespaced domain fields: ${error instanceof Error ? error.message : String(error)}`, error));
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
154
|
export async function getDomainSettings(contractAddress, options = {}) {
|
|
176
155
|
const publicDataProvider = options.provider || getDefaultProvider();
|
|
177
156
|
try {
|
|
@@ -191,13 +170,13 @@ export async function getDomainProfile(fullDomain, options = {}) {
|
|
|
191
170
|
const normalized = normalizeDomain(fullDomain);
|
|
192
171
|
const [resolvedTargetResult, infoResult] = await Promise.all([
|
|
193
172
|
resolveDomain(normalized, { provider: publicDataProvider }),
|
|
194
|
-
|
|
173
|
+
getDomainInfo(normalized, { provider: publicDataProvider })
|
|
195
174
|
]);
|
|
196
175
|
const resolvedTarget = resolvedTargetResult.success ? resolvedTargetResult.data : null;
|
|
197
176
|
const info = infoResult.success ? infoResult.data : null;
|
|
198
177
|
if (info && info.contractAddress) {
|
|
199
178
|
const [fieldsResult, settingsResult] = await Promise.all([
|
|
200
|
-
|
|
179
|
+
getDomainFields(info.resolver, { provider: publicDataProvider }),
|
|
201
180
|
getDomainSettings(info.resolver, { provider: publicDataProvider })
|
|
202
181
|
]);
|
|
203
182
|
const fields = fieldsResult.success ? fieldsResult.data : [];
|
package/dist/provider.d.ts
CHANGED
|
@@ -8,4 +8,3 @@ export interface ProviderConfig {
|
|
|
8
8
|
export declare function getDefaultProvider(): PublicDataProvider;
|
|
9
9
|
export declare function setDefaultProvider(provider: PublicDataProvider): void;
|
|
10
10
|
export declare function createDefaultProvider(config?: ProviderConfig): PublicDataProvider;
|
|
11
|
-
export declare function setupDefaultProvider(config?: ProviderConfig): PublicDataProvider;
|
package/dist/provider.js
CHANGED
|
@@ -3,7 +3,11 @@ import { indexerPublicDataProvider } from '@midnight-ntwrk/midnight-js-indexer-p
|
|
|
3
3
|
let defaultProvider = null;
|
|
4
4
|
export function getDefaultProvider() {
|
|
5
5
|
if (!defaultProvider) {
|
|
6
|
-
|
|
6
|
+
const indexerUrl = "https://indexer.testnet-02.midnight.network/api/v1/graphql";
|
|
7
|
+
const indexerWsUrl = "wss://indexer.testnet-02.midnight.network/api/v1/graphql/ws";
|
|
8
|
+
const networkId = NetworkId.TestNet;
|
|
9
|
+
setNetworkId(networkId);
|
|
10
|
+
defaultProvider = indexerPublicDataProvider(indexerUrl, indexerWsUrl);
|
|
7
11
|
}
|
|
8
12
|
return defaultProvider;
|
|
9
13
|
}
|
|
@@ -15,8 +19,3 @@ export function createDefaultProvider(config = {}) {
|
|
|
15
19
|
setNetworkId(networkId);
|
|
16
20
|
return indexerPublicDataProvider(indexerUrl, indexerWsUrl);
|
|
17
21
|
}
|
|
18
|
-
export function setupDefaultProvider(config = {}) {
|
|
19
|
-
const provider = createDefaultProvider(config);
|
|
20
|
-
setDefaultProvider(provider);
|
|
21
|
-
return provider;
|
|
22
|
-
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DomainProfileWidget, CopyableValue } from '../DomainProfileWidget.js';
|
package/dist/utils/address.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export declare function bytesToHex(bytes: Uint8Array): string;
|
|
2
2
|
export declare function formatContractAddress(bytes: Uint8Array): string;
|
|
3
3
|
export declare function deriveShieldedAddress(coinPublicKeyAddress: string, encryptionPublicKey: string): string | null;
|
|
4
|
+
export declare function isWalletAddress(address: string): boolean;
|
package/dist/utils/address.js
CHANGED
package/exported.md
CHANGED
|
@@ -7,37 +7,32 @@ This document contains all exported functions, types, interfaces, classes, and c
|
|
|
7
7
|
### Core
|
|
8
8
|
|
|
9
9
|
```typescript
|
|
10
|
-
export function resolveDomain(
|
|
10
|
+
export function resolveDomain(domain: string, options?: { provider?: PublicDataProvider; tldAddress?: string }): Promise<Result<string>>
|
|
11
11
|
```
|
|
12
12
|
Resolves a domain name to its target address.
|
|
13
13
|
|
|
14
14
|
```typescript
|
|
15
|
-
export function
|
|
15
|
+
export function getDomainInfoInContract(contractAddress: string, domainName: string, options?: { provider?: PublicDataProvider }): Promise<Result<DomainInfo>>
|
|
16
16
|
```
|
|
17
17
|
Gets information about a domain from a specific contract.
|
|
18
18
|
|
|
19
19
|
```typescript
|
|
20
|
-
export function
|
|
20
|
+
export function getDomainInfo(fullDomain: string, options?: { provider?: PublicDataProvider }): Promise<Result<DomainInfo>>
|
|
21
21
|
```
|
|
22
22
|
Gets domain information by resolving the full domain path.
|
|
23
23
|
|
|
24
24
|
```typescript
|
|
25
|
-
export function getDomainFields(
|
|
25
|
+
export function getDomainFields(contractAddress: string, options?: { provider?: PublicDataProvider }): Promise<Result<Array<[string, string]>>>
|
|
26
26
|
```
|
|
27
27
|
Gets all fields stored in a domain contract.
|
|
28
28
|
|
|
29
29
|
```typescript
|
|
30
|
-
export function
|
|
31
|
-
```
|
|
32
|
-
Gets fields for a domain by resolving its full namespace path.
|
|
33
|
-
|
|
34
|
-
```typescript
|
|
35
|
-
export function getDomainSettings(publicDataProvider: PublicDataProvider, contractAddress: string): Promise<Result<DomainSettings>>
|
|
30
|
+
export function getDomainSettings(contractAddress: string, options?: { provider?: PublicDataProvider }): Promise<Result<DomainSettings>>
|
|
36
31
|
```
|
|
37
32
|
Gets the settings (coin color, domain cost) for a domain contract.
|
|
38
33
|
|
|
39
34
|
```typescript
|
|
40
|
-
export function getDomainProfile(
|
|
35
|
+
export function getDomainProfile(fullDomain: string, options?: { provider?: PublicDataProvider }): Promise<Result<DomainProfileData>>
|
|
41
36
|
```
|
|
42
37
|
Gets the complete profile data for a domain.
|
|
43
38
|
|
package/managed/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * as Leaf from "./managed/leaf/contract/index.cjs";
|
|
2
|
+
import ContractModule from './managed/leaf/contract/index.cjs';
|
|
3
|
+
export const ledger = ContractModule.ledger;
|
|
4
|
+
export const pureCircuits = ContractModule.pureCircuits;
|
|
5
|
+
export const { Contract } = ContractModule;
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,IAAI,MAAM,mCAAmC,CAAC;AAE1D,OAAO,cAAc,MAAM,mCAAmC,CAAC;AAG/D,MAAM,CAAC,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC;AAC5C,MAAM,CAAC,MAAM,YAAY,GAAG,cAAc,CAAC,YAAY,CAAC;AACxD,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAC"}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
pragma language_version 0.17;
|
|
2
|
+
/// # Unshielded Nameservice
|
|
3
|
+
///
|
|
4
|
+
/// Example:
|
|
5
|
+
/// The `domain.mid` register would be deployed with
|
|
6
|
+
/// - parent_domain: "mid"
|
|
7
|
+
/// - parent_resolver: "mid" resolver
|
|
8
|
+
/// - target: arbitrary
|
|
9
|
+
/// - domain: "domain"
|
|
10
|
+
/// - fields for the `domain.mid` domain.
|
|
11
|
+
/// The `sub.domain.mid` register would be deployed with
|
|
12
|
+
/// - parent_domain: "domain"
|
|
13
|
+
/// - parent_resolver: "domain" resolver
|
|
14
|
+
/// - target: arbitrary
|
|
15
|
+
/// - domain: "sub"
|
|
16
|
+
/// - fields for the `sub.domain.mid` domain.
|
|
17
|
+
/// The `hyper.sub.domain.mid` register would be deployed with
|
|
18
|
+
/// - parent_domain: "sub"
|
|
19
|
+
/// - parent_resolver: "sub" resolver
|
|
20
|
+
/// - target: arbitrary
|
|
21
|
+
/// - domain: "hyper"
|
|
22
|
+
/// - fields for the `hyper.sub.domain.mid` domain.
|
|
23
|
+
///
|
|
24
|
+
///
|
|
25
|
+
import CompactStandardLibrary;
|
|
26
|
+
|
|
27
|
+
// This is sealed. If the domain is sold in the parent contract
|
|
28
|
+
// The new owner should deploy a new resolver.
|
|
29
|
+
export sealed ledger PARENT_DOMAIN: Maybe<Opaque<'string'>>;
|
|
30
|
+
export sealed ledger PARENT_RESOLVER: ContractAddress;
|
|
31
|
+
export sealed ledger DOMAIN: Maybe<Opaque<'string'>>;
|
|
32
|
+
|
|
33
|
+
export ledger DOMAIN_OWNER: ZswapCoinPublicKey;
|
|
34
|
+
// This domain could target either a wallet or a contract
|
|
35
|
+
export ledger DOMAIN_TARGET: Either<ZswapCoinPublicKey, ContractAddress>;
|
|
36
|
+
|
|
37
|
+
// Map<domain, (owner, resolver)>.
|
|
38
|
+
export ledger domains: Map<Opaque<'string'>, DomainData>;
|
|
39
|
+
|
|
40
|
+
// Set of domains saved here owned by address.
|
|
41
|
+
export ledger domains_owned: Map<ZswapCoinPublicKey, Set<Opaque<'string'>>>;
|
|
42
|
+
|
|
43
|
+
export ledger fields: Map<Opaque<'string'>, Opaque<'string'>>;
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
export { DomainData, Either, Maybe, CoinInfo }
|
|
47
|
+
struct DomainData {
|
|
48
|
+
owner: ZswapCoinPublicKey,
|
|
49
|
+
resolver: ContractAddress
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
constructor(
|
|
54
|
+
parent_domain: Maybe<Opaque<'string'>>,
|
|
55
|
+
parent_resolver: ContractAddress,
|
|
56
|
+
target: Either<ZswapCoinPublicKey, ContractAddress>,
|
|
57
|
+
domain: Maybe<Opaque<'string'>>,
|
|
58
|
+
coin_color: Bytes<32>,
|
|
59
|
+
domain_cost: Uint<64>,
|
|
60
|
+
kvs: Vector<10, Maybe<[Opaque<'string'>, Opaque<'string'>]>>
|
|
61
|
+
) {
|
|
62
|
+
DOMAIN_OWNER = ownPublicKey();
|
|
63
|
+
PARENT_DOMAIN = disclose(parent_domain);
|
|
64
|
+
PARENT_RESOLVER = disclose(parent_resolver);
|
|
65
|
+
DOMAIN_TARGET = disclose(target);
|
|
66
|
+
DOMAIN = disclose(domain);
|
|
67
|
+
COIN_COLOR = disclose(coin_color);
|
|
68
|
+
DOMAIN_COST = disclose(domain_cost);
|
|
69
|
+
for (const kv of kvs) {
|
|
70
|
+
if (disclose(kv) == none<[Opaque<'string'>, Opaque<'string'>]>()) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
fields.insert(disclose(kv.value[0]),disclose(kv.value[1]));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// ===========================================
|
|
78
|
+
// Circuits
|
|
79
|
+
// ===========================================
|
|
80
|
+
|
|
81
|
+
export ledger COIN_COLOR: Bytes<32>;
|
|
82
|
+
export ledger DOMAIN_COST: Uint<64>;
|
|
83
|
+
|
|
84
|
+
export circuit update_color(c: Bytes<32>) : [] {
|
|
85
|
+
assert(DOMAIN_OWNER == ownPublicKey(), "Not the owner");
|
|
86
|
+
COIN_COLOR = disclose(c);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export circuit update_cost(c: Uint<64>) : [] {
|
|
90
|
+
assert(DOMAIN_OWNER == ownPublicKey(), "Not the owner");
|
|
91
|
+
DOMAIN_COST = disclose(c);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export circuit update_target_and_fields(
|
|
95
|
+
new_target: Either<ZswapCoinPublicKey, ContractAddress>,
|
|
96
|
+
kvs: Vector<10, Maybe<[Opaque<'string'>, Opaque<'string'>]>>
|
|
97
|
+
) : [] {
|
|
98
|
+
assert(DOMAIN_OWNER == ownPublicKey(), "Not the domain owner");
|
|
99
|
+
for (const kv of kvs) {
|
|
100
|
+
if (disclose(kv) == none<[Opaque<'string'>, Opaque<'string'>]>()) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
fields.insert(disclose(kv.value[0]),disclose(kv.value[1]));
|
|
104
|
+
}
|
|
105
|
+
DOMAIN_TARGET = disclose(new_target);
|
|
106
|
+
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export circuit buy_domain_for(owner: ZswapCoinPublicKey, domain: Opaque<'string'>, resolver: ContractAddress, payment: CoinInfo): [] {
|
|
110
|
+
assert(!domains.member(disclose(domain)), "Domain already exists");
|
|
111
|
+
|
|
112
|
+
const d_payment = disclose(payment);
|
|
113
|
+
assert(d_payment.value == DOMAIN_COST, "Wrong amount");
|
|
114
|
+
assert(d_payment.color == COIN_COLOR, "Wrong coin");
|
|
115
|
+
receive(d_payment);
|
|
116
|
+
sendImmediate(d_payment, left<ZswapCoinPublicKey, ContractAddress>(DOMAIN_OWNER), DOMAIN_COST);
|
|
117
|
+
|
|
118
|
+
const d_owner = disclose(owner);
|
|
119
|
+
|
|
120
|
+
const domain_data = DomainData {
|
|
121
|
+
d_owner,
|
|
122
|
+
disclose(resolver)
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
domains.insert(disclose(domain), disclose(domain_data));
|
|
126
|
+
|
|
127
|
+
// Track domains owned by address
|
|
128
|
+
if (!domains_owned.member(d_owner)) {
|
|
129
|
+
domains_owned.insert(d_owner, default<Set<Opaque<'string'>>>);
|
|
130
|
+
}
|
|
131
|
+
domains_owned.lookup(d_owner).insert(disclose(domain));
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export circuit add_multiple_fields(kvs: Vector<10, Maybe<[Opaque<'string'>, Opaque<'string'>]>>) : [] {
|
|
135
|
+
assert(DOMAIN_OWNER == ownPublicKey(), "Not the domain owner");
|
|
136
|
+
for (const kv of kvs) {
|
|
137
|
+
if (disclose(kv) == none<[Opaque<'string'>, Opaque<'string'>]>()) {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
fields.insert(disclose(kv.value[0]),disclose(kv.value[1]));
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export circuit insert_field(k: Opaque<'string'>, v: Opaque<'string'>) : [] {
|
|
145
|
+
assert(DOMAIN_OWNER == ownPublicKey(), "Not the domain owner");
|
|
146
|
+
fields.insert(disclose(k),disclose(v));
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export circuit clear_field(k: Opaque<'string'>): [] {
|
|
150
|
+
assert(DOMAIN_OWNER == ownPublicKey(), "Not the domain owner");
|
|
151
|
+
fields.remove(disclose(k));
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export circuit clear_all_fields(domain: Opaque<'string'>): [] {
|
|
155
|
+
assert(DOMAIN_OWNER == ownPublicKey(), "Not the domain owner");
|
|
156
|
+
fields.resetToDefault();
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export circuit register_domain_for(owner: ZswapCoinPublicKey, domain: Opaque<'string'>, resolver: ContractAddress): [] {
|
|
160
|
+
assert(!domains.member(disclose(domain)), "Domain already exists");
|
|
161
|
+
assert(DOMAIN_OWNER == ownPublicKey(), "Not the domain owner");
|
|
162
|
+
|
|
163
|
+
const d_owner = disclose(owner);
|
|
164
|
+
const domain_data = DomainData {
|
|
165
|
+
d_owner,
|
|
166
|
+
disclose(resolver)
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
domains.insert(disclose(domain), disclose(domain_data));
|
|
170
|
+
|
|
171
|
+
// Track domains owned by address
|
|
172
|
+
if (!domains_owned.member(d_owner)) {
|
|
173
|
+
domains_owned.insert(d_owner, default<Set<Opaque<'string'>>>);
|
|
174
|
+
}
|
|
175
|
+
domains_owned.lookup(d_owner).insert(disclose(domain));
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export circuit set_resolver(domain: Opaque<'string'>, resolver: ContractAddress): [] {
|
|
179
|
+
assert(domains.member(disclose(domain)), "Domain does not exist");
|
|
180
|
+
|
|
181
|
+
const current_data = domains.lookup(disclose(domain));
|
|
182
|
+
assert(current_data.owner == ownPublicKey(), "Not the domain owner");
|
|
183
|
+
|
|
184
|
+
const new_data = DomainData {
|
|
185
|
+
current_data.owner,
|
|
186
|
+
disclose(resolver)
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
domains.insert(disclose(domain), disclose(new_data));
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
export circuit update_domain_target(new_target: Either<ZswapCoinPublicKey, ContractAddress>): [] {
|
|
193
|
+
assert(DOMAIN_OWNER == ownPublicKey(), "Not the contract owner");
|
|
194
|
+
|
|
195
|
+
DOMAIN_TARGET = disclose(new_target);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export circuit transfer_domain(domain: Opaque<'string'>, new_owner: ZswapCoinPublicKey): [] {
|
|
199
|
+
assert(domains.member(disclose(domain)), "Domain does not exist");
|
|
200
|
+
|
|
201
|
+
const current_data = domains.lookup(disclose(domain));
|
|
202
|
+
assert(current_data.owner == ownPublicKey(), "Not the domain owner");
|
|
203
|
+
|
|
204
|
+
const new_data = DomainData {
|
|
205
|
+
disclose(new_owner),
|
|
206
|
+
current_data.resolver
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
domains.insert(disclose(domain), disclose(new_data));
|
|
210
|
+
|
|
211
|
+
// Update ownership tracking
|
|
212
|
+
domains_owned.lookup(ownPublicKey()).remove(disclose(domain));
|
|
213
|
+
if (!domains_owned.member(disclose(new_owner))) {
|
|
214
|
+
domains_owned.insert(disclose(new_owner), default<Set<Opaque<'string'>>>);
|
|
215
|
+
}
|
|
216
|
+
domains_owned.lookup(disclose(new_owner)).insert(disclose(domain));
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
export circuit change_owner(new_owner: ZswapCoinPublicKey) : [] {
|
|
221
|
+
assert(DOMAIN_OWNER == ownPublicKey(), "Not the contract owner");
|
|
222
|
+
DOMAIN_OWNER = disclose(new_owner);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
/*
|
|
227
|
+
Read only, but not pure, so let's not use those
|
|
228
|
+
export circuit resolve(domain: Opaque<'string'>): DomainData {
|
|
229
|
+
assert(domains.member(disclose(domain)), "Domain does not exist");
|
|
230
|
+
return domains.lookup(disclose(domain));
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
export circuit get_parent_domain(): Maybe<Opaque<'string'>> {
|
|
234
|
+
return PARENT_DOMAIN;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
export circuit get_contract_owner(): ZswapCoinPublicKey {
|
|
238
|
+
return DOMAIN_OWNER;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
export circuit get_domain(): Maybe<Opaque<'string'>> {
|
|
242
|
+
return DOMAIN;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
export circuit get_domain_target(): Either<ZswapCoinPublicKey, ContractAddress> {
|
|
246
|
+
return DOMAIN_TARGET;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
export circuit get_parent_resolver(): ContractAddress {
|
|
250
|
+
return PARENT_RESOLVER;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
export circuit addr_owns_domain(addr: ZswapCoinPublicKey, domain: Opaque<'string'>): Boolean {
|
|
254
|
+
assert(domains_owned.member(disclose(addr)), "Address does not own domains in this register");
|
|
255
|
+
return domains_owned.lookup(disclose(addr)).member(disclose(domain));
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
*/
|