evernode-js-client 0.5.1 → 0.5.3

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.
Files changed (2) hide show
  1. package/index.js +171 -98
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -11846,29 +11846,29 @@ class BaseEvernodeClient {
11846
11846
  }
11847
11847
 
11848
11848
  /**
11849
- * Get the moment from the given XRP ledger index. (1 Moment - 1190 XRP ledgers).
11850
- * @param {number} ledgerIndex [Optional] Ledger index to get the moment value.
11851
- * @returns The moment of the given XPR ledger index as 'number'. Returns current moment if XRP ledger index is not given.
11852
- */
11853
- async getMoment(ledgerIndex = null) {
11854
- const lv = ledgerIndex || this.xrplApi.ledgerIndex;
11855
- const m = Math.floor((lv - this.config.momentBaseIdx) / this.config.momentSize);
11856
-
11857
- await Promise.resolve(); // Awaiter placeholder for future async requirements.
11849
+ * Get the moment from the given index (timestamp).
11850
+ * @param {number} index [Optional] Index (timestamp) to get the moment value.
11851
+ * @returns The moment of the given index (timestamp) as 'number'. Returns current moment if index (timestamp) is not given.
11852
+ */
11853
+ async getMoment(index = null) {
11854
+ const i = index || UtilHelpers.getCurrentUnixTime();
11855
+ const m = this.config.momentBaseInfo.baseTransitionMoment + Math.floor((i - this.config.momentBaseInfo.baseIdx) / this.config.momentSize);
11856
+ await Promise.resolve();
11858
11857
  return m;
11859
11858
  }
11860
11859
 
11861
11860
  /**
11862
- * Get start XRP ledger index of the moment (of the given XRPL index).
11863
- * @param {number} ledgerIndex [Optional] Ledger index to get the moment value.
11864
- * @returns The XRP ledger index of the moment (of the given XRPL index) as a 'number'. Returns the current moment's start XRP ledger index if ledger index parameter is not given.
11861
+ * Get start index (timestamp) of the moment.
11862
+ * @param {number} index [Optional] Index (timestamp) to get the moment value.
11863
+ * @returns The index (timestamp) of the moment as a 'number'. Returns the current moment's start index (timestamp) if ledger index parameter is not given.
11865
11864
  */
11866
- async getMomentStartIndex(ledgerIndex = null) {
11867
- const lv = ledgerIndex || this.xrplApi.ledgerIndex;
11868
- const m = Math.floor((lv - this.config.momentBaseIdx) / this.config.momentSize);
11865
+ async getMomentStartIndex(index = null) {
11866
+ const i = index || UtilHelpers.getCurrentUnixTime();
11867
+
11868
+ const m = Math.floor((i - this.config.momentBaseInfo.baseIdx) / this.config.momentSize);
11869
11869
 
11870
11870
  await Promise.resolve(); // Awaiter placeholder for future async requirements.
11871
- return this.config.momentBaseIdx + (m * this.config.momentSize);
11871
+ return this.config.momentBaseInfo.baseIdx + (m * this.config.momentSize);
11872
11872
  }
11873
11873
 
11874
11874
  /**
@@ -11883,19 +11883,23 @@ class BaseEvernodeClient {
11883
11883
  hostRegFee: HookStateKeys.HOST_REG_FEE,
11884
11884
  momentSize: HookStateKeys.MOMENT_SIZE,
11885
11885
  hostHeartbeatFreq: HookStateKeys.HOST_HEARTBEAT_FREQ,
11886
- momentBaseIdx: HookStateKeys.MOMENT_BASE_IDX,
11886
+ momentBaseInfo: HookStateKeys.MOMENT_BASE_INFO,
11887
11887
  purchaserTargetPrice: HookStateKeys.PURCHASER_TARGET_PRICE,
11888
11888
  leaseAcquireWindow: HookStateKeys.LEASE_ACQUIRE_WINDOW,
11889
11889
  rewardInfo: HookStateKeys.REWARD_INFO,
11890
- rewardConfiguaration: HookStateKeys.REWARD_CONFIGURATION,
11891
- hostCount: HookStateKeys.HOST_COUNT
11890
+ rewardConfiguration: HookStateKeys.REWARD_CONFIGURATION,
11891
+ hostCount: HookStateKeys.HOST_COUNT,
11892
+ momentTransitInfo: HookStateKeys.MOMENT_TRANSIT_INFO
11892
11893
  }
11893
11894
  let config = {};
11894
11895
  for (const [key, value] of Object.entries(configStateKeys)) {
11895
11896
  const stateKey = Buffer.from(value, 'hex');
11896
- const stateData = Buffer.from(UtilHelpers.getStateData(states, value), 'hex');
11897
- const decoded = StateHelpers.decodeStateData(stateKey, stateData);
11898
- config[key] = decoded.value;
11897
+ const stateDataBin = StateHelpers.getStateData(states, value);
11898
+ if (stateDataBin) {
11899
+ const stateData = Buffer.from(StateHelpers.getStateData(states, value), 'hex');
11900
+ const decoded = StateHelpers.decodeStateData(stateKey, stateData);
11901
+ config[key] = decoded.value;
11902
+ }
11899
11903
  }
11900
11904
  return config;
11901
11905
  }
@@ -12159,9 +12163,9 @@ class BaseEvernodeClient {
12159
12163
  if (addrStateData) {
12160
12164
  const addrStateDecoded = StateHelpers.decodeHostAddressState(Buffer.from(addrStateKey, 'hex'), Buffer.from(addrStateData, 'hex'));
12161
12165
  const curMomentStartIdx = await this.getMomentStartIndex();
12162
- addrStateDecoded.active = (addrStateDecoded.lastHeartbeatLedger > (this.config.hostHeartbeatFreq * this.config.momentSize) ?
12163
- (addrStateDecoded.lastHeartbeatLedger >= (curMomentStartIdx - (this.config.hostHeartbeatFreq * this.config.momentSize))) :
12164
- (addrStateDecoded.lastHeartbeatLedger > 0))
12166
+ addrStateDecoded.active = (addrStateDecoded.lastHeartbeatIndex > (this.config.hostHeartbeatFreq * this.config.momentSize) ?
12167
+ (addrStateDecoded.lastHeartbeatIndex >= (curMomentStartIdx - (this.config.hostHeartbeatFreq * this.config.momentSize))) :
12168
+ (addrStateDecoded.lastHeartbeatIndex > 0))
12165
12169
 
12166
12170
  const nftIdStatekey = StateHelpers.generateTokenIdStateKey(addrStateDecoded.nfTokenId);
12167
12171
  const nftIdStateIndex = StateHelpers.getHookStateIndex(this.registryAddress, nftIdStatekey);
@@ -12195,9 +12199,9 @@ class BaseEvernodeClient {
12195
12199
  const curMomentStartIdx = await this.getMomentStartIndex();
12196
12200
  // Populate the host active status.
12197
12201
  (hosts.nextPageToken ? hosts.data : hosts).forEach(h => {
12198
- h.active = (h.lastHeartbeatLedger > (this.config.hostHeartbeatFreq * this.config.momentSize) ?
12199
- (h.lastHeartbeatLedger >= (curMomentStartIdx - (this.config.hostHeartbeatFreq * this.config.momentSize))) :
12200
- (h.lastHeartbeatLedger > 0))
12202
+ h.active = (h.lastHeartbeatIndex > (this.config.hostHeartbeatFreq * this.config.momentSize) ?
12203
+ (h.lastHeartbeatIndex >= (curMomentStartIdx - (this.config.hostHeartbeatFreq * this.config.momentSize))) :
12204
+ (h.lastHeartbeatIndex > 0))
12201
12205
  });
12202
12206
  return hosts;
12203
12207
  }
@@ -12804,41 +12808,47 @@ class TenantClient extends BaseEvernodeClient {
12804
12808
  * @returns An object including transaction details,instance info, and acquireReference Id.
12805
12809
  */
12806
12810
  async watchAcquireResponse(tx, options = {}) {
12807
- console.log(`Waiting for acquire response... (txHash: ${tx.id})`);
12811
+ console.log(`Waiting for acquire response... (txHash: ${tx.id})`);
12808
12812
 
12813
+ return new Promise(async (resolve, reject) => {
12814
+ let rejected = false;
12809
12815
  const failTimeout = setTimeout(() => {
12810
- throw({ error: ErrorCodes.ACQUIRE_ERR, reason: ErrorReasons.TIMEOUT });
12816
+ rejected = true;
12817
+ reject({ error: ErrorCodes.ACQUIRE_ERR, reason: ErrorReasons.TIMEOUT });
12811
12818
  }, options.timeout || DEFAULT_WAIT_TIMEOUT);
12812
-
12819
+
12813
12820
  let relevantTx = null;
12814
- while (!relevantTx) {
12821
+ while (!rejected && !relevantTx) {
12815
12822
  const txList = await this.xrplAcc.getAccountTrx(tx.details.ledger_index);
12816
12823
  for (let t of txList) {
12817
12824
  t.tx.Memos = TransactionHelper.deserializeMemos(t.tx?.Memos);
12818
- const res = await this.extractEvernodeEvent(t.tx);
12819
- if ((res?.name === EvernodeEvents.AcquireSuccess || res?.name === EvernodeEvents.AcquireError) && res?.data?.acquireRefId === tx.id) {
12820
- clearTimeout(failTimeout);
12821
- relevantTx = res;
12822
- break;
12823
- }
12825
+ const res = await this.extractEvernodeEvent(t.tx);
12826
+ if ((res?.name === EvernodeEvents.AcquireSuccess || res?.name === EvernodeEvents.AcquireError) && res?.data?.acquireRefId === tx.id) {
12827
+ clearTimeout(failTimeout);
12828
+ relevantTx = res;
12829
+ break;
12830
+ }
12824
12831
  }
12825
- await new Promise(resolve => setTimeout(resolve, 2000));
12832
+ await new Promise(resolveSleep => setTimeout(resolveSleep, 2000));
12826
12833
  }
12827
-
12828
- if (relevantTx?.name === TenantEvents.AcquireSuccess) {
12829
- return({
12830
- transaction: relevantTx?.data.transaction,
12831
- instance: relevantTx?.data.payload.content,
12832
- acquireRefId: relevantTx?.data.acquireRefId
12833
- });
12834
- } else if (relevantTx?.name === TenantEvents.AcquireError) {
12835
- throw({
12836
- error: ErrorCodes.ACQUIRE_ERR,
12837
- transaction: relevantTx?.data.transaction,
12838
- reason: relevantTx?.data.reason,
12839
- acquireRefId: relevantTx?.data.acquireRefId
12840
- })
12834
+
12835
+ if (!rejected) {
12836
+ if (relevantTx?.name === TenantEvents.AcquireSuccess) {
12837
+ resolve({
12838
+ transaction: relevantTx?.data.transaction,
12839
+ instance: relevantTx?.data.payload.content,
12840
+ acquireRefId: relevantTx?.data.acquireRefId
12841
+ });
12842
+ } else if (relevantTx?.name === TenantEvents.AcquireError) {
12843
+ reject({
12844
+ error: ErrorCodes.ACQUIRE_ERR,
12845
+ transaction: relevantTx?.data.transaction,
12846
+ reason: relevantTx?.data.reason,
12847
+ acquireRefId: relevantTx?.data.acquireRefId
12848
+ });
12849
+ }
12841
12850
  }
12851
+ });
12842
12852
  }
12843
12853
 
12844
12854
  /**
@@ -12887,38 +12897,44 @@ class TenantClient extends BaseEvernodeClient {
12887
12897
  async watchExtendResponse(tx, options = {}) {
12888
12898
  console.log(`Waiting for extend lease response... (txHash: ${tx.id})`);
12889
12899
 
12890
- const failTimeout = setTimeout(() => {
12891
- throw({ error: ErrorCodes.EXTEND_ERR, reason: ErrorReasons.TIMEOUT });
12892
- }, options.timeout || DEFAULT_WAIT_TIMEOUT);
12893
-
12894
- let relevantTx = null;
12895
- while (!relevantTx) {
12896
- const txList = await this.xrplAcc.getAccountTrx(tx.details.ledger_index);
12897
- for (let t of txList) {
12898
- t.tx.Memos = TransactionHelper.deserializeMemos(t.tx.Memos);
12899
- const res = await this.extractEvernodeEvent(t.tx);
12900
- if ((res?.name === TenantEvents.ExtendSuccess || res?.name === TenantEvents.ExtendError) && res?.data?.extendRefId === tx.id) {
12901
- clearTimeout(failTimeout);
12902
- relevantTx = res;
12903
- break;
12900
+ return new Promise(async (resolve, reject) => {
12901
+ let rejected = false;
12902
+ const failTimeout = setTimeout(() => {
12903
+ rejected = true;
12904
+ reject({ error: ErrorCodes.EXTEND_ERR, reason: ErrorReasons.TIMEOUT });
12905
+ }, options.timeout || DEFAULT_WAIT_TIMEOUT);
12906
+
12907
+ let relevantTx = null;
12908
+ while (!rejected && !relevantTx) {
12909
+ const txList = await this.xrplAcc.getAccountTrx(tx.details.ledger_index);
12910
+ for (let t of txList) {
12911
+ t.tx.Memos = TransactionHelper.deserializeMemos(t.tx.Memos);
12912
+ const res = await this.extractEvernodeEvent(t.tx);
12913
+ if ((res?.name === TenantEvents.ExtendSuccess || res?.name === TenantEvents.ExtendError) && res?.data?.extendRefId === tx.id) {
12914
+ clearTimeout(failTimeout);
12915
+ relevantTx = res;
12916
+ break;
12917
+ }
12904
12918
  }
12919
+ await new Promise(resolveSleep => setTimeout(resolveSleep, 1000));
12905
12920
  }
12906
- await new Promise(resolve => setTimeout(resolve, 1000));
12907
- }
12908
12921
 
12909
- if (relevantTx?.name === TenantEvents.ExtendSuccess) {
12910
- return({
12911
- transaction: relevantTx?.data.transaction,
12912
- expiryMoment: relevantTx?.data.expiryMoment,
12913
- extendeRefId: relevantTx?.data.extendRefId
12914
- });
12915
- } else if (relevantTx?.name === TenantEvents.ExtendError) {
12916
- throw({
12917
- error: ErrorCodes.EXTEND_ERR,
12918
- transaction: relevantTx?.data.transaction,
12919
- reason: relevantTx?.data.reason
12920
- })
12921
- }
12922
+ if (!rejected) {
12923
+ if (relevantTx?.name === TenantEvents.ExtendSuccess) {
12924
+ resolve({
12925
+ transaction: relevantTx?.data.transaction,
12926
+ expiryMoment: relevantTx?.data.expiryMoment,
12927
+ extendeRefId: relevantTx?.data.extendRefId
12928
+ });
12929
+ } else if (relevantTx?.name === TenantEvents.ExtendError) {
12930
+ reject({
12931
+ error: ErrorCodes.EXTEND_ERR,
12932
+ transaction: relevantTx?.data.transaction,
12933
+ reason: relevantTx?.data.reason
12934
+ });
12935
+ }
12936
+ }
12937
+ });
12922
12938
  }
12923
12939
 
12924
12940
  /**
@@ -13422,10 +13438,11 @@ const HookStateKeys = {
13422
13438
  LEASE_ACQUIRE_WINDOW: "4556520100000000000000000000000000000000000000000000000000000008",
13423
13439
  REWARD_CONFIGURATION: "4556520100000000000000000000000000000000000000000000000000000009",
13424
13440
  MAX_TOLERABLE_DOWNTIME: "455652010000000000000000000000000000000000000000000000000000000A",
13441
+ MOMENT_TRANSIT_INFO: "455652010000000000000000000000000000000000000000000000000000000B",
13425
13442
 
13426
13443
  // Singleton
13427
13444
  HOST_COUNT: "4556523200000000000000000000000000000000000000000000000000000000",
13428
- MOMENT_BASE_IDX: "4556523300000000000000000000000000000000000000000000000000000000",
13445
+ MOMENT_BASE_INFO: "4556523300000000000000000000000000000000000000000000000000000000",
13429
13446
  HOST_REG_FEE: "4556523400000000000000000000000000000000000000000000000000000000",
13430
13447
  MAX_REG: "4556523500000000000000000000000000000000000000000000000000000000",
13431
13448
  REWARD_INFO: "4556523600000000000000000000000000000000000000000000000000000000",
@@ -13864,6 +13881,14 @@ const FIRST_EPOCH_REWARD_QUOTA_OFFSET = 1;
13864
13881
  const EPOCH_REWARD_AMOUNT_OFFSET = 5;
13865
13882
  const REWARD_START_MOMENT_OFFSET = 9;
13866
13883
 
13884
+ const TRANSIT_IDX_OFFSET = 0;
13885
+ const TRANSIT_MOMENT_SIZE_OFFSET = 8;
13886
+ const TRANSIT_MOMENT_TYPE_OFFSET = 10;
13887
+
13888
+ const MOMENT_BASE_POINT_OFFSET = 0;
13889
+ const MOMENT_AT_TRANSITION_OFFSET = 8;
13890
+ const MOMENT_TYPE_OFFSET = 12;
13891
+
13867
13892
  const HOST_TOKEN_ID_OFFSET = 0;
13868
13893
  const HOST_COUNTRY_CODE_OFFSET = 32;
13869
13894
  const HOST_RESERVED_OFFSET = 34;
@@ -13874,6 +13899,7 @@ const HOST_TOT_INS_COUNT_OFFSET = 84;
13874
13899
  const HOST_ACT_INS_COUNT_OFFSET = 88;
13875
13900
  const HOST_HEARTBEAT_LEDGER_IDX_OFFSET = 92;
13876
13901
  const HOST_VERSION_OFFSET = 100;
13902
+ const HOST_REG_TIMESTAMP_OFFSET = 103;
13877
13903
 
13878
13904
  const HOST_ADDRESS_OFFSET = 0;
13879
13905
  const HOST_CPU_MODEL_NAME_OFFSET = 20;
@@ -13888,6 +13914,11 @@ const STATE_KEY_TYPES = {
13888
13914
  HOST_ADDR: 3
13889
13915
  }
13890
13916
 
13917
+ const MOMENT_TYPES = {
13918
+ LEDGER: 0,
13919
+ TIMESTAMP: 1
13920
+ }
13921
+
13891
13922
  const EVERNODE_PREFIX = 'EVR';
13892
13923
  const HOST_ADDR_KEY_ZERO_COUNT = 8;
13893
13924
  const HOOK_STATE_LEDGER_TYPE_PREFIX = 118; // Decimal value of ASCII 'v'
@@ -13900,8 +13931,20 @@ class StateHelpers {
13900
13931
  CONFIGURATION: 'configuration'
13901
13932
  }
13902
13933
 
13934
+ static timeLines = {
13935
+ SEC: "SEC"
13936
+ }
13937
+
13938
+ static getStateData(states, key) {
13939
+ const state = states.find(s => key === s.key);
13940
+ if (!state)
13941
+ return null;
13942
+
13943
+ return state.data;
13944
+ }
13945
+
13903
13946
  static decodeHostAddressState(stateKeyBuf, stateDataBuf) {
13904
- return {
13947
+ let data = {
13905
13948
  address: codec.encodeAccountID(stateKeyBuf.slice(12)),
13906
13949
  nfTokenId: stateDataBuf.slice(HOST_TOKEN_ID_OFFSET, HOST_COUNTRY_CODE_OFFSET).toString('hex').toUpperCase(),
13907
13950
  countryCode: stateDataBuf.slice(HOST_COUNTRY_CODE_OFFSET, HOST_RESERVED_OFFSET).toString(),
@@ -13910,9 +13953,12 @@ class StateHelpers {
13910
13953
  registrationFee: Number(stateDataBuf.readBigUInt64BE(HOST_REG_FEE_OFFSET)),
13911
13954
  maxInstances: stateDataBuf.readUInt32BE(HOST_TOT_INS_COUNT_OFFSET),
13912
13955
  activeInstances: stateDataBuf.readUInt32BE(HOST_ACT_INS_COUNT_OFFSET),
13913
- lastHeartbeatLedger: Number(stateDataBuf.readBigUInt64BE(HOST_HEARTBEAT_LEDGER_IDX_OFFSET)),
13914
- version: `${stateDataBuf.readUInt8(HOST_VERSION_OFFSET)}.${stateDataBuf.readUInt8(HOST_VERSION_OFFSET + 1)}.${stateDataBuf.readUInt8(HOST_VERSION_OFFSET + 2)}`
13956
+ lastHeartbeatIndex: Number(stateDataBuf.readBigUInt64BE(HOST_HEARTBEAT_LEDGER_IDX_OFFSET)),
13957
+ version: `${stateDataBuf.readUInt8(HOST_VERSION_OFFSET)}.${stateDataBuf.readUInt8(HOST_VERSION_OFFSET + 1)}.${stateDataBuf.readUInt8(HOST_VERSION_OFFSET + 2)}`,
13915
13958
  }
13959
+ if (stateDataBuf.length > HOST_REG_TIMESTAMP_OFFSET)
13960
+ data.registrationTimestamp = Number(stateDataBuf.readBigUInt64BE(HOST_REG_TIMESTAMP_OFFSET));
13961
+ return data;
13916
13962
  }
13917
13963
 
13918
13964
  static decodeTokenIdState(stateDataBuf) {
@@ -13955,11 +14001,15 @@ class StateHelpers {
13955
14001
  value: stateData.readUInt32BE()
13956
14002
  }
13957
14003
  }
13958
- else if (Buffer.from(HookStateKeys.MOMENT_BASE_IDX, 'hex').compare(stateKey) === 0) {
14004
+ else if (Buffer.from(HookStateKeys.MOMENT_BASE_INFO, 'hex').compare(stateKey) === 0) {
13959
14005
  return {
13960
14006
  type: this.StateTypes.SIGLETON,
13961
14007
  key: hexKey,
13962
- value: Number(stateData.readBigInt64BE())
14008
+ value: {
14009
+ baseIdx: Number(stateData.readBigUInt64BE(MOMENT_BASE_POINT_OFFSET)),
14010
+ baseTransitionMoment: stateData.length > MOMENT_AT_TRANSITION_OFFSET ? stateData.readUInt32BE(MOMENT_AT_TRANSITION_OFFSET) : 0,
14011
+ momentType: (stateData.length <= MOMENT_TYPE_OFFSET || stateData.readUInt8(MOMENT_TYPE_OFFSET) === MOMENT_TYPES.LEDGER) ? 'ledger' : 'timestamp'
14012
+ }
13963
14013
  }
13964
14014
  }
13965
14015
  else if (Buffer.from(HookStateKeys.HOST_REG_FEE, 'hex').compare(stateKey) === 0 || Buffer.from(HookStateKeys.MAX_REG, 'hex').compare(stateKey) === 0) {
@@ -14033,6 +14083,18 @@ class StateHelpers {
14033
14083
  value: stateData.readUInt16BE()
14034
14084
  }
14035
14085
  }
14086
+ else if (Buffer.from(HookStateKeys.MOMENT_TRANSIT_INFO, 'hex').compare(stateKey) === 0) {
14087
+ Buffer.alloc(1).readUInt8()
14088
+ return {
14089
+ type: this.StateTypes.CONFIGURATION,
14090
+ key: hexKey,
14091
+ value: {
14092
+ transitionIndex: Number(stateData.readBigInt64BE(TRANSIT_IDX_OFFSET)),
14093
+ momentSize: stateData.readUInt16BE(TRANSIT_MOMENT_SIZE_OFFSET),
14094
+ momentType: stateData.readUInt8(TRANSIT_MOMENT_TYPE_OFFSET) === MOMENT_TYPES.LEDGER ? 'ledger' : 'timestamp'
14095
+ }
14096
+ }
14097
+ }
14036
14098
  else
14037
14099
  throw { type: 'Validation Error', message: 'Invalid state key.' };
14038
14100
  }
@@ -14052,7 +14114,7 @@ class StateHelpers {
14052
14114
  };
14053
14115
  }
14054
14116
  else if (Buffer.from(HookStateKeys.HOST_COUNT, 'hex').compare(stateKey) === 0 ||
14055
- Buffer.from(HookStateKeys.MOMENT_BASE_IDX, 'hex').compare(stateKey) === 0 ||
14117
+ Buffer.from(HookStateKeys.MOMENT_BASE_INFO, 'hex').compare(stateKey) === 0 ||
14056
14118
  Buffer.from(HookStateKeys.HOST_REG_FEE, 'hex').compare(stateKey) === 0 ||
14057
14119
  Buffer.from(HookStateKeys.MAX_REG, 'hex').compare(stateKey) === 0 ||
14058
14120
  Buffer.from(HookStateKeys.REWARD_INFO, 'hex').compare(stateKey) === 0) {
@@ -14070,7 +14132,8 @@ class StateHelpers {
14070
14132
  Buffer.from(HookStateKeys.FIXED_REG_FEE, 'hex').compare(stateKey) === 0 ||
14071
14133
  Buffer.from(HookStateKeys.LEASE_ACQUIRE_WINDOW, 'hex').compare(stateKey) === 0 ||
14072
14134
  Buffer.from(HookStateKeys.REWARD_CONFIGURATION, 'hex').compare(stateKey) === 0 ||
14073
- Buffer.from(HookStateKeys.MAX_TOLERABLE_DOWNTIME, 'hex').compare(stateKey) === 0) {
14135
+ Buffer.from(HookStateKeys.MAX_TOLERABLE_DOWNTIME, 'hex').compare(stateKey) === 0 ||
14136
+ Buffer.from(HookStateKeys.MOMENT_TRANSIT_INFO, 'hex').compare(stateKey) === 0) {
14074
14137
  return {
14075
14138
  key: hexKey,
14076
14139
  type: this.STATE_TYPES.CONFIGURATION
@@ -14209,14 +14272,6 @@ const { EvernodeConstants, ErrorReasons } = __nccwpck_require__(9849);
14209
14272
  // Utility helper functions.
14210
14273
  class UtilHelpers {
14211
14274
 
14212
- static getStateData(states, key) {
14213
- const state = states.find(s => key === s.key);
14214
- if (!state)
14215
- throw { code: ErrorReasons.NO_STATE_KEY, error: `State key '${key}' not found.` };
14216
-
14217
- return state.data;
14218
- }
14219
-
14220
14275
  static readUInt(buf, base = 32, isBE = true) {
14221
14276
  buf = Buffer.from(buf);
14222
14277
  switch (base) {
@@ -14245,6 +14300,16 @@ class UtilHelpers {
14245
14300
  leaseAmount: parseFloat(XflHelpers.toString(uriBuf.readBigInt64BE(prefixLen + 2 + halfToSLen)))
14246
14301
  }
14247
14302
  }
14303
+
14304
+ static getCurrentUnixTime(format = "sec") {
14305
+ const time = Date.now();
14306
+ switch (format) {
14307
+ case "sec":
14308
+ return Math.floor(time / 1000);
14309
+ default:
14310
+ return time;
14311
+ }
14312
+ }
14248
14313
  }
14249
14314
 
14250
14315
  module.exports = {
@@ -15110,6 +15175,14 @@ class XrplApi {
15110
15175
  return this.#requestWithPaging({ command: 'account_offers', account: address, ledger_index: "validated", ...options }, API_REQ_TYPE.OFFERS);
15111
15176
  }
15112
15177
 
15178
+ async getSellOffers(nfTokenId, options = {}) {
15179
+ return this.#requestWithPaging({ command: 'nft_sell_offers', nft_id: nfTokenId, ledger_index: "validated", ...options }, API_REQ_TYPE.OFFERS);
15180
+ }
15181
+
15182
+ async getBuyOffers(nfTokenId, options = {}) {
15183
+ return this.#requestWithPaging({ command: 'nft_buy_offers', nft_id: nfTokenId, ledger_index: "validated", ...options }, API_REQ_TYPE.OFFERS);
15184
+ }
15185
+
15113
15186
  async getLedgerEntry(index, options) {
15114
15187
  const resp = (await this.#client.request({ command: 'ledger_entry', index: index, ledger_index: "validated", ...options }));
15115
15188
  return resp?.result?.node;
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  ],
7
7
  "homepage": "https://github.com/HotPocketDev/evernode-js-client",
8
8
  "license": "MIT",
9
- "version": "0.5.1",
9
+ "version": "0.5.3",
10
10
  "dependencies": {
11
11
  "elliptic": "6.5.4",
12
12
  "ripple-address-codec": "4.2.0",