@midnames/sdk 1.0.6 → 2.0.0-rc2

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.
Files changed (142) hide show
  1. package/README.md +4 -43
  2. package/dist/contract.d.ts +5 -0
  3. package/dist/contract.js +5 -0
  4. package/dist/core.d.ts +27 -9
  5. package/dist/core.js +196 -233
  6. package/dist/errors.d.ts +0 -3
  7. package/dist/errors.js +9 -17
  8. package/dist/holographic-card.css +1 -1
  9. package/dist/index.d.ts +10 -10
  10. package/dist/index.js +15 -11
  11. package/{node_modules/@midnames/ns/dist/managed/leaf → dist/managed}/compiler/contract-info.json +298 -232
  12. package/dist/managed/contract/index.d.ts +237 -0
  13. package/{node_modules/@midnames/ns/dist/managed/leaf → dist/managed}/contract/index.js +2044 -1713
  14. package/dist/managed/keys/add_domain_field.prover +0 -0
  15. package/dist/managed/keys/add_multiple_fields.prover +0 -0
  16. package/dist/managed/keys/change_field_limit.prover +0 -0
  17. package/dist/managed/keys/change_root_enable_subdomains.prover +0 -0
  18. package/dist/managed/keys/clear_domain_fields.prover +0 -0
  19. package/dist/managed/keys/create_domain.prover +0 -0
  20. package/dist/managed/keys/lock_payment_config.prover +0 -0
  21. package/dist/managed/keys/lock_target.prover +0 -0
  22. package/dist/managed/keys/remove_domain_field.prover +0 -0
  23. package/dist/managed/keys/transfer_domain.prover +0 -0
  24. package/dist/managed/keys/update_domain_default_field.prover +0 -0
  25. package/dist/managed/keys/update_payment_config.prover +0 -0
  26. package/dist/managed/keys/update_target.prover +0 -0
  27. package/dist/operations.d.ts +32 -20
  28. package/dist/operations.js +86 -103
  29. package/dist/provider.d.ts +6 -7
  30. package/dist/provider.js +11 -7
  31. package/dist/react/DomainProfileWidget.d.ts +1 -1
  32. package/dist/react/DomainProfileWidget.js +14 -36
  33. package/dist/react/HolographicCard.d.ts +1 -17
  34. package/dist/react/HolographicCard.js +1 -6
  35. package/dist/results.d.ts +0 -25
  36. package/dist/results.js +2 -75
  37. package/dist/styles.css +0 -1
  38. package/dist/types.d.ts +19 -4
  39. package/dist/types.js +1 -2
  40. package/dist/utils/address.d.ts +6 -1
  41. package/dist/utils/address.js +23 -6
  42. package/dist/utils/domain.d.ts +0 -4
  43. package/dist/utils/domain.js +15 -40
  44. package/dist/utils/sanitize.js +0 -4
  45. package/dist/witnesses.d.ts +8 -0
  46. package/dist/witnesses.js +6 -0
  47. package/package.json +47 -83
  48. package/dist/controller-types.d.ts +0 -108
  49. package/dist/controller-types.js +0 -17
  50. package/dist/controller-types.js.map +0 -1
  51. package/dist/core.js.map +0 -1
  52. package/dist/errors.js.map +0 -1
  53. package/dist/index.js.map +0 -1
  54. package/dist/operations.js.map +0 -1
  55. package/dist/provider.js.map +0 -1
  56. package/dist/react/DomainProfileWidget/index.d.ts +0 -2
  57. package/dist/react/DomainProfileWidget/index.js +0 -2
  58. package/dist/react/DomainProfileWidget/index.js.map +0 -1
  59. package/dist/react/DomainProfileWidget.js.map +0 -1
  60. package/dist/react/HolographicCard/index.d.ts +0 -3
  61. package/dist/react/HolographicCard/index.js +0 -3
  62. package/dist/react/HolographicCard/index.js.map +0 -1
  63. package/dist/react/HolographicCard.js.map +0 -1
  64. package/dist/react/index.d.ts +0 -3
  65. package/dist/react/index.js +0 -3
  66. package/dist/react/index.js.map +0 -1
  67. package/dist/results.js.map +0 -1
  68. package/dist/types.js.map +0 -1
  69. package/dist/utils/address.js.map +0 -1
  70. package/dist/utils/domain.js.map +0 -1
  71. package/dist/utils/imageResolver.d.ts +0 -8
  72. package/dist/utils/imageResolver.js +0 -90
  73. package/dist/utils/imageResolver.js.map +0 -1
  74. package/dist/utils/index.d.ts +0 -2
  75. package/dist/utils/index.js +0 -3
  76. package/dist/utils/index.js.map +0 -1
  77. package/dist/utils/sanitize.js.map +0 -1
  78. package/node_modules/@midnames/ns/dist/index.d.ts +0 -5
  79. package/node_modules/@midnames/ns/dist/index.js +0 -6
  80. package/node_modules/@midnames/ns/dist/index.js.map +0 -1
  81. package/node_modules/@midnames/ns/dist/leaf.compact +0 -290
  82. package/node_modules/@midnames/ns/dist/managed/leaf/contract/index.d.ts +0 -197
  83. package/node_modules/@midnames/ns/dist/managed/leaf/contract/index.js.map +0 -8
  84. package/node_modules/@midnames/ns/dist/managed/leaf/keys/add_multiple_fields.prover +0 -0
  85. package/node_modules/@midnames/ns/dist/managed/leaf/keys/add_multiple_fields.verifier +0 -0
  86. package/node_modules/@midnames/ns/dist/managed/leaf/keys/buy_domain_for.prover +0 -0
  87. package/node_modules/@midnames/ns/dist/managed/leaf/keys/buy_domain_for.verifier +0 -0
  88. package/node_modules/@midnames/ns/dist/managed/leaf/keys/change_owner.prover +0 -0
  89. package/node_modules/@midnames/ns/dist/managed/leaf/keys/change_owner.verifier +0 -0
  90. package/node_modules/@midnames/ns/dist/managed/leaf/keys/clear_all_fields.prover +0 -0
  91. package/node_modules/@midnames/ns/dist/managed/leaf/keys/clear_all_fields.verifier +0 -0
  92. package/node_modules/@midnames/ns/dist/managed/leaf/keys/clear_field.prover +0 -0
  93. package/node_modules/@midnames/ns/dist/managed/leaf/keys/clear_field.verifier +0 -0
  94. package/node_modules/@midnames/ns/dist/managed/leaf/keys/insert_field.prover +0 -0
  95. package/node_modules/@midnames/ns/dist/managed/leaf/keys/insert_field.verifier +0 -0
  96. package/node_modules/@midnames/ns/dist/managed/leaf/keys/register_domain_for.prover +0 -0
  97. package/node_modules/@midnames/ns/dist/managed/leaf/keys/register_domain_for.verifier +0 -0
  98. package/node_modules/@midnames/ns/dist/managed/leaf/keys/set_resolver.prover +0 -0
  99. package/node_modules/@midnames/ns/dist/managed/leaf/keys/set_resolver.verifier +0 -0
  100. package/node_modules/@midnames/ns/dist/managed/leaf/keys/transfer_domain.prover +0 -0
  101. package/node_modules/@midnames/ns/dist/managed/leaf/keys/transfer_domain.verifier +0 -0
  102. package/node_modules/@midnames/ns/dist/managed/leaf/keys/update_color.prover +0 -0
  103. package/node_modules/@midnames/ns/dist/managed/leaf/keys/update_color.verifier +0 -0
  104. package/node_modules/@midnames/ns/dist/managed/leaf/keys/update_costs.prover +0 -0
  105. package/node_modules/@midnames/ns/dist/managed/leaf/keys/update_costs.verifier +0 -0
  106. package/node_modules/@midnames/ns/dist/managed/leaf/keys/update_domain_target.prover +0 -0
  107. package/node_modules/@midnames/ns/dist/managed/leaf/keys/update_domain_target.verifier +0 -0
  108. package/node_modules/@midnames/ns/dist/managed/leaf/keys/update_target_and_fields.prover +0 -0
  109. package/node_modules/@midnames/ns/dist/managed/leaf/keys/update_target_and_fields.verifier +0 -0
  110. package/node_modules/@midnames/ns/dist/managed/leaf/zkir/add_multiple_fields.bzkir +0 -0
  111. package/node_modules/@midnames/ns/dist/managed/leaf/zkir/add_multiple_fields.zkir +0 -424
  112. package/node_modules/@midnames/ns/dist/managed/leaf/zkir/buy_domain_for.bzkir +0 -0
  113. package/node_modules/@midnames/ns/dist/managed/leaf/zkir/buy_domain_for.zkir +0 -1456
  114. package/node_modules/@midnames/ns/dist/managed/leaf/zkir/change_owner.bzkir +0 -0
  115. package/node_modules/@midnames/ns/dist/managed/leaf/zkir/change_owner.zkir +0 -57
  116. package/node_modules/@midnames/ns/dist/managed/leaf/zkir/clear_all_fields.bzkir +0 -0
  117. package/node_modules/@midnames/ns/dist/managed/leaf/zkir/clear_all_fields.zkir +0 -53
  118. package/node_modules/@midnames/ns/dist/managed/leaf/zkir/clear_field.bzkir +0 -0
  119. package/node_modules/@midnames/ns/dist/managed/leaf/zkir/clear_field.zkir +0 -58
  120. package/node_modules/@midnames/ns/dist/managed/leaf/zkir/insert_field.bzkir +0 -0
  121. package/node_modules/@midnames/ns/dist/managed/leaf/zkir/insert_field.zkir +0 -65
  122. package/node_modules/@midnames/ns/dist/managed/leaf/zkir/register_domain_for.bzkir +0 -0
  123. package/node_modules/@midnames/ns/dist/managed/leaf/zkir/register_domain_for.zkir +0 -401
  124. package/node_modules/@midnames/ns/dist/managed/leaf/zkir/set_resolver.bzkir +0 -0
  125. package/node_modules/@midnames/ns/dist/managed/leaf/zkir/set_resolver.zkir +0 -109
  126. package/node_modules/@midnames/ns/dist/managed/leaf/zkir/transfer_domain.bzkir +0 -0
  127. package/node_modules/@midnames/ns/dist/managed/leaf/zkir/transfer_domain.zkir +0 -212
  128. package/node_modules/@midnames/ns/dist/managed/leaf/zkir/update_color.bzkir +0 -0
  129. package/node_modules/@midnames/ns/dist/managed/leaf/zkir/update_color.zkir +0 -58
  130. package/node_modules/@midnames/ns/dist/managed/leaf/zkir/update_costs.bzkir +0 -0
  131. package/node_modules/@midnames/ns/dist/managed/leaf/zkir/update_costs.zkir +0 -88
  132. package/node_modules/@midnames/ns/dist/managed/leaf/zkir/update_domain_target.bzkir +0 -0
  133. package/node_modules/@midnames/ns/dist/managed/leaf/zkir/update_domain_target.zkir +0 -66
  134. package/node_modules/@midnames/ns/dist/managed/leaf/zkir/update_target_and_fields.bzkir +0 -0
  135. package/node_modules/@midnames/ns/dist/managed/leaf/zkir/update_target_and_fields.zkir +0 -450
  136. package/node_modules/@midnames/ns/dist/utils.d.ts +0 -5
  137. package/node_modules/@midnames/ns/dist/utils.js +0 -19
  138. package/node_modules/@midnames/ns/dist/utils.js.map +0 -1
  139. package/node_modules/@midnames/ns/dist/witnesses.d.ts +0 -4
  140. package/node_modules/@midnames/ns/dist/witnesses.js +0 -3
  141. package/node_modules/@midnames/ns/dist/witnesses.js.map +0 -1
  142. package/node_modules/@midnames/ns/package.json +0 -55
@@ -1,49 +1,61 @@
1
1
  import { CompiledContract } from "@midnight-ntwrk/compact-js";
2
2
  import { type ContractProviders } from "@midnight-ntwrk/midnight-js-contracts";
3
- import { Leaf } from "@midnames/ns";
4
- import type { Result } from "./results.js";
5
- export declare const leafContractInstance: CompiledContract.CompiledContract<Leaf.Contract<any, any>, any, never>;
6
- export declare function buildKvs(fields: Array<[string, string]>): Array<{
3
+ import { NS } from "./contract.js";
4
+ import type { DomainTarget } from "./types.js";
5
+ import type { PaymentConfig } from "./managed/contract/index.js";
6
+ import { type Result } from "./results.js";
7
+ export declare const nsContractInstance: CompiledContract.CompiledContract<NS.Contract<any, any>, any, never>;
8
+ export interface OperationOptions {
9
+ contractAddress?: string;
10
+ secretKey?: string;
11
+ }
12
+ export declare function buildKvs(fields: Array<[string, string]>, size?: number): Array<{
7
13
  is_some: boolean;
8
14
  value: [string, string];
9
15
  }>;
10
- export declare function insertField(domain: string, key: string, value: string, providers: ContractProviders<Leaf.Contract>): Promise<Result<{
16
+ export declare function createDomain(domainName: string, parentId: bigint, ownerAddress: {
17
+ bytes: Uint8Array;
18
+ }, target: DomainTarget, paymentConfig: PaymentConfig, providers: ContractProviders<NS.Contract>, options?: OperationOptions & {
19
+ fields?: Array<[string, string]>;
20
+ defaultField?: string;
21
+ }): Promise<Result<{
11
22
  transactionId: string;
12
23
  }>>;
13
- export declare function clearField(domain: string, key: string, providers: ContractProviders<Leaf.Contract>): Promise<Result<{
24
+ export declare function transferDomain(domainName: string, parentId: bigint, newOwner: Uint8Array, newOwnerAddress: {
25
+ bytes: Uint8Array;
26
+ }, providers: ContractProviders<NS.Contract>, options?: OperationOptions): Promise<Result<{
14
27
  transactionId: string;
15
28
  }>>;
16
- export declare function clearAllFields(domain: string, providers: ContractProviders<Leaf.Contract>): Promise<Result<{
29
+ export declare function addDomainField(domainId: bigint, key: string, value: string, providers: ContractProviders<NS.Contract>, options?: OperationOptions): Promise<Result<{
17
30
  transactionId: string;
18
31
  }>>;
19
- export declare function addMultipleFields(domain: string, fields: Array<[string, string]>, providers: ContractProviders<Leaf.Contract>): Promise<Result<{
32
+ export declare function addMultipleFields(domainId: bigint, fields: Array<[string, string]>, providers: ContractProviders<NS.Contract>, options?: OperationOptions): Promise<Result<{
20
33
  transactionId: string;
21
34
  }>>;
22
- export declare function updateDomainTarget(domain: string, targetAddress: string, providers: ContractProviders<Leaf.Contract>): Promise<Result<{
35
+ export declare function removeDomainField(domainId: bigint, key: string, providers: ContractProviders<NS.Contract>, options?: OperationOptions): Promise<Result<{
23
36
  transactionId: string;
24
37
  }>>;
25
- export declare function updateDomainColor(domain: string, color: Uint8Array, providers: ContractProviders<Leaf.Contract>): Promise<Result<{
38
+ export declare function clearDomainFields(domainId: bigint, providers: ContractProviders<NS.Contract>, options?: OperationOptions): Promise<Result<{
26
39
  transactionId: string;
27
40
  }>>;
28
- export declare function updateDomainCosts(domain: string, costs: {
29
- short: bigint;
30
- medium: bigint;
31
- long: bigint;
32
- }, providers: ContractProviders<Leaf.Contract>): Promise<Result<{
41
+ export declare function updateDefaultField(domainId: bigint, field: string | null, providers: ContractProviders<NS.Contract>, options?: OperationOptions): Promise<Result<{
33
42
  transactionId: string;
34
43
  }>>;
35
- export declare function transferDomainOwnership(parentDomain: string, subdomainName: string, newOwnerAddress: string, providers: ContractProviders<Leaf.Contract>): Promise<Result<{
44
+ export declare function updateDomainTarget(domainId: bigint, target: DomainTarget, providers: ContractProviders<NS.Contract>, options?: OperationOptions): Promise<Result<{
36
45
  transactionId: string;
37
46
  }>>;
38
- export declare function setDomainResolver(parentDomain: string, subdomainName: string, resolverAddress: string, providers: ContractProviders<Leaf.Contract>): Promise<Result<{
47
+ export declare function updatePaymentConfig(domainId: bigint, config: PaymentConfig, providers: ContractProviders<NS.Contract>, options?: OperationOptions): Promise<Result<{
39
48
  transactionId: string;
40
49
  }>>;
41
- export declare function registerDomainFor(parentDomain: string, ownerAddress: string, subdomainName: string, resolverAddress: string, providers: ContractProviders<Leaf.Contract>): Promise<Result<{
50
+ export declare function changeRootEnableSubdomains(enabled: boolean, providers: ContractProviders<NS.Contract>, options?: OperationOptions): Promise<Result<{
42
51
  transactionId: string;
43
52
  }>>;
44
- export declare function buyDomainFor(parentDomain: string, ownerAddress: string, subdomainName: string, resolverAddress: string, _paymentAmount: bigint, providers: ContractProviders<Leaf.Contract>): Promise<Result<{
53
+ export declare function changeFieldLimit(limit: bigint | null, providers: ContractProviders<NS.Contract>, options?: OperationOptions): Promise<Result<{
45
54
  transactionId: string;
46
55
  }>>;
47
- export declare function changeDomainOwner(domain: string, newOwnerAddress: string, providers: ContractProviders<Leaf.Contract>): Promise<Result<{
56
+ export declare function lockTarget(domainId: bigint, providers: ContractProviders<NS.Contract>, options?: OperationOptions): Promise<Result<{
57
+ transactionId: string;
58
+ }>>;
59
+ export declare function lockPaymentConfig(domainId: bigint, providers: ContractProviders<NS.Contract>, options?: OperationOptions): Promise<Result<{
48
60
  transactionId: string;
49
61
  }>>;
@@ -1,47 +1,33 @@
1
1
  import { CompiledContract } from "@midnight-ntwrk/compact-js";
2
2
  import { findDeployedContract, } from "@midnight-ntwrk/midnight-js-contracts";
3
- import { ShieldedCoinPublicKey, MidnightBech32m, } from "@midnight-ntwrk/wallet-sdk-address-format";
4
- import { isWalletAddress } from "./utils/address.js";
5
3
  import { getNetworkId } from "@midnight-ntwrk/midnight-js-network-id";
6
- import { Leaf, MANAGED_DIR } from "@midnames/ns";
4
+ import { NS, MANAGED_DIR, witnesses, AddressType } from "./contract.js";
7
5
  import { success, failure } from "./results.js";
8
- import { NetworkError, InvalidDomainError } from "./errors.js";
9
- import { normalizeDomain, parseFullDomain, domainToKey } from "./utils/domain.js";
10
- import { getDomainInfo } from "./core.js";
11
- function validateDomain(domain) {
12
- const normalized = normalizeDomain(domain);
13
- const parsed = parseFullDomain(normalized);
14
- if (!parsed.isValid) {
15
- return failure(new InvalidDomainError(domain, "Invalid domain format"));
16
- }
17
- return success(normalized);
18
- }
19
- // Contract types and instances
20
- export const leafContractInstance = CompiledContract.make("leaf-contract", Leaf.Contract).pipe(CompiledContract.withVacantWitnesses, CompiledContract.withCompiledFileAssets(MANAGED_DIR));
21
- async function joinLeafContract(providers, contractAddress) {
6
+ import { NetworkError } from "./errors.js";
7
+ import { domainToKey } from "./utils/domain.js";
8
+ import { parseAddressToBytes } from "./utils/address.js";
9
+ import { getNetworkConfig } from "./provider.js";
10
+ // ---- Contract instance ----
11
+ export const nsContractInstance = CompiledContract.make("ns-contract", NS.Contract).pipe(CompiledContract.withWitnesses(witnesses), CompiledContract.withCompiledFileAssets(MANAGED_DIR));
12
+ function getDefaultContractAddress() {
13
+ const currentNetwork = getNetworkId();
14
+ return getNetworkConfig(currentNetwork).contractAddress;
15
+ }
16
+ async function joinNsContract(providers, contractAddress, secretKey) {
17
+ const initialPrivateState = secretKey
18
+ ? { secretKey }
19
+ : { phantom: false };
22
20
  return await findDeployedContract(providers, {
23
- contractAddress,
24
- compiledContract: leafContractInstance,
25
- privateStateId: "namespacePrivateState",
26
- initialPrivateState: { phantom: false },
21
+ contractAddress: contractAddress ?? getDefaultContractAddress(),
22
+ compiledContract: nsContractInstance,
23
+ privateStateId: "nsPrivateState",
24
+ initialPrivateState,
27
25
  });
28
26
  }
29
- // --- Shared helpers ---
30
- async function withLeafContract(domain, providers, label, fn) {
31
- const validated = validateDomain(domain);
32
- if (!validated.success)
33
- return failure(validated.error);
27
+ async function withContract(providers, label, fn, options) {
34
28
  try {
35
- const domainInfoResult = await getDomainInfo(validated.data, {
36
- provider: providers.publicDataProvider,
37
- });
38
- if (!domainInfoResult.success) {
39
- return failure(domainInfoResult.error);
40
- }
41
- const contractAddress = domainInfoResult.data.resolver;
42
- const contract = await joinLeafContract(providers, contractAddress);
43
- const result = await fn(contract, domainInfoResult.data);
44
- return success(result);
29
+ const contract = await joinNsContract(providers, options?.contractAddress, options?.secretKey);
30
+ return success(await fn(contract));
45
31
  }
46
32
  catch (error) {
47
33
  return failure(new NetworkError(`Failed to ${label}: ${error instanceof Error ? error.message : String(error)}`, error));
@@ -50,89 +36,86 @@ async function withLeafContract(domain, providers, label, fn) {
50
36
  function txId(result) {
51
37
  return { transactionId: result.public.txId };
52
38
  }
53
- export function buildKvs(fields) {
54
- return Array.from({ length: 10 }, (_, i) => ({
39
+ function targetToContractArgs(target) {
40
+ const parsed = parseAddressToBytes(target.address);
41
+ switch (target.type) {
42
+ case "contract":
43
+ return { targetBytes: parsed.bytes, targetType: AddressType.ContractAddr };
44
+ case "shielded":
45
+ return { targetBytes: parsed.bytes, targetType: AddressType.ZswapCPKAddr };
46
+ case "unshielded":
47
+ return { targetBytes: parsed.bytes, targetType: AddressType.UnshieldedAddr };
48
+ }
49
+ }
50
+ export function buildKvs(fields, size = 10) {
51
+ return Array.from({ length: size }, (_, i) => ({
55
52
  is_some: i < fields.length,
56
53
  value: i < fields.length ? fields[i] : ["", ""],
57
54
  }));
58
55
  }
59
- function parseAddressToBytes(address) {
60
- if (isWalletAddress(address)) {
61
- const bech32Parsed = MidnightBech32m.parse(address);
62
- const coinPublicKey = ShieldedCoinPublicKey.codec.decode(getNetworkId(), bech32Parsed);
63
- return { bytes: new Uint8Array(coinPublicKey.data) };
64
- }
65
- else {
66
- let hexString = address;
67
- if (address.startsWith("0200")) {
68
- hexString = address.slice(4);
69
- }
70
- const bytes = new Uint8Array(Buffer.from(hexString, "hex"));
71
- return { bytes: bytes.length === 32 ? bytes : bytes.subarray(-32) };
72
- }
73
- }
74
- function formatTargetForContract(address) {
75
- const parsed = parseAddressToBytes(address);
76
- const isLeft = isWalletAddress(address);
77
- return {
78
- is_left: isLeft,
79
- left: isLeft ? parsed : { bytes: new Uint8Array(32) },
80
- right: isLeft ? { bytes: new Uint8Array(32) } : parsed,
81
- };
82
- }
83
- // --- Domain operations ---
84
- export async function insertField(domain, key, value, providers) {
85
- return withLeafContract(domain, providers, "insert field", async (contract) => txId(await contract.callTx.insert_field(key, value)));
86
- }
87
- export async function clearField(domain, key, providers) {
88
- return withLeafContract(domain, providers, "clear field", async (contract) => txId(await contract.callTx.clear_field(key)));
89
- }
90
- export async function clearAllFields(domain, providers) {
91
- return withLeafContract(domain, providers, "clear all fields", async (contract) => txId(await contract.callTx.clear_all_fields()));
92
- }
93
- export async function addMultipleFields(domain, fields, providers) {
56
+ // ---- Domain creation ----
57
+ export async function createDomain(domainName, parentId, ownerAddress, target, paymentConfig, providers, options) {
58
+ const { key, len } = domainToKey(domainName);
59
+ const { targetBytes, targetType } = targetToContractArgs(target);
60
+ const kvs = buildKvs(options?.fields ?? [], 10);
61
+ const defaultField = options?.defaultField
62
+ ? { is_some: true, value: options.defaultField }
63
+ : { is_some: false, value: "" };
64
+ return withContract(providers, "create domain", async (contract) => txId(await contract.callTx.create_domain(ownerAddress, key, len, parentId, targetBytes, targetType, defaultField, paymentConfig, kvs)), options);
65
+ }
66
+ // ---- Domain updates ----
67
+ export async function transferDomain(domainName, parentId, newOwner, newOwnerAddress, providers, options) {
68
+ const { key } = domainToKey(domainName);
69
+ return withContract(providers, "transfer domain", async (contract) => txId(await contract.callTx.transfer_domain(key, parentId, newOwner, newOwnerAddress)), options);
70
+ }
71
+ // ---- Field operations ----
72
+ export async function addDomainField(domainId, key, value, providers, options) {
73
+ return withContract(providers, "add domain field", async (contract) => txId(await contract.callTx.add_domain_field(domainId, key, value)), options);
74
+ }
75
+ export async function addMultipleFields(domainId, fields, providers, options) {
94
76
  if (fields.length === 0) {
95
77
  return failure(new NetworkError("No fields provided"));
96
78
  }
97
79
  if (fields.length > 10) {
98
80
  return failure(new NetworkError("Maximum of 10 fields can be added at once"));
99
81
  }
100
- return withLeafContract(domain, providers, "add multiple fields", async (contract) => txId(await contract.callTx.add_multiple_fields(buildKvs(fields))));
82
+ const kvs = buildKvs(fields, 10);
83
+ return withContract(providers, "add multiple fields", async (contract) => txId(await contract.callTx.add_multiple_fields(domainId, kvs)), options);
101
84
  }
102
- export async function updateDomainTarget(domain, targetAddress, providers) {
103
- return withLeafContract(domain, providers, "update domain target", async (contract) => txId(await contract.callTx.update_domain_target(formatTargetForContract(targetAddress))));
85
+ export async function removeDomainField(domainId, key, providers, options) {
86
+ return withContract(providers, "remove domain field", async (contract) => txId(await contract.callTx.remove_domain_field(domainId, key)), options);
104
87
  }
105
- export async function updateDomainColor(domain, color, providers) {
106
- if (color.length !== 32) {
107
- return failure(new NetworkError("Color must be exactly 32 bytes"));
108
- }
109
- return withLeafContract(domain, providers, "update domain color", async (contract) => txId(await contract.callTx.update_color(color)));
88
+ export async function clearDomainFields(domainId, providers, options) {
89
+ return withContract(providers, "clear domain fields", async (contract) => txId(await contract.callTx.clear_domain_fields(domainId)), options);
110
90
  }
111
- export async function updateDomainCosts(domain, costs, providers) {
112
- if (costs.short < BigInt(0) || costs.medium < BigInt(0) || costs.long < BigInt(0)) {
113
- return failure(new NetworkError("Costs must be non-negative"));
114
- }
115
- return withLeafContract(domain, providers, "update domain costs", async (contract) => txId(await contract.callTx.update_costs(costs.short, costs.medium, costs.long)));
91
+ export async function updateDefaultField(domainId, field, providers, options) {
92
+ const maybe = field !== null
93
+ ? { is_some: true, value: field }
94
+ : { is_some: false, value: "" };
95
+ return withContract(providers, "update default field", async (contract) => txId(await contract.callTx.update_domain_default_field(domainId, maybe)), options);
116
96
  }
117
- export async function transferDomainOwnership(parentDomain, subdomainName, newOwnerAddress, providers) {
118
- return withLeafContract(parentDomain, providers, "transfer domain ownership", async (contract) => txId(await contract.callTx.transfer_domain(domainToKey(subdomainName).key, parseAddressToBytes(newOwnerAddress))));
97
+ // ---- Granular update operations ----
98
+ export async function updateDomainTarget(domainId, target, providers, options) {
99
+ const { targetBytes, targetType } = targetToContractArgs(target);
100
+ return withContract(providers, "update target", async (contract) => txId(await contract.callTx.update_target(domainId, targetBytes, targetType)), options);
119
101
  }
120
- export async function setDomainResolver(parentDomain, subdomainName, resolverAddress, providers) {
121
- return withLeafContract(parentDomain, providers, "set domain resolver", async (contract) => txId(await contract.callTx.set_resolver(domainToKey(subdomainName).key, parseAddressToBytes(resolverAddress))));
102
+ export async function updatePaymentConfig(domainId, config, providers, options) {
103
+ return withContract(providers, "update payment config", async (contract) => txId(await contract.callTx.update_payment_config(domainId, config)), options);
122
104
  }
123
- export async function registerDomainFor(parentDomain, ownerAddress, subdomainName, resolverAddress, providers) {
124
- return withLeafContract(parentDomain, providers, "register domain", async (contract) => {
125
- const { key, len } = domainToKey(subdomainName);
126
- return txId(await contract.callTx.register_domain_for(parseAddressToBytes(ownerAddress), key, len, parseAddressToBytes(resolverAddress)));
127
- });
105
+ // ---- Root zone operations ----
106
+ export async function changeRootEnableSubdomains(enabled, providers, options) {
107
+ return withContract(providers, "change root enable subdomains", async (contract) => txId(await contract.callTx.change_root_enable_subdomains(enabled)), options);
128
108
  }
129
- export async function buyDomainFor(parentDomain, ownerAddress, subdomainName, resolverAddress, _paymentAmount, providers) {
130
- return withLeafContract(parentDomain, providers, "buy domain", async (contract) => {
131
- const { key, len } = domainToKey(subdomainName);
132
- return txId(await contract.callTx.register_domain_for(parseAddressToBytes(ownerAddress), key, len, parseAddressToBytes(resolverAddress)));
133
- });
109
+ export async function changeFieldLimit(limit, providers, options) {
110
+ const maybe = limit !== null
111
+ ? { is_some: true, value: limit }
112
+ : { is_some: false, value: 0n };
113
+ return withContract(providers, "change field limit", async (contract) => txId(await contract.callTx.change_field_limit(maybe)), options);
114
+ }
115
+ // ---- Lock operations ----
116
+ export async function lockTarget(domainId, providers, options) {
117
+ return withContract(providers, "lock target", async (contract) => txId(await contract.callTx.lock_target(domainId)), options);
134
118
  }
135
- export async function changeDomainOwner(domain, newOwnerAddress, providers) {
136
- return withLeafContract(domain, providers, "change domain owner", async (contract) => txId(await contract.callTx.change_owner(parseAddressToBytes(newOwnerAddress))));
119
+ export async function lockPaymentConfig(domainId, providers, options) {
120
+ return withContract(providers, "lock payment config", async (contract) => txId(await contract.callTx.lock_payment_config(domainId)), options);
137
121
  }
138
- //# sourceMappingURL=operations.js.map
@@ -2,15 +2,14 @@ import type { PublicDataProvider } from "@midnight-ntwrk/midnight-js-types";
2
2
  export interface NetworkConfig {
3
3
  indexerUrl: string;
4
4
  indexerWsUrl: string;
5
- tldAddress: string;
5
+ contractAddress: string;
6
6
  }
7
7
  export declare const NETWORK_REGISTRY: Record<string, NetworkConfig>;
8
- export interface ProviderConfig {
9
- indexerUrl?: string;
10
- indexerWsUrl?: string;
11
- networkId?: string;
12
- }
13
8
  export declare function getNetworkConfig(networkId: string): NetworkConfig;
14
9
  export declare function getDefaultProvider(networkId?: string): PublicDataProvider;
15
10
  export declare function setDefaultProvider(provider: PublicDataProvider): void;
16
- export declare function createDefaultProvider(config?: ProviderConfig): PublicDataProvider;
11
+ export declare function createDefaultProvider(config?: {
12
+ indexerUrl?: string;
13
+ indexerWsUrl?: string;
14
+ networkId?: string;
15
+ }): PublicDataProvider;
package/dist/provider.js CHANGED
@@ -1,26 +1,31 @@
1
- import { setNetworkId, } from "@midnight-ntwrk/midnight-js-network-id";
1
+ import { setNetworkId } from "@midnight-ntwrk/midnight-js-network-id";
2
2
  import { indexerPublicDataProvider } from "@midnight-ntwrk/midnight-js-indexer-public-data-provider";
3
3
  export const NETWORK_REGISTRY = {
4
4
  preview: {
5
5
  indexerUrl: "https://indexer.preview.midnight.network/api/v3/graphql",
6
6
  indexerWsUrl: "wss://indexer.preview.midnight.network/api/v3/graphql/ws",
7
- tldAddress: "daa9fc4dfbd42ac9227f8b4358928532da68337689ea3b21b351d607890d9192",
7
+ contractAddress: "", // TODO: set after deployment
8
8
  },
9
9
  preprod: {
10
10
  indexerUrl: "https://indexer.preprod.midnight.network/api/v3/graphql",
11
11
  indexerWsUrl: "wss://indexer.preprod.midnight.network/api/v3/graphql/ws",
12
- tldAddress: "53e332b013710de2dcc7df26262a6b323487984f9eca9d372241ce1d6027a233",
12
+ contractAddress: "cd74a2e9765e1f56e4ada5e2eaea37040212456c386e7f0e7671bcde23577c9c",
13
+ },
14
+ mainnet: {
15
+ indexerUrl: "https://indexer.mainnet.midnight.network/api/v3/graphql",
16
+ indexerWsUrl: "wss://indexer.mainnet.midnight.network/api/v3/graphql/ws",
17
+ contractAddress: "83b0d57aba442f92e12b5cdf92642adb9927ccd554a9061b5bd0992fc72596bb",
13
18
  },
14
19
  };
15
20
  export function getNetworkConfig(networkId) {
16
21
  const config = NETWORK_REGISTRY[networkId];
17
22
  if (!config) {
18
- throw new Error(`Unknown network "${networkId}". Known networks: ${Object.keys(NETWORK_REGISTRY).join(", ")}. Use createDefaultProvider() with explicit URLs for custom networks.`);
23
+ throw new Error(`Unknown network "${networkId}". Known networks: ${Object.keys(NETWORK_REGISTRY).join(", ")}`);
19
24
  }
20
25
  return config;
21
26
  }
22
27
  let defaultProvider = null;
23
- export function getDefaultProvider(networkId = "preview") {
28
+ export function getDefaultProvider(networkId = "mainnet") {
24
29
  if (!defaultProvider) {
25
30
  const net = getNetworkConfig(networkId);
26
31
  setNetworkId(networkId);
@@ -32,7 +37,7 @@ export function setDefaultProvider(provider) {
32
37
  defaultProvider = provider;
33
38
  }
34
39
  export function createDefaultProvider(config = {}) {
35
- const networkId = config.networkId ?? "preview";
40
+ const networkId = config.networkId ?? "mainnet";
36
41
  const knownConfig = NETWORK_REGISTRY[networkId];
37
42
  const indexerUrl = config.indexerUrl ?? knownConfig?.indexerUrl;
38
43
  const indexerWsUrl = config.indexerWsUrl ?? knownConfig?.indexerWsUrl;
@@ -42,4 +47,3 @@ export function createDefaultProvider(config = {}) {
42
47
  setNetworkId(networkId);
43
48
  return indexerPublicDataProvider(indexerUrl, indexerWsUrl);
44
49
  }
45
- //# sourceMappingURL=provider.js.map
@@ -15,7 +15,7 @@ export type DomainProfileWidgetProps = {
15
15
  showDomainInfo?: boolean;
16
16
  showSocialLinks?: boolean;
17
17
  showCopyButtons?: boolean;
18
- fields?: ('target' | 'owner' | 'resolver')[];
18
+ fields?: ('target' | 'owner')[];
19
19
  customFields?: string[];
20
20
  theme?: 'light' | 'dark' | 'auto';
21
21
  borderRadius?: 'none' | 'sm' | 'md' | 'lg';
@@ -41,19 +41,7 @@ export function CopyableValue({ value, className, showCopy = true, onCopySuccess
41
41
  };
42
42
  return (_jsxs("span", { className: `${className} ${showCopy || onFieldClick ? 'midnames-copyable' : ''}`, onClick: handleClick, onMouseEnter: () => setHovered(true), onMouseLeave: () => setHovered(false), title: value, children: [truncate(value), showCopy && (_jsx("span", { className: "midnames-copy-icon-container", children: copied ? (_jsx(Check, { className: "midnames-copy-icon midnames-copy-success" })) : (_jsx(Copy, { className: `midnames-copy-icon midnames-copy-hover ${hovered ? 'midnames-copy-visible' : 'midnames-copy-invisible'}` })) }))] }));
43
43
  }
44
- export function DomainProfileWidget({ fullDomain, publicDataProvider, className, showStatus = true, onError,
45
- // Variant and layout
46
- variant = 'full',
47
- // Visibility controls
48
- showBanner = true, showAvatar = true, showBio = true, showDomainInfo = true, showSocialLinks = true, showCopyButtons = true,
49
- // Field selection
50
- fields = ['target', 'owner', 'resolver'], customFields = [],
51
- // Styling
52
- theme = 'auto', borderRadius = 'md', padding = 'md',
53
- // Custom rendering
54
- renderActions,
55
- // Event callbacks
56
- onFieldClick, onCopySuccess, }) {
44
+ export function DomainProfileWidget({ fullDomain, publicDataProvider, className, showStatus = true, onError, variant = 'full', showBanner = true, showAvatar = true, showBio = true, showDomainInfo = true, showSocialLinks = true, showCopyButtons = true, fields = ['target', 'owner'], customFields = [], theme = 'auto', borderRadius = 'md', padding = 'md', renderActions, onFieldClick, onCopySuccess, }) {
57
45
  const [loading, setLoading] = useState(false);
58
46
  const [data, setData] = useState(null);
59
47
  const [error, setError] = useState(null);
@@ -105,12 +93,14 @@ onFieldClick, onCopySuccess, }) {
105
93
  const bannerUrl = fieldsMap['banner'] || fieldsMap['header'] || '';
106
94
  const epk = fieldsMap['epk'];
107
95
  const resolvedTarget = useMemo(() => {
108
- if (!data?.resolvedTarget)
96
+ const target = data?.info?.target;
97
+ if (!target)
109
98
  return null;
110
- if (epk)
111
- return deriveShieldedAddress(data.resolvedTarget, epk) || data.resolvedTarget;
112
- return data.resolvedTarget;
113
- }, [data?.resolvedTarget, epk]);
99
+ if (target.type === 'shielded' && epk) {
100
+ return deriveShieldedAddress(target.address, epk) || target.address;
101
+ }
102
+ return target.address;
103
+ }, [data?.info?.target, epk]);
114
104
  const status = useMemo(() => {
115
105
  if (loading)
116
106
  return 'unknown';
@@ -118,39 +108,28 @@ onFieldClick, onCopySuccess, }) {
118
108
  return 'error';
119
109
  return data?.info ? 'registered' : 'available';
120
110
  }, [loading, data?.info, error]);
121
- // Build CSS classes based on props
122
111
  const cardClasses = useMemo(() => {
123
112
  const classes = ['midnames-card'];
124
- if (variant !== 'full') {
113
+ if (variant !== 'full')
125
114
  classes.push(`midnames-card-${variant}`);
126
- }
127
- if (theme !== 'auto') {
115
+ if (theme !== 'auto')
128
116
  classes.push(`midnames-theme-${theme}`);
129
- }
130
- if (borderRadius !== 'md') {
117
+ if (borderRadius !== 'md')
131
118
  classes.push(`midnames-border-${borderRadius}`);
132
- }
133
- if (padding !== 'md') {
119
+ if (padding !== 'md')
134
120
  classes.push(`midnames-padding-${padding}`);
135
- }
136
- if (className) {
121
+ if (className)
137
122
  classes.push(className);
138
- }
139
123
  return classes.join(' ');
140
124
  }, [variant, theme, borderRadius, padding, className]);
141
- // Filter fields to show
142
125
  const fieldsToShow = useMemo(() => {
143
126
  const fieldsData = [];
144
127
  if (fields.includes('target')) {
145
128
  fieldsData.push({ key: 'target', label: 'Resolved Target', value: resolvedTarget, fieldName: 'target' });
146
129
  }
147
130
  if (fields.includes('owner')) {
148
- fieldsData.push({ key: 'owner', label: 'Owner', value: data?.info?.owner || null, fieldName: 'owner' });
149
- }
150
- if (fields.includes('resolver')) {
151
- fieldsData.push({ key: 'resolver', label: 'Resolver', value: data?.info?.resolver || null, fieldName: 'resolver' });
131
+ fieldsData.push({ key: 'owner', label: 'Owner', value: data?.info?.ownerAddress || null, fieldName: 'owner' });
152
132
  }
153
- // Add custom fields
154
133
  customFields.forEach(fieldKey => {
155
134
  const fieldValue = fieldsMap[fieldKey.toLowerCase()];
156
135
  if (fieldValue) {
@@ -164,4 +143,3 @@ onFieldClick, onCopySuccess, }) {
164
143
  }
165
144
  return (_jsxs("div", { className: cardClasses, children: [showBanner && bannerUrl && _jsx("img", { src: sanitizeUrl(bannerUrl), alt: "", className: "midnames-banner" }), _jsxs("div", { className: "midnames-header", children: [showAvatar && (_jsx("div", { className: "midnames-avatar", children: avatarUrl ? (_jsx("img", { src: sanitizeUrl(avatarUrl), alt: "", onError: (e) => (e.currentTarget.style.display = 'none') })) : (_jsx("span", { children: (displayName || data?.fullDomain || '?')[0]?.toUpperCase?.() ?? '?' })) })), _jsxs("div", { className: "midnames-ident", children: [_jsx("div", { className: "midnames-name", children: displayName || data?.fullDomain || fullDomain }), variant !== 'minimal' && _jsx("div", { className: "midnames-domain", children: data?.fullDomain || fullDomain })] }), showStatus && (_jsx("div", { className: `midnames-status midnames-status-${status}`, children: loading ? 'Checking…' : status === 'registered' ? 'Registered' : status === 'available' ? 'Available' : status === 'error' ? 'Error' : 'Unknown' }))] }), showBio && bio && _jsx("p", { className: "midnames-bio", children: bio }), showDomainInfo && fieldsToShow.length > 0 && (_jsx("div", { className: "midnames-grid", children: fieldsToShow.map((field) => (_jsxs("div", { className: "midnames-box", children: [_jsx("div", { className: "midnames-box-label", children: field.label }), _jsx(CopyableValue, { value: field.value, className: "midnames-box-value", showCopy: showCopyButtons, onCopySuccess: onCopySuccess, onFieldClick: onFieldClick, fieldName: field.fieldName })] }, field.key))) })), showSocialLinks && (website || twitter || github || location) && (_jsxs("div", { className: "midnames-links", children: [website && (_jsx("a", { className: "midnames-chip", href: sanitizeUrl(website.startsWith('http') ? website : `https://${website}`), target: "_blank", rel: "noreferrer", children: website.replace(/^https?:\/\//, '') })), twitter && (_jsxs("a", { className: "midnames-chip", href: `https://x.com/${twitter}`, target: "_blank", rel: "noreferrer", children: ["@", twitter] })), github && (_jsx("a", { className: "midnames-chip", href: `https://github.com/${github}`, target: "_blank", rel: "noreferrer", children: github })), location && _jsx("span", { className: "midnames-chip", children: location })] })), renderActions && (_jsx("div", { className: "midnames-actions", children: renderActions(data) }))] }));
166
145
  }
167
- //# sourceMappingURL=DomainProfileWidget.js.map
@@ -1,36 +1,20 @@
1
1
  import React from 'react';
2
2
  import type { PublicDataProvider } from '@midnight-ntwrk/midnight-js-types';
3
3
  import { MidnamesError } from '../errors.js';
4
- /**
5
- * HolographicCard props
6
- */
7
4
  export interface HolographicCardProps {
8
- /** Domain name to resolve and display */
9
5
  domain: string;
10
- /** Public data provider for fetching domain information */
11
6
  publicDataProvider?: PublicDataProvider;
12
- /** Custom CSS gradient string for the background gradient effect */
13
7
  behindGradient?: string;
14
- /** Custom CSS gradient string for the inner card gradient */
15
8
  innerGradient?: string;
16
- /** Whether to display the background gradient effect */
17
9
  showBehindGradient?: boolean;
18
- /** Additional CSS classes to apply to the card wrapper */
19
10
  className?: string;
20
- /** Enable or disable the 3D tilt effect on mouse hover */
21
11
  enableTilt?: boolean;
22
- /** Enable or disable the 3D tilt effect on mobile devices */
23
12
  enableMobileTilt?: boolean;
24
- /** Sensitivity of the 3D tilt effect on mobile devices */
25
13
  mobileTiltSensitivity?: number;
26
- /** Text displayed on the contact button */
27
14
  contactText?: string;
28
- /** Whether to display the user information section */
29
15
  showUserInfo?: boolean;
30
- /** Callback function called when the contact button is clicked */
31
16
  onContactClick?: () => void;
32
- /** Callback function called when an error occurs */
33
17
  onError?: (error: MidnamesError) => void;
34
18
  }
35
- declare const HolographicCard: React.NamedExoticComponent<HolographicCardProps>;
19
+ export declare const HolographicCard: React.NamedExoticComponent<HolographicCardProps>;
36
20
  export default HolographicCard;
@@ -21,11 +21,9 @@ const HolographicCardComponent = ({ domain, publicDataProvider, behindGradient,
21
21
  const wrapRef = useRef(null);
22
22
  const cardRef = useRef(null);
23
23
  const lastXY = useRef(null);
24
- // Domain data state
25
24
  const [loading, setLoading] = useState(false);
26
25
  const [data, setData] = useState(null);
27
26
  const [error, setError] = useState(null);
28
- // Fetch domain data
29
27
  useEffect(() => {
30
28
  let mounted = true;
31
29
  setLoading(true);
@@ -58,7 +56,6 @@ const HolographicCardComponent = ({ domain, publicDataProvider, behindGradient,
58
56
  mounted = false;
59
57
  };
60
58
  }, [publicDataProvider, domain, onError]);
61
- // Extract fields from domain data
62
59
  const fieldsMap = useMemo(() => {
63
60
  const m = {};
64
61
  if (data?.fields) {
@@ -69,7 +66,6 @@ const HolographicCardComponent = ({ domain, publicDataProvider, behindGradient,
69
66
  const displayName = fieldsMap['name'] || fieldsMap['displayname'] || fieldsMap['handle'] || '';
70
67
  const avatarUrl = fieldsMap['avatar'] || fieldsMap['image'] || fieldsMap['pfp'] || '';
71
68
  const handle = fieldsMap['handle'] || '';
72
- // Animation logic
73
69
  const animation = useMemo(() => {
74
70
  if (!enableTilt)
75
71
  return null;
@@ -190,6 +186,5 @@ const HolographicCardComponent = ({ domain, publicDataProvider, behindGradient,
190
186
  }), [showBehindGradient, behindGradient, innerGradient]);
191
187
  return (_jsx("div", { ref: wrapRef, className: `midnames-holo-card-wrapper ${className}`.trim(), style: cardStyle, children: _jsx("section", { ref: cardRef, className: "midnames-holo-card", children: _jsxs("div", { className: "midnames-holo-inside", children: [_jsx("div", { className: "midnames-holo-shine" }), _jsx("div", { className: "midnames-holo-glare" }), _jsxs("div", { className: "midnames-holo-content midnames-holo-avatar-content", children: [loading && (_jsx("div", { className: "midnames-holo-loading", children: "Loading domain..." })), error && !loading && (_jsxs("div", { className: "midnames-holo-error", children: [_jsx("div", { children: "Failed to load domain" }), _jsx("div", { style: { fontSize: '12px', opacity: 0.8, marginTop: '8px' }, children: error.message })] })), avatarUrl && !loading && !error && (_jsx("img", { className: "midnames-holo-avatar", src: sanitizeUrl(avatarUrl), alt: `${displayName || domain} avatar`, loading: "lazy", onError: (e) => { e.target.style.display = 'none'; } })), showUserInfo && !loading && !error && (displayName || handle || contactText) && (_jsxs("div", { className: "midnames-holo-user-info", children: [_jsxs("div", { className: "midnames-holo-user-details", children: [_jsx("div", { className: "midnames-holo-mini-avatar", children: _jsx("img", { src: sanitizeUrl(avatarUrl), alt: "mini", loading: "lazy", onError: (e) => { e.target.style.display = 'none'; } }) }), _jsxs("div", { className: "midnames-holo-user-text", children: [displayName && _jsx("div", { className: "midnames-holo-handle", children: displayName }), handle && _jsxs("div", { className: "midnames-holo-status", children: ["@", handle] }), _jsx("div", { className: "midnames-holo-status", children: domain })] })] }), _jsx("button", { className: "midnames-holo-contact-btn", onClick: onContactClick, type: "button", children: contactText })] }))] })] }) }) }));
192
188
  };
193
- const HolographicCard = React.memo(HolographicCardComponent);
189
+ export const HolographicCard = React.memo(HolographicCardComponent);
194
190
  export default HolographicCard;
195
- //# sourceMappingURL=HolographicCard.js.map