evernode-js-client 0.6.44 → 0.6.46
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/index.js +527 -31
- package/node.napi11.node +0 -0
- package/node.napi2.node +0 -0
- package/package.json +1 -1
- package/secp256k1.node +0 -0
package/index.js
CHANGED
@@ -59582,7 +59582,7 @@ const { Buffer } = __nccwpck_require__(4300);
|
|
59582
59582
|
const { XrplApi } = __nccwpck_require__(1850);
|
59583
59583
|
const { XrplAccount } = __nccwpck_require__(9329);
|
59584
59584
|
const { XrplApiEvents, XrplConstants } = __nccwpck_require__(3307);
|
59585
|
-
const { EvernodeEvents, EventTypes, MemoFormats, EvernodeConstants, HookStateKeys, HookParamKeys, RegExp } = __nccwpck_require__(9849);
|
59585
|
+
const { EvernodeEvents, EventTypes, MemoFormats, EvernodeConstants, HookStateKeys, HookParamKeys, RegExp, ReputationConstants } = __nccwpck_require__(9849);
|
59586
59586
|
const { Defaults } = __nccwpck_require__(8262);
|
59587
59587
|
const { EncryptionHelper } = __nccwpck_require__(4832);
|
59588
59588
|
const { EventEmitter } = __nccwpck_require__(6170);
|
@@ -59593,10 +59593,12 @@ const { HookHelpers } = __nccwpck_require__(4675);
|
|
59593
59593
|
const xrpl = __nccwpck_require__(4666);
|
59594
59594
|
|
59595
59595
|
const CANDIDATE_PROPOSE_HASHES_PARAM_OFFSET = 0;
|
59596
|
-
const CANDIDATE_PROPOSE_KEYLETS_PARAM_OFFSET =
|
59597
|
-
const CANDIDATE_PROPOSE_UNIQUE_ID_PARAM_OFFSET =
|
59598
|
-
const CANDIDATE_PROPOSE_SHORT_NAME_PARAM_OFFSET =
|
59599
|
-
const CANDIDATE_PROPOSE_PARAM_SIZE =
|
59596
|
+
const CANDIDATE_PROPOSE_KEYLETS_PARAM_OFFSET = 128;
|
59597
|
+
const CANDIDATE_PROPOSE_UNIQUE_ID_PARAM_OFFSET = 264;
|
59598
|
+
const CANDIDATE_PROPOSE_SHORT_NAME_PARAM_OFFSET = 296;
|
59599
|
+
const CANDIDATE_PROPOSE_PARAM_SIZE = 316;
|
59600
|
+
|
59601
|
+
const MAX_HOOK_PARAM_SIZE = 256;
|
59600
59602
|
|
59601
59603
|
const DUD_HOST_CANDID_ADDRESS_OFFSET = 12;
|
59602
59604
|
|
@@ -59766,6 +59768,7 @@ class BaseEvernodeClient {
|
|
59766
59768
|
const configStateKeys = {
|
59767
59769
|
registryAddress: HookStateKeys.REGISTRY_ADDR,
|
59768
59770
|
heartbeatAddress: HookStateKeys.HEARTBEAT_ADDR,
|
59771
|
+
reputationAddress: HookStateKeys.REPUTATION_ADDR,
|
59769
59772
|
evrIssuerAddress: HookStateKeys.EVR_ISSUER_ADDR,
|
59770
59773
|
foundationAddress: HookStateKeys.FOUNDATION_ADDR,
|
59771
59774
|
hostRegFee: HookStateKeys.HOST_REG_FEE,
|
@@ -60482,6 +60485,74 @@ class BaseEvernodeClient {
|
|
60482
60485
|
return null;
|
60483
60486
|
}
|
60484
60487
|
|
60488
|
+
/**
|
60489
|
+
* Get reputation info of given host.
|
60490
|
+
* @param {string} hostReputationAddress Host's reputation address.
|
60491
|
+
* @param {number} moment (optional) Moment to get reputation info for.
|
60492
|
+
* @returns Reputation info object.
|
60493
|
+
*/
|
60494
|
+
async _getReputationInfoByAddress(hostReputationAddress, moment = null) {
|
60495
|
+
try {
|
60496
|
+
const addrStateKey = StateHelpers.generateHostReputationAddrStateKey(hostReputationAddress);
|
60497
|
+
const addrStateIndex = StateHelpers.getHookStateIndex(this.config.reputationAddress, addrStateKey);
|
60498
|
+
const addrLedgerEntry = await this.xrplApi.getLedgerEntry(addrStateIndex);
|
60499
|
+
const addrStateData = addrLedgerEntry?.HookStateData;
|
60500
|
+
let data = {};
|
60501
|
+
|
60502
|
+
if (addrStateData) {
|
60503
|
+
const addrStateDecoded = StateHelpers.decodeHostReputationAddressState(Buffer.from(addrStateKey, 'hex'), Buffer.from(addrStateData, 'hex'));
|
60504
|
+
data = addrStateDecoded;
|
60505
|
+
}
|
60506
|
+
|
60507
|
+
const repMoment = moment ?? await this.getMoment();
|
60508
|
+
const orderedAddrStateKey = StateHelpers.generateHostReputationOrderAddressStateKey(hostReputationAddress, repMoment);
|
60509
|
+
const orderedAddrStateIndex = StateHelpers.getHookStateIndex(this.config.reputationAddress, orderedAddrStateKey);
|
60510
|
+
const orderedAddrLedgerEntry = await this.xrplApi.getLedgerEntry(orderedAddrStateIndex);
|
60511
|
+
const orderedAddrStateData = orderedAddrLedgerEntry?.HookStateData;
|
60512
|
+
|
60513
|
+
if (orderedAddrStateData) {
|
60514
|
+
const orderedAddrStateDecoded = StateHelpers.decodeHostReputationOrderAddressState(Buffer.from(orderedAddrStateKey, 'hex'), Buffer.from(orderedAddrStateData, 'hex'));
|
60515
|
+
data = { ...data, ...orderedAddrStateDecoded };
|
60516
|
+
}
|
60517
|
+
|
60518
|
+
const hostRepAcc = new XrplAccount(hostReputationAddress, null, { xrplApi: this.xrplApi });
|
60519
|
+
const [msgKey, rep] = await Promise.all([
|
60520
|
+
hostRepAcc.getMessageKey(),
|
60521
|
+
hostRepAcc.getDomain()]);
|
60522
|
+
|
60523
|
+
if (msgKey && rep && rep.length > 0) {
|
60524
|
+
const hostAddress = UtilHelpers.deriveAddress(msgKey);
|
60525
|
+
const hostAcc = new XrplAccount(hostAddress, null, { xrplApi: this.xrplApi });
|
60526
|
+
|
60527
|
+
const repBuf = Buffer.from(rep, 'hex');
|
60528
|
+
const publicKey = repBuf.slice(0, ReputationConstants.REP_INFO_PEER_PORT_OFFSET).toString('hex').toLocaleLowerCase();
|
60529
|
+
const peerPort = repBuf.readUInt16LE(ReputationConstants.REP_INFO_PEER_PORT_OFFSET);
|
60530
|
+
const instanceMoment = (repBuf.length > ReputationConstants.REP_INFO_MOMENT_OFFSET) ? Number(repBuf.readBigUInt64LE(ReputationConstants.REP_INFO_MOMENT_OFFSET)) : null;
|
60531
|
+
const domain = await hostAcc.getDomain();
|
60532
|
+
|
60533
|
+
if (instanceMoment === repMoment) {
|
60534
|
+
data = {
|
60535
|
+
...data,
|
60536
|
+
contract: {
|
60537
|
+
domain: domain,
|
60538
|
+
pubkey: publicKey,
|
60539
|
+
peerPort: peerPort
|
60540
|
+
}
|
60541
|
+
}
|
60542
|
+
}
|
60543
|
+
}
|
60544
|
+
|
60545
|
+
return Object.keys(data).length > 0 ? data : null;
|
60546
|
+
}
|
60547
|
+
catch (e) {
|
60548
|
+
// If the exception is entryNotFound from Rippled there's no entry for the host, So return null.
|
60549
|
+
if (e?.data?.error !== 'entryNotFound')
|
60550
|
+
throw e;
|
60551
|
+
}
|
60552
|
+
|
60553
|
+
return null;
|
60554
|
+
}
|
60555
|
+
|
60485
60556
|
/**
|
60486
60557
|
* Propose a new hook candidate.
|
60487
60558
|
* @param {string} hashes Hook candidate hashes in hex format, <GOVERNOR_HASH(32)><REGISTRY_HASH(32)><HEARTBEAT_HASH(32)>.
|
@@ -60491,8 +60562,8 @@ class BaseEvernodeClient {
|
|
60491
60562
|
*/
|
60492
60563
|
async _propose(hashes, shortName, options = {}) {
|
60493
60564
|
const hashesBuf = Buffer.from(hashes, 'hex');
|
60494
|
-
if (!hashesBuf || hashesBuf.length !=
|
60495
|
-
throw 'Invalid hashes: Hashes should contain all three Governor, Registry, Heartbeat hook hashes.';
|
60565
|
+
if (!hashesBuf || hashesBuf.length != 128)
|
60566
|
+
throw 'Invalid hashes: Hashes should contain all three Governor, Registry, Heartbeat, Reputation hook hashes.';
|
60496
60567
|
|
60497
60568
|
// Check whether hook hashes exist in the definition.
|
60498
60569
|
let keylets = [];
|
@@ -60502,7 +60573,7 @@ class BaseEvernodeClient {
|
|
60502
60573
|
if (!ledgerEntry)
|
60503
60574
|
throw `No hook exists with the specified ${hook} hook hash.`;
|
60504
60575
|
else
|
60505
|
-
keylets.push(HookHelpers.
|
60576
|
+
keylets.push(HookHelpers.getKeylet('HOOK_DEFINITION',index));
|
60506
60577
|
}
|
60507
60578
|
|
60508
60579
|
const uniqueId = StateHelpers.getNewHookCandidateId(hashesBuf);
|
@@ -60523,7 +60594,9 @@ class BaseEvernodeClient {
|
|
60523
60594
|
{
|
60524
60595
|
hookParams: [
|
60525
60596
|
{ name: HookParamKeys.PARAM_EVENT_TYPE_KEY, value: EventTypes.CANDIDATE_PROPOSE },
|
60526
|
-
{ name: HookParamKeys.PARAM_EVENT_DATA_KEY, value: paramBuf.toString('hex').toUpperCase() }
|
60597
|
+
{ name: HookParamKeys.PARAM_EVENT_DATA_KEY, value: paramBuf.slice(0, MAX_HOOK_PARAM_SIZE).toString('hex').toUpperCase() },
|
60598
|
+
{ name: HookParamKeys.PARAM_EVENT_DATA2_KEY, value: paramBuf.slice(MAX_HOOK_PARAM_SIZE).toString('hex').toUpperCase() }
|
60599
|
+
|
60527
60600
|
],
|
60528
60601
|
...options.transactionOptions
|
60529
60602
|
});
|
@@ -60840,6 +60913,7 @@ const { HookTypes } = __nccwpck_require__(8262);
|
|
60840
60913
|
const { RegistryClient } = __nccwpck_require__(8074);
|
60841
60914
|
const { GovernorClient } = __nccwpck_require__(335);
|
60842
60915
|
const { HeartbeatClient } = __nccwpck_require__(6510);
|
60916
|
+
const { ReputationClient } = __nccwpck_require__(7541);
|
60843
60917
|
|
60844
60918
|
class HookClientFactory {
|
60845
60919
|
/**
|
@@ -60864,6 +60938,11 @@ class HookClientFactory {
|
|
60864
60938
|
hookClient = new HeartbeatClient({ heartbeatAddress: heartbeatAddress });
|
60865
60939
|
break;
|
60866
60940
|
}
|
60941
|
+
case HookTypes.reputation: {
|
60942
|
+
const reputationAddress = await HookClientFactory.#getAccountAddress(hookType);
|
60943
|
+
hookClient = new ReputationClient({ reputationAddress: reputationAddress });
|
60944
|
+
break;
|
60945
|
+
}
|
60867
60946
|
default: {
|
60868
60947
|
hookClient = null;
|
60869
60948
|
break;
|
@@ -60890,7 +60969,8 @@ class HookClientFactory {
|
|
60890
60969
|
return configs.registryAddress;
|
60891
60970
|
else if (hookType == HookTypes.heartbeat)
|
60892
60971
|
return configs.heartbeatAddress;
|
60893
|
-
|
60972
|
+
else if (hookType == HookTypes.reputation)
|
60973
|
+
return configs.reputationAddress;
|
60894
60974
|
}
|
60895
60975
|
}
|
60896
60976
|
|
@@ -60940,12 +61020,91 @@ module.exports = {
|
|
60940
61020
|
|
60941
61021
|
/***/ }),
|
60942
61022
|
|
61023
|
+
/***/ 7541:
|
61024
|
+
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
61025
|
+
|
61026
|
+
const { StateHelpers } = __nccwpck_require__(3860);
|
61027
|
+
const { BaseEvernodeClient } = __nccwpck_require__(6263);
|
61028
|
+
|
61029
|
+
const ReputationEvents = {}
|
61030
|
+
|
61031
|
+
class ReputationClient extends BaseEvernodeClient {
|
61032
|
+
|
61033
|
+
constructor(options = {}) {
|
61034
|
+
super(options.reputationAddress, null, Object.values(ReputationEvents), false, options);
|
61035
|
+
}
|
61036
|
+
|
61037
|
+
/**
|
61038
|
+
* Get reputation info of given host reputation orderId.
|
61039
|
+
* @param {number} hostReputationOrderedId Reputation order id of the host.
|
61040
|
+
* @param {number} moment (optional) Moment to get reputation info for.
|
61041
|
+
* @returns Reputation info object.
|
61042
|
+
*/
|
61043
|
+
async getReputationInfoByOrderedId(hostReputationOrderedId, moment = null) {
|
61044
|
+
try {
|
61045
|
+
const repMoment = moment ?? await this.getMoment();
|
61046
|
+
const orderedIdStateKey = StateHelpers.generateHostReputationOrderedIdStateKey(hostReputationOrderedId, repMoment);
|
61047
|
+
const orderedIdStateIndex = StateHelpers.getHookStateIndex(this.xrplAcc.address, orderedIdStateKey);
|
61048
|
+
const orderedIdLedgerEntry = await this.xrplApi.getLedgerEntry(orderedIdStateIndex);
|
61049
|
+
const orderedIdStateData = orderedIdLedgerEntry?.HookStateData;
|
61050
|
+
|
61051
|
+
if (orderedIdStateData) {
|
61052
|
+
const orderedIdStateDecoded = StateHelpers.decodeHostReputationOrderedIdState(Buffer.from(orderedIdStateKey, 'hex'), Buffer.from(orderedIdStateData, 'hex'));
|
61053
|
+
return await this._getReputationInfoByAddress(orderedIdStateDecoded.address, moment);
|
61054
|
+
}
|
61055
|
+
}
|
61056
|
+
catch (e) {
|
61057
|
+
// If the exception is entryNotFound from Rippled there's no entry for the host, So return null.
|
61058
|
+
if (e?.data?.error !== 'entryNotFound')
|
61059
|
+
throw e;
|
61060
|
+
}
|
61061
|
+
|
61062
|
+
return null;
|
61063
|
+
}
|
61064
|
+
|
61065
|
+
/**
|
61066
|
+
* Get reputation info of the moment.
|
61067
|
+
* @param {number} moment (optional) Moment to get reputation info for.
|
61068
|
+
* @returns Reputation info object.
|
61069
|
+
*/
|
61070
|
+
async getReputationInfo(moment = null) {
|
61071
|
+
try {
|
61072
|
+
const repMoment = moment ?? await this.getMoment();
|
61073
|
+
const hostCountStateKey = StateHelpers.generateReputationHostCountStateKey(repMoment);
|
61074
|
+
const hostCountStateIndex = StateHelpers.getHookStateIndex(this.xrplAcc.address, hostCountStateKey);
|
61075
|
+
const hostCountLedgerEntry = await this.xrplApi.getLedgerEntry(hostCountStateIndex);
|
61076
|
+
const hostCountStateData = hostCountLedgerEntry?.HookStateData;
|
61077
|
+
|
61078
|
+
if (hostCountStateData) {
|
61079
|
+
const hostCountStateDecoded = StateHelpers.decodeReputationHostCountState(Buffer.from(hostCountStateKey, 'hex'), Buffer.from(hostCountStateData, 'hex'));
|
61080
|
+
return hostCountStateDecoded;
|
61081
|
+
}
|
61082
|
+
}
|
61083
|
+
catch (e) {
|
61084
|
+
// If the exception is entryNotFound from Rippled there's no entry for the host, So return null.
|
61085
|
+
if (e?.data?.error !== 'entryNotFound')
|
61086
|
+
throw e;
|
61087
|
+
}
|
61088
|
+
|
61089
|
+
return null;
|
61090
|
+
}
|
61091
|
+
}
|
61092
|
+
|
61093
|
+
module.exports = {
|
61094
|
+
ReputationClient,
|
61095
|
+
ReputationEvents
|
61096
|
+
}
|
61097
|
+
|
61098
|
+
/***/ }),
|
61099
|
+
|
60943
61100
|
/***/ 1437:
|
60944
61101
|
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
60945
61102
|
|
60946
61103
|
const { XrplConstants } = __nccwpck_require__(3307);
|
60947
61104
|
const { BaseEvernodeClient } = __nccwpck_require__(6263);
|
60948
|
-
const {
|
61105
|
+
const { HookClientFactory } = __nccwpck_require__(2344);
|
61106
|
+
const { HookTypes } = __nccwpck_require__(8262);
|
61107
|
+
const { EvernodeEvents, EvernodeConstants, MemoFormats, EventTypes, ErrorCodes, HookParamKeys, RegExp, ReputationConstants } = __nccwpck_require__(9849);
|
60949
61108
|
const { XrplAccount } = __nccwpck_require__(9329);
|
60950
61109
|
const { EncryptionHelper } = __nccwpck_require__(4832);
|
60951
61110
|
const { Buffer } = __nccwpck_require__(4300);
|
@@ -61001,6 +61160,27 @@ class HostClient extends BaseEvernodeClient {
|
|
61001
61160
|
super(xrpAddress, xrpSecret, Object.values(HostEvents), true, options);
|
61002
61161
|
}
|
61003
61162
|
|
61163
|
+
async connect(options = {}) {
|
61164
|
+
const res = await super.connect();
|
61165
|
+
await this.setReputationAcc(options.reputationAddress, options.reputationSecret);
|
61166
|
+
return res;
|
61167
|
+
}
|
61168
|
+
|
61169
|
+
async setReputationAcc(reputationAddress = null, reputationSecret = null) {
|
61170
|
+
let hostReputationAccId;
|
61171
|
+
if (!reputationAddress && !reputationSecret) {
|
61172
|
+
hostReputationAccId = (await this.xrplAcc.getWalletLocator())?.slice(0, 20);
|
61173
|
+
if (hostReputationAccId)
|
61174
|
+
reputationAddress = codec.encodeAccountID(Buffer.from(hostReputationAccId, 'hex'));
|
61175
|
+
}
|
61176
|
+
|
61177
|
+
if (reputationAddress || reputationSecret)
|
61178
|
+
this.reputationAcc = new XrplAccount(reputationAddress, reputationSecret, { xrplApi: this.xrplApi });
|
61179
|
+
|
61180
|
+
if (!this.reputationAcc || this.reputationAcc.address === this.xrplAcc.address || this.reputationAcc.address !== reputationAddress)
|
61181
|
+
this.reputationAcc = null;
|
61182
|
+
}
|
61183
|
+
|
61004
61184
|
/**
|
61005
61185
|
* Get max ledger sequence for host client.
|
61006
61186
|
* @returns Max ledger sequence number.
|
@@ -61034,6 +61214,18 @@ class HostClient extends BaseEvernodeClient {
|
|
61034
61214
|
return null;
|
61035
61215
|
}
|
61036
61216
|
|
61217
|
+
/**
|
61218
|
+
* Get lease token by index.
|
61219
|
+
* @param index Index of the token.
|
61220
|
+
* @returns Lease token.
|
61221
|
+
*/
|
61222
|
+
async getLeaseByIndex(index) {
|
61223
|
+
const token = await EvernodeHelpers.getLeaseByIndex(this.xrplApi, index);
|
61224
|
+
if (token.Issuer !== this.xrplAcc.address)
|
61225
|
+
return null;
|
61226
|
+
return token;
|
61227
|
+
}
|
61228
|
+
|
61037
61229
|
/**
|
61038
61230
|
* Get offered and unoffered leases created by the host.
|
61039
61231
|
* @returns Array of lease offer objects.
|
@@ -61131,6 +61323,147 @@ class HostClient extends BaseEvernodeClient {
|
|
61131
61323
|
}
|
61132
61324
|
}
|
61133
61325
|
|
61326
|
+
/**
|
61327
|
+
* Prepare the reputation account with account fields and trust lines.
|
61328
|
+
* @param {string} reputationAddress Address of the reputation account.
|
61329
|
+
* @param {string} reputationSecret Secret of the reputation account.
|
61330
|
+
*/
|
61331
|
+
async prepareReputationAccount(reputationAddress, reputationSecret, options = {}) {
|
61332
|
+
const repAcc = new XrplAccount(reputationAddress, reputationSecret, { xrplApi: this.xrplApi });
|
61333
|
+
const [trustLines, walletLocator, hostWalletLocator] = await Promise.all([
|
61334
|
+
repAcc.getTrustLines(EvernodeConstants.EVR, this.config.evrIssuerAddress),
|
61335
|
+
repAcc.getWalletLocator(),
|
61336
|
+
this.xrplAcc.getWalletLocator()]);
|
61337
|
+
|
61338
|
+
const hostRegAccId = (codec.decodeAccountID(this.xrplAcc.address).toString('hex').toUpperCase()).padEnd(64, '0');
|
61339
|
+
const hostReputationAccId = (codec.decodeAccountID(repAcc.address).toString('hex').toUpperCase()).padEnd(64, '0');
|
61340
|
+
|
61341
|
+
let accountSetFields = {};
|
61342
|
+
accountSetFields = (!walletLocator || walletLocator != hostRegAccId) ? { ...accountSetFields, WalletLocator: hostRegAccId } : accountSetFields;
|
61343
|
+
|
61344
|
+
if (Object.keys(accountSetFields).length !== 0) {
|
61345
|
+
await this.#submitWithRetry(async (feeUplift, submissionRef) => {
|
61346
|
+
await repAcc.setAccountFields(accountSetFields, { maxLedgerIndex: this.#getMaxLedgerSequence(), feeUplift: feeUplift, submissionRef: submissionRef });
|
61347
|
+
}, { ...(options.retryOptions ? options.retryOptions : {}), submissionRef: options.submissionRef });
|
61348
|
+
}
|
61349
|
+
|
61350
|
+
if (trustLines.length === 0) {
|
61351
|
+
await this.#submitWithRetry(async (feeUplift, submissionRef) => {
|
61352
|
+
await repAcc.setTrustLine(EvernodeConstants.EVR, this.config.evrIssuerAddress, "99999999999999", null, null, { maxLedgerIndex: this.#getMaxLedgerSequence(), feeUplift: feeUplift, submissionRef: submissionRef });
|
61353
|
+
}, { ...(options.retryOptions ? options.retryOptions : {}), submissionRef: options.submissionRef });
|
61354
|
+
}
|
61355
|
+
|
61356
|
+
let hostAccountSetFields = {};
|
61357
|
+
hostAccountSetFields = (!hostWalletLocator || hostWalletLocator != hostReputationAccId) ? { ...hostAccountSetFields, WalletLocator: hostReputationAccId } : hostAccountSetFields;
|
61358
|
+
if (Object.keys(hostAccountSetFields).length !== 0) {
|
61359
|
+
await this.#submitWithRetry(async (feeUplift, submissionRef) => {
|
61360
|
+
await this.xrplAcc.setAccountFields(hostAccountSetFields, { maxLedgerIndex: this.#getMaxLedgerSequence(), feeUplift: feeUplift, submissionRef: submissionRef });
|
61361
|
+
}, { ...(options.retryOptions ? options.retryOptions : {}), submissionRef: options.submissionRef });
|
61362
|
+
}
|
61363
|
+
|
61364
|
+
await this.setReputationAcc(reputationAddress, reputationSecret);
|
61365
|
+
}
|
61366
|
+
|
61367
|
+
/**
|
61368
|
+
* Set the reputation contract info.
|
61369
|
+
* @param {number} peerPort Peer port of the reputation contract instance.
|
61370
|
+
* @param {string} publicKey Public key of the reputation contract instance.
|
61371
|
+
*/
|
61372
|
+
async setReputationContractInfo(peerPort, publicKey, moment = null, options = {}) {
|
61373
|
+
const repMoment = moment ?? await this.getMoment();
|
61374
|
+
|
61375
|
+
var buffer = Buffer.alloc(ReputationConstants.REP_INFO_BUFFER_SIZE, 0);
|
61376
|
+
Buffer.from(publicKey.toUpperCase(), "hex").copy(buffer, ReputationConstants.REP_INFO_PUBKEY_OFFSET);
|
61377
|
+
buffer.writeUInt16LE(peerPort, ReputationConstants.REP_INFO_PEER_PORT_OFFSET);
|
61378
|
+
buffer.writeBigUInt64LE(BigInt(repMoment), ReputationConstants.REP_INFO_MOMENT_OFFSET);
|
61379
|
+
const domain = buffer.toString('hex');
|
61380
|
+
|
61381
|
+
let accountSetFields = {};
|
61382
|
+
accountSetFields = { ...accountSetFields, Domain: domain };
|
61383
|
+
|
61384
|
+
if (Object.keys(accountSetFields).length !== 0) {
|
61385
|
+
await this.#submitWithRetry(async (feeUplift, submissionRef) => {
|
61386
|
+
await this.reputationAcc.setAccountFields(accountSetFields, { maxLedgerIndex: this.#getMaxLedgerSequence(), feeUplift: feeUplift, submissionRef: submissionRef });
|
61387
|
+
}, { ...(options.retryOptions ? options.retryOptions : {}), submissionRef: options.submissionRef });
|
61388
|
+
}
|
61389
|
+
}
|
61390
|
+
|
61391
|
+
/**
|
61392
|
+
* Get reputation info of this host.
|
61393
|
+
* @param {number} moment (optional) Moment to get reputation info for.
|
61394
|
+
* @returns Reputation info object.
|
61395
|
+
*/
|
61396
|
+
async getReputationInfo(moment = null) {
|
61397
|
+
if (!this.reputationAcc)
|
61398
|
+
return null;
|
61399
|
+
|
61400
|
+
return await this._getReputationInfoByAddress(this.reputationAcc.address, moment);
|
61401
|
+
}
|
61402
|
+
|
61403
|
+
/**
|
61404
|
+
* Prepare host reputation score to a common format for submission.
|
61405
|
+
* @param {object} collectedScores
|
61406
|
+
* @returns Unified reputation score array.
|
61407
|
+
*/
|
61408
|
+
async prepareHostReputationScores(collectedScores = {}) {
|
61409
|
+
const myReputationInfo = await this.getReputationInfo();
|
61410
|
+
const myOrderId = myReputationInfo.orderedId;
|
61411
|
+
|
61412
|
+
// Deciding universe.
|
61413
|
+
const universeStartIndex = Math.floor(myOrderId / 64) * 64;
|
61414
|
+
|
61415
|
+
const reputationClient = await HookClientFactory.create(HookTypes.reputation);
|
61416
|
+
await reputationClient.connect();
|
61417
|
+
let data = {};
|
61418
|
+
await Promise.all(Array.from({ length: 64 }, (_, i) => i + universeStartIndex).map(async (i) => {
|
61419
|
+
try {
|
61420
|
+
const hostReputationInfo = await reputationClient.getReputationInfoByOrderedId(i);
|
61421
|
+
if (!hostReputationInfo)
|
61422
|
+
throw 'No reputation info for this order id';
|
61423
|
+
data[i.toString()] = {
|
61424
|
+
publicKey: hostReputationInfo.contract.pubkey,
|
61425
|
+
reputationAddress: hostReputationInfo.address,
|
61426
|
+
orderId: i
|
61427
|
+
};
|
61428
|
+
} catch (error) {
|
61429
|
+
data[i.toString()] = { publicKey: "-1", orderId: i };
|
61430
|
+
}
|
61431
|
+
}));
|
61432
|
+
await reputationClient.disconnect();
|
61433
|
+
|
61434
|
+
return Object.entries(data).map(e => ({
|
61435
|
+
...e[1],
|
61436
|
+
scoreValue: collectedScores[e[1]?.publicKey] || 0
|
61437
|
+
}));
|
61438
|
+
}
|
61439
|
+
|
61440
|
+
/**
|
61441
|
+
* Send reputation scores to the reputation hook.
|
61442
|
+
* @param {object} scores [Optional] Score object in { host: score } format.
|
61443
|
+
*/
|
61444
|
+
async sendReputations(scores = null, options = {}) {
|
61445
|
+
let buffer = Buffer.alloc(64, 0);
|
61446
|
+
if (scores) {
|
61447
|
+
const preparedScores = await this.prepareHostReputationScores(scores);
|
61448
|
+
let i = 0;
|
61449
|
+
for (const reputationScore of preparedScores) {
|
61450
|
+
buffer.writeUIntLE(Number(reputationScore.scoreValue), i, 1);
|
61451
|
+
i++;
|
61452
|
+
}
|
61453
|
+
}
|
61454
|
+
|
61455
|
+
await this.reputationAcc.invoke(this.config.reputationAddress,
|
61456
|
+
scores ? { isHex: true, data: buffer.toString('hex') } : null,
|
61457
|
+
{
|
61458
|
+
hookParams: [
|
61459
|
+
{ name: HookParamKeys.PARAM_EVENT_TYPE_KEY, value: EventTypes.HOST_SEND_REPUTATION }
|
61460
|
+
],
|
61461
|
+
maxLedgerIndex: this.#getMaxLedgerSequence(),
|
61462
|
+
...options.transactionOptions,
|
61463
|
+
submissionRef: options.submissionRef
|
61464
|
+
});
|
61465
|
+
}
|
61466
|
+
|
61134
61467
|
/**
|
61135
61468
|
* Create a lease offer.
|
61136
61469
|
* @param {number} leaseIndex Index number for the lease.
|
@@ -62341,7 +62674,8 @@ const DefaultValues = {
|
|
62341
62674
|
const HookTypes = {
|
62342
62675
|
governor: 'GOVERNOR',
|
62343
62676
|
registry: 'REGISTRY',
|
62344
|
-
heartbeat: 'HEARTBEAT'
|
62677
|
+
heartbeat: 'HEARTBEAT',
|
62678
|
+
reputation: 'REPUTATION'
|
62345
62679
|
}
|
62346
62680
|
|
62347
62681
|
const getDefinitions = async () => {
|
@@ -62831,7 +63165,8 @@ const EvernodeConstants = {
|
|
62831
63165
|
HOOKS: [
|
62832
63166
|
"Governor",
|
62833
63167
|
"Registry",
|
62834
|
-
"Heartbeat"
|
63168
|
+
"Heartbeat",
|
63169
|
+
"Reputation"
|
62835
63170
|
],
|
62836
63171
|
CandidateVote: {
|
62837
63172
|
Reject: 0,
|
@@ -62884,7 +63219,8 @@ const EventTypes = {
|
|
62884
63219
|
HOOK_UPDATE_RES: 'evnHookUpdateRes',
|
62885
63220
|
GOVERNANCE_MODE_CHANGE: 'evnGovernanceModeChange',
|
62886
63221
|
LINKED_CANDIDATE_REMOVE: 'evnRemoveLinkedCandidate',
|
62887
|
-
HOST_UPDATE_REPUTATION: 'evnHostUpdateReputation'
|
63222
|
+
HOST_UPDATE_REPUTATION: 'evnHostUpdateReputation',
|
63223
|
+
HOST_SEND_REPUTATION: 'evnHostSendReputation'
|
62888
63224
|
}
|
62889
63225
|
|
62890
63226
|
const MemoFormats = {
|
@@ -62911,6 +63247,13 @@ const ErrorReasons = {
|
|
62911
63247
|
NO_STATE_KEY: 'NO_STATE_KEY'
|
62912
63248
|
}
|
62913
63249
|
|
63250
|
+
const ReputationConstants = {
|
63251
|
+
REP_INFO_BUFFER_SIZE: 43,
|
63252
|
+
REP_INFO_PUBKEY_OFFSET: 0,
|
63253
|
+
REP_INFO_PEER_PORT_OFFSET: 33,
|
63254
|
+
REP_INFO_MOMENT_OFFSET: 35
|
63255
|
+
}
|
63256
|
+
|
62914
63257
|
// All keys are prefixed with 'EVR' (0x455652)
|
62915
63258
|
// Config keys sub-prefix: 0x01
|
62916
63259
|
const HookStateKeys = {
|
@@ -62930,6 +63273,7 @@ const HookStateKeys = {
|
|
62930
63273
|
REGISTRY_ADDR: "455652010000000000000000000000000000000000000000000000000000000D",
|
62931
63274
|
GOVERNANCE_CONFIGURATION: "455652010000000000000000000000000000000000000000000000000000000E",
|
62932
63275
|
NETWORK_CONFIGURATION: "455652010000000000000000000000000000000000000000000000000000000F",
|
63276
|
+
REPUTATION_ADDR: "4556520100000000000000000000000000000000000000000000000000000010",
|
62933
63277
|
|
62934
63278
|
// Singleton
|
62935
63279
|
HOST_COUNT: "4556523200000000000000000000000000000000000000000000000000000000",
|
@@ -62953,6 +63297,7 @@ const HookParamKeys = {
|
|
62953
63297
|
PARAM_STATE_HOOK_KEY: "4556520100000000000000000000000000000000000000000000000000000001",
|
62954
63298
|
PARAM_EVENT_TYPE_KEY: "4556520100000000000000000000000000000000000000000000000000000002",
|
62955
63299
|
PARAM_EVENT_DATA_KEY: "4556520100000000000000000000000000000000000000000000000000000003",
|
63300
|
+
PARAM_EVENT_DATA2_KEY: "4556520100000000000000000000000000000000000000000000000000000004",
|
62956
63301
|
}
|
62957
63302
|
|
62958
63303
|
const EvernodeEvents = {
|
@@ -63004,7 +63349,8 @@ module.exports = {
|
|
63004
63349
|
EvernodeEvents,
|
63005
63350
|
URITokenTypes,
|
63006
63351
|
HookParamKeys,
|
63007
|
-
RegExp
|
63352
|
+
RegExp,
|
63353
|
+
ReputationConstants
|
63008
63354
|
}
|
63009
63355
|
|
63010
63356
|
/***/ }),
|
@@ -63023,6 +63369,13 @@ class EvernodeHelpers {
|
|
63023
63369
|
return hostUriOffers;
|
63024
63370
|
}
|
63025
63371
|
|
63372
|
+
static async getLeaseByIndex(xrplApi, index) {
|
63373
|
+
const entry = await xrplApi.getLedgerEntry(index);
|
63374
|
+
if (!entry || entry.LedgerEntryType !== 'URIToken' || !(this.isValidURI(entry.URI, EvernodeConstants.LEASE_TOKEN_PREFIX_HEX) && entry.Flags == 1))
|
63375
|
+
return null;
|
63376
|
+
return entry;
|
63377
|
+
}
|
63378
|
+
|
63026
63379
|
static async getLeaseOffers(xrplAcc) {
|
63027
63380
|
const hostUriOffers = (await this.getLeases(xrplAcc)).filter(uriToken => uriToken.Amount);
|
63028
63381
|
return hostUriOffers;
|
@@ -63054,7 +63407,7 @@ class EvernodeHelpers {
|
|
63054
63407
|
|
63055
63408
|
const nftPageInfo = page.NFTokens.map((n, loc) => { return { NFTPage: NFT_PAGE_LEDGER_ENTRY_TYPE_HEX + page.index, NFTokenID: n.NFToken.NFTokenID, location: loc } }).find(n => n.NFTokenID == nfTokenId);
|
63056
63409
|
if (buffer) {
|
63057
|
-
let locBuf = Buffer.alloc(2,0);
|
63410
|
+
let locBuf = Buffer.alloc(2, 0);
|
63058
63411
|
locBuf.writeUInt16BE(nftPageInfo.location);
|
63059
63412
|
// <NFT_PAGE_KEYLET(34 bytes)><LOCATION(2 bytes)>
|
63060
63413
|
return Buffer.concat([Buffer.from(nftPageInfo.NFTPage, "hex"), locBuf]);
|
@@ -63088,13 +63441,26 @@ module.exports = {
|
|
63088
63441
|
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
63089
63442
|
|
63090
63443
|
const crypto = __nccwpck_require__(6113);
|
63444
|
+
const codec = __nccwpck_require__(597);
|
63091
63445
|
|
63092
|
-
const
|
63446
|
+
const LEDGER_ENTRY_TYPES = {
|
63447
|
+
HOOK_DEFINITION: 68, // Decimal value of ASCII 'D'
|
63448
|
+
ACCOUNT: 97 // Decimal value of ASCII 'a'
|
63449
|
+
}
|
63093
63450
|
|
63094
63451
|
class HookHelpers {
|
63452
|
+
|
63453
|
+
static getKeylet(type, index) {
|
63454
|
+
const keyletBuf = Buffer.alloc(34, 0);
|
63455
|
+
keyletBuf.writeInt16BE(LEDGER_ENTRY_TYPES[type.toUpperCase()]);
|
63456
|
+
Buffer.from(index, 'hex').copy(keyletBuf, 2);
|
63457
|
+
|
63458
|
+
return keyletBuf.toString('hex');
|
63459
|
+
}
|
63460
|
+
|
63095
63461
|
static getHookDefinitionIndex(hookHash) {
|
63096
63462
|
const typeBuf = Buffer.alloc(2, 0);
|
63097
|
-
typeBuf.writeInt16BE(
|
63463
|
+
typeBuf.writeInt16BE(LEDGER_ENTRY_TYPES.HOOK_DEFINITION);
|
63098
63464
|
|
63099
63465
|
const hookHashBuf = Buffer.from(hookHash, 'hex');
|
63100
63466
|
|
@@ -63108,12 +63474,20 @@ class HookHelpers {
|
|
63108
63474
|
return digest.substring(0, 64).toUpperCase();
|
63109
63475
|
}
|
63110
63476
|
|
63111
|
-
static
|
63112
|
-
const
|
63113
|
-
|
63114
|
-
Buffer.from(index, 'hex').copy(keyletBuf, 2);
|
63477
|
+
static getAccountIndex(address) {
|
63478
|
+
const typeBuf = Buffer.alloc(2, 0);
|
63479
|
+
typeBuf.writeInt16BE(LEDGER_ENTRY_TYPES.ACCOUNT);
|
63115
63480
|
|
63116
|
-
|
63481
|
+
const accountBuf = Buffer.from(codec.decodeAccountID(address), "hex");
|
63482
|
+
|
63483
|
+
let hash = crypto.createHash('sha512');
|
63484
|
+
|
63485
|
+
let data = hash.update(typeBuf);
|
63486
|
+
data = hash.update(accountBuf);
|
63487
|
+
|
63488
|
+
const digest = data.digest('hex');
|
63489
|
+
// Get the first 32 bytes of hash.
|
63490
|
+
return digest.substring(0, 64).toUpperCase();
|
63117
63491
|
}
|
63118
63492
|
}
|
63119
63493
|
|
@@ -63263,6 +63637,10 @@ const HOST_DISK_MB_OFFSET = 72;
|
|
63263
63637
|
const HOST_EMAIL_ADDRESS_OFFSET = 76;
|
63264
63638
|
const HOST_ACCUMULATED_REWARD_OFFSET = 116;
|
63265
63639
|
|
63640
|
+
const HOST_REP_LAST_REG_MOMENT_OFFSET = 0;
|
63641
|
+
const HOST_REP_SCORE_NUMERATOR_OFFSET = 8;
|
63642
|
+
const HOST_REP_SCORE_DENOMINATOR_OFFSET = 16;
|
63643
|
+
|
63266
63644
|
const PREV_HOST_ADDRESS_OFFSET = 0;
|
63267
63645
|
const TRANSFER_LEDGER_IDX_OFFSET = 20;
|
63268
63646
|
const TRANSFERRED_NFT_ID_OFFSET = 28;
|
@@ -63270,6 +63648,7 @@ const TRANSFERRED_NFT_ID_OFFSET = 28;
|
|
63270
63648
|
const CANDIDATE_GOVERNOR_HOOK_HASH_OFFSET = 0;
|
63271
63649
|
const CANDIDATE_REGISTRY_HOOK_HASH_OFFSET = 32;
|
63272
63650
|
const CANDIDATE_HEARTBEAT_HOOK_HASH_OFFSET = 64;
|
63651
|
+
const CANDIDATE_REPUTATION_HOOK_HASH_OFFSET = 96;
|
63273
63652
|
|
63274
63653
|
const CANDIDATE_OWNER_ADDRESS_OFFSET = 0;
|
63275
63654
|
const CANDIDATE_IDX_OFFSET = 20;
|
@@ -63314,6 +63693,8 @@ const CANDIDATE_OWNER_KEY_ZERO_COUNT = 8;
|
|
63314
63693
|
const HOOK_STATE_LEDGER_TYPE_PREFIX = 118; // Decimal value of ASCII 'v'
|
63315
63694
|
const PENDING_TRANSFER = 1;
|
63316
63695
|
const HOST_EMAIL_ADDRESS_LEN = 40;
|
63696
|
+
const STATE_KEY_SIZE = 32;
|
63697
|
+
const ACCOUNT_ID_SIZE = 20;
|
63317
63698
|
|
63318
63699
|
class StateHelpers {
|
63319
63700
|
static StateTypes = {
|
@@ -63338,6 +63719,46 @@ class StateHelpers {
|
|
63338
63719
|
return state.data;
|
63339
63720
|
}
|
63340
63721
|
|
63722
|
+
static decodeHostReputationAddressState(stateKeyBuf, stateDataBuf) {
|
63723
|
+
const keyOffset = STATE_KEY_SIZE - ACCOUNT_ID_SIZE;
|
63724
|
+
const data = {
|
63725
|
+
address: codec.encodeAccountID(stateKeyBuf.slice(keyOffset)),
|
63726
|
+
lastRegisteredMoment: Number(stateDataBuf.readBigUInt64LE(HOST_REP_LAST_REG_MOMENT_OFFSET)),
|
63727
|
+
scoreNumerator: Number(stateDataBuf.readBigUInt64LE(HOST_REP_SCORE_NUMERATOR_OFFSET)),
|
63728
|
+
scoreDenominator: Number(stateDataBuf.readBigUInt64LE(HOST_REP_SCORE_DENOMINATOR_OFFSET))
|
63729
|
+
}
|
63730
|
+
return data;
|
63731
|
+
}
|
63732
|
+
|
63733
|
+
static decodeHostReputationOrderAddressState(stateKeyBuf, stateDataBuf) {
|
63734
|
+
const keyOffset = STATE_KEY_SIZE - ACCOUNT_ID_SIZE - 8;
|
63735
|
+
const data = {
|
63736
|
+
moment: Number(stateKeyBuf.readBigUInt64LE(keyOffset)),
|
63737
|
+
address: codec.encodeAccountID(stateKeyBuf.slice(keyOffset + 8)),
|
63738
|
+
orderedId: Number(stateDataBuf.readBigUInt64LE(0))
|
63739
|
+
}
|
63740
|
+
return data;
|
63741
|
+
}
|
63742
|
+
|
63743
|
+
static decodeHostReputationOrderedIdState(stateKeyBuf, stateDataBuf) {
|
63744
|
+
const keyOffset = STATE_KEY_SIZE - 16;
|
63745
|
+
const data = {
|
63746
|
+
moment: Number(stateKeyBuf.readBigUInt64LE(keyOffset)),
|
63747
|
+
orderedId: Number(stateKeyBuf.readBigUInt64LE(keyOffset + 8)),
|
63748
|
+
address: codec.encodeAccountID(stateDataBuf.slice(0))
|
63749
|
+
}
|
63750
|
+
return data;
|
63751
|
+
}
|
63752
|
+
|
63753
|
+
static decodeReputationHostCountState(stateKeyBuf, stateDataBuf) {
|
63754
|
+
const keyOffset = STATE_KEY_SIZE - 8;
|
63755
|
+
const data = {
|
63756
|
+
moment: Number(stateKeyBuf.readBigUInt64LE(keyOffset)),
|
63757
|
+
count: Number(stateDataBuf.readBigUInt64LE())
|
63758
|
+
}
|
63759
|
+
return data;
|
63760
|
+
}
|
63761
|
+
|
63341
63762
|
static decodeHostAddressState(stateKeyBuf, stateDataBuf) {
|
63342
63763
|
let data = {
|
63343
63764
|
address: codec.encodeAccountID(stateKeyBuf.slice(12)),
|
@@ -63405,6 +63826,8 @@ class StateHelpers {
|
|
63405
63826
|
governorHookHash: stateDataBuf.slice(CANDIDATE_GOVERNOR_HOOK_HASH_OFFSET, CANDIDATE_REGISTRY_HOOK_HASH_OFFSET).toString('hex').toUpperCase(),
|
63406
63827
|
registryHookHash: stateDataBuf.slice(CANDIDATE_REGISTRY_HOOK_HASH_OFFSET, CANDIDATE_HEARTBEAT_HOOK_HASH_OFFSET).toString('hex').toUpperCase(),
|
63407
63828
|
heartbeatHookHash: stateDataBuf.slice(CANDIDATE_HEARTBEAT_HOOK_HASH_OFFSET, CANDIDATE_HEARTBEAT_HOOK_HASH_OFFSET + 32).toString('hex').toUpperCase(),
|
63829
|
+
reputationHookHash: stateDataBuf.slice(CANDIDATE_REPUTATION_HOOK_HASH_OFFSET, CANDIDATE_REPUTATION_HOOK_HASH_OFFSET + 32).toString('hex').toUpperCase(),
|
63830
|
+
|
63408
63831
|
}
|
63409
63832
|
return data;
|
63410
63833
|
}
|
@@ -63534,7 +63957,8 @@ class StateHelpers {
|
|
63534
63957
|
else if (Buffer.from(HookStateKeys.REGISTRY_ADDR, 'hex').compare(stateKey) === 0 ||
|
63535
63958
|
Buffer.from(HookStateKeys.HEARTBEAT_ADDR, 'hex').compare(stateKey) === 0 ||
|
63536
63959
|
Buffer.from(HookStateKeys.EVR_ISSUER_ADDR, 'hex').compare(stateKey) === 0 ||
|
63537
|
-
Buffer.from(HookStateKeys.FOUNDATION_ADDR, 'hex').compare(stateKey) === 0
|
63960
|
+
Buffer.from(HookStateKeys.FOUNDATION_ADDR, 'hex').compare(stateKey) === 0 ||
|
63961
|
+
Buffer.from(HookStateKeys.REPUTATION_ADDR, 'hex').compare(stateKey) === 0) {
|
63538
63962
|
return {
|
63539
63963
|
type: this.StateTypes.CONFIGURATION,
|
63540
63964
|
key: hexKey,
|
@@ -63745,7 +64169,8 @@ class StateHelpers {
|
|
63745
64169
|
Buffer.from(HookStateKeys.REGISTRY_ADDR, 'hex').compare(stateKey) === 0 ||
|
63746
64170
|
Buffer.from(HookStateKeys.HEARTBEAT_ADDR, 'hex').compare(stateKey) === 0 ||
|
63747
64171
|
Buffer.from(HookStateKeys.GOVERNANCE_CONFIGURATION, 'hex').compare(stateKey) === 0 ||
|
63748
|
-
Buffer.from(HookStateKeys.NETWORK_CONFIGURATION, 'hex').compare(stateKey) === 0
|
64172
|
+
Buffer.from(HookStateKeys.NETWORK_CONFIGURATION, 'hex').compare(stateKey) === 0 ||
|
64173
|
+
Buffer.from(HookStateKeys.REPUTATION_ADDR, 'hex').compare(stateKey) === 0) {
|
63749
64174
|
return {
|
63750
64175
|
key: hexKey,
|
63751
64176
|
type: this.StateTypes.CONFIGURATION
|
@@ -63779,6 +64204,39 @@ class StateHelpers {
|
|
63779
64204
|
return stateKeyBuf.toString('hex').toUpperCase();
|
63780
64205
|
}
|
63781
64206
|
|
64207
|
+
static generateHostReputationAddrStateKey(address) {
|
64208
|
+
const buf = Buffer.alloc(STATE_KEY_SIZE, 0);
|
64209
|
+
Buffer.from(codec.decodeAccountID(address), "hex").copy(buf, buf.length - ACCOUNT_ID_SIZE);
|
64210
|
+
|
64211
|
+
return buf.toString('hex').toUpperCase();
|
64212
|
+
}
|
64213
|
+
|
64214
|
+
static generateHostReputationOrderAddressStateKey(address, moment) {
|
64215
|
+
const buf = Buffer.alloc(STATE_KEY_SIZE, 0);
|
64216
|
+
const offset = buf.length - ACCOUNT_ID_SIZE - 8;
|
64217
|
+
buf.writeBigUInt64LE(BigInt(moment), offset);
|
64218
|
+
Buffer.from(codec.decodeAccountID(address), "hex").copy(buf, offset + 8);
|
64219
|
+
|
64220
|
+
return buf.toString('hex').toUpperCase();
|
64221
|
+
}
|
64222
|
+
|
64223
|
+
static generateHostReputationOrderedIdStateKey(orderedId, moment) {
|
64224
|
+
let buf = Buffer.alloc(STATE_KEY_SIZE, 0);
|
64225
|
+
const offset = buf.length - 16;
|
64226
|
+
buf.writeBigUInt64LE(BigInt(moment), offset);
|
64227
|
+
buf.writeBigUInt64LE(BigInt(orderedId), offset + 8);
|
64228
|
+
|
64229
|
+
return buf.toString('hex').toUpperCase();
|
64230
|
+
}
|
64231
|
+
|
64232
|
+
static generateReputationHostCountStateKey(moment) {
|
64233
|
+
let buf = Buffer.alloc(STATE_KEY_SIZE, 0);
|
64234
|
+
const offset = buf.length - 8;
|
64235
|
+
buf.writeBigUInt64LE(BigInt(moment), offset);
|
64236
|
+
|
64237
|
+
return buf.toString('hex').toUpperCase();
|
64238
|
+
}
|
64239
|
+
|
63782
64240
|
static generateTransfereeAddrStateKey(address) {
|
63783
64241
|
// 1 byte - Key Type.
|
63784
64242
|
// 8 bytes - Zeros.
|
@@ -63961,6 +64419,7 @@ module.exports = {
|
|
63961
64419
|
/***/ 6687:
|
63962
64420
|
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
63963
64421
|
|
64422
|
+
const kp = __nccwpck_require__(8150);
|
63964
64423
|
const { Buffer } = __nccwpck_require__(4300);
|
63965
64424
|
const { XflHelpers } = __nccwpck_require__(3243);
|
63966
64425
|
const { EvernodeConstants } = __nccwpck_require__(9849);
|
@@ -64017,6 +64476,13 @@ class UtilHelpers {
|
|
64017
64476
|
}
|
64018
64477
|
}
|
64019
64478
|
|
64479
|
+
static deriveKeypair(secret) {
|
64480
|
+
return kp.deriveKeypair(secret);
|
64481
|
+
}
|
64482
|
+
|
64483
|
+
static deriveAddress(publicKey) {
|
64484
|
+
return kp.deriveAddress(publicKey);
|
64485
|
+
}
|
64020
64486
|
}
|
64021
64487
|
|
64022
64488
|
module.exports = {
|
@@ -64165,13 +64631,13 @@ module.exports = {
|
|
64165
64631
|
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
64166
64632
|
|
64167
64633
|
const xrpl = __nccwpck_require__(4666);
|
64168
|
-
const kp = __nccwpck_require__(8150);
|
64169
64634
|
const codec = __nccwpck_require__(597);
|
64170
64635
|
const crypto = __nccwpck_require__(6113);
|
64171
64636
|
const { XrplConstants, XrplTransactionTypes } = __nccwpck_require__(3307);
|
64172
64637
|
const { TransactionHelper } = __nccwpck_require__(7071);
|
64173
64638
|
const { EventEmitter } = __nccwpck_require__(6170);
|
64174
64639
|
const { Defaults } = __nccwpck_require__(8262);
|
64640
|
+
const { UtilHelpers } = __nccwpck_require__(6687);
|
64175
64641
|
|
64176
64642
|
class XrplAccount {
|
64177
64643
|
|
@@ -64194,8 +64660,8 @@ class XrplAccount {
|
|
64194
64660
|
this.wallet = xrpl.Wallet.fromSeed(this.secret);
|
64195
64661
|
this.address = this.wallet.classicAddress;
|
64196
64662
|
} else if (this.secret) {
|
64197
|
-
const keypair =
|
64198
|
-
const derivedPubKeyAddress =
|
64663
|
+
const keypair = UtilHelpers.deriveKeypair(this.secret);
|
64664
|
+
const derivedPubKeyAddress = UtilHelpers.deriveAddress(keypair.publicKey);
|
64199
64665
|
if (this.address == derivedPubKeyAddress)
|
64200
64666
|
this.wallet = xrpl.Wallet.fromSeed(this.secret);
|
64201
64667
|
else
|
@@ -64223,7 +64689,7 @@ class XrplAccount {
|
|
64223
64689
|
if (!this.secret)
|
64224
64690
|
throw 'Cannot derive key pair: Account secret is empty.';
|
64225
64691
|
|
64226
|
-
return
|
64692
|
+
return UtilHelpers.deriveKeypair(this.secret);
|
64227
64693
|
}
|
64228
64694
|
|
64229
64695
|
async exists() {
|
@@ -64250,6 +64716,10 @@ class XrplAccount {
|
|
64250
64716
|
return (await this.getInfo())?.MessageKey;
|
64251
64717
|
}
|
64252
64718
|
|
64719
|
+
async getWalletLocator() {
|
64720
|
+
return (await this.getInfo())?.WalletLocator;
|
64721
|
+
}
|
64722
|
+
|
64253
64723
|
async getDomain() {
|
64254
64724
|
const domain = (await this.getInfo())?.Domain;
|
64255
64725
|
return domain ? TransactionHelper.hexToASCII(domain) : null;
|
@@ -64400,6 +64870,30 @@ class XrplAccount {
|
|
64400
64870
|
return await this.#prepareSubmissionTransaction(signerListTx, options);
|
64401
64871
|
}
|
64402
64872
|
|
64873
|
+
async invoke(toAddr, blobObj = null, options = {}) {
|
64874
|
+
const preparedTxn = await this.prepareInvoke(toAddr, blobObj, options);
|
64875
|
+
return await this.signAndSubmit(preparedTxn, options.submissionRef);
|
64876
|
+
}
|
64877
|
+
|
64878
|
+
async prepareInvoke(toAddr, blobObj = null, options = {}) {
|
64879
|
+
|
64880
|
+
var txObj = {
|
64881
|
+
TransactionType: XrplTransactionTypes.INVOKE,
|
64882
|
+
Account: this.address,
|
64883
|
+
Destination: toAddr,
|
64884
|
+
HookParameters: TransactionHelper.formatHookParams(options.hookParams)
|
64885
|
+
};
|
64886
|
+
|
64887
|
+
if (blobObj) {
|
64888
|
+
txObj = {
|
64889
|
+
...txObj,
|
64890
|
+
Blob: blobObj.isHex ? blobObj.data : TransactionHelper.asciiToHex(blobObj.data)
|
64891
|
+
}
|
64892
|
+
}
|
64893
|
+
|
64894
|
+
return await this.#prepareSubmissionTransaction(txObj, options);
|
64895
|
+
}
|
64896
|
+
|
64403
64897
|
async makePayment(toAddr, amount, currency = null, issuer = null, memos = null, options = {}) {
|
64404
64898
|
const preparedTxn = await this.prepareMakePayment(toAddr, amount, currency, issuer, memos, options);
|
64405
64899
|
return await this.signAndSubmit(preparedTxn, options.submissionRef);
|
@@ -64971,7 +65465,8 @@ const { Defaults } = __nccwpck_require__(8262);
|
|
64971
65465
|
const { TransactionHelper } = __nccwpck_require__(7071);
|
64972
65466
|
const { XrplApiEvents } = __nccwpck_require__(3307);
|
64973
65467
|
const { XrplAccount } = __nccwpck_require__(9329);
|
64974
|
-
const { XrplHelpers } = __nccwpck_require__(3189)
|
65468
|
+
const { XrplHelpers } = __nccwpck_require__(3189);
|
65469
|
+
const { UtilHelpers } = __nccwpck_require__(6687);
|
64975
65470
|
|
64976
65471
|
const MAX_PAGE_LIMIT = 400;
|
64977
65472
|
const API_REQ_TYPE = {
|
@@ -65407,7 +65902,7 @@ class XrplApi {
|
|
65407
65902
|
const info = await this.getAccountInfo(address);
|
65408
65903
|
const accountFlags = xrpl.parseAccountRootFlags(info.Flags);
|
65409
65904
|
const regularKey = info.RegularKey;
|
65410
|
-
const derivedPubKeyAddress =
|
65905
|
+
const derivedPubKeyAddress = UtilHelpers.deriveAddress(publicKey);
|
65411
65906
|
|
65412
65907
|
// If the master key is disabled the derived pubkey address should be the regular key.
|
65413
65908
|
// Otherwise it could be account address or the regular key
|
@@ -65704,6 +66199,7 @@ const XrplConstants = {
|
|
65704
66199
|
}
|
65705
66200
|
|
65706
66201
|
const XrplTransactionTypes = {
|
66202
|
+
INVOKE: 'Invoke',
|
65707
66203
|
PAYMENT: 'Payment',
|
65708
66204
|
SIGNER_LIST_SET: 'SignerListSet',
|
65709
66205
|
TRUST_SET: 'TrustSet',
|
package/node.napi11.node
ADDED
Binary file
|
package/node.napi2.node
ADDED
Binary file
|
package/package.json
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
],
|
7
7
|
"homepage": "https://github.com/HotPocketDev/evernode-js-client",
|
8
8
|
"license": "SEE LICENSE IN https://raw.githubusercontent.com/EvernodeXRPL/evernode-resources/main/license/evernode-license.pdf",
|
9
|
-
"version": "0.6.
|
9
|
+
"version": "0.6.46",
|
10
10
|
"dependencies": {
|
11
11
|
"elliptic": "6.5.4",
|
12
12
|
"libsodium-wrappers": "0.7.10",
|
package/secp256k1.node
ADDED
Binary file
|