dop-wallet-v6 1.2.3 → 1.2.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.
Files changed (222) hide show
  1. package/dist/services/artifacts/__tests__/artifact-downloader.test.js.map +1 -1
  2. package/dist/services/artifacts/artifact-downloader.d.ts +1 -1
  3. package/dist/services/artifacts/artifact-downloader.js +1 -1
  4. package/dist/services/artifacts/artifact-downloader.js.map +1 -1
  5. package/dist/services/artifacts/artifact-hash.d.ts +1 -1
  6. package/dist/services/artifacts/artifact-hash.js +2 -2
  7. package/dist/services/artifacts/artifact-hash.js.map +1 -1
  8. package/dist/services/artifacts/artifact-util.d.ts +1 -1
  9. package/dist/services/artifacts/artifact-util.js +1 -1
  10. package/dist/services/artifacts/artifact-util.js.map +1 -1
  11. package/dist/services/dop/core/__tests__/providers.test.js +4 -4
  12. package/dist/services/dop/core/__tests__/providers.test.js.map +1 -1
  13. package/dist/services/dop/core/artifacts.d.ts +2 -2
  14. package/dist/services/dop/core/artifacts.js +1 -1
  15. package/dist/services/dop/core/artifacts.js.map +1 -1
  16. package/dist/services/dop/core/encrypts.d.ts +1 -1
  17. package/dist/services/dop/core/encrypts.js +2 -2
  18. package/dist/services/dop/core/encrypts.js.map +1 -1
  19. package/dist/services/dop/core/engine.d.ts +1 -1
  20. package/dist/services/dop/core/engine.js +1 -1
  21. package/dist/services/dop/core/engine.js.map +1 -1
  22. package/dist/services/dop/core/init.d.ts +2 -2
  23. package/dist/services/dop/core/init.js +2 -2
  24. package/dist/services/dop/core/init.js.map +1 -1
  25. package/dist/services/dop/core/load-provider.d.ts +1 -1
  26. package/dist/services/dop/core/load-provider.js +2 -2
  27. package/dist/services/dop/core/load-provider.js.map +1 -1
  28. package/dist/services/dop/core/merkletree.d.ts +3 -3
  29. package/dist/services/dop/core/merkletree.js +2 -2
  30. package/dist/services/dop/core/merkletree.js.map +1 -1
  31. package/dist/services/dop/core/prover.d.ts +1 -1
  32. package/dist/services/dop/core/prover.js +1 -1
  33. package/dist/services/dop/core/prover.js.map +1 -1
  34. package/dist/services/dop/core/providers.d.ts +2 -2
  35. package/dist/services/dop/core/providers.js +1 -1
  36. package/dist/services/dop/core/providers.js.map +1 -1
  37. package/dist/services/dop/dop-txids/__tests__/dop-txid-sync-graph-v2.test.js +1 -1
  38. package/dist/services/dop/dop-txids/__tests__/dop-txid-sync-graph-v2.test.js.map +1 -1
  39. package/dist/services/dop/dop-txids/blinded-commitments.d.ts +1 -1
  40. package/dist/services/dop/dop-txids/blinded-commitments.js +1 -1
  41. package/dist/services/dop/dop-txids/blinded-commitments.js.map +1 -1
  42. package/dist/services/dop/dop-txids/dop-txid-graph-type-formatters.d.ts +1 -1
  43. package/dist/services/dop/dop-txids/dop-txid-graph-type-formatters.js +1 -1
  44. package/dist/services/dop/dop-txids/dop-txid-graph-type-formatters.js.map +1 -1
  45. package/dist/services/dop/dop-txids/dop-txid-merkletrees.d.ts +1 -1
  46. package/dist/services/dop/dop-txids/dop-txid-merkletrees.js +1 -1
  47. package/dist/services/dop/dop-txids/dop-txid-merkletrees.js.map +1 -1
  48. package/dist/services/dop/dop-txids/dop-txid-sync-graph-v2.d.ts +1 -1
  49. package/dist/services/dop/dop-txids/dop-txid-sync-graph-v2.js +2 -2
  50. package/dist/services/dop/dop-txids/dop-txid-sync-graph-v2.js.map +1 -1
  51. package/dist/services/dop/dop-txids/graphql/index.js +1 -1
  52. package/dist/services/dop/dop-txids/graphql/index.js.map +1 -1
  53. package/dist/services/dop/history/transaction-history.d.ts +2 -2
  54. package/dist/services/dop/history/transaction-history.js +2 -2
  55. package/dist/services/dop/history/transaction-history.js.map +1 -1
  56. package/dist/services/dop/index.d.ts +1 -0
  57. package/dist/services/dop/index.js +1 -0
  58. package/dist/services/dop/index.js.map +1 -1
  59. package/dist/services/dop/process/extract-transaction-data.d.ts +1 -1
  60. package/dist/services/dop/process/extract-transaction-data.js +1 -1
  61. package/dist/services/dop/process/extract-transaction-data.js.map +1 -1
  62. package/dist/services/dop/profile/__tests__/profile-manager.test.d.ts +1 -0
  63. package/dist/services/dop/profile/__tests__/profile-manager.test.js +170 -0
  64. package/dist/services/dop/profile/__tests__/profile-manager.test.js.map +1 -0
  65. package/dist/services/dop/profile/__tests__/selective-transparency.test.d.ts +1 -0
  66. package/dist/services/dop/profile/__tests__/selective-transparency.test.js +256 -0
  67. package/dist/services/dop/profile/__tests__/selective-transparency.test.js.map +1 -0
  68. package/dist/services/dop/profile/__tests__/storage.test.d.ts +1 -0
  69. package/dist/services/dop/profile/__tests__/storage.test.js +174 -0
  70. package/dist/services/dop/profile/__tests__/storage.test.js.map +1 -0
  71. package/dist/services/dop/profile/index.d.ts +3 -0
  72. package/dist/services/dop/profile/index.js +20 -0
  73. package/dist/services/dop/profile/index.js.map +1 -0
  74. package/dist/services/dop/profile/profile-manager.d.ts +32 -0
  75. package/dist/services/dop/profile/profile-manager.js +235 -0
  76. package/dist/services/dop/profile/profile-manager.js.map +1 -0
  77. package/dist/services/dop/profile/selective-transparency.d.ts +82 -0
  78. package/dist/services/dop/profile/selective-transparency.js +447 -0
  79. package/dist/services/dop/profile/selective-transparency.js.map +1 -0
  80. package/dist/services/dop/profile/storage.d.ts +27 -0
  81. package/dist/services/dop/profile/storage.js +648 -0
  82. package/dist/services/dop/profile/storage.js.map +1 -0
  83. package/dist/services/dop/profile/types.d.ts +106 -0
  84. package/dist/services/dop/profile/types.js +3 -0
  85. package/dist/services/dop/profile/types.js.map +1 -0
  86. package/dist/services/dop/profile/usage-example.d.ts +11 -0
  87. package/dist/services/dop/profile/usage-example.js +143 -0
  88. package/dist/services/dop/profile/usage-example.js.map +1 -0
  89. package/dist/services/dop/quick-sync/V2/__tests__/quick-sync-events-graph-v2.test.js +2 -2
  90. package/dist/services/dop/quick-sync/V2/__tests__/quick-sync-events-graph-v2.test.js.map +1 -1
  91. package/dist/services/dop/quick-sync/V2/graph-type-formatters-v2.d.ts +1 -1
  92. package/dist/services/dop/quick-sync/V2/graph-type-formatters-v2.js +2 -2
  93. package/dist/services/dop/quick-sync/V2/graph-type-formatters-v2.js.map +1 -1
  94. package/dist/services/dop/quick-sync/V2/graphql/index.js +1 -1
  95. package/dist/services/dop/quick-sync/V2/graphql/index.js.map +1 -1
  96. package/dist/services/dop/quick-sync/V2/quick-sync-events-graph-v2.d.ts +1 -1
  97. package/dist/services/dop/quick-sync/V2/quick-sync-events-graph-v2.js +1 -1
  98. package/dist/services/dop/quick-sync/V2/quick-sync-events-graph-v2.js.map +1 -1
  99. package/dist/services/dop/quick-sync/V3/__tests__/quick-sync-events-graph-v3.test.js +2 -2
  100. package/dist/services/dop/quick-sync/V3/__tests__/quick-sync-events-graph-v3.test.js.map +1 -1
  101. package/dist/services/dop/quick-sync/V3/graph-type-formatters-v3.d.ts +2 -2
  102. package/dist/services/dop/quick-sync/V3/graph-type-formatters-v3.js +1 -1
  103. package/dist/services/dop/quick-sync/V3/graph-type-formatters-v3.js.map +1 -1
  104. package/dist/services/dop/quick-sync/V3/quick-sync-events-graph-v3.d.ts +1 -1
  105. package/dist/services/dop/quick-sync/V3/quick-sync-events-graph-v3.js +2 -2
  106. package/dist/services/dop/quick-sync/V3/quick-sync-events-graph-v3.js.map +1 -1
  107. package/dist/services/dop/quick-sync/graph-query.d.ts +1 -1
  108. package/dist/services/dop/quick-sync/graph-query.js +1 -1
  109. package/dist/services/dop/quick-sync/graph-query.js.map +1 -1
  110. package/dist/services/dop/quick-sync/quick-sync-events.d.ts +2 -2
  111. package/dist/services/dop/quick-sync/quick-sync-events.js.map +1 -1
  112. package/dist/services/dop/quick-sync/shared-formatters.d.ts +1 -1
  113. package/dist/services/dop/quick-sync/shared-formatters.js +1 -1
  114. package/dist/services/dop/quick-sync/shared-formatters.js.map +1 -1
  115. package/dist/services/dop/util/__tests__/bytes-util.test.js +1 -1
  116. package/dist/services/dop/util/__tests__/bytes-util.test.js.map +1 -1
  117. package/dist/services/dop/util/bytes.d.ts +1 -1
  118. package/dist/services/dop/util/bytes.js +1 -1
  119. package/dist/services/dop/util/bytes.js.map +1 -1
  120. package/dist/services/dop/util/crypto.d.ts +2 -2
  121. package/dist/services/dop/util/crypto.js +1 -1
  122. package/dist/services/dop/util/crypto.js.map +1 -1
  123. package/dist/services/dop/wallets/__tests__/balances-live.test.js +1 -1
  124. package/dist/services/dop/wallets/__tests__/balances-live.test.js.map +1 -1
  125. package/dist/services/dop/wallets/__tests__/balances-update.test.js +2 -2
  126. package/dist/services/dop/wallets/__tests__/balances-update.test.js.map +1 -1
  127. package/dist/services/dop/wallets/__tests__/balances.test.js +2 -2
  128. package/dist/services/dop/wallets/__tests__/balances.test.js.map +1 -1
  129. package/dist/services/dop/wallets/__tests__/wallets.test.js +1 -1
  130. package/dist/services/dop/wallets/__tests__/wallets.test.js.map +1 -1
  131. package/dist/services/dop/wallets/balance-update.d.ts +2 -2
  132. package/dist/services/dop/wallets/balance-update.js +2 -2
  133. package/dist/services/dop/wallets/balance-update.js.map +1 -1
  134. package/dist/services/dop/wallets/balances.d.ts +1 -1
  135. package/dist/services/dop/wallets/balances.js.map +1 -1
  136. package/dist/services/dop/wallets/wallets.d.ts +2 -2
  137. package/dist/services/dop/wallets/wallets.js +2 -2
  138. package/dist/services/dop/wallets/wallets.js.map +1 -1
  139. package/dist/services/ethers/ethers-util.js +1 -1
  140. package/dist/services/ethers/ethers-util.js.map +1 -1
  141. package/dist/services/transactions/__tests__/proof-cache.test.js +1 -1
  142. package/dist/services/transactions/__tests__/proof-cache.test.js.map +1 -1
  143. package/dist/services/transactions/__tests__/tx-cross-contract-calls.test.js +8 -8
  144. package/dist/services/transactions/__tests__/tx-cross-contract-calls.test.js.map +1 -1
  145. package/dist/services/transactions/__tests__/tx-encrypt-base-token.test.js +2 -2
  146. package/dist/services/transactions/__tests__/tx-encrypt-base-token.test.js.map +1 -1
  147. package/dist/services/transactions/__tests__/tx-gas-details.test.js +1 -1
  148. package/dist/services/transactions/__tests__/tx-gas-details.test.js.map +1 -1
  149. package/dist/services/transactions/__tests__/tx-notes.test.js +1 -1
  150. package/dist/services/transactions/__tests__/tx-notes.test.js.map +1 -1
  151. package/dist/services/transactions/__tests__/tx-proof-transfer-with-data.test.d.ts +1 -0
  152. package/dist/services/transactions/__tests__/tx-proof-transfer-with-data.test.js +93 -0
  153. package/dist/services/transactions/__tests__/tx-proof-transfer-with-data.test.js.map +1 -0
  154. package/dist/services/transactions/__tests__/tx-transfer.test.js +13 -13
  155. package/dist/services/transactions/__tests__/tx-transfer.test.js.map +1 -1
  156. package/dist/services/transactions/index.d.ts +1 -0
  157. package/dist/services/transactions/index.js +1 -0
  158. package/dist/services/transactions/index.js.map +1 -1
  159. package/dist/services/transactions/proof-cache.d.ts +1 -1
  160. package/dist/services/transactions/proof-cache.js +1 -1
  161. package/dist/services/transactions/proof-cache.js.map +1 -1
  162. package/dist/services/transactions/tx-cross-contract-calls.d.ts +2 -2
  163. package/dist/services/transactions/tx-cross-contract-calls.js +2 -2
  164. package/dist/services/transactions/tx-cross-contract-calls.js.map +1 -1
  165. package/dist/services/transactions/tx-decrypt.d.ts +1 -1
  166. package/dist/services/transactions/tx-decrypt.js +2 -2
  167. package/dist/services/transactions/tx-decrypt.js.map +1 -1
  168. package/dist/services/transactions/tx-encrypt-base-token.d.ts +1 -1
  169. package/dist/services/transactions/tx-encrypt-base-token.js +2 -2
  170. package/dist/services/transactions/tx-encrypt-base-token.js.map +1 -1
  171. package/dist/services/transactions/tx-encrypt.d.ts +1 -1
  172. package/dist/services/transactions/tx-encrypt.js +2 -2
  173. package/dist/services/transactions/tx-encrypt.js.map +1 -1
  174. package/dist/services/transactions/tx-gas-broadcaster-fee-estimator.d.ts +2 -2
  175. package/dist/services/transactions/tx-gas-broadcaster-fee-estimator.js +2 -2
  176. package/dist/services/transactions/tx-gas-broadcaster-fee-estimator.js.map +1 -1
  177. package/dist/services/transactions/tx-gas-details.d.ts +1 -1
  178. package/dist/services/transactions/tx-gas-details.js +2 -2
  179. package/dist/services/transactions/tx-gas-details.js.map +1 -1
  180. package/dist/services/transactions/tx-generator.d.ts +2 -2
  181. package/dist/services/transactions/tx-generator.js +2 -2
  182. package/dist/services/transactions/tx-generator.js.map +1 -1
  183. package/dist/services/transactions/tx-notes.d.ts +2 -2
  184. package/dist/services/transactions/tx-notes.js +2 -2
  185. package/dist/services/transactions/tx-notes.js.map +1 -1
  186. package/dist/services/transactions/tx-nullifiers.d.ts +1 -1
  187. package/dist/services/transactions/tx-nullifiers.js.map +1 -1
  188. package/dist/services/transactions/tx-proof-decrypt.d.ts +1 -1
  189. package/dist/services/transactions/tx-proof-decrypt.js +2 -2
  190. package/dist/services/transactions/tx-proof-decrypt.js.map +1 -1
  191. package/dist/services/transactions/tx-proof-transfer-with-data.d.ts +36 -0
  192. package/dist/services/transactions/tx-proof-transfer-with-data.js +104 -0
  193. package/dist/services/transactions/tx-proof-transfer-with-data.js.map +1 -0
  194. package/dist/services/transactions/tx-proof-transfer.d.ts +2 -2
  195. package/dist/services/transactions/tx-proof-transfer.js +5 -5
  196. package/dist/services/transactions/tx-proof-transfer.js.map +1 -1
  197. package/dist/services/transactions/tx-transfer.d.ts +1 -1
  198. package/dist/services/transactions/tx-transfer.js +1 -1
  199. package/dist/services/transactions/tx-transfer.js.map +1 -1
  200. package/dist/tests/helper.test.d.ts +1 -1
  201. package/dist/tests/helper.test.js +1 -1
  202. package/dist/tests/helper.test.js.map +1 -1
  203. package/dist/tests/mocks.test.d.ts +2 -2
  204. package/dist/tests/mocks.test.js +1 -1
  205. package/dist/tests/mocks.test.js.map +1 -1
  206. package/dist/tests/poi/test-wallet-poi-requester.test.d.ts +2 -2
  207. package/dist/tests/poi/test-wallet-poi-requester.test.js.map +1 -1
  208. package/dist/tests/setup.test.d.ts +2 -2
  209. package/dist/tests/setup.test.js +1 -1
  210. package/dist/tests/setup.test.js.map +1 -1
  211. package/dist/tests/stubs/engine-stubs.test.d.ts +1 -1
  212. package/dist/tests/stubs/engine-stubs.test.js +1 -1
  213. package/dist/tests/stubs/engine-stubs.test.js.map +1 -1
  214. package/dist/utils/blocked-address.js +1 -1
  215. package/dist/utils/blocked-address.js.map +1 -1
  216. package/dist/utils/error.js +1 -1
  217. package/dist/utils/error.js.map +1 -1
  218. package/dist/utils/gas-price.d.ts +1 -1
  219. package/dist/utils/gas-price.js +1 -1
  220. package/dist/utils/gas-price.js.map +1 -1
  221. package/package.json +13 -3
  222. package/postinstall.js +1 -1
@@ -0,0 +1,82 @@
1
+ import { SelectiveTransparencySettings, VisibilityProof, ViewingRequest } from './types';
2
+ import { ProfileStorage } from './storage';
3
+ declare class SelectiveTransparencyManager {
4
+ private profileStorage;
5
+ private get storage();
6
+ setStorage(storage: ProfileStorage): void;
7
+ getSettings(walletId: string): Promise<Optional<SelectiveTransparencySettings>>;
8
+ updateSettings(walletId: string, updates: Partial<SelectiveTransparencySettings>): Promise<SelectiveTransparencySettings>;
9
+ createDefaultSettings(walletId: string): Promise<SelectiveTransparencySettings>;
10
+ setTokenVisibility(walletId: string, tokenAddress: string, visibility: {
11
+ isVisible: boolean;
12
+ showBalance: boolean;
13
+ showTransactions: boolean;
14
+ }): Promise<void>;
15
+ getTokenVisibility(walletId: string, tokenAddress: string): Promise<{
16
+ isVisible: boolean;
17
+ showBalance: boolean;
18
+ showTransactions: boolean;
19
+ }>;
20
+ setNFTVisibility(walletId: string, nftAddress: string, visibility: {
21
+ isVisible: boolean;
22
+ showCollection: boolean;
23
+ showTransactions: boolean;
24
+ }): Promise<void>;
25
+ getNFTVisibility(walletId: string, nftAddress: string): Promise<{
26
+ isVisible: boolean;
27
+ showCollection: boolean;
28
+ showTransactions: boolean;
29
+ }>;
30
+ addToWhitelist(walletId: string, address: string, permissions: {
31
+ viewBalances: boolean;
32
+ viewNFTs: boolean;
33
+ viewTransactions: boolean;
34
+ viewProfile: boolean;
35
+ }): Promise<void>;
36
+ removeFromWhitelist(walletId: string, address: string): Promise<void>;
37
+ checkWhitelistPermission(walletId: string, viewerAddress: string, permission: 'viewBalances' | 'viewNFTs' | 'viewTransactions' | 'viewProfile'): Promise<boolean>;
38
+ generateVisibilityProof(walletId: string, requesterId: string, proofType: 'balance' | 'nft' | 'transaction' | 'profile', assetId?: string): Promise<VisibilityProof>;
39
+ verifyVisibilityProof(proofId: string): Promise<boolean>;
40
+ createViewingRequest(requesterId: string, walletId: string, requestType: 'balance' | 'nft' | 'transaction' | 'profile', assetId?: string, message?: string): Promise<ViewingRequest>;
41
+ respondToViewingRequest(requestId: string, response: 'approved' | 'rejected'): Promise<ViewingRequest>;
42
+ getViewingRequests(walletId: string): Promise<ViewingRequest[]>;
43
+ private checkVisibilityPermission;
44
+ }
45
+ declare const selectiveTransparencyManager: SelectiveTransparencyManager;
46
+ export { selectiveTransparencyManager, SelectiveTransparencyManager, };
47
+ export declare const getSelectiveTransparencySettings: (walletId: string) => Promise<Optional<SelectiveTransparencySettings>>;
48
+ export declare const updateSelectiveTransparencySettings: (walletId: string, updates: Partial<SelectiveTransparencySettings>) => Promise<SelectiveTransparencySettings>;
49
+ export declare const createDefaultSelectiveTransparencySettings: (walletId: string) => Promise<SelectiveTransparencySettings>;
50
+ export declare const setTokenVisibility: (walletId: string, tokenAddress: string, visibility: {
51
+ isVisible: boolean;
52
+ showBalance: boolean;
53
+ showTransactions: boolean;
54
+ }) => Promise<void>;
55
+ export declare const getTokenVisibility: (walletId: string, tokenAddress: string) => Promise<{
56
+ isVisible: boolean;
57
+ showBalance: boolean;
58
+ showTransactions: boolean;
59
+ }>;
60
+ export declare const setNFTVisibility: (walletId: string, nftAddress: string, visibility: {
61
+ isVisible: boolean;
62
+ showCollection: boolean;
63
+ showTransactions: boolean;
64
+ }) => Promise<void>;
65
+ export declare const getNFTVisibility: (walletId: string, nftAddress: string) => Promise<{
66
+ isVisible: boolean;
67
+ showCollection: boolean;
68
+ showTransactions: boolean;
69
+ }>;
70
+ export declare const addToWhitelist: (walletId: string, address: string, permissions: {
71
+ viewBalances: boolean;
72
+ viewNFTs: boolean;
73
+ viewTransactions: boolean;
74
+ viewProfile: boolean;
75
+ }) => Promise<void>;
76
+ export declare const removeFromWhitelist: (walletId: string, address: string) => Promise<void>;
77
+ export declare const checkWhitelistPermission: (walletId: string, viewerAddress: string, permission: 'viewBalances' | 'viewNFTs' | 'viewTransactions' | 'viewProfile') => Promise<boolean>;
78
+ export declare const generateVisibilityProof: (walletId: string, requesterId: string, proofType: 'balance' | 'nft' | 'transaction' | 'profile', assetId?: string) => Promise<VisibilityProof>;
79
+ export declare const verifyVisibilityProof: (proofId: string) => Promise<boolean>;
80
+ export declare const createViewingRequest: (requesterId: string, walletId: string, requestType: 'balance' | 'nft' | 'transaction' | 'profile', assetId?: string, message?: string) => Promise<ViewingRequest>;
81
+ export declare const respondToViewingRequest: (requestId: string, response: 'approved' | 'rejected') => Promise<ViewingRequest>;
82
+ export declare const getViewingRequests: (walletId: string) => Promise<ViewingRequest[]>;
@@ -0,0 +1,447 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getViewingRequests = exports.respondToViewingRequest = exports.createViewingRequest = exports.verifyVisibilityProof = exports.generateVisibilityProof = exports.checkWhitelistPermission = exports.removeFromWhitelist = exports.addToWhitelist = exports.getNFTVisibility = exports.setNFTVisibility = exports.getTokenVisibility = exports.setTokenVisibility = exports.createDefaultSelectiveTransparencySettings = exports.updateSelectiveTransparencySettings = exports.getSelectiveTransparencySettings = exports.SelectiveTransparencyManager = exports.selectiveTransparencyManager = void 0;
4
+ const error_1 = require("../../../utils/error");
5
+ const wallets_1 = require("../wallets/wallets");
6
+ const dop_engine_v3_1 = require("dop-engine-v3");
7
+ const storage_1 = require("./storage");
8
+ class SelectiveTransparencyManager {
9
+ profileStorage;
10
+ get storage() {
11
+ if (!this.profileStorage) {
12
+ this.profileStorage = (0, storage_1.getProfileStorage)();
13
+ }
14
+ return this.profileStorage;
15
+ }
16
+ // For testing: allow injection of storage
17
+ setStorage(storage) {
18
+ this.profileStorage = storage;
19
+ }
20
+ // Settings management
21
+ async getSettings(walletId) {
22
+ try {
23
+ return await this.storage.getSettings(walletId);
24
+ }
25
+ catch (err) {
26
+ throw (0, error_1.reportAndSanitizeError)('getSettings', err);
27
+ }
28
+ }
29
+ async updateSettings(walletId, updates) {
30
+ try {
31
+ const existingSettings = await this.storage.getSettings(walletId);
32
+ const newSettings = {
33
+ id: walletId,
34
+ walletId,
35
+ assetVisibility: {
36
+ showTokenBalances: true,
37
+ showNFTs: true,
38
+ showTransactionHistory: false,
39
+ showAddresses: false,
40
+ },
41
+ tokenVisibilityRules: [],
42
+ nftVisibilityRules: [],
43
+ transactionVisibility: {
44
+ showSenderAddress: false,
45
+ showReceiverAddress: false,
46
+ showAmount: false,
47
+ showMemo: false,
48
+ showTimestamp: true,
49
+ },
50
+ profileVisibility: {
51
+ showUsername: true,
52
+ showProfilePicture: true,
53
+ showBio: true,
54
+ showSocialLinks: true,
55
+ },
56
+ viewingWhitelist: [],
57
+ createdAt: new Date(),
58
+ updatedAt: new Date(),
59
+ ...existingSettings,
60
+ ...updates,
61
+ };
62
+ await this.storage.setSettings(walletId, newSettings);
63
+ return newSettings;
64
+ }
65
+ catch (err) {
66
+ throw (0, error_1.reportAndSanitizeError)('updateSettings', err);
67
+ }
68
+ }
69
+ async createDefaultSettings(walletId) {
70
+ try {
71
+ const defaultSettings = {
72
+ id: walletId,
73
+ walletId,
74
+ assetVisibility: {
75
+ showTokenBalances: true,
76
+ showNFTs: true,
77
+ showTransactionHistory: false,
78
+ showAddresses: false,
79
+ },
80
+ tokenVisibilityRules: [],
81
+ nftVisibilityRules: [],
82
+ transactionVisibility: {
83
+ showSenderAddress: false,
84
+ showReceiverAddress: false,
85
+ showAmount: false,
86
+ showMemo: false,
87
+ showTimestamp: true,
88
+ },
89
+ profileVisibility: {
90
+ showUsername: true,
91
+ showProfilePicture: true,
92
+ showBio: true,
93
+ showSocialLinks: true,
94
+ },
95
+ viewingWhitelist: [],
96
+ createdAt: new Date(),
97
+ updatedAt: new Date(),
98
+ };
99
+ await this.storage.setSettings(walletId, defaultSettings);
100
+ return defaultSettings;
101
+ }
102
+ catch (err) {
103
+ throw (0, error_1.reportAndSanitizeError)('createDefaultSettings', err);
104
+ }
105
+ }
106
+ // Token visibility management
107
+ async setTokenVisibility(walletId, tokenAddress, visibility) {
108
+ try {
109
+ const settings = await this.getSettings(walletId);
110
+ if (!settings) {
111
+ throw new Error('Settings not found');
112
+ }
113
+ const existingRuleIndex = settings.tokenVisibilityRules.findIndex(rule => rule.tokenAddress.toLowerCase() === tokenAddress.toLowerCase());
114
+ const newRule = {
115
+ tokenAddress: tokenAddress.toLowerCase(),
116
+ ...visibility,
117
+ };
118
+ if (existingRuleIndex >= 0) {
119
+ settings.tokenVisibilityRules[existingRuleIndex] = newRule;
120
+ }
121
+ else {
122
+ settings.tokenVisibilityRules.push(newRule);
123
+ }
124
+ settings.updatedAt = new Date();
125
+ await this.storage.setSettings(walletId, settings);
126
+ }
127
+ catch (err) {
128
+ throw (0, error_1.reportAndSanitizeError)('setTokenVisibility', err);
129
+ }
130
+ }
131
+ async getTokenVisibility(walletId, tokenAddress) {
132
+ try {
133
+ const settings = await this.getSettings(walletId);
134
+ if (!settings) {
135
+ // Default visibility if no settings found
136
+ return {
137
+ isVisible: true,
138
+ showBalance: true,
139
+ showTransactions: false,
140
+ };
141
+ }
142
+ const rule = settings.tokenVisibilityRules.find(rule => rule.tokenAddress.toLowerCase() === tokenAddress.toLowerCase());
143
+ if (rule) {
144
+ return {
145
+ isVisible: rule.isVisible,
146
+ showBalance: rule.showBalance,
147
+ showTransactions: rule.showTransactions,
148
+ };
149
+ }
150
+ // Default visibility based on global asset visibility
151
+ return {
152
+ isVisible: settings.assetVisibility.showTokenBalances,
153
+ showBalance: settings.assetVisibility.showTokenBalances,
154
+ showTransactions: settings.assetVisibility.showTransactionHistory,
155
+ };
156
+ }
157
+ catch (err) {
158
+ throw (0, error_1.reportAndSanitizeError)('getTokenVisibility', err);
159
+ }
160
+ }
161
+ // NFT visibility management
162
+ async setNFTVisibility(walletId, nftAddress, visibility) {
163
+ try {
164
+ const settings = await this.getSettings(walletId);
165
+ if (!settings) {
166
+ throw new Error('Settings not found');
167
+ }
168
+ const existingRuleIndex = settings.nftVisibilityRules.findIndex(rule => rule.nftAddress.toLowerCase() === nftAddress.toLowerCase());
169
+ const newRule = {
170
+ nftAddress: nftAddress.toLowerCase(),
171
+ ...visibility,
172
+ };
173
+ if (existingRuleIndex >= 0) {
174
+ settings.nftVisibilityRules[existingRuleIndex] = newRule;
175
+ }
176
+ else {
177
+ settings.nftVisibilityRules.push(newRule);
178
+ }
179
+ settings.updatedAt = new Date();
180
+ await this.storage.setSettings(walletId, settings);
181
+ }
182
+ catch (err) {
183
+ throw (0, error_1.reportAndSanitizeError)('setNFTVisibility', err);
184
+ }
185
+ }
186
+ async getNFTVisibility(walletId, nftAddress) {
187
+ try {
188
+ const settings = await this.getSettings(walletId);
189
+ if (!settings) {
190
+ return {
191
+ isVisible: true,
192
+ showCollection: true,
193
+ showTransactions: false,
194
+ };
195
+ }
196
+ const rule = settings.nftVisibilityRules.find(rule => rule.nftAddress.toLowerCase() === nftAddress.toLowerCase());
197
+ if (rule) {
198
+ return {
199
+ isVisible: rule.isVisible,
200
+ showCollection: rule.showCollection,
201
+ showTransactions: rule.showTransactions,
202
+ };
203
+ }
204
+ return {
205
+ isVisible: settings.assetVisibility.showNFTs,
206
+ showCollection: settings.assetVisibility.showNFTs,
207
+ showTransactions: settings.assetVisibility.showTransactionHistory,
208
+ };
209
+ }
210
+ catch (err) {
211
+ throw (0, error_1.reportAndSanitizeError)('getNFTVisibility', err);
212
+ }
213
+ }
214
+ // Whitelist management
215
+ async addToWhitelist(walletId, address, permissions) {
216
+ try {
217
+ const settings = await this.getSettings(walletId);
218
+ if (!settings) {
219
+ throw new Error('Settings not found');
220
+ }
221
+ const existingIndex = settings.viewingWhitelist.findIndex(entry => entry.address.toLowerCase() === address.toLowerCase());
222
+ const newEntry = {
223
+ address: address.toLowerCase(),
224
+ permissions,
225
+ };
226
+ if (existingIndex >= 0) {
227
+ settings.viewingWhitelist[existingIndex] = newEntry;
228
+ }
229
+ else {
230
+ settings.viewingWhitelist.push(newEntry);
231
+ }
232
+ settings.updatedAt = new Date();
233
+ await this.storage.setSettings(walletId, settings);
234
+ }
235
+ catch (err) {
236
+ throw (0, error_1.reportAndSanitizeError)('addToWhitelist', err);
237
+ }
238
+ }
239
+ async removeFromWhitelist(walletId, address) {
240
+ try {
241
+ const settings = await this.getSettings(walletId);
242
+ if (!settings) {
243
+ throw new Error('Settings not found');
244
+ }
245
+ settings.viewingWhitelist = settings.viewingWhitelist.filter(entry => entry.address.toLowerCase() !== address.toLowerCase());
246
+ settings.updatedAt = new Date();
247
+ await this.storage.setSettings(walletId, settings);
248
+ }
249
+ catch (err) {
250
+ throw (0, error_1.reportAndSanitizeError)('removeFromWhitelist', err);
251
+ }
252
+ }
253
+ async checkWhitelistPermission(walletId, viewerAddress, permission) {
254
+ try {
255
+ const settings = await this.getSettings(walletId);
256
+ if (!settings) {
257
+ return false;
258
+ }
259
+ const whitelistEntry = settings.viewingWhitelist.find(entry => entry.address.toLowerCase() === viewerAddress.toLowerCase());
260
+ return whitelistEntry?.permissions[permission] ?? false;
261
+ }
262
+ catch (err) {
263
+ throw (0, error_1.reportAndSanitizeError)('checkWhitelistPermission', err);
264
+ }
265
+ }
266
+ // Visibility proof generation
267
+ async generateVisibilityProof(walletId, requesterId, proofType, assetId) {
268
+ try {
269
+ (0, wallets_1.walletForID)(walletId);
270
+ const settings = await this.getSettings(walletId);
271
+ if (!settings) {
272
+ throw new Error('Settings not found');
273
+ }
274
+ // Check if requester has permission
275
+ const hasPermission = await this.checkVisibilityPermission(walletId, requesterId, proofType);
276
+ if (!hasPermission) {
277
+ throw new Error('Insufficient permissions');
278
+ }
279
+ // Generate cryptographic proof
280
+ const proofData = {
281
+ walletId,
282
+ requesterId,
283
+ proofType,
284
+ assetId,
285
+ timestamp: Date.now(),
286
+ };
287
+ JSON.stringify(proofData);
288
+ const proofHash = dop_engine_v3_1.ByteUtils.randomHex(32);
289
+ const proof = {
290
+ id: proofHash,
291
+ walletId,
292
+ requesterId,
293
+ proofType,
294
+ assetId,
295
+ proof: proofHash,
296
+ isValid: true,
297
+ expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000),
298
+ createdAt: new Date(),
299
+ };
300
+ await this.storage.setProof(proof.id, proof);
301
+ return proof;
302
+ }
303
+ catch (err) {
304
+ throw (0, error_1.reportAndSanitizeError)('generateVisibilityProof', err);
305
+ }
306
+ }
307
+ async verifyVisibilityProof(proofId) {
308
+ try {
309
+ const proof = await this.storage.getProof(proofId);
310
+ if (!proof) {
311
+ return false;
312
+ }
313
+ if (proof.expiresAt && proof.expiresAt < new Date()) {
314
+ proof.isValid = false;
315
+ await this.storage.setProof(proofId, proof);
316
+ return false;
317
+ }
318
+ return proof.isValid;
319
+ }
320
+ catch (err) {
321
+ throw (0, error_1.reportAndSanitizeError)('verifyVisibilityProof', err);
322
+ }
323
+ }
324
+ // Viewing request management
325
+ async createViewingRequest(requesterId, walletId, requestType, assetId, message) {
326
+ try {
327
+ const requestId = dop_engine_v3_1.ByteUtils.randomHex(32);
328
+ const request = {
329
+ id: requestId,
330
+ requesterId,
331
+ walletId,
332
+ requestType,
333
+ assetId,
334
+ message,
335
+ status: 'pending',
336
+ createdAt: new Date(),
337
+ expiresAt: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000), // 7 days
338
+ };
339
+ await this.storage.setViewingRequest(requestId, request);
340
+ return request;
341
+ }
342
+ catch (err) {
343
+ throw (0, error_1.reportAndSanitizeError)('createViewingRequest', err);
344
+ }
345
+ }
346
+ async respondToViewingRequest(requestId, response) {
347
+ try {
348
+ const request = await this.storage.getViewingRequest(requestId);
349
+ if (!request) {
350
+ throw new Error('Request not found');
351
+ }
352
+ if (request.status !== 'pending') {
353
+ throw new Error('Request already responded to');
354
+ }
355
+ if (request.expiresAt < new Date()) {
356
+ request.status = 'expired';
357
+ await this.storage.setViewingRequest(requestId, request);
358
+ throw new Error('Request expired');
359
+ }
360
+ request.status = response;
361
+ request.respondedAt = new Date();
362
+ // If approved, add to whitelist
363
+ if (response === 'approved') {
364
+ const permissions = {
365
+ viewBalances: request.requestType === 'balance',
366
+ viewNFTs: request.requestType === 'nft',
367
+ viewTransactions: request.requestType === 'transaction',
368
+ viewProfile: request.requestType === 'profile',
369
+ };
370
+ await this.addToWhitelist(request.walletId, request.requesterId, permissions);
371
+ }
372
+ await this.storage.setViewingRequest(requestId, request);
373
+ return request;
374
+ }
375
+ catch (err) {
376
+ throw (0, error_1.reportAndSanitizeError)('respondToViewingRequest', err);
377
+ }
378
+ }
379
+ async getViewingRequests(walletId) {
380
+ try {
381
+ const requests = await this.storage.getAllViewingRequestsForWallet(walletId);
382
+ return requests.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());
383
+ }
384
+ catch (err) {
385
+ throw (0, error_1.reportAndSanitizeError)('getViewingRequests', err);
386
+ }
387
+ }
388
+ // Helper methods
389
+ async checkVisibilityPermission(walletId, viewerAddress, type) {
390
+ const settings = await this.getSettings(walletId);
391
+ if (!settings) {
392
+ return false;
393
+ }
394
+ // For proof generation, require explicit whitelist permission
395
+ let permissionType;
396
+ if (type === 'balance') {
397
+ permissionType = 'viewBalances';
398
+ }
399
+ else if (type === 'nft') {
400
+ permissionType = 'viewNFTs';
401
+ }
402
+ else if (type === 'transaction') {
403
+ permissionType = 'viewTransactions';
404
+ }
405
+ else {
406
+ permissionType = 'viewProfile';
407
+ }
408
+ const whitelistPermission = await this.checkWhitelistPermission(walletId, viewerAddress, permissionType);
409
+ return whitelistPermission;
410
+ }
411
+ }
412
+ exports.SelectiveTransparencyManager = SelectiveTransparencyManager;
413
+ // Singleton instance
414
+ const selectiveTransparencyManager = new SelectiveTransparencyManager();
415
+ exports.selectiveTransparencyManager = selectiveTransparencyManager;
416
+ // Export convenience functions
417
+ const getSelectiveTransparencySettings = (walletId) => selectiveTransparencyManager.getSettings(walletId);
418
+ exports.getSelectiveTransparencySettings = getSelectiveTransparencySettings;
419
+ const updateSelectiveTransparencySettings = (walletId, updates) => selectiveTransparencyManager.updateSettings(walletId, updates);
420
+ exports.updateSelectiveTransparencySettings = updateSelectiveTransparencySettings;
421
+ const createDefaultSelectiveTransparencySettings = (walletId) => selectiveTransparencyManager.createDefaultSettings(walletId);
422
+ exports.createDefaultSelectiveTransparencySettings = createDefaultSelectiveTransparencySettings;
423
+ const setTokenVisibility = (walletId, tokenAddress, visibility) => selectiveTransparencyManager.setTokenVisibility(walletId, tokenAddress, visibility);
424
+ exports.setTokenVisibility = setTokenVisibility;
425
+ const getTokenVisibility = (walletId, tokenAddress) => selectiveTransparencyManager.getTokenVisibility(walletId, tokenAddress);
426
+ exports.getTokenVisibility = getTokenVisibility;
427
+ const setNFTVisibility = (walletId, nftAddress, visibility) => selectiveTransparencyManager.setNFTVisibility(walletId, nftAddress, visibility);
428
+ exports.setNFTVisibility = setNFTVisibility;
429
+ const getNFTVisibility = (walletId, nftAddress) => selectiveTransparencyManager.getNFTVisibility(walletId, nftAddress);
430
+ exports.getNFTVisibility = getNFTVisibility;
431
+ const addToWhitelist = (walletId, address, permissions) => selectiveTransparencyManager.addToWhitelist(walletId, address, permissions);
432
+ exports.addToWhitelist = addToWhitelist;
433
+ const removeFromWhitelist = (walletId, address) => selectiveTransparencyManager.removeFromWhitelist(walletId, address);
434
+ exports.removeFromWhitelist = removeFromWhitelist;
435
+ const checkWhitelistPermission = (walletId, viewerAddress, permission) => selectiveTransparencyManager.checkWhitelistPermission(walletId, viewerAddress, permission);
436
+ exports.checkWhitelistPermission = checkWhitelistPermission;
437
+ const generateVisibilityProof = (walletId, requesterId, proofType, assetId) => selectiveTransparencyManager.generateVisibilityProof(walletId, requesterId, proofType, assetId);
438
+ exports.generateVisibilityProof = generateVisibilityProof;
439
+ const verifyVisibilityProof = (proofId) => selectiveTransparencyManager.verifyVisibilityProof(proofId);
440
+ exports.verifyVisibilityProof = verifyVisibilityProof;
441
+ const createViewingRequest = (requesterId, walletId, requestType, assetId, message) => selectiveTransparencyManager.createViewingRequest(requesterId, walletId, requestType, assetId, message);
442
+ exports.createViewingRequest = createViewingRequest;
443
+ const respondToViewingRequest = (requestId, response) => selectiveTransparencyManager.respondToViewingRequest(requestId, response);
444
+ exports.respondToViewingRequest = respondToViewingRequest;
445
+ const getViewingRequests = (walletId) => selectiveTransparencyManager.getViewingRequests(walletId);
446
+ exports.getViewingRequests = getViewingRequests;
447
+ //# sourceMappingURL=selective-transparency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selective-transparency.js","sourceRoot":"","sources":["../../../../src/services/dop/profile/selective-transparency.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-return */\n/* eslint-disable @typescript-eslint/no-unsafe-argument */\nimport { \n SelectiveTransparencySettings,\n VisibilityProof,\n ViewingRequest\n} from './types';\nimport { reportAndSanitizeError } from '../../../utils/error';\nimport { walletForID } from '../wallets/wallets';\nimport { ByteUtils } from 'dop-engine-v3';\nimport { getProfileStorage, ProfileStorage } from './storage';\n\nclass SelectiveTransparencyManager {\n private profileStorage: Optional<ProfileStorage>;\n \n private get storage(): ProfileStorage {\n if (!this.profileStorage) {\n this.profileStorage = getProfileStorage();\n }\n return this.profileStorage;\n }\n\n // For testing: allow injection of storage\n setStorage(storage: ProfileStorage) {\n this.profileStorage = storage;\n }\n\n // Settings management\n async getSettings(walletId: string): Promise<Optional<SelectiveTransparencySettings>> {\n try {\n return await this.storage.getSettings(walletId);\n } catch (err) {\n throw reportAndSanitizeError('getSettings', err);\n }\n }\n\n async updateSettings(\n walletId: string,\n updates: Partial<SelectiveTransparencySettings>\n ): Promise<SelectiveTransparencySettings> {\n try {\n const existingSettings = await this.storage.getSettings(walletId);\n \n const newSettings: SelectiveTransparencySettings = {\n id: walletId,\n walletId,\n assetVisibility: {\n showTokenBalances: true,\n showNFTs: true,\n showTransactionHistory: false,\n showAddresses: false,\n },\n tokenVisibilityRules: [],\n nftVisibilityRules: [],\n transactionVisibility: {\n showSenderAddress: false,\n showReceiverAddress: false,\n showAmount: false,\n showMemo: false,\n showTimestamp: true,\n },\n profileVisibility: {\n showUsername: true,\n showProfilePicture: true,\n showBio: true,\n showSocialLinks: true,\n },\n viewingWhitelist: [],\n createdAt: new Date(),\n updatedAt: new Date(),\n ...existingSettings,\n ...updates,\n };\n\n await this.storage.setSettings(walletId, newSettings);\n return newSettings;\n } catch (err) {\n throw reportAndSanitizeError('updateSettings', err);\n }\n }\n\n async createDefaultSettings(walletId: string): Promise<SelectiveTransparencySettings> {\n try {\n const defaultSettings: SelectiveTransparencySettings = {\n id: walletId,\n walletId,\n assetVisibility: {\n showTokenBalances: true,\n showNFTs: true,\n showTransactionHistory: false,\n showAddresses: false,\n },\n tokenVisibilityRules: [],\n nftVisibilityRules: [],\n transactionVisibility: {\n showSenderAddress: false,\n showReceiverAddress: false,\n showAmount: false,\n showMemo: false,\n showTimestamp: true,\n },\n profileVisibility: {\n showUsername: true,\n showProfilePicture: true,\n showBio: true,\n showSocialLinks: true,\n },\n viewingWhitelist: [],\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n\n await this.storage.setSettings(walletId, defaultSettings);\n return defaultSettings;\n } catch (err) {\n throw reportAndSanitizeError('createDefaultSettings', err);\n }\n }\n\n // Token visibility management\n async setTokenVisibility(\n walletId: string,\n tokenAddress: string,\n visibility: {\n isVisible: boolean;\n showBalance: boolean;\n showTransactions: boolean;\n }\n ): Promise<void> {\n try {\n const settings = await this.getSettings(walletId);\n if (!settings) {\n throw new Error('Settings not found');\n }\n\n const existingRuleIndex = settings.tokenVisibilityRules.findIndex(\n rule => rule.tokenAddress.toLowerCase() === tokenAddress.toLowerCase()\n );\n\n const newRule = {\n tokenAddress: tokenAddress.toLowerCase(),\n ...visibility,\n };\n\n if (existingRuleIndex >= 0) {\n settings.tokenVisibilityRules[existingRuleIndex] = newRule;\n } else {\n settings.tokenVisibilityRules.push(newRule);\n }\n\n settings.updatedAt = new Date();\n await this.storage.setSettings(walletId, settings);\n } catch (err) {\n throw reportAndSanitizeError('setTokenVisibility', err);\n }\n }\n\n async getTokenVisibility(\n walletId: string,\n tokenAddress: string\n ): Promise<{\n isVisible: boolean;\n showBalance: boolean;\n showTransactions: boolean;\n }> {\n try {\n const settings = await this.getSettings(walletId);\n if (!settings) {\n // Default visibility if no settings found\n return {\n isVisible: true,\n showBalance: true,\n showTransactions: false,\n };\n }\n\n const rule = settings.tokenVisibilityRules.find(\n rule => rule.tokenAddress.toLowerCase() === tokenAddress.toLowerCase()\n );\n\n if (rule) {\n return {\n isVisible: rule.isVisible,\n showBalance: rule.showBalance,\n showTransactions: rule.showTransactions,\n };\n }\n\n // Default visibility based on global asset visibility\n return {\n isVisible: settings.assetVisibility.showTokenBalances,\n showBalance: settings.assetVisibility.showTokenBalances,\n showTransactions: settings.assetVisibility.showTransactionHistory,\n };\n } catch (err) {\n throw reportAndSanitizeError('getTokenVisibility', err);\n }\n }\n\n // NFT visibility management\n async setNFTVisibility(\n walletId: string,\n nftAddress: string,\n visibility: {\n isVisible: boolean;\n showCollection: boolean;\n showTransactions: boolean;\n }\n ): Promise<void> {\n try {\n const settings = await this.getSettings(walletId);\n if (!settings) {\n throw new Error('Settings not found');\n }\n\n const existingRuleIndex = settings.nftVisibilityRules.findIndex(\n rule => rule.nftAddress.toLowerCase() === nftAddress.toLowerCase()\n );\n\n const newRule = {\n nftAddress: nftAddress.toLowerCase(),\n ...visibility,\n };\n\n if (existingRuleIndex >= 0) {\n settings.nftVisibilityRules[existingRuleIndex] = newRule;\n } else {\n settings.nftVisibilityRules.push(newRule);\n }\n\n settings.updatedAt = new Date();\n await this.storage.setSettings(walletId, settings);\n } catch (err) {\n throw reportAndSanitizeError('setNFTVisibility', err);\n }\n }\n\n async getNFTVisibility(\n walletId: string,\n nftAddress: string\n ): Promise<{\n isVisible: boolean;\n showCollection: boolean;\n showTransactions: boolean;\n }> {\n try {\n const settings = await this.getSettings(walletId);\n if (!settings) {\n return {\n isVisible: true,\n showCollection: true,\n showTransactions: false,\n };\n }\n\n const rule = settings.nftVisibilityRules.find(\n rule => rule.nftAddress.toLowerCase() === nftAddress.toLowerCase()\n );\n\n if (rule) {\n return {\n isVisible: rule.isVisible,\n showCollection: rule.showCollection,\n showTransactions: rule.showTransactions,\n };\n }\n\n return {\n isVisible: settings.assetVisibility.showNFTs,\n showCollection: settings.assetVisibility.showNFTs,\n showTransactions: settings.assetVisibility.showTransactionHistory,\n };\n } catch (err) {\n throw reportAndSanitizeError('getNFTVisibility', err);\n }\n }\n\n // Whitelist management\n async addToWhitelist(\n walletId: string,\n address: string,\n permissions: {\n viewBalances: boolean;\n viewNFTs: boolean;\n viewTransactions: boolean;\n viewProfile: boolean;\n }\n ): Promise<void> {\n try {\n const settings = await this.getSettings(walletId);\n if (!settings) {\n throw new Error('Settings not found');\n }\n\n const existingIndex = settings.viewingWhitelist.findIndex(\n entry => entry.address.toLowerCase() === address.toLowerCase()\n );\n\n const newEntry = {\n address: address.toLowerCase(),\n permissions,\n };\n\n if (existingIndex >= 0) {\n settings.viewingWhitelist[existingIndex] = newEntry;\n } else {\n settings.viewingWhitelist.push(newEntry);\n }\n\n settings.updatedAt = new Date();\n await this.storage.setSettings(walletId, settings);\n } catch (err) {\n throw reportAndSanitizeError('addToWhitelist', err);\n }\n }\n\n async removeFromWhitelist(walletId: string, address: string): Promise<void> {\n try {\n const settings = await this.getSettings(walletId);\n if (!settings) {\n throw new Error('Settings not found');\n }\n\n settings.viewingWhitelist = settings.viewingWhitelist.filter(\n entry => entry.address.toLowerCase() !== address.toLowerCase()\n );\n\n settings.updatedAt = new Date();\n await this.storage.setSettings(walletId, settings);\n } catch (err) {\n throw reportAndSanitizeError('removeFromWhitelist', err);\n }\n }\n\n async checkWhitelistPermission(\n walletId: string,\n viewerAddress: string,\n permission: 'viewBalances' | 'viewNFTs' | 'viewTransactions' | 'viewProfile'\n ): Promise<boolean> {\n try {\n const settings = await this.getSettings(walletId);\n if (!settings) {\n return false;\n }\n\n const whitelistEntry = settings.viewingWhitelist.find(\n entry => entry.address.toLowerCase() === viewerAddress.toLowerCase()\n );\n\n return whitelistEntry?.permissions[permission] ?? false;\n } catch (err) {\n throw reportAndSanitizeError('checkWhitelistPermission', err);\n }\n }\n\n // Visibility proof generation\n async generateVisibilityProof(\n walletId: string,\n requesterId: string,\n proofType: 'balance' | 'nft' | 'transaction' | 'profile',\n assetId?: string\n ): Promise<VisibilityProof> {\n try {\n walletForID(walletId);\n const settings = await this.getSettings(walletId);\n \n if (!settings) {\n throw new Error('Settings not found');\n }\n\n // Check if requester has permission\n const hasPermission = await this.checkVisibilityPermission(\n walletId,\n requesterId,\n proofType\n );\n\n if (!hasPermission) {\n throw new Error('Insufficient permissions');\n }\n\n // Generate cryptographic proof\n const proofData = {\n walletId,\n requesterId,\n proofType,\n assetId,\n timestamp: Date.now(),\n };\n\n JSON.stringify(proofData);\n const proofHash = ByteUtils.randomHex(32);\n\n const proof: VisibilityProof = {\n id: proofHash,\n walletId,\n requesterId,\n proofType,\n assetId,\n proof: proofHash,\n isValid: true,\n expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000), // 24 hours\n createdAt: new Date(),\n };\n\n await this.storage.setProof(proof.id, proof);\n return proof;\n } catch (err) {\n throw reportAndSanitizeError('generateVisibilityProof', err);\n }\n }\n\n async verifyVisibilityProof(proofId: string): Promise<boolean> {\n try {\n const proof = await this.storage.getProof(proofId);\n if (!proof) {\n return false;\n }\n\n if (proof.expiresAt && proof.expiresAt < new Date()) {\n proof.isValid = false;\n await this.storage.setProof(proofId, proof);\n return false;\n }\n\n return proof.isValid;\n } catch (err) {\n throw reportAndSanitizeError('verifyVisibilityProof', err);\n }\n }\n\n // Viewing request management\n async createViewingRequest(\n requesterId: string,\n walletId: string,\n requestType: 'balance' | 'nft' | 'transaction' | 'profile',\n assetId?: string,\n message?: string\n ): Promise<ViewingRequest> {\n try {\n const requestId = ByteUtils.randomHex(32);\n \n const request: ViewingRequest = {\n id: requestId,\n requesterId,\n walletId,\n requestType,\n assetId,\n message,\n status: 'pending',\n createdAt: new Date(),\n expiresAt: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000), // 7 days\n };\n\n await this.storage.setViewingRequest(requestId, request);\n return request;\n } catch (err) {\n throw reportAndSanitizeError('createViewingRequest', err);\n }\n }\n\n async respondToViewingRequest(\n requestId: string,\n response: 'approved' | 'rejected'\n ): Promise<ViewingRequest> {\n try {\n const request = await this.storage.getViewingRequest(requestId);\n if (!request) {\n throw new Error('Request not found');\n }\n\n if (request.status !== 'pending') {\n throw new Error('Request already responded to');\n }\n\n if (request.expiresAt < new Date()) {\n request.status = 'expired';\n await this.storage.setViewingRequest(requestId, request);\n throw new Error('Request expired');\n }\n\n request.status = response;\n request.respondedAt = new Date();\n\n // If approved, add to whitelist\n if (response === 'approved') {\n const permissions = {\n viewBalances: request.requestType === 'balance',\n viewNFTs: request.requestType === 'nft',\n viewTransactions: request.requestType === 'transaction',\n viewProfile: request.requestType === 'profile',\n };\n\n await this.addToWhitelist(request.walletId, request.requesterId, permissions);\n }\n\n await this.storage.setViewingRequest(requestId, request);\n return request;\n } catch (err) {\n throw reportAndSanitizeError('respondToViewingRequest', err);\n }\n }\n\n async getViewingRequests(walletId: string): Promise<ViewingRequest[]> {\n try {\n const requests = await this.storage.getAllViewingRequestsForWallet(walletId);\n return requests.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());\n } catch (err) {\n throw reportAndSanitizeError('getViewingRequests', err);\n }\n }\n\n // Helper methods\n private async checkVisibilityPermission(\n walletId: string,\n viewerAddress: string,\n type: 'balance' | 'nft' | 'transaction' | 'profile'\n ): Promise<boolean> {\n const settings = await this.getSettings(walletId);\n if (!settings) {\n return false;\n }\n\n // For proof generation, require explicit whitelist permission\n let permissionType: 'viewBalances' | 'viewNFTs' | 'viewTransactions' | 'viewProfile';\n \n if (type === 'balance') {\n permissionType = 'viewBalances';\n } else if (type === 'nft') {\n permissionType = 'viewNFTs';\n } else if (type === 'transaction') {\n permissionType = 'viewTransactions';\n } else {\n permissionType = 'viewProfile';\n }\n\n const whitelistPermission = await this.checkWhitelistPermission(\n walletId,\n viewerAddress,\n permissionType\n );\n\n return whitelistPermission;\n }\n}\n\n// Singleton instance\nconst selectiveTransparencyManager = new SelectiveTransparencyManager();\n\nexport {\n selectiveTransparencyManager,\n SelectiveTransparencyManager,\n};\n\n// Export convenience functions\nexport const getSelectiveTransparencySettings = (walletId: string) =>\n selectiveTransparencyManager.getSettings(walletId);\n\nexport const updateSelectiveTransparencySettings = (\n walletId: string,\n updates: Partial<SelectiveTransparencySettings>\n) => selectiveTransparencyManager.updateSettings(walletId, updates);\n\nexport const createDefaultSelectiveTransparencySettings = (walletId: string) =>\n selectiveTransparencyManager.createDefaultSettings(walletId);\n\nexport const setTokenVisibility = (\n walletId: string,\n tokenAddress: string,\n visibility: { isVisible: boolean; showBalance: boolean; showTransactions: boolean }\n) => selectiveTransparencyManager.setTokenVisibility(walletId, tokenAddress, visibility);\n\nexport const getTokenVisibility = (walletId: string, tokenAddress: string) =>\n selectiveTransparencyManager.getTokenVisibility(walletId, tokenAddress);\n\nexport const setNFTVisibility = (\n walletId: string,\n nftAddress: string,\n visibility: { isVisible: boolean; showCollection: boolean; showTransactions: boolean }\n) => selectiveTransparencyManager.setNFTVisibility(walletId, nftAddress, visibility);\n\nexport const getNFTVisibility = (walletId: string, nftAddress: string) =>\n selectiveTransparencyManager.getNFTVisibility(walletId, nftAddress);\n\nexport const addToWhitelist = (\n walletId: string,\n address: string,\n permissions: {\n viewBalances: boolean;\n viewNFTs: boolean;\n viewTransactions: boolean;\n viewProfile: boolean;\n }\n) => selectiveTransparencyManager.addToWhitelist(walletId, address, permissions);\n\nexport const removeFromWhitelist = (walletId: string, address: string) =>\n selectiveTransparencyManager.removeFromWhitelist(walletId, address);\n\nexport const checkWhitelistPermission = (\n walletId: string,\n viewerAddress: string,\n permission: 'viewBalances' | 'viewNFTs' | 'viewTransactions' | 'viewProfile'\n) => selectiveTransparencyManager.checkWhitelistPermission(walletId, viewerAddress, permission);\n\nexport const generateVisibilityProof = (\n walletId: string,\n requesterId: string,\n proofType: 'balance' | 'nft' | 'transaction' | 'profile',\n assetId?: string\n) => selectiveTransparencyManager.generateVisibilityProof(walletId, requesterId, proofType, assetId);\n\nexport const verifyVisibilityProof = (proofId: string) =>\n selectiveTransparencyManager.verifyVisibilityProof(proofId);\n\nexport const createViewingRequest = (\n requesterId: string,\n walletId: string,\n requestType: 'balance' | 'nft' | 'transaction' | 'profile',\n assetId?: string,\n message?: string\n) => selectiveTransparencyManager.createViewingRequest(requesterId, walletId, requestType, assetId, message);\n\nexport const respondToViewingRequest = (\n requestId: string,\n response: 'approved' | 'rejected'\n) => selectiveTransparencyManager.respondToViewingRequest(requestId, response);\n\nexport const getViewingRequests = (walletId: string) =>\n selectiveTransparencyManager.getViewingRequests(walletId);\n"]}
@@ -0,0 +1,27 @@
1
+ import type { AbstractLevelDOWN } from 'abstract-leveldown';
2
+ import { UserProfile, SelectiveTransparencySettings, VisibilityProof, ViewingRequest } from './types';
3
+ /**
4
+ * Storage utility for profile and selective transparency data using LevelDown
5
+ */
6
+ export declare class ProfileStorage {
7
+ private db;
8
+ constructor(db: AbstractLevelDOWN);
9
+ getProfile(walletId: string): Promise<Optional<UserProfile>>;
10
+ setProfile(walletId: string, profile: UserProfile): Promise<void>;
11
+ deleteProfile(walletId: string): Promise<void>;
12
+ getSettings(walletId: string): Promise<Optional<SelectiveTransparencySettings>>;
13
+ setSettings(walletId: string, settings: SelectiveTransparencySettings): Promise<void>;
14
+ deleteSettings(walletId: string): Promise<void>;
15
+ getProof(proofId: string): Promise<Optional<VisibilityProof>>;
16
+ setProof(proofId: string, proof: VisibilityProof): Promise<void>;
17
+ deleteProof(proofId: string): Promise<void>;
18
+ getViewingRequest(requestId: string): Promise<Optional<ViewingRequest>>;
19
+ setViewingRequest(requestId: string, request: ViewingRequest): Promise<void>;
20
+ deleteViewingRequest(requestId: string): Promise<void>;
21
+ getAllProofsForWallet(walletId: string): Promise<VisibilityProof[]>;
22
+ getAllViewingRequestsForWallet(walletId: string): Promise<ViewingRequest[]>;
23
+ cleanupExpiredProofs(): Promise<void>;
24
+ cleanupExpiredViewingRequests(): Promise<void>;
25
+ }
26
+ export declare const getProfileStorage: () => ProfileStorage;
27
+ export declare const setProfileStorage: (storage: ProfileStorage) => void;