evernode-js-client 0.5.17-beta-v3.1 → 0.5.17-beta-v3.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. package/index.js +61 -4
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -12525,6 +12525,8 @@ class BaseEvernodeClient {
12525
12525
  const ownerStateDecoded = StateHelpers.decodeCandidateOwnerState(Buffer.from(ownerStateKey, 'hex'), Buffer.from(ownerStateData, 'hex'));
12526
12526
  return { ...ownerStateDecoded, ...idStateDecoded };
12527
12527
  }
12528
+
12529
+ return { ...idStateDecoded, uniqueId: candidateId };
12528
12530
  }
12529
12531
  }
12530
12532
  catch (e) {
@@ -13100,7 +13102,20 @@ class HostClient extends BaseEvernodeClient {
13100
13102
  Buffer.from(tosHash, 'hex').copy(uriBuf, prefixLen + 2, 0, halfToSLen);
13101
13103
  uriBuf.writeBigInt64BE(XflHelpers.getXfl(leaseAmount.toString()), prefixLen + 2 + halfToSLen);
13102
13104
  const uri = uriBuf.toString('base64');
13103
- await this.xrplAcc.mintURIToken(uri, null, { isBurnable: true, isHexUri: false });
13105
+
13106
+ try {
13107
+ await this.xrplAcc.mintURIToken(uri, null, { isBurnable: true, isHexUri: false });
13108
+ } catch (e) {
13109
+ // Re-minting the URIToken after burning that sold URIToken.
13110
+ if (e.code === "tecDUPLICATE") {
13111
+ const uriTokenId = this.xrplAcc.generateIssuedURITokenId(uri);
13112
+ console.log(`Burning URIToken related to a previously sold lease.`);
13113
+ await this.xrplAcc.burnURIToken(uriTokenId);
13114
+ console.log("Re-mint the URIToken for the new lease offer.")
13115
+ await this.xrplAcc.mintURIToken(uri, null, { isBurnable: true, isHexUri: false });
13116
+ }
13117
+ }
13118
+
13104
13119
  const uriToken = await this.xrplAcc.getURITokenByUri(uri);
13105
13120
  if (!uriToken)
13106
13121
  throw "Offer lease NFT creation error.";
@@ -13146,6 +13161,15 @@ class HostClient extends BaseEvernodeClient {
13146
13161
  if (await this.isRegistered())
13147
13162
  throw "Host already registered.";
13148
13163
 
13164
+ // Check whether are there lease offers in for the host due to a previous registration.
13165
+ const existingLeaseURITokens = (await this.xrplAcc.getURITokens()).filter(n => EvernodeHelpers.isValidURI(n.URI, EvernodeConstants.LEASE_TOKEN_PREFIX_HEX));
13166
+ if (existingLeaseURITokens) {
13167
+ console.log("Burning unsold URITokens related to the previous leases.");
13168
+ for (const uriToken of existingLeaseURITokens) {
13169
+ await this.xrplAcc.burnURIToken(uriToken.index);
13170
+ }
13171
+ }
13172
+
13149
13173
  // Check whether is there any missed NFT sell offer that needs to be accepted
13150
13174
  // from the client-side in order to complete the registration.
13151
13175
  const registryAcc = new XrplAccount(this.config.registryAddress, null, { xrplApi: this.xrplApi });
@@ -14931,6 +14955,7 @@ const EPOCH_COUNT_OFFSET = 0;
14931
14955
  const FIRST_EPOCH_REWARD_QUOTA_OFFSET = 1;
14932
14956
  const EPOCH_REWARD_AMOUNT_OFFSET = 5;
14933
14957
  const REWARD_START_MOMENT_OFFSET = 9;
14958
+ const ACCUMULATED_REWARD_FREQUENCY_OFFSET = 13;
14934
14959
 
14935
14960
  const TRANSIT_IDX_OFFSET = 0;
14936
14961
  const TRANSIT_MOMENT_SIZE_OFFSET = 8;
@@ -14980,6 +15005,7 @@ const HOST_CPU_MICROSEC_OFFSET = 64;
14980
15005
  const HOST_RAM_MB_OFFSET = 68;
14981
15006
  const HOST_DISK_MB_OFFSET = 72;
14982
15007
  const HOST_EMAIL_ADDRESS_OFFSET = 76;
15008
+ const HOST_ACCUMULATED_REWARD_OFFSET = 116;
14983
15009
 
14984
15010
  const PREV_HOST_ADDRESS_OFFSET = 0;
14985
15011
  const TRANSFER_LEDGER_IDX_OFFSET = 20;
@@ -15080,7 +15106,8 @@ class StateHelpers {
15080
15106
  cpuMicrosec: stateDataBuf.readUInt32BE(HOST_CPU_MICROSEC_OFFSET),
15081
15107
  ramMb: stateDataBuf.readUInt32BE(HOST_RAM_MB_OFFSET),
15082
15108
  diskMb: stateDataBuf.readUInt32BE(HOST_DISK_MB_OFFSET),
15083
- email: stateDataBuf.slice(HOST_EMAIL_ADDRESS_OFFSET, HOST_EMAIL_ADDRESS_OFFSET + HOST_EMAIL_ADDRESS_LEN).toString().toString().replace(/\0/g, '')
15109
+ email: stateDataBuf.slice(HOST_EMAIL_ADDRESS_OFFSET, HOST_EMAIL_ADDRESS_OFFSET + HOST_EMAIL_ADDRESS_LEN).toString().toString().replace(/\0/g, ''),
15110
+ accumulatedRewardAmount: XflHelpers.toString(stateDataBuf.readBigInt64BE(HOST_ACCUMULATED_REWARD_OFFSET))
15084
15111
  }
15085
15112
  }
15086
15113
 
@@ -15250,7 +15277,8 @@ class StateHelpers {
15250
15277
  epochCount: stateData.readUInt8(EPOCH_COUNT_OFFSET),
15251
15278
  firstEpochRewardQuota: stateData.readUInt32BE(FIRST_EPOCH_REWARD_QUOTA_OFFSET),
15252
15279
  epochRewardAmount: stateData.readUInt32BE(EPOCH_REWARD_AMOUNT_OFFSET),
15253
- rewardStartMoment: stateData.readUInt32BE(REWARD_START_MOMENT_OFFSET)
15280
+ rewardStartMoment: stateData.readUInt32BE(REWARD_START_MOMENT_OFFSET),
15281
+ accumulatedRewardFrequency: stateData.readUInt16BE(ACCUMULATED_REWARD_FREQUENCY_OFFSET)
15254
15282
  }
15255
15283
  }
15256
15284
  }
@@ -15331,7 +15359,7 @@ class StateHelpers {
15331
15359
  voteBaseCountChangedTimestamp: Number(stateData.readBigUInt64BE(VOTER_BASE_COUNT_CHANGED_TIMESTAMP_OFFSET)),
15332
15360
  foundationLastVotedCandidateIdx: stateData.readUInt32BE(FOUNDATION_LAST_VOTED_CANDIDATE_IDX),
15333
15361
  foundationLastVotedTimestamp: Number(stateData.readBigUInt64BE(FOUNDATION_LAST_VOTED_TIMESTAMP_OFFSET)),
15334
- electedProposalUniqueId: stateData.readUInt32BE(ELECTED_PROPOSAL_UNIQUE_ID_OFFSET),
15362
+ electedProposalUniqueId: stateData.slice(ELECTED_PROPOSAL_UNIQUE_ID_OFFSET, PROPOSAL_ELECTED_TIMESTAMP_OFFSET).toString('hex').toUpperCase(),
15335
15363
  proposalElectedTimestamp: Number(stateData.readBigUInt64BE(PROPOSAL_ELECTED_TIMESTAMP_OFFSET)),
15336
15364
  updatedHookCount: stateData.readUInt8(UPDATED_HOOK_COUNT_OFFSET),
15337
15365
  supportVoteSent: stateData.readUInt8(FOUNDATION_SUPPORT_VOTE_FLAG_OFFSET)
@@ -16437,6 +16465,35 @@ class XrplAccount {
16437
16465
  const hexUri = isHexUri ? uri : TransactionHelper.asciiToHex(uri).toUpperCase();
16438
16466
  return tokens.find(t => t.URI == hexUri);
16439
16467
  }
16468
+
16469
+
16470
+ generateIssuedURITokenId(uri) {
16471
+ if (uri.length < 1 || uri.length > 256)
16472
+ throw 'Invalid URI';
16473
+
16474
+ const URITOKEN_LEDGER_TYPE_PREFIX = 85; // Decimal value of ASCII 'U'
16475
+ const accIdHex = (codec.decodeAccountID(this.address)).toString('hex').toUpperCase();
16476
+ let uriHex = '';
16477
+ for (let n in uri) {
16478
+ let digit = uri.charCodeAt(n).toString(16).toUpperCase();
16479
+ uriHex += (digit.length == 1 ? '0' : '') + digit
16480
+ }
16481
+
16482
+ let hash = crypto.createHash('sha512');
16483
+
16484
+ const typeBuf = Buffer.allocUnsafe(2);
16485
+ typeBuf.writeInt16BE(URITOKEN_LEDGER_TYPE_PREFIX);
16486
+
16487
+ const dataBuf = Buffer.from(`${accIdHex}${uriHex}`, 'hex');
16488
+
16489
+ let output = hash.update(typeBuf);
16490
+ output = hash.update(dataBuf);
16491
+
16492
+ const digest = output.digest('hex');
16493
+
16494
+ // Get the first 32 bytes of hash.
16495
+ return digest.substring(0, 64).toUpperCase();
16496
+ }
16440
16497
  }
16441
16498
 
16442
16499
  function makeAmountObject(amount, currency, issuer) {
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.17-beta-v3.1",
9
+ "version": "0.5.17-beta-v3.3",
10
10
  "dependencies": {
11
11
  "elliptic": "6.5.4",
12
12
  "libsodium-wrappers": "0.7.10",