@midnames/sdk 0.1.3 → 0.1.5
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 +94 -26
- package/dist/core.d.ts +5 -10
- package/dist/core.js +4 -204
- package/dist/index.d.ts +3 -1
- package/dist/index.js +7 -1
- package/dist/info.d.ts +5 -0
- package/dist/info.js +5 -0
- package/dist/modules/core.d.ts +8 -0
- package/dist/modules/core.js +80 -0
- package/dist/modules/index.d.ts +3 -0
- package/dist/modules/index.js +6 -0
- package/dist/modules/info.d.ts +20 -0
- package/dist/modules/info.js +152 -0
- package/dist/provider.d.ts +11 -0
- package/dist/provider.js +26 -0
- package/dist/react/DomainProfileWidget.d.ts +1 -1
- package/dist/react/DomainProfileWidget.js +3 -2
- package/dist/react/HolographicCard.d.ts +2 -2
- package/dist/react/HolographicCard.js +3 -2
- package/dist/utils.d.ts +2 -0
- package/dist/utils.js +3 -0
- 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 +40 -10
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { getZswapNetworkId } 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
|
+
import { getProviderOrThrow } from '../provider.js';
|
|
8
|
+
import { resolveDomain, getDefaultTldAddress } from './core.js';
|
|
9
|
+
async function queryContractStateSafely(publicDataProvider, contractAddress) {
|
|
10
|
+
try {
|
|
11
|
+
const contractState = await publicDataProvider.queryContractState(contractAddress);
|
|
12
|
+
if (contractState == null) {
|
|
13
|
+
return failure(new ContractNotFoundError(contractAddress));
|
|
14
|
+
}
|
|
15
|
+
return success(contractState);
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
return failure(new ProviderError(`Failed to query contract state: ${error instanceof Error ? error.message : String(error)}`, error));
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
async function getResolverAddress(publicDataProvider, fullDomain) {
|
|
22
|
+
try {
|
|
23
|
+
const tldAddress = getDefaultTldAddress();
|
|
24
|
+
const domainParts = fullDomain.split('.');
|
|
25
|
+
const traversalParts = domainParts.slice(0, -1).reverse();
|
|
26
|
+
if (traversalParts.length === 0)
|
|
27
|
+
return success(tldAddress);
|
|
28
|
+
let currentResolver = tldAddress;
|
|
29
|
+
for (const part of traversalParts) {
|
|
30
|
+
const contractStateResult = await queryContractStateSafely(publicDataProvider, currentResolver);
|
|
31
|
+
if (!contractStateResult.success) {
|
|
32
|
+
return failure(contractStateResult.error);
|
|
33
|
+
}
|
|
34
|
+
const contractLedger = ledger(contractStateResult.data.data);
|
|
35
|
+
if (!contractLedger.domains.member(part)) {
|
|
36
|
+
return failure(new DomainNotFoundError(`${part} in ${currentResolver}`));
|
|
37
|
+
}
|
|
38
|
+
const domainData = contractLedger.domains.lookup(part);
|
|
39
|
+
const resolverBytes = domainData.resolver.bytes;
|
|
40
|
+
currentResolver = formatContractAddress(resolverBytes);
|
|
41
|
+
}
|
|
42
|
+
return success(currentResolver);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
return failure(new NetworkError(`Failed to get resolver address: ${error instanceof Error ? error.message : String(error)}`, error));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export async function getDomainInfo(contractAddress, domainName, options = {}) {
|
|
49
|
+
const publicDataProvider = getProviderOrThrow(options.provider);
|
|
50
|
+
try {
|
|
51
|
+
const contractStateResult = await queryContractStateSafely(publicDataProvider, contractAddress);
|
|
52
|
+
if (!contractStateResult.success)
|
|
53
|
+
return failure(contractStateResult.error);
|
|
54
|
+
const contractLedger = ledger(contractStateResult.data.data);
|
|
55
|
+
if (!contractLedger.domains.member(domainName)) {
|
|
56
|
+
return failure(new DomainNotFoundError(domainName));
|
|
57
|
+
}
|
|
58
|
+
const domainData = contractLedger.domains.lookup(domainName);
|
|
59
|
+
const ownerCoinPublicKey = new ShieldedCoinPublicKey(Buffer.from(domainData.owner.bytes));
|
|
60
|
+
const ownerAddress = ShieldedCoinPublicKey.codec.encode(getZswapNetworkId(), ownerCoinPublicKey).asString();
|
|
61
|
+
return success({ owner: ownerAddress, resolver: formatContractAddress(domainData.resolver.bytes) });
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
return failure(new NetworkError(`Failed to get domain info: ${error instanceof Error ? error.message : String(error)}`, error));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export async function getDomainInfoByResolving(fullDomain, options = {}) {
|
|
68
|
+
const publicDataProvider = getProviderOrThrow(options.provider);
|
|
69
|
+
try {
|
|
70
|
+
const normalizedDomain = normalizeDomain(fullDomain);
|
|
71
|
+
const parsed = parseFullDomain(normalizedDomain);
|
|
72
|
+
if (!parsed.isValid) {
|
|
73
|
+
return failure(new InvalidDomainError(fullDomain, 'Invalid domain format'));
|
|
74
|
+
}
|
|
75
|
+
const parentContractAddressResult = await getResolverAddress(publicDataProvider, parsed.parentDomainPath);
|
|
76
|
+
if (!parentContractAddressResult.success)
|
|
77
|
+
return failure(parentContractAddressResult.error);
|
|
78
|
+
const infoResult = await getDomainInfo(parentContractAddressResult.data, parsed.domainName, { provider: publicDataProvider });
|
|
79
|
+
if (!infoResult.success)
|
|
80
|
+
return failure(infoResult.error);
|
|
81
|
+
return success({ ...infoResult.data, contractAddress: parentContractAddressResult.data });
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
return failure(new NetworkError(`Failed to get domain info by resolving: ${error instanceof Error ? error.message : String(error)}`, error));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
export async function getDomainFields(contractAddress, options = {}) {
|
|
88
|
+
const publicDataProvider = getProviderOrThrow(options.provider);
|
|
89
|
+
try {
|
|
90
|
+
const contractStateResult = await queryContractStateSafely(publicDataProvider, contractAddress);
|
|
91
|
+
if (!contractStateResult.success)
|
|
92
|
+
return failure(contractStateResult.error);
|
|
93
|
+
const contractLedger = ledger(contractStateResult.data.data);
|
|
94
|
+
const fields = [];
|
|
95
|
+
for (const [key, value] of contractLedger.fields)
|
|
96
|
+
fields.push([key, value]);
|
|
97
|
+
return success(fields);
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
return failure(new NetworkError(`Failed to get domain fields: ${error instanceof Error ? error.message : String(error)}`, error));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
export async function getNamespacedDomainFields(_parentContractAddress, fullDomainName, options = {}) {
|
|
104
|
+
const publicDataProvider = getProviderOrThrow(options.provider);
|
|
105
|
+
try {
|
|
106
|
+
const domainContractAddressResult = await getResolverAddress(publicDataProvider, fullDomainName);
|
|
107
|
+
if (!domainContractAddressResult.success)
|
|
108
|
+
return failure(domainContractAddressResult.error);
|
|
109
|
+
return await getDomainFields(domainContractAddressResult.data, { provider: publicDataProvider });
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
return failure(new NetworkError(`Failed to get namespaced domain fields: ${error instanceof Error ? error.message : String(error)}`, error));
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
export async function getDomainSettings(contractAddress, options = {}) {
|
|
116
|
+
const publicDataProvider = getProviderOrThrow(options.provider);
|
|
117
|
+
try {
|
|
118
|
+
const contractStateResult = await queryContractStateSafely(publicDataProvider, contractAddress);
|
|
119
|
+
if (!contractStateResult.success)
|
|
120
|
+
return failure(contractStateResult.error);
|
|
121
|
+
const contractLedger = ledger(contractStateResult.data.data);
|
|
122
|
+
return success({ coinColor: contractLedger.COIN_COLOR, domainCost: contractLedger.DOMAIN_COST });
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
return failure(new NetworkError(`Failed to get domain settings: ${error instanceof Error ? error.message : String(error)}`, error));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
export async function getDomainProfile(fullDomain, options = {}) {
|
|
129
|
+
const publicDataProvider = getProviderOrThrow(options.provider);
|
|
130
|
+
try {
|
|
131
|
+
const normalized = normalizeDomain(fullDomain);
|
|
132
|
+
const [resolvedTargetResult, infoResult] = await Promise.all([
|
|
133
|
+
resolveDomain(normalized, { provider: publicDataProvider }),
|
|
134
|
+
getDomainInfoByResolving(normalized, { provider: publicDataProvider })
|
|
135
|
+
]);
|
|
136
|
+
const resolvedTarget = resolvedTargetResult.success ? resolvedTargetResult.data : null;
|
|
137
|
+
const info = infoResult.success ? infoResult.data : null;
|
|
138
|
+
if (info && info.contractAddress) {
|
|
139
|
+
const [fieldsResult, settingsResult] = await Promise.all([
|
|
140
|
+
getNamespacedDomainFields(info.contractAddress, normalized, { provider: publicDataProvider }),
|
|
141
|
+
getDomainSettings(info.resolver, { provider: publicDataProvider })
|
|
142
|
+
]);
|
|
143
|
+
const fields = fieldsResult.success ? fieldsResult.data : [];
|
|
144
|
+
const settings = settingsResult.success ? settingsResult.data : null;
|
|
145
|
+
return success({ fullDomain: normalized, resolvedTarget, info, fields, settings });
|
|
146
|
+
}
|
|
147
|
+
return success({ fullDomain: normalized, resolvedTarget, info, fields: [], settings: null });
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
return failure(new NetworkError(`Failed to get domain profile: ${error instanceof Error ? error.message : String(error)}`, error));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { PublicDataProvider } from '@midnight-ntwrk/midnight-js-types';
|
|
2
|
+
import { NetworkId } from '@midnight-ntwrk/midnight-js-network-id';
|
|
3
|
+
export interface ProviderConfig {
|
|
4
|
+
indexerUrl?: string;
|
|
5
|
+
indexerWsUrl?: string;
|
|
6
|
+
networkId?: NetworkId;
|
|
7
|
+
}
|
|
8
|
+
export declare function setupDefaultProvider(config?: ProviderConfig): PublicDataProvider;
|
|
9
|
+
export declare function setDefaultProvider(provider: PublicDataProvider): void;
|
|
10
|
+
export declare function getDefaultProvider(): PublicDataProvider | null;
|
|
11
|
+
export declare function getProviderOrThrow(provider?: PublicDataProvider): PublicDataProvider;
|
package/dist/provider.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { setNetworkId, NetworkId } from '@midnight-ntwrk/midnight-js-network-id';
|
|
2
|
+
import { indexerPublicDataProvider } from '@midnight-ntwrk/midnight-js-indexer-public-data-provider';
|
|
3
|
+
let defaultProvider = null;
|
|
4
|
+
export function setupDefaultProvider(config = {}) {
|
|
5
|
+
const { indexerUrl = "https://indexer.testnet-02.midnight.network/api/v1/graphql", indexerWsUrl = "wss://indexer.testnet-02.midnight.network/api/v1/graphql/ws", networkId = NetworkId.TestNet } = config;
|
|
6
|
+
// Set network ID globally
|
|
7
|
+
setNetworkId(networkId);
|
|
8
|
+
// Create the provider with testnet defaults
|
|
9
|
+
const provider = indexerPublicDataProvider(indexerUrl, indexerWsUrl);
|
|
10
|
+
// Set it as the default
|
|
11
|
+
setDefaultProvider(provider);
|
|
12
|
+
return provider;
|
|
13
|
+
}
|
|
14
|
+
export function setDefaultProvider(provider) {
|
|
15
|
+
defaultProvider = provider;
|
|
16
|
+
}
|
|
17
|
+
export function getDefaultProvider() {
|
|
18
|
+
return defaultProvider;
|
|
19
|
+
}
|
|
20
|
+
export function getProviderOrThrow(provider) {
|
|
21
|
+
if (provider)
|
|
22
|
+
return provider;
|
|
23
|
+
if (defaultProvider)
|
|
24
|
+
return defaultProvider;
|
|
25
|
+
throw new Error('No provider specified. Either pass a provider parameter or set a default provider using setDefaultProvider().');
|
|
26
|
+
}
|
|
@@ -4,7 +4,7 @@ import type { DomainProfileData } from '../types.js';
|
|
|
4
4
|
import { MidNamesError } from '../types.js';
|
|
5
5
|
export type DomainProfileWidgetProps = {
|
|
6
6
|
fullDomain: string;
|
|
7
|
-
publicDataProvider
|
|
7
|
+
publicDataProvider?: PublicDataProvider;
|
|
8
8
|
className?: string;
|
|
9
9
|
showStatus?: boolean;
|
|
10
10
|
onError?: (error: MidNamesError) => void;
|
|
@@ -3,7 +3,8 @@ import { useEffect, useMemo, useState } from 'react';
|
|
|
3
3
|
import { MidNamesError } from '../types.js';
|
|
4
4
|
import { deriveShieldedAddress } from '../utils/address.js';
|
|
5
5
|
import { Copy, Check } from 'lucide-react';
|
|
6
|
-
import { getDomainProfile } from '../
|
|
6
|
+
import { getDomainProfile } from '../modules/index.js';
|
|
7
|
+
import { getProviderOrThrow } from '../provider.js';
|
|
7
8
|
function truncate(addr, head = 10, tail = 6) {
|
|
8
9
|
if (!addr)
|
|
9
10
|
return 'N/A';
|
|
@@ -60,7 +61,7 @@ onFieldClick, onCopySuccess, }) {
|
|
|
60
61
|
let mounted = true;
|
|
61
62
|
setLoading(true);
|
|
62
63
|
setError(null);
|
|
63
|
-
getDomainProfile(
|
|
64
|
+
getDomainProfile(fullDomain, { provider: getProviderOrThrow(publicDataProvider) })
|
|
64
65
|
.then((d) => {
|
|
65
66
|
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
66
67
|
if (mounted) {
|
|
@@ -7,8 +7,8 @@ import { MidNamesError } from '../types.js';
|
|
|
7
7
|
export interface HolographicCardProps {
|
|
8
8
|
/** Domain name to resolve and display */
|
|
9
9
|
domain: string;
|
|
10
|
-
/** Public data provider for fetching domain information */
|
|
11
|
-
publicDataProvider
|
|
10
|
+
/** Public data provider for fetching domain information (optional if default provider is set) */
|
|
11
|
+
publicDataProvider?: PublicDataProvider;
|
|
12
12
|
/** Custom CSS gradient string for the background gradient effect */
|
|
13
13
|
behindGradient?: string;
|
|
14
14
|
/** Custom CSS gradient string for the inner card gradient */
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import React, { useEffect, useRef, useCallback, useMemo, useState } from 'react';
|
|
3
3
|
import { MidNamesError } from '../types.js';
|
|
4
|
-
import { getDomainProfile } from '../
|
|
4
|
+
import { getDomainProfile } from '../modules/index.js';
|
|
5
|
+
import { getProviderOrThrow } from '../provider.js';
|
|
5
6
|
const DEFAULT_BEHIND_GRADIENT = 'radial-gradient(farthest-side circle at var(--midnames-holo-pointer-x) var(--midnames-holo-pointer-y),hsla(266,100%,90%,var(--midnames-holo-card-opacity)) 4%,hsla(266,50%,80%,calc(var(--midnames-holo-card-opacity)*0.75)) 10%,hsla(266,25%,70%,calc(var(--midnames-holo-card-opacity)*0.5)) 50%,hsla(266,0%,60%,0) 100%),radial-gradient(35% 52% at 55% 20%,#00ffaac4 0%,#073aff00 100%),radial-gradient(100% 100% at 50% 50%,#00c1ffff 1%,#073aff00 76%),conic-gradient(from 124deg at 50% 50%,#c137ffff 0%,#07c6ffff 40%,#07c6ffff 60%,#c137ffff 100%)';
|
|
6
7
|
const DEFAULT_INNER_GRADIENT = 'linear-gradient(145deg,#60496e8c 0%,#71C4FF44 100%)';
|
|
7
8
|
const ANIMATION_CONFIG = {
|
|
@@ -28,7 +29,7 @@ const HolographicCardComponent = ({ domain, publicDataProvider, behindGradient,
|
|
|
28
29
|
let mounted = true;
|
|
29
30
|
setLoading(true);
|
|
30
31
|
setError(null);
|
|
31
|
-
getDomainProfile(
|
|
32
|
+
getDomainProfile(domain, { provider: getProviderOrThrow(publicDataProvider) })
|
|
32
33
|
.then((result) => {
|
|
33
34
|
var _a, _b, _c, _d;
|
|
34
35
|
if (mounted) {
|
package/dist/utils.d.ts
ADDED
package/dist/utils.js
ADDED
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
|
+
*/
|