@keetanetwork/keetanet-client 0.14.7 → 0.14.8
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/api/index.d.ts +1 -0
- package/api/node.d.ts +1 -0
- package/client/client_common_tests.d.ts +1 -1
- package/client/index-browser.d.ts +107 -12
- package/client/index-browser.js +4433 -4217
- package/client/index.d.ts +107 -12
- package/client/index.js +287 -37
- package/docs/assets/hierarchy.js +1 -1
- package/docs/assets/navigation.js +1 -1
- package/docs/assets/search.js +1 -1
- package/docs/classes/KeetaNetSDK.Client.html +16 -6
- package/docs/classes/KeetaNetSDK.Referenced.BaseSet.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.BaseVoteBuilder.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.BlockHash.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.BlockOperation.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.BlockOperationCREATE_IDENTIFIER.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.BlockOperationMANAGE_CERTIFICATE.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.BlockOperationMODIFY_PERMISSIONS.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.BlockOperationRECEIVE.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.BlockOperationSEND.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.BlockOperationSET_INFO.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.BlockOperationSET_REP.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.BlockOperationTOKEN_ADMIN_MODIFY_BALANCE.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.BlockOperationTOKEN_ADMIN_SUPPLY.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.CertificateHash.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.ECDSAKeyPair.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256K1KeyPair.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256K1PrivateKey.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256K1PublicKey.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256K1Signature.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256R1KeyPair.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256R1PrivateKey.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256R1PublicKey.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.ECDSASECP256R1Signature.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.ED25519KeyPair.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.ED25519PrivateKey.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.ED25519PublicKey.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.ED25519Signature.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.ExternalKeyPair.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.ExternalSet.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.IdempotentKey.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.IdentifierKey.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.IdentifierKeyPair.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.KeetaNetError.html +2 -2
- package/docs/classes/KeetaNetSDK.Referenced.KeetaNetErrorBase.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.KeetaNetLedgerError.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.KeetaNetLedgerIdempotentKeyError.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.KeetaNetLedgerVoteError.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.KeyInterface.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.KeyStorage.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.Log.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.PermissionSetHolder.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.PossiblyExpiredVote.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.RequestTiming.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.SignatureStorage.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.Stats.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.StatsPending.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.Vote.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.VoteBlockBundle.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.VoteBlockHash.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.VoteBuilder.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.VoteHash.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.VoteLikeBase.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.VoteQuote.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.VoteQuoteBuilder.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.VoteStaple.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.VoteStapleHash.html +1 -1
- package/docs/classes/KeetaNetSDK.Referenced.src_lib_utils_buffer.BufferStorage.html +1 -1
- package/docs/classes/KeetaNetSDK.UserClient.html +42 -5
- package/docs/hierarchy.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.ACLEntry.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.ACLUpdate.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.ASN1ExplicitContextTag.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.ASN1ImplicitContextTag.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.ASN1Object.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.AcceptSwapRequest.html +3 -0
- package/docs/interfaces/KeetaNetSDK.Referenced.BaseExternalKeyPairFunctions.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.BaseGenerationConfig.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.BaseIdentifierCreateArguments.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperation.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationCREATE_IDENTIFIER.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationMANAGE_CERTIFICATE.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationMANAGE_CERTIFICATESerializable.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationMODIFY_PERMISSIONS.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationRECEIVE.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationSEND.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationSET_INFO.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationSET_REP.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationTOKEN_ADMIN_MODIFY_BALANCE.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.BlockJSONOperationTOKEN_ADMIN_SUPPLY.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.BlockV1Canonical.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.BlockV2Canonical.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.Constructor.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.CreateSwapRequest.html +3 -0
- package/docs/interfaces/KeetaNetSDK.Referenced.DisposableTimingHandle.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.ExternalKeyPairFunctionsNoEncryption.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.ExternalKeyPairFunctionsSupportsEncryption.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.InitialConfigSupply.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.InstanceSet.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.KVGenericOptionsType.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.KVSetOptionsType.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.ModifyTokenBalanceEntry.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.MultiSigIdentifierCreateArguments.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.MultisigConfig.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.NumericValueEntry.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.P2PPeerBase.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.P2PPeerListener.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.P2PPeerRepBase.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.PublicKeyStorage.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.PublishOptions.html +19 -4
- package/docs/interfaces/KeetaNetSDK.Referenced.RequestTokenReceiveEntry.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.TokenNumericEntry.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.UserClientConfig.html +2 -2
- package/docs/interfaces/KeetaNetSDK.Referenced.UserClientOptions.html +2 -2
- package/docs/interfaces/KeetaNetSDK.Referenced.WithIsInstance.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.src_lib_utils_asn1.ASN1BitString.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.src_lib_utils_asn1.ASN1Date.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.src_lib_utils_asn1.ASN1OID.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.src_lib_utils_asn1.ASN1Set.html +1 -1
- package/docs/interfaces/KeetaNetSDK.Referenced.src_lib_utils_asn1.ASN1String.html +1 -1
- package/docs/modules/KeetaNetSDK.Referenced.html +1 -1
- package/docs/variables/KeetaNetSDK.Referenced.allFullErrorCodes.html +1 -1
- package/lib/error/client.d.ts +2 -2
- package/lib/error/index.d.ts +1 -1
- package/lib/log/target_gcp.d.ts +8 -0
- package/lib/log/target_gcp.js +130 -100
- package/lib/node/timing.d.ts +3 -2
- package/lib/node/utils.d.ts +7 -1
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
- package/version.d.ts +1 -1
package/client/index.js
CHANGED
|
@@ -58008,6 +58008,58 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
58008
58008
|
__setModuleDefault(result, mod);
|
|
58009
58009
|
return result;
|
|
58010
58010
|
};
|
|
58011
|
+
var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
|
|
58012
|
+
if (value !== null && value !== void 0) {
|
|
58013
|
+
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
58014
|
+
var dispose, inner;
|
|
58015
|
+
if (async) {
|
|
58016
|
+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
58017
|
+
dispose = value[Symbol.asyncDispose];
|
|
58018
|
+
}
|
|
58019
|
+
if (dispose === void 0) {
|
|
58020
|
+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
58021
|
+
dispose = value[Symbol.dispose];
|
|
58022
|
+
if (async) inner = dispose;
|
|
58023
|
+
}
|
|
58024
|
+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
58025
|
+
if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
|
|
58026
|
+
env.stack.push({ value: value, dispose: dispose, async: async });
|
|
58027
|
+
}
|
|
58028
|
+
else if (async) {
|
|
58029
|
+
env.stack.push({ async: true });
|
|
58030
|
+
}
|
|
58031
|
+
return value;
|
|
58032
|
+
};
|
|
58033
|
+
var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
|
|
58034
|
+
return function (env) {
|
|
58035
|
+
function fail(e) {
|
|
58036
|
+
env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
58037
|
+
env.hasError = true;
|
|
58038
|
+
}
|
|
58039
|
+
var r, s = 0;
|
|
58040
|
+
function next() {
|
|
58041
|
+
while (r = env.stack.pop()) {
|
|
58042
|
+
try {
|
|
58043
|
+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
58044
|
+
if (r.dispose) {
|
|
58045
|
+
var result = r.dispose.call(r.value);
|
|
58046
|
+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
|
|
58047
|
+
}
|
|
58048
|
+
else s |= 1;
|
|
58049
|
+
}
|
|
58050
|
+
catch (e) {
|
|
58051
|
+
fail(e);
|
|
58052
|
+
}
|
|
58053
|
+
}
|
|
58054
|
+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
58055
|
+
if (env.hasError) throw env.error;
|
|
58056
|
+
}
|
|
58057
|
+
return next();
|
|
58058
|
+
};
|
|
58059
|
+
})(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
58060
|
+
var e = new Error(message);
|
|
58061
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
58062
|
+
});
|
|
58011
58063
|
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
58012
58064
|
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
58013
58065
|
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
@@ -58246,6 +58298,7 @@ class Client {
|
|
|
58246
58298
|
* The `blocks` builder will be computed using {@link computeBuilderBlocks} and then transmitted.
|
|
58247
58299
|
*
|
|
58248
58300
|
* @param builder The UserClientBuilder to compute and transmit transmit
|
|
58301
|
+
* @param options User provided options {@link PublishOptions }
|
|
58249
58302
|
* @param network The network to use for the builder (if using a builder)
|
|
58250
58303
|
* @return The result of the publish operation
|
|
58251
58304
|
*/
|
|
@@ -58276,7 +58329,7 @@ class Client {
|
|
|
58276
58329
|
throw (new Error('Votes require fees but generateFeeBlock was not defined'));
|
|
58277
58330
|
}
|
|
58278
58331
|
const staple = vote_1.VoteStaple.fromVotesAndBlocks(tempVotes, blocks);
|
|
58279
|
-
const feeBlock = await options.generateFeeBlock(staple);
|
|
58332
|
+
const feeBlock = await options.generateFeeBlock(staple, options);
|
|
58280
58333
|
blocks.push(feeBlock);
|
|
58281
58334
|
}
|
|
58282
58335
|
const permVotes = await __classPrivateFieldGet(this, _Client_instances, "m", _Client_requestVotes).call(this, blocks, tempVotes);
|
|
@@ -58557,21 +58610,43 @@ class Client {
|
|
|
58557
58610
|
*
|
|
58558
58611
|
* @param account The account to get the head block for
|
|
58559
58612
|
* @param rep The representative to get the head block from -- this is generally "ANY" in which case the best representative will be used, but it is possible to request a specific representative
|
|
58560
|
-
* @return The head block for the account or null if the account has
|
|
58561
|
-
* not created any blocks
|
|
58613
|
+
* @return The head block and height for the account or null if the account has not created any blocks
|
|
58562
58614
|
*/
|
|
58563
|
-
async
|
|
58615
|
+
async getAccountHeadInfo(account, rep = 'ANY') {
|
|
58564
58616
|
account = lib_1.default.Account.toPublicKeyString(account);
|
|
58565
58617
|
const result = await __classPrivateFieldGet(this, _Client_instances, "m", _Client_api).call(this, rep, 'GET /node/ledger/account/:account/head', {
|
|
58566
58618
|
args: {
|
|
58567
58619
|
account
|
|
58568
58620
|
}
|
|
58569
58621
|
});
|
|
58570
|
-
if (result.block === null) {
|
|
58622
|
+
if (result.block === null || result.height === null) {
|
|
58571
58623
|
return (null);
|
|
58572
58624
|
}
|
|
58573
58625
|
const block = new lib_1.default.Block(result.block);
|
|
58574
|
-
return (
|
|
58626
|
+
return ({
|
|
58627
|
+
block,
|
|
58628
|
+
height: BigInt(result.height)
|
|
58629
|
+
});
|
|
58630
|
+
}
|
|
58631
|
+
/**
|
|
58632
|
+
* Get the current head block for a given account. This will return the
|
|
58633
|
+
* entire block, or null if the account has not created any blocks.
|
|
58634
|
+
*
|
|
58635
|
+
* An account with no blocks may still have a balance because other users
|
|
58636
|
+
* may have sent tokens to it.
|
|
58637
|
+
*
|
|
58638
|
+
* @param account The account to get the head block for
|
|
58639
|
+
* @param rep The representative to get the head block from -- this is generally "ANY" in which case the best representative will be used, but it is possible to request a specific representative
|
|
58640
|
+
* @return The head block for the account or null if the account has
|
|
58641
|
+
* not created any blocks
|
|
58642
|
+
*/
|
|
58643
|
+
async getHeadBlock(account, rep = 'ANY') {
|
|
58644
|
+
account = lib_1.default.Account.toPublicKeyString(account);
|
|
58645
|
+
const headBlockInfo = await this.getAccountHeadInfo(account, rep);
|
|
58646
|
+
if (headBlockInfo === null) {
|
|
58647
|
+
return (null);
|
|
58648
|
+
}
|
|
58649
|
+
return (headBlockInfo.block);
|
|
58575
58650
|
}
|
|
58576
58651
|
/**
|
|
58577
58652
|
* @param blockhash The block hash to get the block for
|
|
@@ -59061,8 +59136,9 @@ class Client {
|
|
|
59061
59136
|
*
|
|
59062
59137
|
* @param account Account to recover
|
|
59063
59138
|
* @param publish Publish the recovered staple to the network (default is true)
|
|
59139
|
+
* @param options options for publishing {@link PublishOptions }
|
|
59064
59140
|
*/
|
|
59065
|
-
async recoverAccount(account, publish = true) {
|
|
59141
|
+
async recoverAccount(account, publish = true, options) {
|
|
59066
59142
|
const successorBlock = await this.getPendingBlock(account);
|
|
59067
59143
|
if (!successorBlock) {
|
|
59068
59144
|
return (null);
|
|
@@ -59158,7 +59234,7 @@ class Client {
|
|
|
59158
59234
|
let newTempVotes = [];
|
|
59159
59235
|
if (tempVotes.length !== __classPrivateFieldGet(this, _Client_reps, "f").length) {
|
|
59160
59236
|
try {
|
|
59161
|
-
newTempVotes = await __classPrivateFieldGet(this, _Client_instances, "m", _Client_requestVotes).call(this, votedOnBlocks, undefined, missingReps);
|
|
59237
|
+
newTempVotes = await __classPrivateFieldGet(this, _Client_instances, "m", _Client_requestVotes).call(this, votedOnBlocks, undefined, missingReps, options?.quotes);
|
|
59162
59238
|
}
|
|
59163
59239
|
catch {
|
|
59164
59240
|
/* Ignore */
|
|
@@ -59166,6 +59242,22 @@ class Client {
|
|
|
59166
59242
|
tempVotes = [...tempVotes, ...newTempVotes];
|
|
59167
59243
|
}
|
|
59168
59244
|
const missingPermReps = __classPrivateFieldGet(this, _Client_reps, "f").filter(rep => !permReps.includes(rep));
|
|
59245
|
+
// If any of the temporary votes require a fee, we need to generate a fee block
|
|
59246
|
+
let requiresFee = false;
|
|
59247
|
+
for (const vote of tempVotes) {
|
|
59248
|
+
if (vote.fee !== undefined) {
|
|
59249
|
+
requiresFee = true;
|
|
59250
|
+
}
|
|
59251
|
+
}
|
|
59252
|
+
// If we need a fee block and don't have any permanent votes, we need to generate a fee block
|
|
59253
|
+
if (requiresFee && permVotes.length === 0) {
|
|
59254
|
+
if (options?.generateFeeBlock === undefined) {
|
|
59255
|
+
throw (new Error('Votes require fees but generateFeeBlock was not defined'));
|
|
59256
|
+
}
|
|
59257
|
+
const staple = vote_1.VoteStaple.fromVotesAndBlocks(tempVotes, votedOnBlocks);
|
|
59258
|
+
const feeBlock = await options.generateFeeBlock(staple, options);
|
|
59259
|
+
votedOnBlocks.push(feeBlock);
|
|
59260
|
+
}
|
|
59169
59261
|
try {
|
|
59170
59262
|
const newPermVotes = await __classPrivateFieldGet(this, _Client_instances, "m", _Client_requestVotes).call(this, votedOnBlocks, tempVotes, missingPermReps);
|
|
59171
59263
|
permVotes = [...permVotes, ...newPermVotes];
|
|
@@ -59200,7 +59292,7 @@ class Client {
|
|
|
59200
59292
|
const repAccountInfoPromises = [];
|
|
59201
59293
|
for (const rep of reps) {
|
|
59202
59294
|
repAccountInfoPromises.push((async () => {
|
|
59203
|
-
const info = await this.
|
|
59295
|
+
const info = await this.getAccountHeadInfo(account, rep);
|
|
59204
59296
|
return ({
|
|
59205
59297
|
rep,
|
|
59206
59298
|
info
|
|
@@ -59215,15 +59307,15 @@ class Client {
|
|
|
59215
59307
|
}
|
|
59216
59308
|
}
|
|
59217
59309
|
const accountInfoSorted = accountInfo.sort(function (a, b) {
|
|
59218
|
-
return (Number(BigInt(a.info
|
|
59310
|
+
return (Number(BigInt(a.info?.height ?? -1) - BigInt(b.info?.height ?? -1)));
|
|
59219
59311
|
});
|
|
59220
|
-
if (accountInfoSorted[0].info
|
|
59312
|
+
if (accountInfoSorted[0].info?.height === accountInfoSorted[accountInfoSorted.length - 1].info?.height) {
|
|
59221
59313
|
// Block Heights match so return
|
|
59222
59314
|
return (null);
|
|
59223
59315
|
}
|
|
59224
|
-
let lowestHead = accountInfoSorted[0].info.
|
|
59225
|
-
if (lowestHead === null) {
|
|
59226
|
-
lowestHead = block_1.default.getAccountOpeningHash(account)
|
|
59316
|
+
let lowestHead = accountInfoSorted[0].info?.block.hash;
|
|
59317
|
+
if (lowestHead === null || lowestHead === undefined) {
|
|
59318
|
+
lowestHead = block_1.default.getAccountOpeningHash(account);
|
|
59227
59319
|
}
|
|
59228
59320
|
// Get the missing successor block and vote staple from the rep with the highest block height
|
|
59229
59321
|
const successorBlock = await this.getSuccessorBlock(lowestHead, accountInfoSorted[accountInfoSorted.length - 1].rep);
|
|
@@ -59237,8 +59329,8 @@ class Client {
|
|
|
59237
59329
|
if (publish === true) {
|
|
59238
59330
|
await this.transmitStaple(successorStaple, [accountInfoSorted[0].rep]);
|
|
59239
59331
|
}
|
|
59240
|
-
const updatedAccountInfo = await this.
|
|
59241
|
-
if (updatedAccountInfo
|
|
59332
|
+
const updatedAccountInfo = await this.getAccountHeadInfo(account, accountInfoSorted[0].rep);
|
|
59333
|
+
if (updatedAccountInfo?.height === accountInfoSorted[0].info?.height) {
|
|
59242
59334
|
throw (new client_1.default('CLIENT_SYNC_PUBLISH_FAILED', `Client sync found a missing staple: ${successorStaple.blocksHash}, but it could not be published to rep: ${accountInfoSorted[0].rep.key.publicKeyString.get()}`));
|
|
59243
59335
|
}
|
|
59244
59336
|
return (successorStaple);
|
|
@@ -59364,10 +59456,16 @@ async function _Client_apiRaw(rep, api, method, options = {}) {
|
|
|
59364
59456
|
const keetaNetError = error_1.KeetaNetError.fromJSON(errorInfo);
|
|
59365
59457
|
try {
|
|
59366
59458
|
if (ledger_1.KeetaNetLedgerVoteError.isInstance(keetaNetError)) {
|
|
59459
|
+
let syncPerformed = false;
|
|
59367
59460
|
for (const account of keetaNetError.accounts) {
|
|
59368
|
-
await this.syncAccount(account);
|
|
59461
|
+
const successorStaple = await this.syncAccount(account);
|
|
59462
|
+
if (successorStaple !== null) {
|
|
59463
|
+
syncPerformed = true;
|
|
59464
|
+
}
|
|
59465
|
+
}
|
|
59466
|
+
if (syncPerformed) {
|
|
59467
|
+
continue;
|
|
59369
59468
|
}
|
|
59370
|
-
continue;
|
|
59371
59469
|
}
|
|
59372
59470
|
}
|
|
59373
59471
|
catch {
|
|
@@ -59836,6 +59934,103 @@ class UserClient {
|
|
|
59836
59934
|
};
|
|
59837
59935
|
return (new UserClient(config));
|
|
59838
59936
|
}
|
|
59937
|
+
/**
|
|
59938
|
+
* Initiate a swap request
|
|
59939
|
+
*
|
|
59940
|
+
* @param request {@link CreateSwapRequest}
|
|
59941
|
+
* Defines what is being sent from {@link Account}, {@link TokenAddress} and Amount
|
|
59942
|
+
* Defines what is being received from {@link Account}, {@link TokenAddress} and Converted Amount
|
|
59943
|
+
* @param client either a UserClient instance or network and signer from which to create a UserClient
|
|
59944
|
+
* @param options User client options (common options)
|
|
59945
|
+
* @returns Swap {@link Block}
|
|
59946
|
+
*/
|
|
59947
|
+
static async createSwapRequest(request, client, options) {
|
|
59948
|
+
let userClient;
|
|
59949
|
+
if (UserClient.isInstance(client)) {
|
|
59950
|
+
userClient = client;
|
|
59951
|
+
}
|
|
59952
|
+
else {
|
|
59953
|
+
userClient = this.fromNetwork(client.network, client.signer, options);
|
|
59954
|
+
}
|
|
59955
|
+
if (userClient === undefined) {
|
|
59956
|
+
throw (new Error('UserClient Should have been defined for swap'));
|
|
59957
|
+
}
|
|
59958
|
+
const { from, to } = request;
|
|
59959
|
+
if (options?.account !== undefined && !request.from.account.comparePublicKey(options.account)) {
|
|
59960
|
+
throw (new client_1.default('CLIENT_SWAP_INVALID_ACCOUNT_OPTION', 'account should be provided in the request instead of options'));
|
|
59961
|
+
}
|
|
59962
|
+
const builder = userClient.initBuilder({ ...options, account: request.from.account });
|
|
59963
|
+
builder.send(to.account, from.amount, from.token);
|
|
59964
|
+
builder.receive(to.account, to.amount, to.token, true);
|
|
59965
|
+
const blocks = await builder.computeBlocks();
|
|
59966
|
+
if (blocks.blocks.length !== 1) {
|
|
59967
|
+
throw (new Error('Compute Swap Request Generated more than 1 block'));
|
|
59968
|
+
}
|
|
59969
|
+
return (blocks.blocks[0]);
|
|
59970
|
+
}
|
|
59971
|
+
static async acceptSwapRequest(request, builderOrUserClient, options) {
|
|
59972
|
+
let builder;
|
|
59973
|
+
let account;
|
|
59974
|
+
if (builder_1.UserClientBuilder.isInstance(builderOrUserClient)) {
|
|
59975
|
+
builder = builderOrUserClient;
|
|
59976
|
+
account = builder.defaultOptions.account;
|
|
59977
|
+
}
|
|
59978
|
+
else {
|
|
59979
|
+
let userClient;
|
|
59980
|
+
if (UserClient.isInstance(builderOrUserClient)) {
|
|
59981
|
+
userClient = builderOrUserClient;
|
|
59982
|
+
account = builderOrUserClient.account;
|
|
59983
|
+
}
|
|
59984
|
+
else {
|
|
59985
|
+
const env_1 = { stack: [], error: void 0, hasError: false };
|
|
59986
|
+
try {
|
|
59987
|
+
// Use await using so this temporary client gets cleaned up
|
|
59988
|
+
const temporaryClient = __addDisposableResource(env_1, this.fromNetwork(builderOrUserClient.network, builderOrUserClient.signer, options), true);
|
|
59989
|
+
userClient = temporaryClient;
|
|
59990
|
+
account = options?.account ?? builderOrUserClient.signer;
|
|
59991
|
+
if (account === null) {
|
|
59992
|
+
throw (new client_1.default('CLIENT_SWAP_INVALID_ACCOUNT_OPTION', 'Signer is required for building swap block'));
|
|
59993
|
+
}
|
|
59994
|
+
}
|
|
59995
|
+
catch (e_1) {
|
|
59996
|
+
env_1.error = e_1;
|
|
59997
|
+
env_1.hasError = true;
|
|
59998
|
+
}
|
|
59999
|
+
finally {
|
|
60000
|
+
const result_1 = __disposeResources(env_1);
|
|
60001
|
+
if (result_1)
|
|
60002
|
+
await result_1;
|
|
60003
|
+
}
|
|
60004
|
+
}
|
|
60005
|
+
builder = userClient.initBuilder(options);
|
|
60006
|
+
}
|
|
60007
|
+
if (account === undefined) {
|
|
60008
|
+
throw (new client_1.default('CLIENT_SWAP_INVALID_ACCOUNT_OPTION', 'Unable to determine account for swap'));
|
|
60009
|
+
}
|
|
60010
|
+
const sendOperation = request.block.operations.find(({ type }) => block_1.default.OperationType.SEND === type);
|
|
60011
|
+
const receiveOperation = request.block.operations.find(({ type }) => block_1.default.OperationType.RECEIVE === type);
|
|
60012
|
+
if (!sendOperation || sendOperation.type !== block_1.default.OperationType.SEND) {
|
|
60013
|
+
throw (new client_1.default('CLIENT_SWAP_MISSING_SEND', 'Swap Request is missing send'));
|
|
60014
|
+
}
|
|
60015
|
+
if (!receiveOperation || receiveOperation.type !== block_1.default.OperationType.RECEIVE) {
|
|
60016
|
+
throw (new client_1.default('CLIENT_SWAP_MISSING_RECEIVE', 'Swap Request is missing receive operation'));
|
|
60017
|
+
}
|
|
60018
|
+
if (!sendOperation.to.comparePublicKey(receiveOperation.from)) {
|
|
60019
|
+
throw (new client_1.default('CLIENT_SWAP_SEND_RECEIVE_ACCOUNT_MISMATCH', 'The SEND and RECEIVE operations must have matching accounts.'));
|
|
60020
|
+
}
|
|
60021
|
+
if (!sendOperation.to.comparePublicKey(account)) {
|
|
60022
|
+
throw (new client_1.default('CLIENT_SWAP_SEND_ACCOUNT_MISMATCH', 'Swap Request send account does not match'));
|
|
60023
|
+
}
|
|
60024
|
+
if (request.expected?.token !== undefined && !sendOperation.token.comparePublicKey(request.expected?.token)) {
|
|
60025
|
+
throw (new client_1.default('CLIENT_SWAP_REQUEST_TOKEN_MISMATCH', 'Swap Request send token does not match expected'));
|
|
60026
|
+
}
|
|
60027
|
+
if (request.expected?.amount !== undefined && sendOperation.amount !== request.expected?.amount) {
|
|
60028
|
+
throw (new client_1.default('CLIENT_SWAP_REQUEST_AMOUNT_MISMATCH', 'Swap Request send amount does not match expected'));
|
|
60029
|
+
}
|
|
60030
|
+
builder.send(request.block.account, receiveOperation.amount, receiveOperation.token);
|
|
60031
|
+
const blocks = await builder.computeBlocks();
|
|
60032
|
+
return ([...blocks.blocks, request.block]);
|
|
60033
|
+
}
|
|
59839
60034
|
/**
|
|
59840
60035
|
* Helper method to filter a list of vote staples into
|
|
59841
60036
|
* a list of blocks and operations that are related to
|
|
@@ -59942,8 +60137,8 @@ class UserClient {
|
|
|
59942
60137
|
this.networkAddress = networkAddress;
|
|
59943
60138
|
this.baseToken = baseToken;
|
|
59944
60139
|
__classPrivateFieldSet(this, _UserClient_config, {
|
|
59945
|
-
generateFeeBlock: async (staple) => {
|
|
59946
|
-
const builder = this.initBuilder();
|
|
60140
|
+
generateFeeBlock: async (staple, options) => {
|
|
60141
|
+
const builder = this.initBuilder(options);
|
|
59947
60142
|
const block = await builder.computeFeeBlock(staple);
|
|
59948
60143
|
return (block);
|
|
59949
60144
|
},
|
|
@@ -60090,6 +60285,22 @@ class UserClient {
|
|
|
60090
60285
|
from: 'publish-aid'
|
|
60091
60286
|
});
|
|
60092
60287
|
}
|
|
60288
|
+
/**
|
|
60289
|
+
* Transmit a set of blocks to the network. This will request short
|
|
60290
|
+
* votes and permanent votes for the blocks and then publish them to
|
|
60291
|
+
* the network. Optionally it will generate a fee block from a user
|
|
60292
|
+
* provided function if fees are required.
|
|
60293
|
+
*
|
|
60294
|
+
* @param blocks The blocks to transmit
|
|
60295
|
+
* @param options User provided options {@link PublishOptions }
|
|
60296
|
+
* @return The result of the publish operation
|
|
60297
|
+
*/
|
|
60298
|
+
async transmit(blocks, options = {}) {
|
|
60299
|
+
if (options.generateFeeBlock === undefined) {
|
|
60300
|
+
options.generateFeeBlock = __classPrivateFieldGet(this, _UserClient_config, "f").generateFeeBlock;
|
|
60301
|
+
}
|
|
60302
|
+
return (await __classPrivateFieldGet(this, _UserClient_client, "f").transmit(blocks, options));
|
|
60303
|
+
}
|
|
60093
60304
|
/**
|
|
60094
60305
|
* Set the metadata for an account and publish the blocks to the
|
|
60095
60306
|
* network.
|
|
@@ -60350,7 +60561,7 @@ class UserClient {
|
|
|
60350
60561
|
* @param options User client options (common options)
|
|
60351
60562
|
*/
|
|
60352
60563
|
async recover(publish, options = {}) {
|
|
60353
|
-
return (await __classPrivateFieldGet(this, _UserClient_client, "f").recoverAccount(__classPrivateFieldGet(this, _UserClient_instances, "m", _UserClient_getAccount).call(this, options), publish));
|
|
60564
|
+
return (await __classPrivateFieldGet(this, _UserClient_client, "f").recoverAccount(__classPrivateFieldGet(this, _UserClient_instances, "m", _UserClient_getAccount).call(this, options), publish, options));
|
|
60354
60565
|
}
|
|
60355
60566
|
/**
|
|
60356
60567
|
* Fetch a block from a given idempotent key
|
|
@@ -60370,6 +60581,33 @@ class UserClient {
|
|
|
60370
60581
|
async sync(publish, options = {}) {
|
|
60371
60582
|
return (await __classPrivateFieldGet(this, _UserClient_client, "f").syncAccount(__classPrivateFieldGet(this, _UserClient_instances, "m", _UserClient_getAccount).call(this, options), publish));
|
|
60372
60583
|
}
|
|
60584
|
+
/**
|
|
60585
|
+
* Initiate a swap request
|
|
60586
|
+
*
|
|
60587
|
+
* @param request {@link CreateSwapRequest}
|
|
60588
|
+
* Defines what is being sent from {@link Account}, {@link TokenAddress} and Amount
|
|
60589
|
+
* Defines what is being received from {@link Account}, {@link TokenAddress} and Converted Amount
|
|
60590
|
+
* @param options User client options (common options)
|
|
60591
|
+
* @returns Swap {@link Block}
|
|
60592
|
+
*/
|
|
60593
|
+
async createSwapRequest(request, options) {
|
|
60594
|
+
return (await UserClient.createSwapRequest(request, this, options));
|
|
60595
|
+
}
|
|
60596
|
+
/**
|
|
60597
|
+
* Finalize a swap request
|
|
60598
|
+
*
|
|
60599
|
+
* @param request {@link AcceptSwapRequest} initial swap request block and optional expected token and amounts
|
|
60600
|
+
* @param builderOrOptions {@link UserClientBuilder} or {@link UserClientOptions} to use for building the swap block
|
|
60601
|
+
* @returns Blocks
|
|
60602
|
+
*/
|
|
60603
|
+
async acceptSwapRequest(request, builderOrOptions) {
|
|
60604
|
+
if (builder_1.UserClientBuilder.isInstance(builderOrOptions)) {
|
|
60605
|
+
return (await UserClient.acceptSwapRequest(request, builderOrOptions));
|
|
60606
|
+
}
|
|
60607
|
+
else {
|
|
60608
|
+
return (await UserClient.acceptSwapRequest(request, this, builderOrOptions));
|
|
60609
|
+
}
|
|
60610
|
+
}
|
|
60373
60611
|
/**
|
|
60374
60612
|
* Register a callback for change messages and set up a websocket filtered to our account only.
|
|
60375
60613
|
* Also set up long timeout polling for changes in case the websocket misses a change update
|
|
@@ -65336,7 +65574,15 @@ exports.ClientErrorCodes = [
|
|
|
65336
65574
|
'BUILDER_USER_CLIENT_REQUIRED',
|
|
65337
65575
|
'PUBLISH_AID_NOT_AVAILABLE',
|
|
65338
65576
|
'SIGNER_REQUIRES_PRIVATE_KEY',
|
|
65339
|
-
'SYNC_PUBLISH_FAILED'
|
|
65577
|
+
'SYNC_PUBLISH_FAILED',
|
|
65578
|
+
'SWAP_INVALID_ACCOUNT_OPTION',
|
|
65579
|
+
'SWAP_OPTIONS_INVALID',
|
|
65580
|
+
'SWAP_MISSING_SEND',
|
|
65581
|
+
'SWAP_MISSING_RECEIVE',
|
|
65582
|
+
'SWAP_SEND_RECEIVE_ACCOUNT_MISMATCH',
|
|
65583
|
+
'SWAP_SEND_ACCOUNT_MISMATCH',
|
|
65584
|
+
'SWAP_REQUEST_TOKEN_MISMATCH',
|
|
65585
|
+
'SWAP_REQUEST_AMOUNT_MISMATCH'
|
|
65340
65586
|
];
|
|
65341
65587
|
exports.FullClientErrorCodes = exports.ClientErrorCodes.map(code => `${ClientErrorType}_${code}`);
|
|
65342
65588
|
class KeetaNetClientError extends base_1.KeetaNetErrorBase {
|
|
@@ -69271,13 +69517,18 @@ class Log {
|
|
|
69271
69517
|
*
|
|
69272
69518
|
* The default value for `<name>` is `KEETANET`.
|
|
69273
69519
|
*/
|
|
69274
|
-
static Legacy(name) {
|
|
69275
|
-
if (
|
|
69276
|
-
|
|
69520
|
+
static Legacy(name = 'KEETANET') {
|
|
69521
|
+
if (Log.legacyLoggerInstance) {
|
|
69522
|
+
if (__classPrivateFieldGet(Log.legacyLoggerInstance, _Log_destroyed, "f")) {
|
|
69523
|
+
Log.legacyLoggerInstance = undefined;
|
|
69524
|
+
}
|
|
69525
|
+
}
|
|
69526
|
+
if (Log.legacyLoggerInstance) {
|
|
69527
|
+
return (Log.legacyLoggerInstance);
|
|
69277
69528
|
}
|
|
69278
69529
|
const extraConfig = {};
|
|
69279
69530
|
if (process !== undefined) {
|
|
69280
|
-
let environmentLogLevel = process.env[`${name}_DEBUG`]?.toUpperCase() ?? 'NONE';
|
|
69531
|
+
let environmentLogLevel = process.env[`${name}_DEBUG`]?.toUpperCase() ?? process.env[`${name}_LAMBDA_LOG_LEVEL`]?.toUpperCase() ?? 'NONE';
|
|
69281
69532
|
if (environmentLogLevel === 'TRUE') {
|
|
69282
69533
|
environmentLogLevel = 'DEBUG';
|
|
69283
69534
|
}
|
|
@@ -69285,16 +69536,11 @@ class Log {
|
|
|
69285
69536
|
environmentLogLevel = 'NONE';
|
|
69286
69537
|
}
|
|
69287
69538
|
extraConfig.logLevel = (0, helper_generated_1.assertLogTargetLevel)(environmentLogLevel);
|
|
69288
|
-
|
|
69289
|
-
|
|
69290
|
-
|
|
69291
|
-
if (__classPrivateFieldGet(Log.legacyLoggerInstance, _Log_destroyed, "f")) {
|
|
69292
|
-
Log.legacyLoggerInstance = undefined;
|
|
69539
|
+
const logFilterString = process.env[`${name}_DEBUG_FILTER`] ?? process.env[`${name}_LAMBDA_LOG_FILTER`] ?? '';
|
|
69540
|
+
if (logFilterString !== '') {
|
|
69541
|
+
extraConfig.filter = new RegExp(logFilterString, 'i');
|
|
69293
69542
|
}
|
|
69294
69543
|
}
|
|
69295
|
-
if (Log.legacyLoggerInstance) {
|
|
69296
|
-
return (Log.legacyLoggerInstance);
|
|
69297
|
-
}
|
|
69298
69544
|
const logger = new Log();
|
|
69299
69545
|
logger.registerConsoleTarget({
|
|
69300
69546
|
logLevel: Log.defaultLevel,
|
|
@@ -69839,7 +70085,7 @@ exports["default"] = Node;
|
|
|
69839
70085
|
/***/ }),
|
|
69840
70086
|
|
|
69841
70087
|
/***/ 2895:
|
|
69842
|
-
/***/ (function(__unused_webpack_module, exports) {
|
|
70088
|
+
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
|
|
69843
70089
|
|
|
69844
70090
|
"use strict";
|
|
69845
70091
|
|
|
@@ -69854,9 +70100,13 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
|
|
|
69854
70100
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
69855
70101
|
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
69856
70102
|
};
|
|
70103
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
70104
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
70105
|
+
};
|
|
69857
70106
|
var _RequestTiming_timing, _RequestTiming_counter;
|
|
69858
70107
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
69859
70108
|
exports.RequestTiming = void 0;
|
|
70109
|
+
const log_1 = __importDefault(__webpack_require__(9));
|
|
69860
70110
|
/**
|
|
69861
70111
|
* Support the old way of doing timing where the callers could call
|
|
69862
70112
|
* startTime/endTime with the same string to terminate a timing section
|
|
@@ -70009,7 +70259,7 @@ class RequestTiming {
|
|
|
70009
70259
|
}
|
|
70010
70260
|
exports.RequestTiming = RequestTiming;
|
|
70011
70261
|
_RequestTiming_timing = new WeakMap(), _RequestTiming_counter = new WeakMap();
|
|
70012
|
-
RequestTiming.defaultLogger =
|
|
70262
|
+
RequestTiming.defaultLogger = log_1.default.Legacy();
|
|
70013
70263
|
exports["default"] = RequestTiming;
|
|
70014
70264
|
|
|
70015
70265
|
|
|
@@ -78545,7 +78795,7 @@ exports.Testing = { findRDN, blockHashesFromVote, feeFromVote };
|
|
|
78545
78795
|
|
|
78546
78796
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
78547
78797
|
exports.version = void 0;
|
|
78548
|
-
exports.version = '0.14.
|
|
78798
|
+
exports.version = '0.14.8+g2ae53aba450fae088463ac1a8f545b6460825c5b';
|
|
78549
78799
|
exports["default"] = exports.version;
|
|
78550
78800
|
|
|
78551
78801
|
|
package/docs/assets/hierarchy.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
window.hierarchyData = "
|
|
1
|
+
window.hierarchyData = "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"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
window.navigationData = "
|
|
1
|
+
window.navigationData = "eJyNz8ELgjAUx/H/5Z1XlkKIt0iREDyoncTDdC8czRnbjCD83zsETj1I5/flw/uVHzD4NhBAHBXFNY13eXHOiigEAk9qWgiA9c3QoTTaWSX71nQCCDy4ZBD4nu+fDv5IJjFBNDRFk4eJ1bqeDQK1MzsuHZdA03LBFEoIygnL8I4KZYNs27Ldip09dhEcpbFOI6jWK+fXLI2jO59306j+kWy3pQleW+ZFFaf1eprg9VLw3LEaqy/Rd5Px"
|