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