@cardano-sdk/cardano-services-client 0.26.28 → 0.26.29

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 (28) hide show
  1. package/dist/cjs/ChainHistoryProvider/BlockfrostChainHistoryProvider.d.ts +42 -4
  2. package/dist/cjs/ChainHistoryProvider/BlockfrostChainHistoryProvider.d.ts.map +1 -1
  3. package/dist/cjs/ChainHistoryProvider/BlockfrostChainHistoryProvider.js +140 -34
  4. package/dist/cjs/ChainHistoryProvider/BlockfrostChainHistoryProvider.js.map +1 -1
  5. package/dist/cjs/UtxoProvider/BlockfrostUtxoProvider.d.ts +19 -3
  6. package/dist/cjs/UtxoProvider/BlockfrostUtxoProvider.d.ts.map +1 -1
  7. package/dist/cjs/UtxoProvider/BlockfrostUtxoProvider.js +107 -7
  8. package/dist/cjs/UtxoProvider/BlockfrostUtxoProvider.js.map +1 -1
  9. package/dist/cjs/credentialUtils.d.ts +15 -0
  10. package/dist/cjs/credentialUtils.d.ts.map +1 -0
  11. package/dist/cjs/credentialUtils.js +199 -0
  12. package/dist/cjs/credentialUtils.js.map +1 -0
  13. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  14. package/dist/esm/ChainHistoryProvider/BlockfrostChainHistoryProvider.d.ts +42 -4
  15. package/dist/esm/ChainHistoryProvider/BlockfrostChainHistoryProvider.d.ts.map +1 -1
  16. package/dist/esm/ChainHistoryProvider/BlockfrostChainHistoryProvider.js +140 -34
  17. package/dist/esm/ChainHistoryProvider/BlockfrostChainHistoryProvider.js.map +1 -1
  18. package/dist/esm/UtxoProvider/BlockfrostUtxoProvider.d.ts +19 -3
  19. package/dist/esm/UtxoProvider/BlockfrostUtxoProvider.d.ts.map +1 -1
  20. package/dist/esm/UtxoProvider/BlockfrostUtxoProvider.js +105 -8
  21. package/dist/esm/UtxoProvider/BlockfrostUtxoProvider.js.map +1 -1
  22. package/dist/esm/credentialUtils.d.ts +15 -0
  23. package/dist/esm/credentialUtils.d.ts.map +1 -0
  24. package/dist/esm/credentialUtils.js +193 -0
  25. package/dist/esm/credentialUtils.js.map +1 -0
  26. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  27. package/dist/package.json +4 -4
  28. package/package.json +4 -4
@@ -0,0 +1,199 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.minimizeCredentialSet = exports.extractCredentials = exports.createPaymentCredentialFilter = void 0;
4
+ const core_1 = require("@cardano-sdk/core");
5
+ const parseAddress = (address) => {
6
+ try {
7
+ return core_1.Cardano.Address.fromBech32(address);
8
+ }
9
+ catch {
10
+ try {
11
+ return core_1.Cardano.Address.fromBase58(address);
12
+ }
13
+ catch {
14
+ return null;
15
+ }
16
+ }
17
+ };
18
+ const extractPaymentCredential = (address) => {
19
+ const parsed = parseAddress(address);
20
+ if (!parsed)
21
+ return null;
22
+ if (parsed.asByron())
23
+ return null;
24
+ const baseAddress = parsed.asBase();
25
+ if (baseAddress) {
26
+ const credential = baseAddress.getPaymentCredential();
27
+ return core_1.Cardano.PaymentCredential.fromCredential(credential);
28
+ }
29
+ const enterpriseAddress = parsed.asEnterprise();
30
+ if (enterpriseAddress) {
31
+ const credential = enterpriseAddress.getPaymentCredential();
32
+ return core_1.Cardano.PaymentCredential.fromCredential(credential);
33
+ }
34
+ const pointerAddress = parsed.asPointer();
35
+ if (pointerAddress) {
36
+ const credential = pointerAddress.getPaymentCredential();
37
+ return core_1.Cardano.PaymentCredential.fromCredential(credential);
38
+ }
39
+ return null;
40
+ };
41
+ const createPaymentCredentialFilter = (addresses) => {
42
+ const exactAddresses = new Set(addresses);
43
+ const controlledCredentials = new Set();
44
+ for (const address of addresses) {
45
+ const credential = extractPaymentCredential(address);
46
+ if (credential) {
47
+ controlledCredentials.add(credential);
48
+ }
49
+ }
50
+ return (address) => {
51
+ if (exactAddresses.has(address)) {
52
+ return true;
53
+ }
54
+ const credential = extractPaymentCredential(address);
55
+ if (!credential) {
56
+ return false;
57
+ }
58
+ return controlledCredentials.has(credential);
59
+ };
60
+ };
61
+ exports.createPaymentCredentialFilter = createPaymentCredentialFilter;
62
+ const addToCredentialMap = (map, credential, address) => {
63
+ if (!map.has(credential)) {
64
+ map.set(credential, []);
65
+ }
66
+ map.get(credential).push(address);
67
+ };
68
+ const processBaseAddress = (baseAddress, parsedAddress, address, paymentCredentials, rewardAccounts) => {
69
+ const paymentCredential = baseAddress.getPaymentCredential();
70
+ const paymentBech32 = core_1.Cardano.PaymentCredential.fromCredential(paymentCredential);
71
+ addToCredentialMap(paymentCredentials, paymentBech32, address);
72
+ const stakeCredential = baseAddress.getStakeCredential();
73
+ const networkId = parsedAddress.getNetworkId();
74
+ const rewardAccount = core_1.Cardano.RewardAccount.fromCredential(stakeCredential, networkId);
75
+ addToCredentialMap(rewardAccounts, rewardAccount, address);
76
+ };
77
+ const processEnterpriseAddress = (enterpriseAddress, address, paymentCredentials) => {
78
+ const paymentCredential = enterpriseAddress.getPaymentCredential();
79
+ const paymentBech32 = core_1.Cardano.PaymentCredential.fromCredential(paymentCredential);
80
+ addToCredentialMap(paymentCredentials, paymentBech32, address);
81
+ };
82
+ const extractCredentials = (addresses) => {
83
+ const paymentCredentials = new Map();
84
+ const rewardAccounts = new Map();
85
+ const byron = [];
86
+ const pointer = [];
87
+ const seenAddresses = new Set();
88
+ for (const address of addresses) {
89
+ if (seenAddresses.has(address))
90
+ continue;
91
+ seenAddresses.add(address);
92
+ const parsedAddress = parseAddress(address);
93
+ if (!parsedAddress)
94
+ continue;
95
+ if (parsedAddress.asByron()) {
96
+ byron.push(address);
97
+ continue;
98
+ }
99
+ if (parsedAddress.asPointer()) {
100
+ pointer.push(address);
101
+ continue;
102
+ }
103
+ const baseAddress = parsedAddress.asBase();
104
+ if (baseAddress) {
105
+ processBaseAddress(baseAddress, parsedAddress, address, paymentCredentials, rewardAccounts);
106
+ continue;
107
+ }
108
+ const enterpriseAddress = parsedAddress.asEnterprise();
109
+ if (enterpriseAddress) {
110
+ processEnterpriseAddress(enterpriseAddress, address, paymentCredentials);
111
+ }
112
+ }
113
+ return {
114
+ paymentCredentials,
115
+ rewardAccounts,
116
+ skippedAddresses: {
117
+ byron,
118
+ pointer
119
+ }
120
+ };
121
+ };
122
+ exports.extractCredentials = extractCredentials;
123
+ const buildCredentialList = (paymentCredentials, rewardAccounts) => {
124
+ const allCredentials = [];
125
+ for (const [credential, addresses] of paymentCredentials.entries()) {
126
+ if (addresses.length > 0) {
127
+ allCredentials.push({
128
+ addresses,
129
+ credential,
130
+ type: 'payment',
131
+ uncoveredCount: addresses.length
132
+ });
133
+ }
134
+ }
135
+ for (const [rewardAccount, addresses] of rewardAccounts.entries()) {
136
+ if (addresses.length > 0) {
137
+ allCredentials.push({
138
+ addresses,
139
+ credential: rewardAccount,
140
+ type: 'stake',
141
+ uncoveredCount: addresses.length
142
+ });
143
+ }
144
+ }
145
+ return allCredentials;
146
+ };
147
+ const updateUncoveredCounts = (credentialInfos, coveredAddresses) => {
148
+ for (const info of credentialInfos) {
149
+ info.uncoveredCount = info.addresses.filter((addr) => !coveredAddresses.has(addr)).length;
150
+ }
151
+ };
152
+ const findBestCredential = (credentialInfos) => {
153
+ let maxInfo = null;
154
+ for (const info of credentialInfos) {
155
+ if (info.uncoveredCount === 0)
156
+ continue;
157
+ if (maxInfo === null) {
158
+ maxInfo = info;
159
+ continue;
160
+ }
161
+ const hasMoreCoverage = info.uncoveredCount > maxInfo.uncoveredCount;
162
+ const hasSameCoverageButPreferPayment = info.uncoveredCount === maxInfo.uncoveredCount && info.type === 'payment' && maxInfo.type === 'stake';
163
+ if (hasMoreCoverage || hasSameCoverageButPreferPayment) {
164
+ maxInfo = info;
165
+ }
166
+ }
167
+ return maxInfo;
168
+ };
169
+ const addToResultMaps = (selectedCredential, minimizedPayment, minimizedRewardAccounts) => {
170
+ if (selectedCredential.type === 'payment') {
171
+ minimizedPayment.set(selectedCredential.credential, selectedCredential.addresses);
172
+ }
173
+ else {
174
+ minimizedRewardAccounts.set(selectedCredential.credential, selectedCredential.addresses);
175
+ }
176
+ };
177
+ const minimizeCredentialSet = (credentials) => {
178
+ const { paymentCredentials, rewardAccounts } = credentials;
179
+ const coveredAddresses = new Set();
180
+ const minimizedPayment = new Map();
181
+ const minimizedRewardAccounts = new Map();
182
+ const allCredentials = buildCredentialList(paymentCredentials, rewardAccounts);
183
+ while (allCredentials.some((info) => info.uncoveredCount > 0)) {
184
+ updateUncoveredCounts(allCredentials, coveredAddresses);
185
+ const selectedCredential = findBestCredential(allCredentials);
186
+ if (!selectedCredential || selectedCredential.uncoveredCount === 0)
187
+ break;
188
+ addToResultMaps(selectedCredential, minimizedPayment, minimizedRewardAccounts);
189
+ for (const addr of selectedCredential.addresses) {
190
+ coveredAddresses.add(addr);
191
+ }
192
+ }
193
+ return {
194
+ paymentCredentials: minimizedPayment,
195
+ rewardAccounts: minimizedRewardAccounts
196
+ };
197
+ };
198
+ exports.minimizeCredentialSet = minimizeCredentialSet;
199
+ //# sourceMappingURL=credentialUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentialUtils.js","sourceRoot":"","sources":["../../src/credentialUtils.ts"],"names":[],"mappings":"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"}