@hashgraphonline/standards-sdk 0.1.146-chore-jsr-improvements.canary.46c0c0f.91 → 0.1.146-chore-jsr-improvements.canary.62a5b19.93
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/services/registry-broker/client/adapters.d.ts +4 -19
- package/dist/cjs/services/registry-broker/client/adapters.d.ts.map +1 -1
- package/dist/cjs/services/registry-broker/client/agents.d.ts +4 -15
- package/dist/cjs/services/registry-broker/client/agents.d.ts.map +1 -1
- package/dist/cjs/services/registry-broker/client/base-client.d.ts +64 -1
- package/dist/cjs/services/registry-broker/client/base-client.d.ts.map +1 -1
- package/dist/cjs/services/registry-broker/client/chat-history.d.ts +4 -22
- package/dist/cjs/services/registry-broker/client/chat-history.d.ts.map +1 -1
- package/dist/cjs/services/registry-broker/client/chat.d.ts +4 -32
- package/dist/cjs/services/registry-broker/client/chat.d.ts.map +1 -1
- package/dist/cjs/services/registry-broker/client/credits.d.ts +4 -39
- package/dist/cjs/services/registry-broker/client/credits.d.ts.map +1 -1
- package/dist/cjs/services/registry-broker/client/encrypted-chat-manager.d.ts +4 -34
- package/dist/cjs/services/registry-broker/client/encrypted-chat-manager.d.ts.map +1 -1
- package/dist/cjs/services/registry-broker/client/encryption.d.ts +4 -32
- package/dist/cjs/services/registry-broker/client/encryption.d.ts.map +1 -1
- package/dist/cjs/services/registry-broker/client/ledger-auth.d.ts +4 -9
- package/dist/cjs/services/registry-broker/client/ledger-auth.d.ts.map +1 -1
- package/dist/cjs/services/registry-broker/client/search-helpers.d.ts +16 -0
- package/dist/cjs/services/registry-broker/client/search-helpers.d.ts.map +1 -0
- package/dist/cjs/services/registry-broker/client/search.d.ts +5 -18
- package/dist/cjs/services/registry-broker/client/search.d.ts.map +1 -1
- package/dist/cjs/services/registry-broker/client.d.ts +4 -0
- package/dist/cjs/services/registry-broker/client.d.ts.map +1 -1
- package/dist/cjs/standards-sdk.cjs +3 -3
- package/dist/cjs/standards-sdk.cjs.map +1 -1
- package/dist/es/services/registry-broker/client/adapters.d.ts +4 -19
- package/dist/es/services/registry-broker/client/adapters.d.ts.map +1 -1
- package/dist/es/services/registry-broker/client/agents.d.ts +4 -15
- package/dist/es/services/registry-broker/client/agents.d.ts.map +1 -1
- package/dist/es/services/registry-broker/client/base-client.d.ts +64 -1
- package/dist/es/services/registry-broker/client/base-client.d.ts.map +1 -1
- package/dist/es/services/registry-broker/client/chat-history.d.ts +4 -22
- package/dist/es/services/registry-broker/client/chat-history.d.ts.map +1 -1
- package/dist/es/services/registry-broker/client/chat.d.ts +4 -32
- package/dist/es/services/registry-broker/client/chat.d.ts.map +1 -1
- package/dist/es/services/registry-broker/client/credits.d.ts +4 -39
- package/dist/es/services/registry-broker/client/credits.d.ts.map +1 -1
- package/dist/es/services/registry-broker/client/encrypted-chat-manager.d.ts +4 -34
- package/dist/es/services/registry-broker/client/encrypted-chat-manager.d.ts.map +1 -1
- package/dist/es/services/registry-broker/client/encryption.d.ts +4 -32
- package/dist/es/services/registry-broker/client/encryption.d.ts.map +1 -1
- package/dist/es/services/registry-broker/client/ledger-auth.d.ts +4 -9
- package/dist/es/services/registry-broker/client/ledger-auth.d.ts.map +1 -1
- package/dist/es/services/registry-broker/client/search-helpers.d.ts +16 -0
- package/dist/es/services/registry-broker/client/search-helpers.d.ts.map +1 -0
- package/dist/es/services/registry-broker/client/search.d.ts +5 -18
- package/dist/es/services/registry-broker/client/search.d.ts.map +1 -1
- package/dist/es/services/registry-broker/client.d.ts +4 -0
- package/dist/es/services/registry-broker/client.d.ts.map +1 -1
- package/dist/es/standards-sdk.es.js +9 -17
- package/dist/es/standards-sdk.es.js.map +1 -1
- package/dist/es/standards-sdk.es101.js +1 -1
- package/dist/es/standards-sdk.es103.js +1 -1
- package/dist/es/standards-sdk.es109.js +2 -10
- package/dist/es/standards-sdk.es109.js.map +1 -1
- package/dist/es/standards-sdk.es11.js +1 -1
- package/dist/es/standards-sdk.es110.js +5 -5
- package/dist/es/standards-sdk.es12.js +1 -1
- package/dist/es/standards-sdk.es120.js +1 -1
- package/dist/es/standards-sdk.es121.js +1 -1
- package/dist/es/standards-sdk.es122.js +5 -5
- package/dist/es/standards-sdk.es124.js +1 -1
- package/dist/es/standards-sdk.es125.js +1 -1
- package/dist/es/standards-sdk.es127.js +624 -155
- package/dist/es/standards-sdk.es127.js.map +1 -1
- package/dist/es/standards-sdk.es128.js +15 -205
- package/dist/es/standards-sdk.es128.js.map +1 -1
- package/dist/es/standards-sdk.es129.js +74 -97
- package/dist/es/standards-sdk.es129.js.map +1 -1
- package/dist/es/standards-sdk.es130.js +78 -112
- package/dist/es/standards-sdk.es130.js.map +1 -1
- package/dist/es/standards-sdk.es131.js +51 -238
- package/dist/es/standards-sdk.es131.js.map +1 -1
- package/dist/es/standards-sdk.es132.js +146 -167
- package/dist/es/standards-sdk.es132.js.map +1 -1
- package/dist/es/standards-sdk.es133.js +8 -123
- package/dist/es/standards-sdk.es133.js.map +1 -1
- package/dist/es/standards-sdk.es134.js +77 -317
- package/dist/es/standards-sdk.es134.js.map +1 -1
- package/dist/es/standards-sdk.es135.js +61 -460
- package/dist/es/standards-sdk.es135.js.map +1 -1
- package/dist/es/standards-sdk.es136.js +30 -17
- package/dist/es/standards-sdk.es136.js.map +1 -1
- package/dist/es/standards-sdk.es137.js +34 -81
- package/dist/es/standards-sdk.es137.js.map +1 -1
- package/dist/es/standards-sdk.es138.js +28 -87
- package/dist/es/standards-sdk.es138.js.map +1 -1
- package/dist/es/standards-sdk.es139.js +932 -59
- package/dist/es/standards-sdk.es139.js.map +1 -1
- package/dist/es/standards-sdk.es140.js +12263 -133
- package/dist/es/standards-sdk.es140.js.map +1 -1
- package/dist/es/standards-sdk.es141.js +138 -7
- package/dist/es/standards-sdk.es141.js.map +1 -1
- package/dist/es/standards-sdk.es142.js +36 -80
- package/dist/es/standards-sdk.es142.js.map +1 -1
- package/dist/es/standards-sdk.es143.js +49 -58
- package/dist/es/standards-sdk.es143.js.map +1 -1
- package/dist/es/standards-sdk.es144.js +84 -30
- package/dist/es/standards-sdk.es144.js.map +1 -1
- package/dist/es/standards-sdk.es145.js +17 -34
- package/dist/es/standards-sdk.es145.js.map +1 -1
- package/dist/es/standards-sdk.es146.js +172 -28
- package/dist/es/standards-sdk.es146.js.map +1 -1
- package/dist/es/standards-sdk.es147.js +299 -115
- package/dist/es/standards-sdk.es147.js.map +1 -1
- package/dist/es/standards-sdk.es148.js +340 -36
- package/dist/es/standards-sdk.es148.js.map +1 -1
- package/dist/es/standards-sdk.es149.js +453 -959
- package/dist/es/standards-sdk.es149.js.map +1 -1
- package/dist/es/standards-sdk.es150.js +267 -12225
- package/dist/es/standards-sdk.es150.js.map +1 -1
- package/dist/es/standards-sdk.es151.js +74 -15
- package/dist/es/standards-sdk.es151.js.map +1 -1
- package/dist/es/standards-sdk.es152.js +132 -49
- package/dist/es/standards-sdk.es152.js.map +1 -1
- package/dist/es/standards-sdk.es16.js +2 -10
- package/dist/es/standards-sdk.es16.js.map +1 -1
- package/dist/es/standards-sdk.es18.js +5 -13
- package/dist/es/standards-sdk.es18.js.map +1 -1
- package/dist/es/standards-sdk.es19.js +3 -11
- package/dist/es/standards-sdk.es19.js.map +1 -1
- package/dist/es/standards-sdk.es22.js +1 -1
- package/dist/es/standards-sdk.es27.js +5 -13
- package/dist/es/standards-sdk.es27.js.map +1 -1
- package/dist/es/standards-sdk.es30.js +1 -1
- package/dist/es/standards-sdk.es31.js +1 -1
- package/dist/es/standards-sdk.es35.js +3 -11
- package/dist/es/standards-sdk.es35.js.map +1 -1
- package/dist/es/standards-sdk.es36.js +3 -3
- package/dist/es/standards-sdk.es37.js +1 -1
- package/dist/es/standards-sdk.es4.js +1 -1
- package/dist/es/standards-sdk.es53.js +1 -1
- package/dist/es/standards-sdk.es56.js +1 -1
- package/dist/es/standards-sdk.es58.js +1 -1
- package/dist/es/standards-sdk.es59.js +1 -1
- package/dist/es/standards-sdk.es60.js +3 -11
- package/dist/es/standards-sdk.es60.js.map +1 -1
- package/dist/es/standards-sdk.es62.js +1 -1
- package/dist/es/standards-sdk.es64.js +1 -1
- package/dist/es/standards-sdk.es65.js +2 -2
- package/dist/es/standards-sdk.es68.js +2 -2
- package/dist/es/standards-sdk.es69.js +1 -1
- package/dist/es/standards-sdk.es7.js +1 -1
- package/dist/es/standards-sdk.es71.js +1 -1
- package/dist/es/standards-sdk.es76.js +1 -1
- package/dist/es/standards-sdk.es77.js +2 -10
- package/dist/es/standards-sdk.es77.js.map +1 -1
- package/dist/es/standards-sdk.es78.js +1 -1
- package/dist/es/standards-sdk.es81.js +1 -1
- package/dist/es/standards-sdk.es83.js +1 -1
- package/dist/es/standards-sdk.es87.js +3 -3
- package/dist/es/standards-sdk.es91.js +1 -1
- package/dist/es/standards-sdk.es92.js +1 -1
- package/dist/es/standards-sdk.es97.js +1 -1
- package/dist/es/standards-sdk.es99.js +1 -1
- package/package.json +1 -1
- package/dist/es/standards-sdk.es153.js +0 -87
- package/dist/es/standards-sdk.es153.js.map +0 -1
- package/dist/es/standards-sdk.es154.js +0 -175
- package/dist/es/standards-sdk.es154.js.map +0 -1
- package/dist/es/standards-sdk.es155.js +0 -325
- package/dist/es/standards-sdk.es155.js.map +0 -1
- package/dist/es/standards-sdk.es156.js +0 -349
- package/dist/es/standards-sdk.es156.js.map +0 -1
- package/dist/es/standards-sdk.es157.js +0 -456
- package/dist/es/standards-sdk.es157.js.map +0 -1
- package/dist/es/standards-sdk.es158.js +0 -334
- package/dist/es/standards-sdk.es158.js.map +0 -1
- package/dist/es/standards-sdk.es159.js +0 -79
- package/dist/es/standards-sdk.es159.js.map +0 -1
- package/dist/es/standards-sdk.es160.js +0 -242
- package/dist/es/standards-sdk.es160.js.map +0 -1
- package/dist/es/standards-sdk.es161.js +0 -247
- package/dist/es/standards-sdk.es161.js.map +0 -1
|
@@ -1,183 +1,162 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
return viem.privateKeyToAccount(privateKey);
|
|
10
|
-
} catch (error) {
|
|
11
|
-
const err = new Error(
|
|
12
|
-
'EVM ledger authentication requires the optional dependency "viem". Install it to use evmPrivateKey flows.'
|
|
13
|
-
);
|
|
14
|
-
err.cause = error;
|
|
15
|
-
throw err;
|
|
1
|
+
import { CustomFeeType } from "./standards-sdk.es133.js";
|
|
2
|
+
import { HederaMirrorNode } from "./standards-sdk.es126.js";
|
|
3
|
+
class FeeConfigBuilder {
|
|
4
|
+
constructor(options) {
|
|
5
|
+
this.customFees = [];
|
|
6
|
+
this.logger = options.logger;
|
|
7
|
+
this.mirrorNode = new HederaMirrorNode(options.network, options.logger);
|
|
8
|
+
this.defaultCollectorAccountId = options.defaultCollectorAccountId || "";
|
|
16
9
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
10
|
+
/**
|
|
11
|
+
* Static factory method to create a FeeConfigBuilder with a single HBAR fee.
|
|
12
|
+
* @param hbarAmount Amount in HBAR.
|
|
13
|
+
* @param collectorAccountId Optional account ID to collect the fee. If omitted or undefined, defaults to the agent's own account ID during topic creation.
|
|
14
|
+
* @param network Network type ('mainnet' or 'testnet').
|
|
15
|
+
* @param logger Logger instance.
|
|
16
|
+
* @param exemptAccounts Optional array of account IDs exempt from this fee.
|
|
17
|
+
* @returns A configured FeeConfigBuilder instance.
|
|
18
|
+
*/
|
|
19
|
+
static forHbar(hbarAmount, collectorAccountId, network, logger, exemptAccounts = []) {
|
|
20
|
+
const builder = new FeeConfigBuilder({
|
|
21
|
+
network,
|
|
22
|
+
logger,
|
|
23
|
+
defaultCollectorAccountId: collectorAccountId
|
|
24
|
+
});
|
|
25
|
+
return builder.addHbarFee(hbarAmount, collectorAccountId, exemptAccounts);
|
|
25
26
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
/**
|
|
28
|
+
* Static factory method to create a FeeConfigBuilder with a single token fee.
|
|
29
|
+
* Automatically fetches token decimals if not provided.
|
|
30
|
+
* @param tokenAmount Amount of tokens.
|
|
31
|
+
* @param feeTokenId Token ID for the fee.
|
|
32
|
+
* @param collectorAccountId Optional account ID to collect the fee. If omitted or undefined, defaults to the agent's own account ID during topic creation.
|
|
33
|
+
* @param network Network type ('mainnet' or 'testnet').
|
|
34
|
+
* @param logger Logger instance.
|
|
35
|
+
* @param exemptAccounts Optional array of account IDs exempt from this fee.
|
|
36
|
+
* @param decimals Optional decimals for the token (fetched if omitted).
|
|
37
|
+
* @returns A Promise resolving to a configured FeeConfigBuilder instance.
|
|
38
|
+
*/
|
|
39
|
+
static async forToken(tokenAmount, feeTokenId, collectorAccountId, network, logger, exemptAccounts = [], decimals) {
|
|
40
|
+
const builder = new FeeConfigBuilder({
|
|
41
|
+
network,
|
|
42
|
+
logger,
|
|
43
|
+
defaultCollectorAccountId: collectorAccountId
|
|
44
|
+
});
|
|
45
|
+
await builder.addTokenFee(
|
|
46
|
+
tokenAmount,
|
|
47
|
+
feeTokenId,
|
|
48
|
+
collectorAccountId,
|
|
49
|
+
decimals,
|
|
50
|
+
exemptAccounts
|
|
29
51
|
);
|
|
52
|
+
return builder;
|
|
30
53
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
if (accountKey && typeof accountKey.toString === "function") {
|
|
43
|
-
derivedPublicKey = accountKey.toString();
|
|
54
|
+
/**
|
|
55
|
+
* Adds an HBAR fee configuration to the builder.
|
|
56
|
+
* Allows chaining multiple fee additions.
|
|
57
|
+
* @param hbarAmount The amount in HBAR (e.g., 0.5).
|
|
58
|
+
* @param collectorAccountId Optional. The account ID to collect this fee. If omitted, defaults to the agent's own account ID during topic creation.
|
|
59
|
+
* @param exemptAccountIds Optional. Accounts specifically exempt from *this* HBAR fee.
|
|
60
|
+
* @returns This FeeConfigBuilder instance for chaining.
|
|
61
|
+
*/
|
|
62
|
+
addHbarFee(hbarAmount, collectorAccountId, exemptAccountIds = []) {
|
|
63
|
+
if (hbarAmount <= 0) {
|
|
64
|
+
throw new Error("HBAR amount must be greater than zero");
|
|
44
65
|
}
|
|
66
|
+
this.customFees.push({
|
|
67
|
+
feeAmount: {
|
|
68
|
+
amount: hbarAmount * 1e8,
|
|
69
|
+
decimals: 0
|
|
70
|
+
},
|
|
71
|
+
feeCollectorAccountId: collectorAccountId || this.defaultCollectorAccountId,
|
|
72
|
+
feeTokenId: void 0,
|
|
73
|
+
exemptAccounts: [...exemptAccountIds],
|
|
74
|
+
type: CustomFeeType.FIXED_FEE
|
|
75
|
+
});
|
|
76
|
+
return this;
|
|
45
77
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
network
|
|
78
|
+
/**
|
|
79
|
+
* Adds a token fee configuration to the builder.
|
|
80
|
+
* Allows chaining multiple fee additions.
|
|
81
|
+
* Fetches token decimals automatically if not provided.
|
|
82
|
+
* @param tokenAmount The amount of the specified token.
|
|
83
|
+
* @param feeTokenId The ID of the token to charge the fee in.
|
|
84
|
+
* @param collectorAccountId Optional. The account ID to collect this fee. If omitted, defaults to the agent's own account ID during topic creation.
|
|
85
|
+
* @param decimals Optional. The number of decimals for the token. If omitted, it will be fetched from the mirror node.
|
|
86
|
+
* @param exemptAccountIds Optional. Accounts specifically exempt from *this* token fee.
|
|
87
|
+
* @returns A Promise resolving to this FeeConfigBuilder instance for chaining.
|
|
88
|
+
*/
|
|
89
|
+
async addTokenFee(tokenAmount, feeTokenId, collectorAccountId, decimals, exemptAccountIds = []) {
|
|
90
|
+
if (tokenAmount <= 0) {
|
|
91
|
+
throw new Error("Token amount must be greater than zero");
|
|
61
92
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
}
|
|
87
|
-
const raw = await this.requestJson("/auth/ledger/verify", {
|
|
88
|
-
method: "POST",
|
|
89
|
-
headers: { "content-type": "application/json" },
|
|
90
|
-
body
|
|
91
|
-
});
|
|
92
|
-
const result = this.parseWithSchema(
|
|
93
|
-
raw,
|
|
94
|
-
ledgerVerifyResponseSchema,
|
|
95
|
-
"ledger verification response"
|
|
96
|
-
);
|
|
97
|
-
this.setLedgerApiKey(result.key);
|
|
98
|
-
return result;
|
|
99
|
-
};
|
|
100
|
-
RegistryBrokerClient.prototype.authenticateWithLedger = async function(options) {
|
|
101
|
-
const challenge = await this.createLedgerChallenge({
|
|
102
|
-
accountId: options.accountId,
|
|
103
|
-
network: options.network
|
|
104
|
-
});
|
|
105
|
-
const signed = await resolveLedgerAuthSignature(challenge.message, options);
|
|
106
|
-
const verification = await this.verifyLedgerChallenge({
|
|
107
|
-
challengeId: challenge.challengeId,
|
|
108
|
-
accountId: options.accountId,
|
|
109
|
-
network: options.network,
|
|
110
|
-
signature: signed.signature,
|
|
111
|
-
signatureKind: signed.signatureKind,
|
|
112
|
-
publicKey: signed.publicKey,
|
|
113
|
-
expiresInMinutes: options.expiresInMinutes
|
|
114
|
-
});
|
|
115
|
-
return verification;
|
|
116
|
-
};
|
|
117
|
-
RegistryBrokerClient.prototype.authenticateWithLedgerCredentials = async function(options) {
|
|
118
|
-
const {
|
|
119
|
-
accountId,
|
|
120
|
-
network,
|
|
121
|
-
signer,
|
|
122
|
-
sign,
|
|
123
|
-
hederaPrivateKey,
|
|
124
|
-
evmPrivateKey,
|
|
125
|
-
expiresInMinutes,
|
|
126
|
-
setAccountHeader = true,
|
|
127
|
-
label,
|
|
128
|
-
logger
|
|
129
|
-
} = options;
|
|
130
|
-
const resolvedNetwork = canonicalizeLedgerNetwork(network);
|
|
131
|
-
const labelSuffix = label ? ` for ${label}` : "";
|
|
132
|
-
const networkPayload = resolvedNetwork.canonical;
|
|
133
|
-
const authOptions = {
|
|
134
|
-
accountId,
|
|
135
|
-
network: networkPayload,
|
|
136
|
-
expiresInMinutes
|
|
137
|
-
};
|
|
138
|
-
if (sign) {
|
|
139
|
-
authOptions.sign = sign;
|
|
140
|
-
} else if (signer) {
|
|
141
|
-
authOptions.signer = signer;
|
|
142
|
-
} else if (hederaPrivateKey) {
|
|
143
|
-
if (resolvedNetwork.kind !== "hedera" || !resolvedNetwork.hederaNetwork) {
|
|
144
|
-
throw new Error(
|
|
145
|
-
"hederaPrivateKey can only be used with hedera:mainnet or hedera:testnet networks."
|
|
146
|
-
);
|
|
93
|
+
if (!feeTokenId) {
|
|
94
|
+
throw new Error("Fee token ID is required when adding a token fee");
|
|
95
|
+
}
|
|
96
|
+
let finalDecimals = decimals;
|
|
97
|
+
if (finalDecimals === void 0) {
|
|
98
|
+
try {
|
|
99
|
+
const tokenInfo = await this.mirrorNode.getTokenInfo(feeTokenId);
|
|
100
|
+
if (tokenInfo?.decimals) {
|
|
101
|
+
finalDecimals = parseInt(tokenInfo.decimals, 10);
|
|
102
|
+
this.logger.info(
|
|
103
|
+
`Fetched decimals for ${feeTokenId}: ${finalDecimals}`
|
|
104
|
+
);
|
|
105
|
+
} else {
|
|
106
|
+
this.logger.warn(
|
|
107
|
+
`Could not fetch decimals for ${feeTokenId}, defaulting to 0.`
|
|
108
|
+
);
|
|
109
|
+
finalDecimals = 0;
|
|
110
|
+
}
|
|
111
|
+
} catch (error) {
|
|
112
|
+
this.logger.error(
|
|
113
|
+
`Error fetching decimals for ${feeTokenId}, defaulting to 0: ${error}`
|
|
114
|
+
);
|
|
115
|
+
finalDecimals = 0;
|
|
116
|
+
}
|
|
147
117
|
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
118
|
+
this.customFees.push({
|
|
119
|
+
feeAmount: {
|
|
120
|
+
amount: tokenAmount * 10 ** finalDecimals,
|
|
121
|
+
decimals: finalDecimals
|
|
122
|
+
},
|
|
123
|
+
feeCollectorAccountId: collectorAccountId || this.defaultCollectorAccountId,
|
|
124
|
+
feeTokenId,
|
|
125
|
+
exemptAccounts: [...exemptAccountIds],
|
|
126
|
+
type: CustomFeeType.FIXED_FEE
|
|
152
127
|
});
|
|
153
|
-
|
|
154
|
-
|
|
128
|
+
return this;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Builds the final TopicFeeConfig object.
|
|
132
|
+
* @returns The TopicFeeConfig containing all added custom fees and a consolidated list of unique exempt accounts.
|
|
133
|
+
* @throws Error if no fees have been added.
|
|
134
|
+
* @throws Error if more than 10 fees have been added.
|
|
135
|
+
*/
|
|
136
|
+
build() {
|
|
137
|
+
if (this.customFees.length === 0) {
|
|
155
138
|
throw new Error(
|
|
156
|
-
"
|
|
139
|
+
"At least one fee must be added using addHbarFee/addTokenFee or created using forHbar/forToken"
|
|
157
140
|
);
|
|
158
141
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
142
|
+
if (this.customFees.length > 10) {
|
|
143
|
+
throw new Error("Maximum of 10 custom fees per topic allowed");
|
|
144
|
+
}
|
|
145
|
+
const allExemptAccounts = /* @__PURE__ */ new Set();
|
|
146
|
+
this.customFees.forEach((fee) => {
|
|
147
|
+
fee.exemptAccounts.forEach((account) => allExemptAccounts.add(account));
|
|
165
148
|
});
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
);
|
|
149
|
+
const resolvedCustomFees = this.customFees.map((fee) => ({
|
|
150
|
+
...fee,
|
|
151
|
+
feeCollectorAccountId: fee.feeCollectorAccountId || this.defaultCollectorAccountId
|
|
152
|
+
}));
|
|
153
|
+
return {
|
|
154
|
+
customFees: resolvedCustomFees,
|
|
155
|
+
exemptAccounts: Array.from(allExemptAccounts)
|
|
156
|
+
};
|
|
170
157
|
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
const verification = await this.authenticateWithLedger(authOptions);
|
|
175
|
-
if (setAccountHeader) {
|
|
176
|
-
this.setDefaultHeader("x-account-id", verification.accountId);
|
|
177
|
-
}
|
|
178
|
-
logger?.info?.(
|
|
179
|
-
`Ledger authentication complete${labelSuffix}. Issued key prefix: ${verification.apiKey.prefix}…${verification.apiKey.lastFour}`
|
|
180
|
-
);
|
|
181
|
-
return verification;
|
|
158
|
+
}
|
|
159
|
+
export {
|
|
160
|
+
FeeConfigBuilder
|
|
182
161
|
};
|
|
183
162
|
//# sourceMappingURL=standards-sdk.es132.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-sdk.es132.js","sources":["../../src/services/registry-broker/client/ledger-auth.ts"],"sourcesContent":["import { Buffer } from 'buffer';\nimport type { SignerSignature } from '@hashgraph/sdk';\nimport type {\n JsonObject,\n JsonValue,\n LedgerAuthenticationOptions,\n LedgerAuthenticationSignerResult,\n LedgerChallengeRequest,\n LedgerChallengeResponse,\n LedgerCredentialAuthOptions,\n LedgerVerifyRequest,\n LedgerVerifyResponse,\n} from '../types';\nimport {\n ledgerChallengeResponseSchema,\n ledgerVerifyResponseSchema,\n} from '../schemas';\nimport { canonicalizeLedgerNetwork } from '../ledger-network';\nimport { createPrivateKeySignerAsync } from '../private-key-signer';\nimport { RegistryBrokerClient } from './base-client';\n\ndeclare module './base-client' {\n interface RegistryBrokerClient {\n createLedgerChallenge(\n payload: LedgerChallengeRequest,\n ): Promise<LedgerChallengeResponse>;\n verifyLedgerChallenge(\n payload: LedgerVerifyRequest,\n ): Promise<LedgerVerifyResponse>;\n authenticateWithLedger(\n options: LedgerAuthenticationOptions,\n ): Promise<LedgerVerifyResponse>;\n authenticateWithLedgerCredentials(\n options: LedgerCredentialAuthOptions,\n ): Promise<LedgerVerifyResponse>;\n }\n}\n\nasync function loadViemAccount(privateKey: `0x${string}`): Promise<{\n publicKey: string;\n signMessage: (input: { message: string }) => Promise<string>;\n}> {\n try {\n const viem = await import('viem/accounts');\n return viem.privateKeyToAccount(privateKey);\n } catch (error) {\n const err = new Error(\n 'EVM ledger authentication requires the optional dependency \"viem\". Install it to use evmPrivateKey flows.',\n );\n (err as { cause?: unknown }).cause = error;\n throw err;\n }\n}\n\nasync function resolveLedgerAuthSignature(\n message: string,\n options: LedgerAuthenticationOptions,\n): Promise<LedgerAuthenticationSignerResult> {\n if (typeof options.sign === 'function') {\n const result = await options.sign(message);\n if (\n !result ||\n typeof result.signature !== 'string' ||\n result.signature.length === 0\n ) {\n throw new Error('Custom ledger signer failed to produce a signature.');\n }\n return result;\n }\n\n if (!options.signer || typeof options.signer.sign !== 'function') {\n throw new Error(\n 'Ledger authentication requires a Hedera Signer or custom sign function.',\n );\n }\n\n const payload = Buffer.from(message, 'utf8');\n const signatures: SignerSignature[] = await options.signer.sign([payload]);\n const signatureEntry = signatures?.[0];\n if (!signatureEntry) {\n throw new Error('Signer did not return any signatures.');\n }\n\n let derivedPublicKey: string | undefined;\n if (signatureEntry.publicKey) {\n derivedPublicKey = signatureEntry.publicKey.toString();\n } else if (typeof options.signer.getAccountKey === 'function') {\n const accountKey = await options.signer.getAccountKey();\n if (accountKey && typeof accountKey.toString === 'function') {\n derivedPublicKey = accountKey.toString();\n }\n }\n\n return {\n signature: Buffer.from(signatureEntry.signature).toString('base64'),\n signatureKind: 'raw',\n publicKey: derivedPublicKey,\n };\n}\n\nRegistryBrokerClient.prototype.createLedgerChallenge = async function (\n this: RegistryBrokerClient,\n payload: LedgerChallengeRequest,\n): Promise<LedgerChallengeResponse> {\n const resolvedNetwork = canonicalizeLedgerNetwork(payload.network);\n const network =\n resolvedNetwork.kind === 'hedera'\n ? (resolvedNetwork.hederaNetwork ?? resolvedNetwork.canonical)\n : resolvedNetwork.canonical;\n const raw = await this.requestJson<JsonValue>('/auth/ledger/challenge', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: {\n accountId: payload.accountId,\n network,\n },\n });\n\n return this.parseWithSchema(\n raw,\n ledgerChallengeResponseSchema,\n 'ledger challenge response',\n );\n};\n\nRegistryBrokerClient.prototype.verifyLedgerChallenge = async function (\n this: RegistryBrokerClient,\n payload: LedgerVerifyRequest,\n): Promise<LedgerVerifyResponse> {\n const resolvedNetwork = canonicalizeLedgerNetwork(payload.network);\n const network =\n resolvedNetwork.kind === 'hedera'\n ? (resolvedNetwork.hederaNetwork ?? resolvedNetwork.canonical)\n : resolvedNetwork.canonical;\n const body: JsonObject = {\n challengeId: payload.challengeId,\n accountId: payload.accountId,\n network,\n signature: payload.signature,\n };\n\n if (payload.signatureKind) {\n body.signatureKind = payload.signatureKind;\n }\n if (payload.publicKey) {\n body.publicKey = payload.publicKey;\n }\n if (typeof payload.expiresInMinutes === 'number') {\n body.expiresInMinutes = payload.expiresInMinutes;\n }\n\n const raw = await this.requestJson<JsonValue>('/auth/ledger/verify', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body,\n });\n\n const result = this.parseWithSchema(\n raw,\n ledgerVerifyResponseSchema,\n 'ledger verification response',\n );\n\n this.setLedgerApiKey(result.key);\n return result;\n};\n\nRegistryBrokerClient.prototype.authenticateWithLedger = async function (\n this: RegistryBrokerClient,\n options: LedgerAuthenticationOptions,\n): Promise<LedgerVerifyResponse> {\n const challenge = await this.createLedgerChallenge({\n accountId: options.accountId,\n network: options.network,\n });\n const signed = await resolveLedgerAuthSignature(challenge.message, options);\n const verification = await this.verifyLedgerChallenge({\n challengeId: challenge.challengeId,\n accountId: options.accountId,\n network: options.network,\n signature: signed.signature,\n signatureKind: signed.signatureKind,\n publicKey: signed.publicKey,\n expiresInMinutes: options.expiresInMinutes,\n });\n return verification;\n};\n\nRegistryBrokerClient.prototype.authenticateWithLedgerCredentials =\n async function (\n this: RegistryBrokerClient,\n options: LedgerCredentialAuthOptions,\n ): Promise<LedgerVerifyResponse> {\n const {\n accountId,\n network,\n signer,\n sign,\n hederaPrivateKey,\n evmPrivateKey,\n expiresInMinutes,\n setAccountHeader = true,\n label,\n logger,\n } = options;\n\n const resolvedNetwork = canonicalizeLedgerNetwork(network);\n const labelSuffix = label ? ` for ${label}` : '';\n\n const networkPayload = resolvedNetwork.canonical;\n\n const authOptions: LedgerAuthenticationOptions = {\n accountId,\n network: networkPayload,\n expiresInMinutes,\n };\n\n if (sign) {\n authOptions.sign = sign;\n } else if (signer) {\n authOptions.signer = signer;\n } else if (hederaPrivateKey) {\n if (resolvedNetwork.kind !== 'hedera' || !resolvedNetwork.hederaNetwork) {\n throw new Error(\n 'hederaPrivateKey can only be used with hedera:mainnet or hedera:testnet networks.',\n );\n }\n authOptions.signer = await createPrivateKeySignerAsync({\n accountId,\n privateKey: hederaPrivateKey,\n network: resolvedNetwork.hederaNetwork,\n });\n } else if (evmPrivateKey) {\n if (resolvedNetwork.kind !== 'evm') {\n throw new Error(\n 'evmPrivateKey can only be used with CAIP-2 EVM networks (eip155:<chainId>).',\n );\n }\n const formattedKey = evmPrivateKey.startsWith('0x')\n ? (evmPrivateKey as `0x${string}`)\n : (`0x${evmPrivateKey}` as `0x${string}`);\n const account = await loadViemAccount(formattedKey);\n authOptions.sign = async message => ({\n signature: await account.signMessage({ message }),\n signatureKind: 'evm',\n publicKey: account.publicKey,\n });\n } else {\n throw new Error(\n 'Provide a signer, sign function, hederaPrivateKey, or evmPrivateKey to authenticate with the ledger.',\n );\n }\n\n logger?.info?.(\n `Authenticating ledger account ${accountId} (${resolvedNetwork.canonical})${labelSuffix}...`,\n );\n const verification = await this.authenticateWithLedger(authOptions);\n if (setAccountHeader) {\n this.setDefaultHeader('x-account-id', verification.accountId);\n }\n logger?.info?.(\n `Ledger authentication complete${labelSuffix}. Issued key prefix: ${verification.apiKey.prefix}…${verification.apiKey.lastFour}`,\n );\n return verification;\n };\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"standards-sdk.es132.js","sources":["../../src/fees/fee-config-builder.ts"],"sourcesContent":["import {\n FeeConfigBuilderInterface,\n TokenFeeConfig,\n TopicFeeConfig,\n CustomFeeType,\n} from './types';\nimport { HederaMirrorNode } from '../services/mirror-node';\nimport { Logger } from '../utils/logger';\nimport { NetworkType } from '../utils/types';\n\n/**\n * FeeConfigBuilder provides a fluent interface for creating fee configurations\n * for HCS-10 topics. This makes it easy to configure fees without dealing with\n * the complexity of the underlying fee structure.\n *\n * Example usage:\n *\n * // Super simple one-liner with the factory method\n * const simpleFeeConfig = FeeConfigBuilder.forHbar(5, '0.0.12345', NetworkType.TESTNET, new Logger(), ['0.0.67890']);\n *\n * // With multiple fees:\n * const multipleFeeConfig = new FeeConfigBuilder({\n * network: NetworkType.TESTNET,\n * logger: new Logger(),\n * defaultCollectorAccountId: '0.0.12345',\n * defaultExemptAccountIds: ['0.0.67890']\n * })\n * .withHbarFee(1) // 1 HBAR fee\n * .withTokenFee(10, '0.0.54321') // 10 units of token 0.0.54321\n * .build();\n *\n * With Agent Builder\n * const agent = new AgentBuilder()\n * .setName('Fee Collector Agent')\n * .setDescription('An agent that collects fees')\n * .setInboundTopicType(InboundTopicType.FEE_BASED)\n * .setFeeConfig(FeeConfigBuilder.forHbar(1, '0.0.12345', NetworkType.TESTNET, new Logger(), ['0.0.67890']))\n * .setNetwork('testnet')\n .build();\n\n * Directly with client\n * const client = new HCS10Client(config);\n * const connectionFeeConfig = new FeeConfigBuilder({\n * network: NetworkType.TESTNET,\n * logger: new Logger(),\n * defaultCollectorAccountId: client.getAccountAndSigner().accountId,\n * defaultExemptAccountIds: ['0.0.67890']\n * })\n * .withHbarFee(0.5) // 0.5 HBAR (simple!)\n * .build();\n\n * const result = await client.handleConnectionRequest(\n * inboundTopicId,\n * requestingAccountId,\n * connectionRequestId,\n * connectionFeeConfig\n * );\n*/\nexport interface FeeConfigBuilderOptions {\n network: NetworkType;\n logger: Logger;\n defaultCollectorAccountId?: string;\n}\n\nexport class FeeConfigBuilder implements FeeConfigBuilderInterface {\n private customFees: TokenFeeConfig[] = [];\n private mirrorNode: HederaMirrorNode;\n private logger: Logger;\n private defaultCollectorAccountId: string;\n\n constructor(options: FeeConfigBuilderOptions) {\n this.logger = options.logger;\n this.mirrorNode = new HederaMirrorNode(options.network, options.logger);\n this.defaultCollectorAccountId = options.defaultCollectorAccountId || '';\n }\n\n /**\n * Static factory method to create a FeeConfigBuilder with a single HBAR fee.\n * @param hbarAmount Amount in HBAR.\n * @param collectorAccountId Optional account ID to collect the fee. If omitted or undefined, defaults to the agent's own account ID during topic creation.\n * @param network Network type ('mainnet' or 'testnet').\n * @param logger Logger instance.\n * @param exemptAccounts Optional array of account IDs exempt from this fee.\n * @returns A configured FeeConfigBuilder instance.\n */\n static forHbar(\n hbarAmount: number,\n collectorAccountId: string | undefined,\n network: NetworkType,\n logger: Logger,\n exemptAccounts: string[] = [],\n ): FeeConfigBuilder {\n const builder = new FeeConfigBuilder({\n network,\n logger,\n defaultCollectorAccountId: collectorAccountId,\n });\n return builder.addHbarFee(hbarAmount, collectorAccountId, exemptAccounts);\n }\n\n /**\n * Static factory method to create a FeeConfigBuilder with a single token fee.\n * Automatically fetches token decimals if not provided.\n * @param tokenAmount Amount of tokens.\n * @param feeTokenId Token ID for the fee.\n * @param collectorAccountId Optional account ID to collect the fee. If omitted or undefined, defaults to the agent's own account ID during topic creation.\n * @param network Network type ('mainnet' or 'testnet').\n * @param logger Logger instance.\n * @param exemptAccounts Optional array of account IDs exempt from this fee.\n * @param decimals Optional decimals for the token (fetched if omitted).\n * @returns A Promise resolving to a configured FeeConfigBuilder instance.\n */\n static async forToken(\n tokenAmount: number,\n feeTokenId: string,\n collectorAccountId: string | undefined,\n network: NetworkType,\n logger: Logger,\n exemptAccounts: string[] = [],\n decimals?: number,\n ): Promise<FeeConfigBuilder> {\n const builder = new FeeConfigBuilder({\n network,\n logger,\n defaultCollectorAccountId: collectorAccountId,\n });\n await builder.addTokenFee(\n tokenAmount,\n feeTokenId,\n collectorAccountId,\n decimals,\n exemptAccounts,\n );\n return builder;\n }\n\n /**\n * Adds an HBAR fee configuration to the builder.\n * Allows chaining multiple fee additions.\n * @param hbarAmount The amount in HBAR (e.g., 0.5).\n * @param collectorAccountId Optional. The account ID to collect this fee. If omitted, defaults to the agent's own account ID during topic creation.\n * @param exemptAccountIds Optional. Accounts specifically exempt from *this* HBAR fee.\n * @returns This FeeConfigBuilder instance for chaining.\n */\n addHbarFee(\n hbarAmount: number,\n collectorAccountId?: string,\n exemptAccountIds: string[] = [],\n ): FeeConfigBuilder {\n if (hbarAmount <= 0) {\n throw new Error('HBAR amount must be greater than zero');\n }\n\n this.customFees.push({\n feeAmount: {\n amount: hbarAmount * 100_000_000,\n decimals: 0,\n },\n feeCollectorAccountId:\n collectorAccountId || this.defaultCollectorAccountId,\n feeTokenId: undefined,\n exemptAccounts: [...exemptAccountIds],\n type: CustomFeeType.FIXED_FEE,\n });\n\n return this;\n }\n\n /**\n * Adds a token fee configuration to the builder.\n * Allows chaining multiple fee additions.\n * Fetches token decimals automatically if not provided.\n * @param tokenAmount The amount of the specified token.\n * @param feeTokenId The ID of the token to charge the fee in.\n * @param collectorAccountId Optional. The account ID to collect this fee. If omitted, defaults to the agent's own account ID during topic creation.\n * @param decimals Optional. The number of decimals for the token. If omitted, it will be fetched from the mirror node.\n * @param exemptAccountIds Optional. Accounts specifically exempt from *this* token fee.\n * @returns A Promise resolving to this FeeConfigBuilder instance for chaining.\n */\n async addTokenFee(\n tokenAmount: number,\n feeTokenId: string,\n collectorAccountId?: string,\n decimals?: number,\n exemptAccountIds: string[] = [],\n ): Promise<FeeConfigBuilder> {\n if (tokenAmount <= 0) {\n throw new Error('Token amount must be greater than zero');\n }\n if (!feeTokenId) {\n throw new Error('Fee token ID is required when adding a token fee');\n }\n\n let finalDecimals = decimals;\n if (finalDecimals === undefined) {\n try {\n const tokenInfo = await this.mirrorNode.getTokenInfo(feeTokenId);\n if (tokenInfo?.decimals) {\n finalDecimals = parseInt(tokenInfo.decimals, 10);\n this.logger.info(\n `Fetched decimals for ${feeTokenId}: ${finalDecimals}`,\n );\n } else {\n this.logger.warn(\n `Could not fetch decimals for ${feeTokenId}, defaulting to 0.`,\n );\n finalDecimals = 0;\n }\n } catch (error) {\n this.logger.error(\n `Error fetching decimals for ${feeTokenId}, defaulting to 0: ${error}`,\n );\n finalDecimals = 0;\n }\n }\n\n this.customFees.push({\n feeAmount: {\n amount: tokenAmount * 10 ** finalDecimals,\n decimals: finalDecimals,\n },\n feeCollectorAccountId:\n collectorAccountId || this.defaultCollectorAccountId,\n feeTokenId: feeTokenId,\n exemptAccounts: [...exemptAccountIds],\n type: CustomFeeType.FIXED_FEE,\n });\n\n return this;\n }\n\n /**\n * Builds the final TopicFeeConfig object.\n * @returns The TopicFeeConfig containing all added custom fees and a consolidated list of unique exempt accounts.\n * @throws Error if no fees have been added.\n * @throws Error if more than 10 fees have been added.\n */\n build(): TopicFeeConfig {\n if (this.customFees.length === 0) {\n throw new Error(\n 'At least one fee must be added using addHbarFee/addTokenFee or created using forHbar/forToken',\n );\n }\n\n if (this.customFees.length > 10) {\n throw new Error('Maximum of 10 custom fees per topic allowed');\n }\n\n const allExemptAccounts = new Set<string>();\n this.customFees.forEach(fee => {\n fee.exemptAccounts.forEach(account => allExemptAccounts.add(account));\n });\n\n const resolvedCustomFees = this.customFees.map(fee => ({\n ...fee,\n feeCollectorAccountId:\n fee.feeCollectorAccountId || this.defaultCollectorAccountId,\n }));\n\n return {\n customFees: resolvedCustomFees,\n exemptAccounts: Array.from(allExemptAccounts),\n };\n }\n}\n"],"names":[],"mappings":";;AAgEO,MAAM,iBAAsD;AAAA,EAMjE,YAAY,SAAkC;AAL9C,SAAQ,aAA+B,CAAA;AAMrC,SAAK,SAAS,QAAQ;AACtB,SAAK,aAAa,IAAI,iBAAiB,QAAQ,SAAS,QAAQ,MAAM;AACtE,SAAK,4BAA4B,QAAQ,6BAA6B;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAO,QACL,YACA,oBACA,SACA,QACA,iBAA2B,IACT;AAClB,UAAM,UAAU,IAAI,iBAAiB;AAAA,MACnC;AAAA,MACA;AAAA,MACA,2BAA2B;AAAA,IAAA,CAC5B;AACD,WAAO,QAAQ,WAAW,YAAY,oBAAoB,cAAc;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,aAAa,SACX,aACA,YACA,oBACA,SACA,QACA,iBAA2B,CAAA,GAC3B,UAC2B;AAC3B,UAAM,UAAU,IAAI,iBAAiB;AAAA,MACnC;AAAA,MACA;AAAA,MACA,2BAA2B;AAAA,IAAA,CAC5B;AACD,UAAM,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAEF,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,WACE,YACA,oBACA,mBAA6B,CAAA,GACX;AAClB,QAAI,cAAc,GAAG;AACnB,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACzD;AAEA,SAAK,WAAW,KAAK;AAAA,MACnB,WAAW;AAAA,QACT,QAAQ,aAAa;AAAA,QACrB,UAAU;AAAA,MAAA;AAAA,MAEZ,uBACE,sBAAsB,KAAK;AAAA,MAC7B,YAAY;AAAA,MACZ,gBAAgB,CAAC,GAAG,gBAAgB;AAAA,MACpC,MAAM,cAAc;AAAA,IAAA,CACrB;AAED,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,YACJ,aACA,YACA,oBACA,UACA,mBAA6B,IACF;AAC3B,QAAI,eAAe,GAAG;AACpB,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC1D;AACA,QAAI,CAAC,YAAY;AACf,YAAM,IAAI,MAAM,kDAAkD;AAAA,IACpE;AAEA,QAAI,gBAAgB;AACpB,QAAI,kBAAkB,QAAW;AAC/B,UAAI;AACF,cAAM,YAAY,MAAM,KAAK,WAAW,aAAa,UAAU;AAC/D,YAAI,WAAW,UAAU;AACvB,0BAAgB,SAAS,UAAU,UAAU,EAAE;AAC/C,eAAK,OAAO;AAAA,YACV,wBAAwB,UAAU,KAAK,aAAa;AAAA,UAAA;AAAA,QAExD,OAAO;AACL,eAAK,OAAO;AAAA,YACV,gCAAgC,UAAU;AAAA,UAAA;AAE5C,0BAAgB;AAAA,QAClB;AAAA,MACF,SAAS,OAAO;AACd,aAAK,OAAO;AAAA,UACV,+BAA+B,UAAU,sBAAsB,KAAK;AAAA,QAAA;AAEtE,wBAAgB;AAAA,MAClB;AAAA,IACF;AAEA,SAAK,WAAW,KAAK;AAAA,MACnB,WAAW;AAAA,QACT,QAAQ,cAAc,MAAM;AAAA,QAC5B,UAAU;AAAA,MAAA;AAAA,MAEZ,uBACE,sBAAsB,KAAK;AAAA,MAC7B;AAAA,MACA,gBAAgB,CAAC,GAAG,gBAAgB;AAAA,MACpC,MAAM,cAAc;AAAA,IAAA,CACrB;AAED,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QAAwB;AACtB,QAAI,KAAK,WAAW,WAAW,GAAG;AAChC,YAAM,IAAI;AAAA,QACR;AAAA,MAAA;AAAA,IAEJ;AAEA,QAAI,KAAK,WAAW,SAAS,IAAI;AAC/B,YAAM,IAAI,MAAM,6CAA6C;AAAA,IAC/D;AAEA,UAAM,wCAAwB,IAAA;AAC9B,SAAK,WAAW,QAAQ,CAAA,QAAO;AAC7B,UAAI,eAAe,QAAQ,CAAA,YAAW,kBAAkB,IAAI,OAAO,CAAC;AAAA,IACtE,CAAC;AAED,UAAM,qBAAqB,KAAK,WAAW,IAAI,CAAA,SAAQ;AAAA,MACrD,GAAG;AAAA,MACH,uBACE,IAAI,yBAAyB,KAAK;AAAA,IAAA,EACpC;AAEF,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,gBAAgB,MAAM,KAAK,iBAAiB;AAAA,IAAA;AAAA,EAEhD;AACF;"}
|
|
@@ -1,125 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
}
|
|
10
|
-
const created = /* @__PURE__ */ new Map();
|
|
11
|
-
conversationContexts.set(client, created);
|
|
12
|
-
return created;
|
|
13
|
-
}
|
|
14
|
-
function identitiesMatch(a, b) {
|
|
15
|
-
if (!a && !b) {
|
|
16
|
-
return true;
|
|
17
|
-
}
|
|
18
|
-
if (!a || !b) {
|
|
19
|
-
return false;
|
|
20
|
-
}
|
|
21
|
-
if (a.uaid && b.uaid && a.uaid.toLowerCase() === b.uaid.toLowerCase()) {
|
|
22
|
-
return true;
|
|
23
|
-
}
|
|
24
|
-
if (a.ledgerAccountId && b.ledgerAccountId && a.ledgerAccountId.toLowerCase() === b.ledgerAccountId.toLowerCase()) {
|
|
25
|
-
return true;
|
|
26
|
-
}
|
|
27
|
-
if (a.userId && b.userId && a.userId === b.userId) {
|
|
28
|
-
return true;
|
|
29
|
-
}
|
|
30
|
-
if (a.email && b.email && a.email.toLowerCase() === b.email.toLowerCase()) {
|
|
31
|
-
return true;
|
|
32
|
-
}
|
|
33
|
-
return false;
|
|
34
|
-
}
|
|
35
|
-
RegistryBrokerClient.prototype.fetchHistorySnapshot = async function(sessionId, options) {
|
|
36
|
-
if (!sessionId || sessionId.trim().length === 0) {
|
|
37
|
-
throw new Error("sessionId is required to fetch chat history");
|
|
38
|
-
}
|
|
39
|
-
const raw = await this.requestJson(
|
|
40
|
-
`/chat/session/${encodeURIComponent(sessionId)}/history`,
|
|
41
|
-
{
|
|
42
|
-
method: "GET"
|
|
43
|
-
}
|
|
44
|
-
);
|
|
45
|
-
const snapshot = this.parseWithSchema(
|
|
46
|
-
raw,
|
|
47
|
-
chatHistorySnapshotResponseSchema,
|
|
48
|
-
"chat history snapshot response"
|
|
49
|
-
);
|
|
50
|
-
return this.attachDecryptedHistory(sessionId, snapshot, options);
|
|
51
|
-
};
|
|
52
|
-
RegistryBrokerClient.prototype.attachDecryptedHistory = function(sessionId, snapshot, options) {
|
|
53
|
-
const shouldDecrypt = options?.decrypt !== void 0 ? options.decrypt : this.encryptionOptions?.autoDecryptHistory === true;
|
|
54
|
-
if (!shouldDecrypt) {
|
|
55
|
-
return snapshot;
|
|
56
|
-
}
|
|
57
|
-
const context = this.resolveDecryptionContext(sessionId, options);
|
|
58
|
-
if (!context) {
|
|
59
|
-
throw new Error(
|
|
60
|
-
"Unable to decrypt chat history: encryption context unavailable"
|
|
61
|
-
);
|
|
62
|
-
}
|
|
63
|
-
const decryptedHistory = snapshot.history.map((entry) => ({
|
|
64
|
-
entry,
|
|
65
|
-
plaintext: this.decryptHistoryEntryFromContext(sessionId, entry, context)
|
|
66
|
-
}));
|
|
67
|
-
return { ...snapshot, decryptedHistory };
|
|
68
|
-
};
|
|
69
|
-
RegistryBrokerClient.prototype.registerConversationContextForEncryption = function(context) {
|
|
70
|
-
const normalized = {
|
|
71
|
-
sessionId: context.sessionId,
|
|
72
|
-
sharedSecret: Buffer.from(context.sharedSecret),
|
|
73
|
-
identity: context.identity ? { ...context.identity } : void 0
|
|
74
|
-
};
|
|
75
|
-
const map = getConversationContextMap(this);
|
|
76
|
-
const entries = map.get(context.sessionId) ?? [];
|
|
77
|
-
const existingIndex = entries.findIndex(
|
|
78
|
-
(existing) => identitiesMatch(existing.identity, normalized.identity)
|
|
79
|
-
);
|
|
80
|
-
if (existingIndex >= 0) {
|
|
81
|
-
entries[existingIndex] = normalized;
|
|
82
|
-
} else {
|
|
83
|
-
entries.push(normalized);
|
|
84
|
-
}
|
|
85
|
-
map.set(context.sessionId, entries);
|
|
86
|
-
};
|
|
87
|
-
RegistryBrokerClient.prototype.resolveDecryptionContext = function(sessionId, options) {
|
|
88
|
-
if (options?.sharedSecret) {
|
|
89
|
-
return {
|
|
90
|
-
sessionId,
|
|
91
|
-
sharedSecret: this.normalizeSharedSecret(options.sharedSecret),
|
|
92
|
-
identity: options.identity
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
const map = getConversationContextMap(this);
|
|
96
|
-
const contexts = map.get(sessionId);
|
|
97
|
-
if (!contexts || contexts.length === 0) {
|
|
98
|
-
return null;
|
|
99
|
-
}
|
|
100
|
-
if (options?.identity) {
|
|
101
|
-
const match = contexts.find(
|
|
102
|
-
(context) => identitiesMatch(context.identity, options.identity)
|
|
103
|
-
);
|
|
104
|
-
if (match) {
|
|
105
|
-
return match;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
return contexts[0];
|
|
109
|
-
};
|
|
110
|
-
RegistryBrokerClient.prototype.decryptHistoryEntryFromContext = function(sessionId, entry, context) {
|
|
111
|
-
const envelope = entry.cipherEnvelope;
|
|
112
|
-
if (!envelope) {
|
|
113
|
-
return entry.content;
|
|
114
|
-
}
|
|
115
|
-
const secret = Buffer.from(context.sharedSecret);
|
|
116
|
-
try {
|
|
117
|
-
return this.encryption.decryptCipherEnvelope({
|
|
118
|
-
envelope,
|
|
119
|
-
sharedSecret: secret
|
|
120
|
-
});
|
|
121
|
-
} catch (_error) {
|
|
122
|
-
return null;
|
|
123
|
-
}
|
|
1
|
+
var CustomFeeType = /* @__PURE__ */ ((CustomFeeType2) => {
|
|
2
|
+
CustomFeeType2["FIXED_FEE"] = "FIXED_FEE";
|
|
3
|
+
CustomFeeType2["FRACTIONAL_FEE"] = "FRACTIONAL_FEE";
|
|
4
|
+
CustomFeeType2["ROYALTY_FEE"] = "ROYALTY_FEE";
|
|
5
|
+
return CustomFeeType2;
|
|
6
|
+
})(CustomFeeType || {});
|
|
7
|
+
export {
|
|
8
|
+
CustomFeeType
|
|
124
9
|
};
|
|
125
10
|
//# sourceMappingURL=standards-sdk.es133.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-sdk.es133.js","sources":["../../src/
|
|
1
|
+
{"version":3,"file":"standards-sdk.es133.js","sources":["../../src/fees/types.ts"],"sourcesContent":["export interface FeeConfigBuilderInterface {\n addHbarFee(\n hbarAmount: number,\n collectorAccountId?: string,\n exemptAccountIds?: string[],\n ): FeeConfigBuilderInterface;\n addTokenFee(\n tokenAmount: number,\n feeTokenId: string,\n collectorAccountId?: string,\n decimals?: number,\n exemptAccountIds?: string[],\n ): Promise<FeeConfigBuilderInterface>;\n build(): TopicFeeConfig;\n}\n\nexport enum CustomFeeType {\n FIXED_FEE = 'FIXED_FEE',\n FRACTIONAL_FEE = 'FRACTIONAL_FEE',\n ROYALTY_FEE = 'ROYALTY_FEE',\n}\n\nexport type FeeAmount = {\n amount: number;\n decimals?: number;\n};\n\nexport interface TokenFeeConfig {\n feeAmount: FeeAmount;\n feeCollectorAccountId: string;\n feeTokenId?: string;\n exemptAccounts: string[];\n type: CustomFeeType;\n}\n\nexport interface TopicFeeConfig {\n customFees: TokenFeeConfig[];\n exemptAccounts: string[];\n}\n"],"names":["CustomFeeType"],"mappings":"AAgBO,IAAK,kCAAAA,mBAAL;AACLA,iBAAA,WAAA,IAAY;AACZA,iBAAA,gBAAA,IAAiB;AACjBA,iBAAA,aAAA,IAAc;AAHJ,SAAAA;AAAA,GAAA,iBAAA,CAAA,CAAA;"}
|