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 |