dop-wallet-v6 1.2.2 → 1.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/services/artifacts/__tests__/artifact-downloader.test.js.map +1 -1
- package/dist/services/artifacts/artifact-downloader.d.ts +1 -1
- package/dist/services/artifacts/artifact-downloader.js.map +1 -1
- package/dist/services/artifacts/artifact-hash.d.ts +1 -1
- package/dist/services/artifacts/artifact-hash.js.map +1 -1
- package/dist/services/artifacts/artifact-util.d.ts +1 -1
- package/dist/services/artifacts/artifact-util.js.map +1 -1
- package/dist/services/dop/core/__tests__/providers.test.js +2 -2
- package/dist/services/dop/core/__tests__/providers.test.js.map +1 -1
- package/dist/services/dop/core/artifacts.d.ts +2 -2
- package/dist/services/dop/core/artifacts.js.map +1 -1
- package/dist/services/dop/core/encrypts.d.ts +1 -1
- package/dist/services/dop/core/encrypts.js.map +1 -1
- package/dist/services/dop/core/engine.d.ts +1 -1
- package/dist/services/dop/core/engine.js.map +1 -1
- package/dist/services/dop/core/init.d.ts +2 -2
- package/dist/services/dop/core/init.js.map +1 -1
- package/dist/services/dop/core/load-provider.d.ts +1 -1
- package/dist/services/dop/core/load-provider.js.map +1 -1
- package/dist/services/dop/core/merkletree.d.ts +2 -2
- package/dist/services/dop/core/merkletree.js.map +1 -1
- package/dist/services/dop/core/prover.d.ts +1 -1
- package/dist/services/dop/core/prover.js.map +1 -1
- package/dist/services/dop/core/providers.d.ts +2 -2
- package/dist/services/dop/core/providers.js.map +1 -1
- package/dist/services/dop/dop-txids/__tests__/dop-txid-sync-graph-v2.test.js.map +1 -1
- package/dist/services/dop/dop-txids/blinded-commitments.d.ts +1 -1
- package/dist/services/dop/dop-txids/blinded-commitments.js.map +1 -1
- package/dist/services/dop/dop-txids/dop-txid-graph-type-formatters.d.ts +1 -1
- package/dist/services/dop/dop-txids/dop-txid-graph-type-formatters.js.map +1 -1
- package/dist/services/dop/dop-txids/dop-txid-merkletrees.d.ts +1 -1
- package/dist/services/dop/dop-txids/dop-txid-merkletrees.js.map +1 -1
- package/dist/services/dop/dop-txids/dop-txid-sync-graph-v2.d.ts +1 -1
- package/dist/services/dop/dop-txids/dop-txid-sync-graph-v2.js.map +1 -1
- package/dist/services/dop/dop-txids/graphql/index.js +1 -1
- package/dist/services/dop/dop-txids/graphql/index.js.map +1 -1
- package/dist/services/dop/history/transaction-history.d.ts +2 -2
- package/dist/services/dop/history/transaction-history.js.map +1 -1
- package/dist/services/dop/index.d.ts +1 -0
- package/dist/services/dop/index.js +1 -0
- package/dist/services/dop/index.js.map +1 -1
- package/dist/services/dop/process/extract-transaction-data.d.ts +1 -1
- package/dist/services/dop/process/extract-transaction-data.js.map +1 -1
- package/dist/services/dop/profile/__tests__/profile-manager.test.d.ts +1 -0
- package/dist/services/dop/profile/__tests__/profile-manager.test.js +170 -0
- package/dist/services/dop/profile/__tests__/profile-manager.test.js.map +1 -0
- package/dist/services/dop/profile/__tests__/selective-transparency.test.d.ts +1 -0
- package/dist/services/dop/profile/__tests__/selective-transparency.test.js +256 -0
- package/dist/services/dop/profile/__tests__/selective-transparency.test.js.map +1 -0
- package/dist/services/dop/profile/__tests__/storage.test.d.ts +1 -0
- package/dist/services/dop/profile/__tests__/storage.test.js +174 -0
- package/dist/services/dop/profile/__tests__/storage.test.js.map +1 -0
- package/dist/services/dop/profile/index.d.ts +3 -0
- package/dist/services/dop/profile/index.js +20 -0
- package/dist/services/dop/profile/index.js.map +1 -0
- package/dist/services/dop/profile/profile-manager.d.ts +32 -0
- package/dist/services/dop/profile/profile-manager.js +235 -0
- package/dist/services/dop/profile/profile-manager.js.map +1 -0
- package/dist/services/dop/profile/selective-transparency.d.ts +82 -0
- package/dist/services/dop/profile/selective-transparency.js +447 -0
- package/dist/services/dop/profile/selective-transparency.js.map +1 -0
- package/dist/services/dop/profile/storage.d.ts +27 -0
- package/dist/services/dop/profile/storage.js +648 -0
- package/dist/services/dop/profile/storage.js.map +1 -0
- package/dist/services/dop/profile/types.d.ts +106 -0
- package/dist/services/dop/profile/types.js +3 -0
- package/dist/services/dop/profile/types.js.map +1 -0
- package/dist/services/dop/profile/usage-example.d.ts +11 -0
- package/dist/services/dop/profile/usage-example.js +143 -0
- package/dist/services/dop/profile/usage-example.js.map +1 -0
- package/dist/services/dop/quick-sync/V2/__tests__/quick-sync-events-graph-v2.test.js.map +1 -1
- package/dist/services/dop/quick-sync/V2/graph-type-formatters-v2.d.ts +1 -1
- package/dist/services/dop/quick-sync/V2/graph-type-formatters-v2.js.map +1 -1
- package/dist/services/dop/quick-sync/V2/graphql/index.js +1 -1
- package/dist/services/dop/quick-sync/V2/graphql/index.js.map +1 -1
- package/dist/services/dop/quick-sync/V2/quick-sync-events-graph-v2.d.ts +1 -1
- package/dist/services/dop/quick-sync/V2/quick-sync-events-graph-v2.js.map +1 -1
- package/dist/services/dop/quick-sync/V3/__tests__/quick-sync-events-graph-v3.test.js.map +1 -1
- package/dist/services/dop/quick-sync/V3/graph-type-formatters-v3.d.ts +1 -1
- package/dist/services/dop/quick-sync/V3/graph-type-formatters-v3.js.map +1 -1
- package/dist/services/dop/quick-sync/V3/quick-sync-events-graph-v3.d.ts +1 -1
- package/dist/services/dop/quick-sync/V3/quick-sync-events-graph-v3.js.map +1 -1
- package/dist/services/dop/quick-sync/graph-query.d.ts +1 -1
- package/dist/services/dop/quick-sync/graph-query.js.map +1 -1
- package/dist/services/dop/quick-sync/quick-sync-events.d.ts +1 -1
- package/dist/services/dop/quick-sync/quick-sync-events.js.map +1 -1
- package/dist/services/dop/quick-sync/shared-formatters.d.ts +1 -1
- package/dist/services/dop/quick-sync/shared-formatters.js.map +1 -1
- package/dist/services/dop/util/__tests__/bytes-util.test.js +1 -1
- package/dist/services/dop/util/__tests__/bytes-util.test.js.map +1 -1
- package/dist/services/dop/util/bytes.d.ts +1 -1
- package/dist/services/dop/util/bytes.js.map +1 -1
- package/dist/services/dop/util/crypto.d.ts +2 -2
- package/dist/services/dop/util/crypto.js.map +1 -1
- package/dist/services/dop/wallets/__tests__/balances-live.test.js.map +1 -1
- package/dist/services/dop/wallets/__tests__/balances-update.test.js.map +1 -1
- package/dist/services/dop/wallets/__tests__/balances.test.js.map +1 -1
- package/dist/services/dop/wallets/__tests__/wallets.test.js.map +1 -1
- package/dist/services/dop/wallets/balance-update.d.ts +2 -2
- package/dist/services/dop/wallets/balance-update.js.map +1 -1
- package/dist/services/dop/wallets/balances.d.ts +1 -1
- package/dist/services/dop/wallets/balances.js.map +1 -1
- package/dist/services/dop/wallets/wallets.d.ts +2 -2
- package/dist/services/dop/wallets/wallets.js.map +1 -1
- package/dist/services/ethers/ethers-util.js.map +1 -1
- package/dist/services/transactions/__tests__/proof-cache.test.js.map +1 -1
- package/dist/services/transactions/__tests__/tx-cross-contract-calls.test.js +6 -6
- package/dist/services/transactions/__tests__/tx-cross-contract-calls.test.js.map +1 -1
- package/dist/services/transactions/__tests__/tx-encrypt-base-token.test.js.map +1 -1
- package/dist/services/transactions/__tests__/tx-gas-details.test.js.map +1 -1
- package/dist/services/transactions/__tests__/tx-notes.test.js.map +1 -1
- package/dist/services/transactions/__tests__/tx-transfer.test.js +9 -9
- package/dist/services/transactions/__tests__/tx-transfer.test.js.map +1 -1
- package/dist/services/transactions/proof-cache.d.ts +1 -1
- package/dist/services/transactions/proof-cache.js.map +1 -1
- package/dist/services/transactions/tx-cross-contract-calls.d.ts +2 -2
- package/dist/services/transactions/tx-cross-contract-calls.js.map +1 -1
- package/dist/services/transactions/tx-decrypt.d.ts +1 -1
- package/dist/services/transactions/tx-decrypt.js.map +1 -1
- package/dist/services/transactions/tx-encrypt-base-token.d.ts +1 -1
- package/dist/services/transactions/tx-encrypt-base-token.js.map +1 -1
- package/dist/services/transactions/tx-encrypt.d.ts +1 -1
- package/dist/services/transactions/tx-encrypt.js.map +1 -1
- package/dist/services/transactions/tx-gas-broadcaster-fee-estimator.d.ts +2 -2
- package/dist/services/transactions/tx-gas-broadcaster-fee-estimator.js.map +1 -1
- package/dist/services/transactions/tx-gas-details.d.ts +1 -1
- package/dist/services/transactions/tx-gas-details.js.map +1 -1
- package/dist/services/transactions/tx-generator.d.ts +2 -2
- package/dist/services/transactions/tx-generator.js.map +1 -1
- package/dist/services/transactions/tx-notes.d.ts +2 -2
- package/dist/services/transactions/tx-notes.js.map +1 -1
- package/dist/services/transactions/tx-nullifiers.d.ts +1 -1
- package/dist/services/transactions/tx-nullifiers.js.map +1 -1
- package/dist/services/transactions/tx-proof-decrypt.d.ts +1 -1
- package/dist/services/transactions/tx-proof-decrypt.js.map +1 -1
- package/dist/services/transactions/tx-proof-transfer.d.ts +1 -1
- package/dist/services/transactions/tx-proof-transfer.js.map +1 -1
- package/dist/services/transactions/tx-transfer.d.ts +1 -1
- package/dist/services/transactions/tx-transfer.js.map +1 -1
- package/dist/tests/helper.test.d.ts +1 -1
- package/dist/tests/helper.test.js.map +1 -1
- package/dist/tests/mocks.test.d.ts +2 -2
- package/dist/tests/mocks.test.js.map +1 -1
- package/dist/tests/poi/test-wallet-poi-requester.test.d.ts +2 -2
- package/dist/tests/poi/test-wallet-poi-requester.test.js.map +1 -1
- package/dist/tests/setup.test.d.ts +1 -1
- package/dist/tests/setup.test.js.map +1 -1
- package/dist/tests/stubs/engine-stubs.test.d.ts +1 -1
- package/dist/tests/stubs/engine-stubs.test.js.map +1 -1
- package/dist/utils/blocked-address.js.map +1 -1
- package/dist/utils/error.js.map +1 -1
- package/dist/utils/gas-price.d.ts +1 -1
- package/dist/utils/gas-price.js.map +1 -1
- package/package.json +13 -3
- package/postinstall.js +1 -1
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const chai_1 = __importDefault(require("chai"));
|
|
7
|
+
const chai_as_promised_1 = __importDefault(require("chai-as-promised"));
|
|
8
|
+
const storage_1 = require("../storage");
|
|
9
|
+
const leveldown_1 = __importDefault(require("leveldown"));
|
|
10
|
+
const fs_1 = require("fs");
|
|
11
|
+
chai_1.default.use(chai_as_promised_1.default);
|
|
12
|
+
const { expect } = chai_1.default;
|
|
13
|
+
describe('ProfileStorage', () => {
|
|
14
|
+
let storage;
|
|
15
|
+
let db;
|
|
16
|
+
const testDbPath = 'test-profile-db';
|
|
17
|
+
beforeEach(async () => {
|
|
18
|
+
db = new leveldown_1.default(testDbPath);
|
|
19
|
+
await new Promise((resolve, reject) => {
|
|
20
|
+
db.open((err) => {
|
|
21
|
+
if (err)
|
|
22
|
+
reject(err);
|
|
23
|
+
else
|
|
24
|
+
resolve();
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
storage = new storage_1.ProfileStorage(db);
|
|
28
|
+
});
|
|
29
|
+
afterEach(async () => {
|
|
30
|
+
// eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
|
|
31
|
+
if (db && typeof db.close === 'function') {
|
|
32
|
+
await new Promise((resolve, reject) => {
|
|
33
|
+
db.close((err) => {
|
|
34
|
+
if (err)
|
|
35
|
+
reject(err);
|
|
36
|
+
else
|
|
37
|
+
resolve();
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
(0, fs_1.rmSync)(testDbPath, { recursive: true, force: true });
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
// Ignore cleanup errors
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
describe('Profile operations', () => {
|
|
49
|
+
it('should store and retrieve a profile', async () => {
|
|
50
|
+
const walletId = 'test-wallet-1';
|
|
51
|
+
const profile = {
|
|
52
|
+
id: walletId,
|
|
53
|
+
username: 'testuser',
|
|
54
|
+
profilePicture: 'https://example.com/avatar.jpg',
|
|
55
|
+
bio: 'Test bio',
|
|
56
|
+
socialLinks: {
|
|
57
|
+
twitter: '@testuser',
|
|
58
|
+
discord: 'testuser#1234',
|
|
59
|
+
},
|
|
60
|
+
createdAt: new Date(),
|
|
61
|
+
updatedAt: new Date(),
|
|
62
|
+
};
|
|
63
|
+
await storage.setProfile(walletId, profile);
|
|
64
|
+
const retrievedProfile = await storage.getProfile(walletId);
|
|
65
|
+
expect(retrievedProfile).to.not.be.undefined;
|
|
66
|
+
expect(retrievedProfile?.id).to.equal(walletId);
|
|
67
|
+
expect(retrievedProfile?.username).to.equal('testuser');
|
|
68
|
+
expect(retrievedProfile?.bio).to.equal('Test bio');
|
|
69
|
+
});
|
|
70
|
+
it('should return undefined for non-existent profile', async () => {
|
|
71
|
+
const retrievedProfile = await storage.getProfile('non-existent-wallet');
|
|
72
|
+
expect(retrievedProfile).to.be.undefined;
|
|
73
|
+
});
|
|
74
|
+
it('should delete a profile', async () => {
|
|
75
|
+
const walletId = 'test-wallet-2';
|
|
76
|
+
const profile = {
|
|
77
|
+
id: walletId,
|
|
78
|
+
username: 'testuser2',
|
|
79
|
+
createdAt: new Date(),
|
|
80
|
+
updatedAt: new Date(),
|
|
81
|
+
};
|
|
82
|
+
await storage.setProfile(walletId, profile);
|
|
83
|
+
await storage.deleteProfile(walletId);
|
|
84
|
+
const retrievedProfile = await storage.getProfile(walletId);
|
|
85
|
+
expect(retrievedProfile).to.be.undefined;
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
describe('Settings operations', () => {
|
|
89
|
+
it('should store and retrieve selective transparency settings', async () => {
|
|
90
|
+
const walletId = 'test-wallet-3';
|
|
91
|
+
const settings = {
|
|
92
|
+
id: walletId,
|
|
93
|
+
walletId,
|
|
94
|
+
assetVisibility: {
|
|
95
|
+
showTokenBalances: true,
|
|
96
|
+
showNFTs: false,
|
|
97
|
+
showTransactionHistory: false,
|
|
98
|
+
showAddresses: false,
|
|
99
|
+
},
|
|
100
|
+
tokenVisibilityRules: [],
|
|
101
|
+
nftVisibilityRules: [],
|
|
102
|
+
transactionVisibility: {
|
|
103
|
+
showSenderAddress: false,
|
|
104
|
+
showReceiverAddress: false,
|
|
105
|
+
showAmount: false,
|
|
106
|
+
showMemo: false,
|
|
107
|
+
showTimestamp: true,
|
|
108
|
+
},
|
|
109
|
+
profileVisibility: {
|
|
110
|
+
showUsername: true,
|
|
111
|
+
showProfilePicture: true,
|
|
112
|
+
showBio: true,
|
|
113
|
+
showSocialLinks: true,
|
|
114
|
+
},
|
|
115
|
+
viewingWhitelist: [],
|
|
116
|
+
createdAt: new Date(),
|
|
117
|
+
updatedAt: new Date(),
|
|
118
|
+
};
|
|
119
|
+
await storage.setSettings(walletId, settings);
|
|
120
|
+
const retrievedSettings = await storage.getSettings(walletId);
|
|
121
|
+
expect(retrievedSettings).to.not.be.undefined;
|
|
122
|
+
expect(retrievedSettings?.walletId).to.equal(walletId);
|
|
123
|
+
expect(retrievedSettings?.assetVisibility.showTokenBalances).to.be.true;
|
|
124
|
+
expect(retrievedSettings?.assetVisibility.showNFTs).to.be.false;
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
describe('Proof operations', () => {
|
|
128
|
+
it('should store and retrieve visibility proofs', async () => {
|
|
129
|
+
const proofId = 'test-proof-1';
|
|
130
|
+
const proof = {
|
|
131
|
+
id: proofId,
|
|
132
|
+
walletId: 'test-wallet-4',
|
|
133
|
+
requesterId: 'requester-wallet',
|
|
134
|
+
proofType: 'balance',
|
|
135
|
+
assetId: 'ETH',
|
|
136
|
+
proof: 'test-proof-hash',
|
|
137
|
+
isValid: true,
|
|
138
|
+
createdAt: new Date(),
|
|
139
|
+
expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000),
|
|
140
|
+
};
|
|
141
|
+
await storage.setProof(proofId, proof);
|
|
142
|
+
const retrievedProof = await storage.getProof(proofId);
|
|
143
|
+
expect(retrievedProof).to.not.be.undefined;
|
|
144
|
+
expect(retrievedProof?.id).to.equal(proofId);
|
|
145
|
+
expect(retrievedProof?.walletId).to.equal('test-wallet-4');
|
|
146
|
+
expect(retrievedProof?.proofType).to.equal('balance');
|
|
147
|
+
expect(retrievedProof?.isValid).to.be.true;
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
describe('Viewing request operations', () => {
|
|
151
|
+
it('should store and retrieve viewing requests', async () => {
|
|
152
|
+
const requestId = 'test-request-1';
|
|
153
|
+
const request = {
|
|
154
|
+
id: requestId,
|
|
155
|
+
requesterId: 'requester-wallet',
|
|
156
|
+
walletId: 'target-wallet',
|
|
157
|
+
requestType: 'balance',
|
|
158
|
+
message: 'Please share your balance',
|
|
159
|
+
status: 'pending',
|
|
160
|
+
createdAt: new Date(),
|
|
161
|
+
expiresAt: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000),
|
|
162
|
+
};
|
|
163
|
+
await storage.setViewingRequest(requestId, request);
|
|
164
|
+
const retrievedRequest = await storage.getViewingRequest(requestId);
|
|
165
|
+
expect(retrievedRequest).to.not.be.undefined;
|
|
166
|
+
expect(retrievedRequest?.id).to.equal(requestId);
|
|
167
|
+
expect(retrievedRequest?.requesterId).to.equal('requester-wallet');
|
|
168
|
+
expect(retrievedRequest?.walletId).to.equal('target-wallet');
|
|
169
|
+
expect(retrievedRequest?.requestType).to.equal('balance');
|
|
170
|
+
expect(retrievedRequest?.status).to.equal('pending');
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
//# sourceMappingURL=storage.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.test.js","sourceRoot":"","sources":["../../../../../src/services/dop/profile/__tests__/storage.test.ts"],"names":[],"mappings":"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","sourcesContent":["import chai from 'chai';\nimport chaiAsPromised from 'chai-as-promised';\nimport { ProfileStorage } from '../storage';\nimport { UserProfile, SelectiveTransparencySettings, VisibilityProof, ViewingRequest } from '../types';\nimport LevelDOWN from 'leveldown';\nimport { rmSync } from 'fs';\nimport type { AbstractLevelDOWN } from 'abstract-leveldown';\n\nchai.use(chaiAsPromised);\nconst { expect } = chai;\n\ndescribe('ProfileStorage', () => {\n let storage: ProfileStorage;\n let db: AbstractLevelDOWN;\n const testDbPath = 'test-profile-db';\n\n beforeEach(async () => {\n db = new LevelDOWN(testDbPath);\n await new Promise<void>((resolve, reject) => {\n db.open((err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n storage = new ProfileStorage(db);\n });\n\n afterEach(async () => {\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n if (db && typeof db.close === 'function') {\n await new Promise<void>((resolve, reject) => {\n db.close((err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n }\n try {\n rmSync(testDbPath, { recursive: true, force: true });\n } catch (error) {\n // Ignore cleanup errors\n }\n });\n\n describe('Profile operations', () => {\n it('should store and retrieve a profile', async () => {\n const walletId = 'test-wallet-1';\n const profile: UserProfile = {\n id: walletId,\n username: 'testuser',\n profilePicture: 'https://example.com/avatar.jpg',\n bio: 'Test bio',\n socialLinks: {\n twitter: '@testuser',\n discord: 'testuser#1234',\n },\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n\n await storage.setProfile(walletId, profile);\n const retrievedProfile = await storage.getProfile(walletId);\n\n expect(retrievedProfile).to.not.be.undefined;\n expect(retrievedProfile?.id).to.equal(walletId);\n expect(retrievedProfile?.username).to.equal('testuser');\n expect(retrievedProfile?.bio).to.equal('Test bio');\n });\n\n it('should return undefined for non-existent profile', async () => {\n const retrievedProfile = await storage.getProfile('non-existent-wallet');\n expect(retrievedProfile).to.be.undefined;\n });\n\n it('should delete a profile', async () => {\n const walletId = 'test-wallet-2';\n const profile: UserProfile = {\n id: walletId,\n username: 'testuser2',\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n\n await storage.setProfile(walletId, profile);\n await storage.deleteProfile(walletId);\n \n const retrievedProfile = await storage.getProfile(walletId);\n expect(retrievedProfile).to.be.undefined;\n });\n });\n\n describe('Settings operations', () => {\n it('should store and retrieve selective transparency settings', async () => {\n const walletId = 'test-wallet-3';\n const settings: SelectiveTransparencySettings = {\n id: walletId,\n walletId,\n assetVisibility: {\n showTokenBalances: true,\n showNFTs: false,\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 storage.setSettings(walletId, settings);\n const retrievedSettings = await storage.getSettings(walletId);\n\n expect(retrievedSettings).to.not.be.undefined;\n expect(retrievedSettings?.walletId).to.equal(walletId);\n expect(retrievedSettings?.assetVisibility.showTokenBalances).to.be.true;\n expect(retrievedSettings?.assetVisibility.showNFTs).to.be.false;\n });\n });\n\n describe('Proof operations', () => {\n it('should store and retrieve visibility proofs', async () => {\n const proofId = 'test-proof-1';\n const proof: VisibilityProof = {\n id: proofId,\n walletId: 'test-wallet-4',\n requesterId: 'requester-wallet',\n proofType: 'balance',\n assetId: 'ETH',\n proof: 'test-proof-hash',\n isValid: true,\n createdAt: new Date(),\n expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000),\n };\n\n await storage.setProof(proofId, proof);\n const retrievedProof = await storage.getProof(proofId);\n\n expect(retrievedProof).to.not.be.undefined;\n expect(retrievedProof?.id).to.equal(proofId);\n expect(retrievedProof?.walletId).to.equal('test-wallet-4');\n expect(retrievedProof?.proofType).to.equal('balance');\n expect(retrievedProof?.isValid).to.be.true;\n });\n });\n\n describe('Viewing request operations', () => {\n it('should store and retrieve viewing requests', async () => {\n const requestId = 'test-request-1';\n const request: ViewingRequest = {\n id: requestId,\n requesterId: 'requester-wallet',\n walletId: 'target-wallet',\n requestType: 'balance',\n message: 'Please share your balance',\n status: 'pending',\n createdAt: new Date(),\n expiresAt: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000),\n };\n\n await storage.setViewingRequest(requestId, request);\n const retrievedRequest = await storage.getViewingRequest(requestId);\n\n expect(retrievedRequest).to.not.be.undefined;\n expect(retrievedRequest?.id).to.equal(requestId);\n expect(retrievedRequest?.requesterId).to.equal('requester-wallet');\n expect(retrievedRequest?.walletId).to.equal('target-wallet');\n expect(retrievedRequest?.requestType).to.equal('balance');\n expect(retrievedRequest?.status).to.equal('pending');\n });\n });\n});\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./profile-manager"), exports);
|
|
18
|
+
__exportStar(require("./selective-transparency"), exports);
|
|
19
|
+
__exportStar(require("./types"), exports);
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/dop/profile/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,2DAAyC;AACzC,0CAAwB","sourcesContent":["export * from './profile-manager';\nexport * from './selective-transparency';\nexport * from './types';\n"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { UserProfile, ProfileCustomization, SelectiveTransparencyCallback } from './types';
|
|
2
|
+
import { ProfileStorage } from './storage';
|
|
3
|
+
export declare const setSelectiveTransparencyCallback: (callback?: SelectiveTransparencyCallback) => void;
|
|
4
|
+
declare class ProfileManager {
|
|
5
|
+
private profileStorage;
|
|
6
|
+
private get storage();
|
|
7
|
+
setStorage(storage: ProfileStorage): void;
|
|
8
|
+
createProfile(walletId: string, profileData: Partial<UserProfile>): Promise<UserProfile>;
|
|
9
|
+
updateProfile(walletId: string, updates: Partial<UserProfile>): Promise<UserProfile>;
|
|
10
|
+
getProfile(walletId: string): Promise<Optional<UserProfile>>;
|
|
11
|
+
deleteProfile(walletId: string): Promise<void>;
|
|
12
|
+
setCustomization(walletId: string, customization: ProfileCustomization): Promise<void>;
|
|
13
|
+
getCustomization(walletId: string): Promise<Optional<ProfileCustomization>>;
|
|
14
|
+
static validateUsername(username: string): boolean;
|
|
15
|
+
static validateProfilePicture(profilePicture: string): boolean;
|
|
16
|
+
searchProfiles(_query: string): Promise<UserProfile[]>;
|
|
17
|
+
exportProfile(walletId: string): Promise<string>;
|
|
18
|
+
importProfile(walletId: string, data: string): Promise<UserProfile>;
|
|
19
|
+
}
|
|
20
|
+
declare const profileManager: ProfileManager;
|
|
21
|
+
export { profileManager, ProfileManager, };
|
|
22
|
+
export declare const createProfile: (walletId: string, profileData: Partial<UserProfile>) => Promise<UserProfile>;
|
|
23
|
+
export declare const updateProfile: (walletId: string, updates: Partial<UserProfile>) => Promise<UserProfile>;
|
|
24
|
+
export declare const getProfile: (walletId: string) => Promise<Optional<UserProfile>>;
|
|
25
|
+
export declare const deleteProfile: (walletId: string) => Promise<void>;
|
|
26
|
+
export declare const setCustomization: (walletId: string, customization: ProfileCustomization) => Promise<void>;
|
|
27
|
+
export declare const getCustomization: (walletId: string) => Promise<Optional<ProfileCustomization>>;
|
|
28
|
+
export declare const validateUsername: (username: string) => boolean;
|
|
29
|
+
export declare const validateProfilePicture: (profilePicture: string) => boolean;
|
|
30
|
+
export declare const searchProfiles: (query: string) => Promise<UserProfile[]>;
|
|
31
|
+
export declare const exportProfile: (walletId: string) => Promise<string>;
|
|
32
|
+
export declare const importProfile: (walletId: string, data: string) => Promise<UserProfile>;
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.importProfile = exports.exportProfile = exports.searchProfiles = exports.validateProfilePicture = exports.validateUsername = exports.getCustomization = exports.setCustomization = exports.deleteProfile = exports.getProfile = exports.updateProfile = exports.createProfile = exports.ProfileManager = exports.profileManager = exports.setSelectiveTransparencyCallback = void 0;
|
|
4
|
+
const error_1 = require("../../../utils/error");
|
|
5
|
+
const storage_1 = require("./storage");
|
|
6
|
+
let eventCallback;
|
|
7
|
+
const setSelectiveTransparencyCallback = (callback) => {
|
|
8
|
+
eventCallback = callback;
|
|
9
|
+
};
|
|
10
|
+
exports.setSelectiveTransparencyCallback = setSelectiveTransparencyCallback;
|
|
11
|
+
const emitEvent = (event) => {
|
|
12
|
+
if (eventCallback) {
|
|
13
|
+
eventCallback(event);
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
class ProfileManager {
|
|
17
|
+
profileStorage;
|
|
18
|
+
get storage() {
|
|
19
|
+
if (!this.profileStorage) {
|
|
20
|
+
this.profileStorage = (0, storage_1.getProfileStorage)();
|
|
21
|
+
}
|
|
22
|
+
return this.profileStorage;
|
|
23
|
+
}
|
|
24
|
+
// For testing: allow injection of storage
|
|
25
|
+
setStorage(storage) {
|
|
26
|
+
this.profileStorage = storage;
|
|
27
|
+
}
|
|
28
|
+
// Profile management
|
|
29
|
+
async createProfile(walletId, profileData) {
|
|
30
|
+
try {
|
|
31
|
+
// Validate profile data
|
|
32
|
+
if (profileData.username !== undefined && profileData.username !== null && !ProfileManager.validateUsername(profileData.username)) {
|
|
33
|
+
throw new Error('Invalid username');
|
|
34
|
+
}
|
|
35
|
+
if (profileData.bio !== undefined && profileData.bio !== null && profileData.bio.length > 500) {
|
|
36
|
+
throw new Error('Bio too long');
|
|
37
|
+
}
|
|
38
|
+
if (profileData.profilePicture !== undefined && profileData.profilePicture !== null && !ProfileManager.validateProfilePicture(profileData.profilePicture)) {
|
|
39
|
+
throw new Error('Invalid profile picture URL');
|
|
40
|
+
}
|
|
41
|
+
const profile = {
|
|
42
|
+
id: walletId,
|
|
43
|
+
username: profileData.username,
|
|
44
|
+
profilePicture: profileData.profilePicture,
|
|
45
|
+
bio: profileData.bio,
|
|
46
|
+
socialLinks: profileData.socialLinks,
|
|
47
|
+
createdAt: new Date(),
|
|
48
|
+
updatedAt: new Date(),
|
|
49
|
+
};
|
|
50
|
+
await this.storage.setProfile(walletId, profile);
|
|
51
|
+
emitEvent({
|
|
52
|
+
type: 'profile_updated',
|
|
53
|
+
data: { walletId, profile }
|
|
54
|
+
});
|
|
55
|
+
return profile;
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
throw (0, error_1.reportAndSanitizeError)('createProfile', err);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async updateProfile(walletId, updates) {
|
|
62
|
+
try {
|
|
63
|
+
const existingProfile = await this.storage.getProfile(walletId);
|
|
64
|
+
if (!existingProfile) {
|
|
65
|
+
throw new Error('Profile not found');
|
|
66
|
+
}
|
|
67
|
+
const updatedProfile = {
|
|
68
|
+
...existingProfile,
|
|
69
|
+
...updates,
|
|
70
|
+
updatedAt: new Date(),
|
|
71
|
+
};
|
|
72
|
+
await this.storage.setProfile(walletId, updatedProfile);
|
|
73
|
+
emitEvent({
|
|
74
|
+
type: 'profile_updated',
|
|
75
|
+
data: { walletId, profile: updatedProfile }
|
|
76
|
+
});
|
|
77
|
+
return updatedProfile;
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
throw (0, error_1.reportAndSanitizeError)('updateProfile', err);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async getProfile(walletId) {
|
|
84
|
+
try {
|
|
85
|
+
return await this.storage.getProfile(walletId);
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
throw (0, error_1.reportAndSanitizeError)('getProfile', err);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async deleteProfile(walletId) {
|
|
92
|
+
try {
|
|
93
|
+
const existingProfile = await this.storage.getProfile(walletId);
|
|
94
|
+
if (!existingProfile) {
|
|
95
|
+
throw new Error('Profile not found');
|
|
96
|
+
}
|
|
97
|
+
await this.storage.deleteProfile(walletId);
|
|
98
|
+
emitEvent({
|
|
99
|
+
type: 'profile_updated',
|
|
100
|
+
data: { walletId, deleted: true }
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
throw (0, error_1.reportAndSanitizeError)('deleteProfile', err);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Profile customization
|
|
108
|
+
async setCustomization(walletId, customization) {
|
|
109
|
+
try {
|
|
110
|
+
// For now, store customization as part of profile
|
|
111
|
+
const profile = await this.storage.getProfile(walletId);
|
|
112
|
+
if (!profile) {
|
|
113
|
+
throw new Error('Profile not found');
|
|
114
|
+
}
|
|
115
|
+
const updatedProfile = {
|
|
116
|
+
...profile,
|
|
117
|
+
customization,
|
|
118
|
+
updatedAt: new Date(),
|
|
119
|
+
};
|
|
120
|
+
await this.storage.setProfile(walletId, updatedProfile);
|
|
121
|
+
emitEvent({
|
|
122
|
+
type: 'settings_changed',
|
|
123
|
+
data: { walletId, customization }
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
throw (0, error_1.reportAndSanitizeError)('setCustomization', err);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
async getCustomization(walletId) {
|
|
131
|
+
try {
|
|
132
|
+
const profile = await this.storage.getProfile(walletId);
|
|
133
|
+
return profile?.customization;
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
throw (0, error_1.reportAndSanitizeError)('getCustomization', err);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Profile validation
|
|
140
|
+
static validateUsername(username) {
|
|
141
|
+
if (!username || username.length < 3 || username.length > 32) {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
// Allow alphanumeric characters, underscores, and hyphens
|
|
145
|
+
const usernameRegex = /^[a-zA-Z0-9_-]+$/;
|
|
146
|
+
return usernameRegex.test(username);
|
|
147
|
+
}
|
|
148
|
+
static validateProfilePicture(profilePicture) {
|
|
149
|
+
if (!profilePicture) {
|
|
150
|
+
return true; // Optional field
|
|
151
|
+
}
|
|
152
|
+
// Basic URL validation
|
|
153
|
+
try {
|
|
154
|
+
// eslint-disable-next-line no-new
|
|
155
|
+
new URL(profilePicture);
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// Search profiles - simplified for now
|
|
163
|
+
async searchProfiles(_query) {
|
|
164
|
+
try {
|
|
165
|
+
// For now, return empty array
|
|
166
|
+
// In a full implementation, you'd iterate through all profiles in the database
|
|
167
|
+
return [];
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
throw (0, error_1.reportAndSanitizeError)('searchProfiles', err);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// Export/import profiles - simplified for now
|
|
174
|
+
async exportProfile(walletId) {
|
|
175
|
+
try {
|
|
176
|
+
const profile = await this.storage.getProfile(walletId);
|
|
177
|
+
if (!profile) {
|
|
178
|
+
throw new Error('Profile not found');
|
|
179
|
+
}
|
|
180
|
+
return JSON.stringify({ profile });
|
|
181
|
+
}
|
|
182
|
+
catch (err) {
|
|
183
|
+
throw (0, error_1.reportAndSanitizeError)('exportProfile', err);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
async importProfile(walletId, data) {
|
|
187
|
+
try {
|
|
188
|
+
const parsed = JSON.parse(data);
|
|
189
|
+
const { profile } = parsed;
|
|
190
|
+
if (profile === undefined || profile === null || typeof profile !== 'object' || !('id' in profile)) {
|
|
191
|
+
throw new Error('Invalid profile data');
|
|
192
|
+
}
|
|
193
|
+
// Update IDs to match current wallet
|
|
194
|
+
profile.id = walletId;
|
|
195
|
+
profile.updatedAt = new Date();
|
|
196
|
+
await this.storage.setProfile(walletId, profile);
|
|
197
|
+
emitEvent({
|
|
198
|
+
type: 'profile_updated',
|
|
199
|
+
data: { walletId, profile }
|
|
200
|
+
});
|
|
201
|
+
return profile;
|
|
202
|
+
}
|
|
203
|
+
catch (err) {
|
|
204
|
+
throw (0, error_1.reportAndSanitizeError)('importProfile', err);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
exports.ProfileManager = ProfileManager;
|
|
209
|
+
// Singleton instance
|
|
210
|
+
const profileManager = new ProfileManager();
|
|
211
|
+
exports.profileManager = profileManager;
|
|
212
|
+
// Export convenience functions
|
|
213
|
+
const createProfile = (walletId, profileData) => profileManager.createProfile(walletId, profileData);
|
|
214
|
+
exports.createProfile = createProfile;
|
|
215
|
+
const updateProfile = (walletId, updates) => profileManager.updateProfile(walletId, updates);
|
|
216
|
+
exports.updateProfile = updateProfile;
|
|
217
|
+
const getProfile = (walletId) => profileManager.getProfile(walletId);
|
|
218
|
+
exports.getProfile = getProfile;
|
|
219
|
+
const deleteProfile = (walletId) => profileManager.deleteProfile(walletId);
|
|
220
|
+
exports.deleteProfile = deleteProfile;
|
|
221
|
+
const setCustomization = (walletId, customization) => profileManager.setCustomization(walletId, customization);
|
|
222
|
+
exports.setCustomization = setCustomization;
|
|
223
|
+
const getCustomization = (walletId) => profileManager.getCustomization(walletId);
|
|
224
|
+
exports.getCustomization = getCustomization;
|
|
225
|
+
const validateUsername = (username) => ProfileManager.validateUsername(username);
|
|
226
|
+
exports.validateUsername = validateUsername;
|
|
227
|
+
const validateProfilePicture = (profilePicture) => ProfileManager.validateProfilePicture(profilePicture);
|
|
228
|
+
exports.validateProfilePicture = validateProfilePicture;
|
|
229
|
+
const searchProfiles = (query) => profileManager.searchProfiles(query);
|
|
230
|
+
exports.searchProfiles = searchProfiles;
|
|
231
|
+
const exportProfile = (walletId) => profileManager.exportProfile(walletId);
|
|
232
|
+
exports.exportProfile = exportProfile;
|
|
233
|
+
const importProfile = (walletId, data) => profileManager.importProfile(walletId, data);
|
|
234
|
+
exports.importProfile = importProfile;
|
|
235
|
+
//# sourceMappingURL=profile-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-manager.js","sourceRoot":"","sources":["../../../../src/services/dop/profile/profile-manager.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 */\n/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable class-methods-use-this */\nimport { \n UserProfile,\n ProfileCustomization,\n SelectiveTransparencyEvent,\n SelectiveTransparencyCallback\n} from './types';\nimport { reportAndSanitizeError } from '../../../utils/error';\nimport { getProfileStorage, ProfileStorage } from './storage';\n\nlet eventCallback: Optional<SelectiveTransparencyCallback>;\n\nexport const setSelectiveTransparencyCallback = (\n callback?: SelectiveTransparencyCallback,\n) => {\n eventCallback = callback;\n};\n\nconst emitEvent = (event: SelectiveTransparencyEvent) => {\n if (eventCallback) {\n eventCallback(event);\n }\n};\n\nclass ProfileManager {\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 // Profile management\n async createProfile(\n walletId: string,\n profileData: Partial<UserProfile>\n ): Promise<UserProfile> {\n try {\n // Validate profile data\n if (profileData.username !== undefined && profileData.username !== null && !ProfileManager.validateUsername(profileData.username)) {\n throw new Error('Invalid username');\n }\n\n if (profileData.bio !== undefined && profileData.bio !== null && profileData.bio.length > 500) {\n throw new Error('Bio too long');\n }\n\n if (profileData.profilePicture !== undefined && profileData.profilePicture !== null && !ProfileManager.validateProfilePicture(profileData.profilePicture)) {\n throw new Error('Invalid profile picture URL');\n }\n\n const profile: UserProfile = {\n id: walletId,\n username: profileData.username,\n profilePicture: profileData.profilePicture,\n bio: profileData.bio,\n socialLinks: profileData.socialLinks,\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n\n await this.storage.setProfile(walletId, profile);\n \n emitEvent({\n type: 'profile_updated',\n data: { walletId, profile }\n });\n\n return profile;\n } catch (err) {\n throw reportAndSanitizeError('createProfile', err);\n }\n }\n\n async updateProfile(\n walletId: string,\n updates: Partial<UserProfile>\n ): Promise<UserProfile> {\n try {\n const existingProfile = await this.storage.getProfile(walletId);\n if (!existingProfile) {\n throw new Error('Profile not found');\n }\n\n const updatedProfile: UserProfile = {\n ...existingProfile,\n ...updates,\n updatedAt: new Date(),\n };\n\n await this.storage.setProfile(walletId, updatedProfile);\n \n emitEvent({\n type: 'profile_updated',\n data: { walletId, profile: updatedProfile }\n });\n\n return updatedProfile;\n } catch (err) {\n throw reportAndSanitizeError('updateProfile', err);\n }\n }\n\n async getProfile(walletId: string): Promise<Optional<UserProfile>> {\n try {\n return await this.storage.getProfile(walletId);\n } catch (err) {\n throw reportAndSanitizeError('getProfile', err);\n }\n }\n\n async deleteProfile(walletId: string): Promise<void> {\n try {\n const existingProfile = await this.storage.getProfile(walletId);\n if (!existingProfile) {\n throw new Error('Profile not found');\n }\n\n await this.storage.deleteProfile(walletId);\n\n emitEvent({\n type: 'profile_updated',\n data: { walletId, deleted: true }\n });\n } catch (err) {\n throw reportAndSanitizeError('deleteProfile', err);\n }\n }\n\n // Profile customization\n async setCustomization(\n walletId: string,\n customization: ProfileCustomization\n ): Promise<void> {\n try {\n // For now, store customization as part of profile\n const profile = await this.storage.getProfile(walletId);\n if (!profile) {\n throw new Error('Profile not found');\n }\n\n const updatedProfile = {\n ...profile,\n customization,\n updatedAt: new Date(),\n };\n\n await this.storage.setProfile(walletId, updatedProfile);\n \n emitEvent({\n type: 'settings_changed',\n data: { walletId, customization }\n });\n } catch (err) {\n throw reportAndSanitizeError('setCustomization', err);\n }\n }\n\n async getCustomization(walletId: string): Promise<Optional<ProfileCustomization>> {\n try {\n const profile = await this.storage.getProfile(walletId);\n return profile?.customization;\n } catch (err) {\n throw reportAndSanitizeError('getCustomization', err);\n }\n }\n\n // Profile validation\n public static validateUsername(username: string): boolean {\n if (!username || username.length < 3 || username.length > 32) {\n return false;\n }\n \n // Allow alphanumeric characters, underscores, and hyphens\n const usernameRegex = /^[a-zA-Z0-9_-]+$/;\n return usernameRegex.test(username);\n }\n\n public static validateProfilePicture(profilePicture: string): boolean {\n if (!profilePicture) {\n return true; // Optional field\n }\n \n // Basic URL validation\n try {\n // eslint-disable-next-line no-new\n new URL(profilePicture);\n return true;\n } catch {\n return false;\n }\n }\n\n // Search profiles - simplified for now\n async searchProfiles(_query: string): Promise<UserProfile[]> {\n try {\n // For now, return empty array\n // In a full implementation, you'd iterate through all profiles in the database\n return [];\n } catch (err) {\n throw reportAndSanitizeError('searchProfiles', err);\n }\n }\n\n // Export/import profiles - simplified for now\n async exportProfile(walletId: string): Promise<string> {\n try {\n const profile = await this.storage.getProfile(walletId);\n \n if (!profile) {\n throw new Error('Profile not found');\n }\n\n return JSON.stringify({ profile });\n } catch (err) {\n throw reportAndSanitizeError('exportProfile', err);\n }\n }\n\n async importProfile(walletId: string, data: string): Promise<UserProfile> {\n try {\n const parsed = JSON.parse(data);\n const { profile } = parsed;\n\n if (profile === undefined || profile === null || typeof profile !== 'object' || !('id' in profile)) {\n throw new Error('Invalid profile data');\n }\n\n // Update IDs to match current wallet\n profile.id = walletId;\n profile.updatedAt = new Date();\n\n await this.storage.setProfile(walletId, profile as UserProfile);\n\n emitEvent({\n type: 'profile_updated',\n data: { walletId, profile }\n });\n\n return profile;\n } catch (err) {\n throw reportAndSanitizeError('importProfile', err);\n }\n }\n}\n\n// Singleton instance\nconst profileManager = new ProfileManager();\n\nexport {\n profileManager,\n ProfileManager,\n};\n\n// Export convenience functions\nexport const createProfile = (walletId: string, profileData: Partial<UserProfile>) =>\n profileManager.createProfile(walletId, profileData);\n\nexport const updateProfile = (walletId: string, updates: Partial<UserProfile>) =>\n profileManager.updateProfile(walletId, updates);\n\nexport const getProfile = (walletId: string) =>\n profileManager.getProfile(walletId);\n\nexport const deleteProfile = (walletId: string) =>\n profileManager.deleteProfile(walletId);\n\nexport const setCustomization = (walletId: string, customization: ProfileCustomization) =>\n profileManager.setCustomization(walletId, customization);\n\nexport const getCustomization = (walletId: string) =>\n profileManager.getCustomization(walletId);\n\nexport const validateUsername = (username: string) =>\n ProfileManager.validateUsername(username);\n\nexport const validateProfilePicture = (profilePicture: string) =>\n ProfileManager.validateProfilePicture(profilePicture);\n\nexport const searchProfiles = (query: string) =>\n profileManager.searchProfiles(query);\n\nexport const exportProfile = (walletId: string) =>\n profileManager.exportProfile(walletId);\n\nexport const importProfile = (walletId: string, data: string) =>\n profileManager.importProfile(walletId, data);\n"]}
|
|
@@ -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[]>;
|