evernode-js-client 0.5.5 → 0.5.7
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 +79 -6
- package/package.json +1 -1
package/index.js
CHANGED
@@ -12156,6 +12156,19 @@ class BaseEvernodeClient {
|
|
12156
12156
|
}
|
12157
12157
|
}
|
12158
12158
|
}
|
12159
|
+
else if (tx.Memos.length >= 1 &&
|
12160
|
+
tx.Memos[0].type === MemoTypes.HOST_TRANSFER && tx.Memos[0].format === MemoFormats.HEX && tx.Memos[0].data) {
|
12161
|
+
|
12162
|
+
const addrsBuf = Buffer.from(tx.Memos[0].data, 'hex');
|
12163
|
+
|
12164
|
+
return {
|
12165
|
+
name: EvernodeEvents.HostTransfer,
|
12166
|
+
data: {
|
12167
|
+
transaction: tx,
|
12168
|
+
transferee: codec.encodeAccountID(addrsBuf)
|
12169
|
+
}
|
12170
|
+
}
|
12171
|
+
}
|
12159
12172
|
|
12160
12173
|
return null;
|
12161
12174
|
}
|
@@ -12302,6 +12315,7 @@ const { Buffer } = __nccwpck_require__(4300);
|
|
12302
12315
|
const codec = __nccwpck_require__(597);
|
12303
12316
|
const { XflHelpers } = __nccwpck_require__(3243);
|
12304
12317
|
const { EvernodeHelpers } = __nccwpck_require__(2523);
|
12318
|
+
const { StateHelpers } = __nccwpck_require__(3860);
|
12305
12319
|
|
12306
12320
|
const OFFER_WAIT_TIMEOUT = 60;
|
12307
12321
|
|
@@ -12447,9 +12461,29 @@ class HostClient extends BaseEvernodeClient {
|
|
12447
12461
|
}
|
12448
12462
|
}
|
12449
12463
|
|
12464
|
+
// Check the availability of an initiated transfer.
|
12465
|
+
// Need to modify the amount accordingly.
|
12466
|
+
const stateTransfereeAddrKey = StateHelpers.generateTransfereeAddrStateKey(this.xrplAcc.address);
|
12467
|
+
const stateTransfereeAddrIndex = StateHelpers.getHookStateIndex(this.registryAddress, stateTransfereeAddrKey);
|
12468
|
+
let transfereeAddrLedgerEntry = {};
|
12469
|
+
let transfereeAddrStateData = {};
|
12470
|
+
let transferredNFTokenId = null;
|
12471
|
+
|
12472
|
+
try {
|
12473
|
+
const res = await this.xrplApi.getLedgerEntry(stateTransfereeAddrIndex);
|
12474
|
+
transfereeAddrLedgerEntry = { ...transfereeAddrLedgerEntry, ...res };
|
12475
|
+
transfereeAddrStateData = transfereeAddrLedgerEntry?.HookStateData;
|
12476
|
+
const transfereeAddrStateDecoded = StateHelpers.decodeTransfereeAddrState(Buffer.from(stateTransfereeAddrKey, 'hex'), Buffer.from(transfereeAddrStateData, 'hex'));
|
12477
|
+
transferredNFTokenId = transfereeAddrStateDecoded?.transferredNfTokenId;
|
12478
|
+
|
12479
|
+
}
|
12480
|
+
catch (e) {
|
12481
|
+
console.log("No initiated transfers were found.");
|
12482
|
+
}
|
12483
|
+
|
12450
12484
|
const memoData = `${countryCode};${cpuMicroSec};${ramMb};${diskMb};${totalInstanceCount};${cpuModel};${cpuCount};${cpuSpeed};${description}`
|
12451
12485
|
const tx = await this.xrplAcc.makePayment(this.registryAddress,
|
12452
|
-
this.config.hostRegFee.toString(),
|
12486
|
+
(transferredNFTokenId) ? EvernodeConstants.NOW_IN_EVRS : this.config.hostRegFee.toString(),
|
12453
12487
|
EvernodeConstants.EVR,
|
12454
12488
|
this.config.evrIssuerAddress,
|
12455
12489
|
[{ type: MemoTypes.HOST_REG, format: MemoFormats.TEXT, data: memoData }],
|
@@ -12461,7 +12495,7 @@ class HostClient extends BaseEvernodeClient {
|
|
12461
12495
|
let attempts = 0;
|
12462
12496
|
let offerLedgerIndex = 0;
|
12463
12497
|
while (attempts < OFFER_WAIT_TIMEOUT) {
|
12464
|
-
const nft = (await regAcc.getNfts()).find(n => n.URI === `${EvernodeConstants.NFT_PREFIX_HEX}${tx.id}`);
|
12498
|
+
const nft = (await regAcc.getNfts()).find(n => (n.URI === `${EvernodeConstants.NFT_PREFIX_HEX}${tx.id}`) || (n.NFTokenID === transferredNFTokenId));
|
12465
12499
|
if (nft) {
|
12466
12500
|
offer = (await regAcc.getNftOffers()).find(o => o.Destination === this.xrplAcc.address && o.NFTokenID === nft.NFTokenID && o.Flags === 1);
|
12467
12501
|
offerLedgerIndex = this.xrplApi.ledgerIndex;
|
@@ -13461,7 +13495,8 @@ const EvernodeConstants = {
|
|
13461
13495
|
EVR: 'EVR',
|
13462
13496
|
NFT_PREFIX_HEX: '657672686F7374', // evrhost
|
13463
13497
|
LEASE_NFT_PREFIX_HEX: '6576726C65617365', // evrlease
|
13464
|
-
HOOK_NAMESPACE: '01EAF09326B4911554384121FF56FA8FECC215FDDE2EC35D9E59F2C53EC665A0'
|
13498
|
+
HOOK_NAMESPACE: '01EAF09326B4911554384121FF56FA8FECC215FDDE2EC35D9E59F2C53EC665A0',
|
13499
|
+
NOW_IN_EVRS: "0.00000001"
|
13465
13500
|
}
|
13466
13501
|
|
13467
13502
|
const MemoTypes = {
|
@@ -13998,9 +14033,14 @@ const HOST_CPU_MICROSEC_OFFSET = 64;
|
|
13998
14033
|
const HOST_RAM_MB_OFFSET = 68;
|
13999
14034
|
const HOST_DISK_MB_OFFSET = 72;
|
14000
14035
|
|
14036
|
+
const PREV_HOST_ADDRESS_OFFSET = 0;
|
14037
|
+
const TRANSFER_LEDGER_IDX_OFFSET = 20;
|
14038
|
+
const TRANSFERRED_NFT_ID_OFFSET = 28;
|
14039
|
+
|
14001
14040
|
const STATE_KEY_TYPES = {
|
14002
14041
|
TOKEN_ID: 2,
|
14003
|
-
HOST_ADDR: 3
|
14042
|
+
HOST_ADDR: 3,
|
14043
|
+
TRANSFEREE_ADDR: 4
|
14004
14044
|
}
|
14005
14045
|
|
14006
14046
|
const MOMENT_TYPES = {
|
@@ -14008,8 +14048,14 @@ const MOMENT_TYPES = {
|
|
14008
14048
|
TIMESTAMP: 1
|
14009
14049
|
}
|
14010
14050
|
|
14051
|
+
const TRANSFER_STATES = {
|
14052
|
+
NO_TRANSFER: 0,
|
14053
|
+
HAS_A_TRANSFER: 1
|
14054
|
+
}
|
14055
|
+
|
14011
14056
|
const EVERNODE_PREFIX = 'EVR';
|
14012
14057
|
const HOST_ADDR_KEY_ZERO_COUNT = 8;
|
14058
|
+
const TRANSFEREE_ADDR_KEY_ZERO_COUNT = 8;
|
14013
14059
|
const HOOK_STATE_LEDGER_TYPE_PREFIX = 118; // Decimal value of ASCII 'v'
|
14014
14060
|
const PENDING_TRANSFER = 1;
|
14015
14061
|
|
@@ -14046,7 +14092,7 @@ class StateHelpers {
|
|
14046
14092
|
activeInstances: stateDataBuf.readUInt32BE(HOST_ACT_INS_COUNT_OFFSET),
|
14047
14093
|
lastHeartbeatIndex: Number(stateDataBuf.readBigUInt64BE(HOST_HEARTBEAT_LEDGER_IDX_OFFSET)),
|
14048
14094
|
version: `${stateDataBuf.readUInt8(HOST_VERSION_OFFSET)}.${stateDataBuf.readUInt8(HOST_VERSION_OFFSET + 1)}.${stateDataBuf.readUInt8(HOST_VERSION_OFFSET + 2)}`,
|
14049
|
-
hasPendingTransfer: (stateDataBuf.readUInt8(HOST_TRANSFER_FLAG_OFFSET) === PENDING_TRANSFER) ?
|
14095
|
+
hasPendingTransfer: (stateDataBuf.length > HOST_TRANSFER_FLAG_OFFSET && (stateDataBuf.readUInt8(HOST_TRANSFER_FLAG_OFFSET) === PENDING_TRANSFER)) ? TRANSFER_STATES.HAS_A_TRANSFER : TRANSFER_STATES.NO_TRANSFER
|
14050
14096
|
}
|
14051
14097
|
if (stateDataBuf.length > HOST_REG_TIMESTAMP_OFFSET)
|
14052
14098
|
data.registrationTimestamp = Number(stateDataBuf.readBigUInt64BE(HOST_REG_TIMESTAMP_OFFSET));
|
@@ -14065,6 +14111,18 @@ class StateHelpers {
|
|
14065
14111
|
}
|
14066
14112
|
}
|
14067
14113
|
|
14114
|
+
|
14115
|
+
static decodeTransfereeAddrState(stateKeyBuf, stateDataBuf) {
|
14116
|
+
const prevHostClassicAddress = codec.encodeAccountID(stateDataBuf.slice(PREV_HOST_ADDRESS_OFFSET, TRANSFER_LEDGER_IDX_OFFSET));
|
14117
|
+
return {
|
14118
|
+
futureOwnerAddress: codec.encodeAccountID(stateKeyBuf.slice(12)),
|
14119
|
+
prevHostAddressKey: this.generateHostAddrStateKey(prevHostClassicAddress),
|
14120
|
+
prevHostAddress: prevHostClassicAddress,
|
14121
|
+
transferLedgerIdx: Number(stateDataBuf.readBigUInt64BE(TRANSFER_LEDGER_IDX_OFFSET)),
|
14122
|
+
transferredNfTokenId: stateDataBuf.slice(TRANSFERRED_NFT_ID_OFFSET, 60).toString('hex').toUpperCase()
|
14123
|
+
}
|
14124
|
+
}
|
14125
|
+
|
14068
14126
|
static decodeStateData(stateKey, stateData) {
|
14069
14127
|
const hexKey = stateKey.toString('hex').toUpperCase();
|
14070
14128
|
if (Buffer.from(HookStateKeys.PREFIX_HOST_ADDR, 'hex').compare(stateKey, 0, 4) === 0) {
|
@@ -14089,7 +14147,8 @@ class StateHelpers {
|
|
14089
14147
|
else if (Buffer.from(HookStateKeys.PREFIX_TRANSFEREE_ADDR, 'hex').compare(stateKey, 0, 4) === 0) {
|
14090
14148
|
return {
|
14091
14149
|
type: this.StateTypes.TRANSFEREE_ADDR,
|
14092
|
-
key: hexKey
|
14150
|
+
key: hexKey,
|
14151
|
+
...this.decodeTransfereeAddrState(stateKey, stateData)
|
14093
14152
|
}
|
14094
14153
|
}
|
14095
14154
|
else if (Buffer.from(HookStateKeys.HOST_COUNT, 'hex').compare(stateKey) === 0) {
|
@@ -14265,6 +14324,20 @@ class StateHelpers {
|
|
14265
14324
|
return stateKeyBuf.toString('hex').toUpperCase();
|
14266
14325
|
}
|
14267
14326
|
|
14327
|
+
static generateTransfereeAddrStateKey(address) {
|
14328
|
+
// 1 byte - Key Type.
|
14329
|
+
// 8 bytes - Zeros.
|
14330
|
+
let buf = Buffer.allocUnsafe(9);
|
14331
|
+
buf.writeUInt8(STATE_KEY_TYPES.TRANSFEREE_ADDR);
|
14332
|
+
for (let i = 0; i < TRANSFEREE_ADDR_KEY_ZERO_COUNT; i++) {
|
14333
|
+
buf.writeUInt8(0, i + 1);
|
14334
|
+
}
|
14335
|
+
|
14336
|
+
const addrBuf = Buffer.from(codec.decodeAccountID(address), "hex");
|
14337
|
+
const stateKeyBuf = Buffer.concat([Buffer.from(EVERNODE_PREFIX, "utf-8"), buf, addrBuf]);
|
14338
|
+
return stateKeyBuf.toString('hex').toUpperCase();
|
14339
|
+
}
|
14340
|
+
|
14268
14341
|
static getHookStateIndex(hookAccount, stateKey, hookNamespace = EvernodeConstants.HOOK_NAMESPACE) {
|
14269
14342
|
const typeBuf = Buffer.allocUnsafe(2);
|
14270
14343
|
typeBuf.writeInt16BE(HOOK_STATE_LEDGER_TYPE_PREFIX);
|