evernode-js-client 0.5.15 → 0.5.17-beta-v3.0
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 +1396 -370
- package/package.json +4 -1
- package/postinstall.js/build/Release/secp256k1.node +0 -0
- package/postinstall.js/index.js +19 -0
package/index.js
CHANGED
@@ -11733,6 +11733,14 @@ const { UtilHelpers } = __nccwpck_require__(6687);
|
|
11733
11733
|
const { FirestoreHandler } = __nccwpck_require__(9718);
|
11734
11734
|
const { StateHelpers } = __nccwpck_require__(3860);
|
11735
11735
|
const { EvernodeHelpers } = __nccwpck_require__(2523);
|
11736
|
+
const { HookHelpers } = __nccwpck_require__(4675);
|
11737
|
+
|
11738
|
+
const CANDIDATE_PROPOSE_UNIQUE_ID_MEMO_OFFSET = 0;
|
11739
|
+
const CANDIDATE_PROPOSE_SHORT_NAME_MEMO_OFFSET = 32;
|
11740
|
+
const CANDIDATE_PROPOSE_KEYLETS_MEMO_OFFSET = 52;
|
11741
|
+
const CANDIDATE_PROPOSE_MEMO_SIZE = 154;
|
11742
|
+
|
11743
|
+
const DUD_HOST_CANDID_ADDRESS_OFFSET = 12;
|
11736
11744
|
|
11737
11745
|
class BaseEvernodeClient {
|
11738
11746
|
|
@@ -11744,7 +11752,7 @@ class BaseEvernodeClient {
|
|
11744
11752
|
constructor(xrpAddress, xrpSecret, watchEvents, autoSubscribe = false, options = {}) {
|
11745
11753
|
|
11746
11754
|
this.connected = false;
|
11747
|
-
this.
|
11755
|
+
this.governorAddress = options.governorAddress || DefaultValues.governorAddress;
|
11748
11756
|
|
11749
11757
|
this.xrplApi = options.xrplApi || DefaultValues.xrplApi || new XrplApi(options.rippledServer);
|
11750
11758
|
if (!options.xrplApi && !DefaultValues.xrplApi)
|
@@ -11758,9 +11766,8 @@ class BaseEvernodeClient {
|
|
11758
11766
|
this.#firestoreHandler = new FirestoreHandler()
|
11759
11767
|
|
11760
11768
|
this.xrplAcc.on(XrplApiEvents.PAYMENT, (tx, error) => this.#handleEvernodeEvent(tx, error));
|
11761
|
-
this.xrplAcc.on(XrplApiEvents.
|
11762
|
-
this.xrplAcc.on(XrplApiEvents.
|
11763
|
-
|
11769
|
+
this.xrplAcc.on(XrplApiEvents.URI_TOKEN_BUY, (tx, error) => this.#handleEvernodeEvent(tx, error));
|
11770
|
+
this.xrplAcc.on(XrplApiEvents.URI_TOKEN_CREATE_SELL_OFFER, (tx, error) => this.#handleEvernodeEvent(tx, error));
|
11764
11771
|
}
|
11765
11772
|
|
11766
11773
|
/**
|
@@ -11824,21 +11831,21 @@ class BaseEvernodeClient {
|
|
11824
11831
|
}
|
11825
11832
|
|
11826
11833
|
/**
|
11827
|
-
* Subscribes to the
|
11834
|
+
* Subscribes to the client events.
|
11828
11835
|
*/
|
11829
11836
|
async subscribe() {
|
11830
11837
|
await this.xrplAcc.subscribe();
|
11831
11838
|
}
|
11832
11839
|
|
11833
11840
|
/**
|
11834
|
-
* Unsubscribes from the
|
11841
|
+
* Unsubscribes from the client events.
|
11835
11842
|
*/
|
11836
11843
|
async unsubscribe() {
|
11837
11844
|
await this.xrplAcc.unsubscribe();
|
11838
11845
|
}
|
11839
11846
|
|
11840
11847
|
/**
|
11841
|
-
* Get the EVR balance in the
|
11848
|
+
* Get the EVR balance in the account.
|
11842
11849
|
* @returns The available EVR amount as a 'string'.
|
11843
11850
|
*/
|
11844
11851
|
async getEVRBalance() {
|
@@ -11854,7 +11861,7 @@ class BaseEvernodeClient {
|
|
11854
11861
|
* @returns The list of hook states including Evernode configuration and hosts.
|
11855
11862
|
*/
|
11856
11863
|
async getHookStates() {
|
11857
|
-
const regAcc = new XrplAccount(this.
|
11864
|
+
const regAcc = new XrplAccount(this.governorAddress, null, { xrplApi: this.xrplApi });
|
11858
11865
|
const configs = await regAcc.getNamespaceEntries(EvernodeConstants.HOOK_NAMESPACE);
|
11859
11866
|
|
11860
11867
|
if (configs)
|
@@ -11895,19 +11902,22 @@ class BaseEvernodeClient {
|
|
11895
11902
|
async #getEvernodeConfig() {
|
11896
11903
|
let states = await this.getHookStates();
|
11897
11904
|
const configStateKeys = {
|
11905
|
+
registryAddress: HookStateKeys.REGISTRY_ADDR,
|
11906
|
+
heartbeatAddress: HookStateKeys.HEARTBEAT_ADDR,
|
11898
11907
|
evrIssuerAddress: HookStateKeys.EVR_ISSUER_ADDR,
|
11899
11908
|
foundationAddress: HookStateKeys.FOUNDATION_ADDR,
|
11900
11909
|
hostRegFee: HookStateKeys.HOST_REG_FEE,
|
11901
11910
|
momentSize: HookStateKeys.MOMENT_SIZE,
|
11902
11911
|
hostHeartbeatFreq: HookStateKeys.HOST_HEARTBEAT_FREQ,
|
11903
11912
|
momentBaseInfo: HookStateKeys.MOMENT_BASE_INFO,
|
11904
|
-
purchaserTargetPrice: HookStateKeys.PURCHASER_TARGET_PRICE,
|
11905
11913
|
leaseAcquireWindow: HookStateKeys.LEASE_ACQUIRE_WINDOW,
|
11906
11914
|
rewardInfo: HookStateKeys.REWARD_INFO,
|
11907
11915
|
rewardConfiguration: HookStateKeys.REWARD_CONFIGURATION,
|
11908
11916
|
hostCount: HookStateKeys.HOST_COUNT,
|
11909
11917
|
momentTransitInfo: HookStateKeys.MOMENT_TRANSIT_INFO,
|
11910
|
-
registryMaxTrxEmitFee: HookStateKeys.MAX_TRX_EMISSION_FEE
|
11918
|
+
registryMaxTrxEmitFee: HookStateKeys.MAX_TRX_EMISSION_FEE,
|
11919
|
+
governanceConfiguration: HookStateKeys.GOVERNANCE_CONFIGURATION,
|
11920
|
+
governanceInfo: HookStateKeys.GOVERNANCE_INFO
|
11911
11921
|
}
|
11912
11922
|
let config = {};
|
11913
11923
|
for (const [key, value] of Object.entries(configStateKeys)) {
|
@@ -11952,7 +11962,7 @@ class BaseEvernodeClient {
|
|
11952
11962
|
* @returns The event object in the format {name: '', data: {}}. Returns null if not handled. Note: You need to deserialize memos before passing the transaction to this function.
|
11953
11963
|
*/
|
11954
11964
|
async extractEvernodeEvent(tx) {
|
11955
|
-
if (tx.TransactionType === '
|
11965
|
+
if (tx.TransactionType === 'URITokenBuy' && tx.Memos.length >= 1 &&
|
11956
11966
|
tx.Memos[0].type === MemoTypes.ACQUIRE_LEASE && tx.Memos[0].format === MemoFormats.BASE64 && tx.Memos[0].data) {
|
11957
11967
|
|
11958
11968
|
// If our account is the destination host account, then decrypt the payload.
|
@@ -11970,8 +11980,8 @@ class BaseEvernodeClient {
|
|
11970
11980
|
data: {
|
11971
11981
|
transaction: tx,
|
11972
11982
|
host: tx.Destination,
|
11973
|
-
|
11974
|
-
leaseAmount: tx.
|
11983
|
+
uriTokenId: tx.URITokenSellOffer?.index,
|
11984
|
+
leaseAmount: tx.URITokenSellOffer?.Amount?.value,
|
11975
11985
|
acquireRefId: tx.hash,
|
11976
11986
|
tenant: tx.Account,
|
11977
11987
|
payload: payload
|
@@ -11979,19 +11989,6 @@ class BaseEvernodeClient {
|
|
11979
11989
|
}
|
11980
11990
|
}
|
11981
11991
|
|
11982
|
-
else if (tx.TransactionType === 'NFTokenAcceptOffer' && tx.NFTokenBuyOffer && tx.Memos.length >= 1 &&
|
11983
|
-
tx.Memos[0].type === MemoTypes.HOST_POST_DEREG && tx.Memos[0].format === MemoFormats.HEX && tx.Memos[0].data) {
|
11984
|
-
return {
|
11985
|
-
name: EvernodeEvents.HostPostDeregistered,
|
11986
|
-
data: {
|
11987
|
-
transaction: tx,
|
11988
|
-
nfTokenId: tx.NFTokenBuyOffer.NFTokenID,
|
11989
|
-
flags: tx.Flags,
|
11990
|
-
hash: tx.hash
|
11991
|
-
}
|
11992
|
-
}
|
11993
|
-
}
|
11994
|
-
|
11995
11992
|
else if (tx.Memos.length >= 2 &&
|
11996
11993
|
tx.Memos[0].type === MemoTypes.ACQUIRE_SUCCESS && tx.Memos[0].data &&
|
11997
11994
|
tx.Memos[1].type === MemoTypes.ACQUIRE_REF && tx.Memos[1].data) {
|
@@ -12060,18 +12057,27 @@ class BaseEvernodeClient {
|
|
12060
12057
|
else if (tx.Memos.length >= 1 &&
|
12061
12058
|
tx.Memos[0].type === MemoTypes.HEARTBEAT) {
|
12062
12059
|
|
12060
|
+
const voteInfo = (tx.Memos[0].data && tx.Memos[0].data.length) ?
|
12061
|
+
{
|
12062
|
+
voteInfo: {
|
12063
|
+
candidateId: tx.Memos[0].data.substr(0, 64),
|
12064
|
+
vote: Buffer.from(tx.Memos[0].data, 'hex').slice(32, 33).readUInt8()
|
12065
|
+
}
|
12066
|
+
} : {};
|
12067
|
+
|
12063
12068
|
return {
|
12064
12069
|
name: EvernodeEvents.Heartbeat,
|
12065
12070
|
data: {
|
12066
12071
|
transaction: tx,
|
12067
|
-
host: tx.Account
|
12072
|
+
host: tx.Account,
|
12073
|
+
...voteInfo
|
12068
12074
|
}
|
12069
12075
|
}
|
12070
12076
|
}
|
12071
12077
|
else if (tx.Memos.length >= 1 &&
|
12072
12078
|
tx.Memos[0].type === MemoTypes.EXTEND_LEASE && tx.Memos[0].format === MemoFormats.HEX && tx.Memos[0].data) {
|
12073
12079
|
|
12074
|
-
let
|
12080
|
+
let uriTokenId = tx.Memos[0].data;
|
12075
12081
|
|
12076
12082
|
return {
|
12077
12083
|
name: EvernodeEvents.ExtendLease,
|
@@ -12081,7 +12087,7 @@ class BaseEvernodeClient {
|
|
12081
12087
|
tenant: tx.Account,
|
12082
12088
|
currency: tx.Amount.currency,
|
12083
12089
|
payment: parseFloat(tx.Amount.value),
|
12084
|
-
|
12090
|
+
uriTokenId: uriTokenId
|
12085
12091
|
}
|
12086
12092
|
}
|
12087
12093
|
}
|
@@ -12122,10 +12128,10 @@ class BaseEvernodeClient {
|
|
12122
12128
|
}
|
12123
12129
|
}
|
12124
12130
|
else if (tx.Memos.length >= 1 &&
|
12125
|
-
tx.Memos[0].type === MemoTypes.
|
12131
|
+
tx.Memos[0].type === MemoTypes.INIT && tx.Memos[0].format === MemoFormats.HEX && tx.Memos[0].data) {
|
12126
12132
|
|
12127
12133
|
return {
|
12128
|
-
name: EvernodeEvents.
|
12134
|
+
name: EvernodeEvents.Initialized,
|
12129
12135
|
data: {
|
12130
12136
|
transaction: tx
|
12131
12137
|
}
|
@@ -12179,6 +12185,116 @@ class BaseEvernodeClient {
|
|
12179
12185
|
}
|
12180
12186
|
}
|
12181
12187
|
}
|
12188
|
+
else if (tx.Memos.length >= 2 &&
|
12189
|
+
tx.Memos[0].type === MemoTypes.CANDIDATE_PROPOSE && tx.Memos[0].format === MemoFormats.HEX && tx.Memos[0].data &&
|
12190
|
+
tx.Memos[1].type === MemoTypes.CANDIDATE_PROPOSE_REF && tx.Memos[1].format === MemoFormats.HEX && tx.Memos[1].data) {
|
12191
|
+
|
12192
|
+
return {
|
12193
|
+
name: EvernodeEvents.CandidateProposed,
|
12194
|
+
data: {
|
12195
|
+
transaction: tx,
|
12196
|
+
owner: tx.Account,
|
12197
|
+
candidateId: tx.Memos[1].data.substr(0, 64)
|
12198
|
+
}
|
12199
|
+
}
|
12200
|
+
}
|
12201
|
+
else if (tx.Memos.length >= 1 &&
|
12202
|
+
tx.Memos[0].type === MemoTypes.CANDIDATE_WITHDRAW && tx.Memos[0].format === MemoFormats.HEX && tx.Memos[0].data) {
|
12203
|
+
return {
|
12204
|
+
name: EvernodeEvents.CandidateWithdrew,
|
12205
|
+
data: {
|
12206
|
+
transaction: tx,
|
12207
|
+
owner: tx.Account,
|
12208
|
+
candidateId: tx.Memos[0].data.substr(0, 64)
|
12209
|
+
}
|
12210
|
+
}
|
12211
|
+
}
|
12212
|
+
else if (tx.Memos.length >= 1 &&
|
12213
|
+
tx.Memos[0].type === MemoTypes.CANDIDATE_STATUS_CHANGE && tx.Memos[0].format === MemoFormats.HEX && tx.Memos[0].data) {
|
12214
|
+
const memoBuf = Buffer.from(tx.Memos[0].data, 'hex');
|
12215
|
+
const candidateId = memoBuf.slice(0, 32).toString('hex');
|
12216
|
+
const candidateType = StateHelpers.getCandidateType(candidateId);
|
12217
|
+
|
12218
|
+
switch (candidateType) {
|
12219
|
+
case (EvernodeConstants.CandidateTypes.DudHost):
|
12220
|
+
return {
|
12221
|
+
name: memoBuf.readUInt8(32) === EvernodeConstants.CandidateStatuses.CANDIDATE_ELECTED ? EvernodeEvents.DudHostRemoved : EvernodeEvents.DudHostStatusChanged,
|
12222
|
+
data: {
|
12223
|
+
transaction: tx,
|
12224
|
+
candidateId: candidateId,
|
12225
|
+
host: codec.encodeAccountID(Buffer.from(candidateId, 'hex').slice(DUD_HOST_CANDID_ADDRESS_OFFSET, 32))
|
12226
|
+
}
|
12227
|
+
}
|
12228
|
+
case (EvernodeConstants.CandidateTypes.PilotedMode):
|
12229
|
+
return {
|
12230
|
+
name: EvernodeEvents.FallbackToPiloted,
|
12231
|
+
data: {
|
12232
|
+
transaction: tx,
|
12233
|
+
candidateId: candidateId,
|
12234
|
+
}
|
12235
|
+
}
|
12236
|
+
case (EvernodeConstants.CandidateTypes.NewHook):
|
12237
|
+
return {
|
12238
|
+
name: EvernodeEvents.NewHookStatusChanged,
|
12239
|
+
data: {
|
12240
|
+
transaction: tx,
|
12241
|
+
candidateId: candidateId,
|
12242
|
+
}
|
12243
|
+
}
|
12244
|
+
default:
|
12245
|
+
return null;
|
12246
|
+
}
|
12247
|
+
|
12248
|
+
}
|
12249
|
+
else if (tx.Memos.length >= 1 &&
|
12250
|
+
tx.Memos[0].type === MemoTypes.HOOK_UPDATE_RES && tx.Memos[0].format === MemoFormats.HEX && tx.Memos[0].data) {
|
12251
|
+
return {
|
12252
|
+
name: EvernodeEvents.ChildHookUpdated,
|
12253
|
+
data: {
|
12254
|
+
transaction: tx,
|
12255
|
+
account: tx.Account,
|
12256
|
+
candidateId: tx.Memos[0].data.substr(0, 64)
|
12257
|
+
}
|
12258
|
+
}
|
12259
|
+
}
|
12260
|
+
else if (tx.Memos.length >= 1 &&
|
12261
|
+
tx.Memos[0].type === MemoTypes.GOVERNANCE_MODE_CHANGE && tx.Memos[0].format === MemoFormats.HEX && tx.Memos[0].data) {
|
12262
|
+
const mode = Buffer.from(tx.Memos[0].data, 'hex').slice(0, 1).readUInt8();
|
12263
|
+
|
12264
|
+
return {
|
12265
|
+
name: EvernodeEvents.GovernanceModeChanged,
|
12266
|
+
data: {
|
12267
|
+
transaction: tx,
|
12268
|
+
mode: mode
|
12269
|
+
}
|
12270
|
+
}
|
12271
|
+
}
|
12272
|
+
else if (tx.Memos.length >= 1 &&
|
12273
|
+
tx.Memos[0].type === MemoTypes.CANDIDATE_VOTE && tx.Memos[0].format === MemoFormats.HEX && tx.Memos[0].data) {
|
12274
|
+
const vote = Buffer.from(tx.Memos[0].data, 'hex').slice(32, 33).readUInt8();
|
12275
|
+
|
12276
|
+
return {
|
12277
|
+
name: EvernodeEvents.FoundationVoted,
|
12278
|
+
data: {
|
12279
|
+
transaction: tx,
|
12280
|
+
candidateId: tx.Memos[0].data.substr(0, 64),
|
12281
|
+
vote: vote
|
12282
|
+
}
|
12283
|
+
}
|
12284
|
+
}
|
12285
|
+
else if (tx.Memos.length >= 1 &&
|
12286
|
+
tx.Memos[0].type === MemoTypes.DUD_HOST_REPORT && tx.Memos[0].format === MemoFormats.HEX && tx.Memos[0].data) {
|
12287
|
+
const candidateId = tx.Memos[0].data.substr(0, 64);
|
12288
|
+
|
12289
|
+
return {
|
12290
|
+
name: EvernodeEvents.DudHostReported,
|
12291
|
+
data: {
|
12292
|
+
transaction: tx,
|
12293
|
+
candidateId: candidateId,
|
12294
|
+
host: codec.encodeAccountID(Buffer.from(candidateId, 'hex').slice(DUD_HOST_CANDID_ADDRESS_OFFSET, 32))
|
12295
|
+
}
|
12296
|
+
}
|
12297
|
+
}
|
12182
12298
|
|
12183
12299
|
return null;
|
12184
12300
|
}
|
@@ -12186,12 +12302,12 @@ class BaseEvernodeClient {
|
|
12186
12302
|
/**
|
12187
12303
|
* Get the registered host information.
|
12188
12304
|
* @param {string} hostAddress [Optional] Address of the host.
|
12189
|
-
* @returns The registered host information object. Returns null
|
12305
|
+
* @returns The registered host information object. Returns null if not registered.
|
12190
12306
|
*/
|
12191
12307
|
async getHostInfo(hostAddress = this.xrplAcc.address) {
|
12192
12308
|
try {
|
12193
12309
|
const addrStateKey = StateHelpers.generateHostAddrStateKey(hostAddress);
|
12194
|
-
const addrStateIndex = StateHelpers.getHookStateIndex(this.
|
12310
|
+
const addrStateIndex = StateHelpers.getHookStateIndex(this.governorAddress, addrStateKey);
|
12195
12311
|
const addrLedgerEntry = await this.xrplApi.getLedgerEntry(addrStateIndex);
|
12196
12312
|
const addrStateData = addrLedgerEntry?.HookStateData;
|
12197
12313
|
if (addrStateData) {
|
@@ -12201,14 +12317,14 @@ class BaseEvernodeClient {
|
|
12201
12317
|
(addrStateDecoded.lastHeartbeatIndex >= (curMomentStartIdx - (this.config.hostHeartbeatFreq * this.config.momentSize))) :
|
12202
12318
|
(addrStateDecoded.lastHeartbeatIndex > 0))
|
12203
12319
|
|
12204
|
-
const
|
12205
|
-
const
|
12206
|
-
const
|
12320
|
+
const tokenIdStatekey = StateHelpers.generateTokenIdStateKey(addrStateDecoded.uriTokenId);
|
12321
|
+
const tokenIdStateIndex = StateHelpers.getHookStateIndex(this.governorAddress, tokenIdStatekey);
|
12322
|
+
const tokenIdLedgerEntry = await this.xrplApi.getLedgerEntry(tokenIdStateIndex);
|
12207
12323
|
|
12208
|
-
const
|
12209
|
-
if (
|
12210
|
-
const
|
12211
|
-
return { ...addrStateDecoded, ...
|
12324
|
+
const tokenIdStateData = tokenIdLedgerEntry?.HookStateData;
|
12325
|
+
if (tokenIdStateData) {
|
12326
|
+
const tokenIdStateDecoded = StateHelpers.decodeTokenIdState(Buffer.from(tokenIdStateData, 'hex'));
|
12327
|
+
return { ...addrStateDecoded, ...tokenIdStateDecoded };
|
12212
12328
|
}
|
12213
12329
|
}
|
12214
12330
|
}
|
@@ -12236,12 +12352,24 @@ class BaseEvernodeClient {
|
|
12236
12352
|
host.domain = await hostAcc.getDomain();
|
12237
12353
|
|
12238
12354
|
host.active = (host.lastHeartbeatIndex > (this.config.hostHeartbeatFreq * this.config.momentSize) ?
|
12239
|
-
|
12240
|
-
|
12355
|
+
(host.lastHeartbeatIndex >= (curMomentStartIdx - (this.config.hostHeartbeatFreq * this.config.momentSize))) :
|
12356
|
+
(host.lastHeartbeatIndex > 0));
|
12241
12357
|
return host;
|
12242
12358
|
}));
|
12243
12359
|
|
12244
|
-
return (hosts.nextPageToken ? {...hosts, data: res} : res);
|
12360
|
+
return (hosts.nextPageToken ? { ...hosts, data: res } : res);
|
12361
|
+
}
|
12362
|
+
|
12363
|
+
/**
|
12364
|
+
* Get all the candidates proposed in Evernode. The result's are paginated. Default page size is 20. Note: Specifying both filter and pagination does not supported.
|
12365
|
+
* @param {object} filters [Optional] Filter criteria to filter the hosts. The filter key can be a either property of the host.
|
12366
|
+
* @param {number} pageSize [Optional] Page size for the results.
|
12367
|
+
* @param {string} nextPageToken [Optional] Next page's token, If received by the previous result set.
|
12368
|
+
* @returns The list of candidates. The response will be in '{data: [], nextPageToken: ''}' only if there are more pages. Otherwise the response will only contain the host list.
|
12369
|
+
*/
|
12370
|
+
async getCandidates(filters = null, pageSize = null, nextPageToken = null) {
|
12371
|
+
const candidates = await this.#firestoreHandler.getCandidates(filters, pageSize, nextPageToken);
|
12372
|
+
return candidates;
|
12245
12373
|
}
|
12246
12374
|
|
12247
12375
|
/**
|
@@ -12290,12 +12418,35 @@ class BaseEvernodeClient {
|
|
12290
12418
|
return fullHostList;
|
12291
12419
|
}
|
12292
12420
|
|
12421
|
+
/**
|
12422
|
+
* Get all the candidates without paginating.
|
12423
|
+
* @returns The list of candidates.
|
12424
|
+
*/
|
12425
|
+
async getAllCandidates() {
|
12426
|
+
let fullCandidateList = [];
|
12427
|
+
const candidates = await this.#firestoreHandler.getCandidates();
|
12428
|
+
if (candidates.nextPageToken) {
|
12429
|
+
let currentPageToken = candidates.nextPageToken;
|
12430
|
+
let nextCandidates = null;
|
12431
|
+
fullCandidateList = fullCandidateList.concat(candidates.data);
|
12432
|
+
while (currentPageToken) {
|
12433
|
+
nextCandidates = await this.#firestoreHandler.getCandidates(null, 50, currentPageToken);
|
12434
|
+
fullCandidateList = fullCandidateList.concat(nextCandidates.nextPageToken ? nextCandidates.data : nextCandidates);
|
12435
|
+
currentPageToken = nextCandidates.nextPageToken;
|
12436
|
+
}
|
12437
|
+
} else {
|
12438
|
+
fullCandidateList = fullCandidateList.concat(candidates);
|
12439
|
+
}
|
12440
|
+
|
12441
|
+
return fullCandidateList;
|
12442
|
+
}
|
12443
|
+
|
12293
12444
|
/**
|
12294
12445
|
* Remove a host which is inactive for a long period. The inactivity is checked by Evernode it self and only pruned if inactive thresholds are met.
|
12295
12446
|
* @param {string} hostAddress XRPL address of the host to be pruned.
|
12296
12447
|
*/
|
12297
12448
|
async pruneDeadHost(hostAddress) {
|
12298
|
-
if (this.xrplAcc.address === this.registryAddress)
|
12449
|
+
if (this.xrplAcc.address === this.config.registryAddress)
|
12299
12450
|
throw 'Invalid function call';
|
12300
12451
|
|
12301
12452
|
let memoData = Buffer.allocUnsafe(20);
|
@@ -12303,27 +12454,224 @@ class BaseEvernodeClient {
|
|
12303
12454
|
|
12304
12455
|
// To obtain registration NFT Page Keylet and index.
|
12305
12456
|
const hostAcc = new XrplAccount(hostAddress, null, { xrplApi: this.xrplApi });
|
12306
|
-
const
|
12307
|
-
if (
|
12308
|
-
|
12309
|
-
|
12310
|
-
|
12311
|
-
|
12312
|
-
|
12313
|
-
|
12314
|
-
|
12315
|
-
XrplConstants.MIN_XRP_AMOUNT,
|
12316
|
-
XrplConstants.XRP,
|
12317
|
-
null,
|
12318
|
-
[
|
12319
|
-
{ type: MemoTypes.DEAD_HOST_PRUNE, format: MemoFormats.HEX, data: memoData.toString('hex') },
|
12320
|
-
{ type: MemoTypes.HOST_REGISTRY_REF, format: MemoFormats.HEX, data: nftPageDataBuf.toString('hex') }
|
12321
|
-
]);
|
12322
|
-
} else
|
12323
|
-
throw "Invalid Registration NFT."
|
12457
|
+
const regUriToken = (await hostAcc.getURITokens()).find(n => n.URI.startsWith(EvernodeConstants.TOKEN_PREFIX_HEX) && n.Issuer === this.config.registryAddress);
|
12458
|
+
if (regUriToken) {
|
12459
|
+
await this.xrplAcc.makePayment(this.config.registryAddress,
|
12460
|
+
XrplConstants.MIN_XRP_AMOUNT,
|
12461
|
+
XrplConstants.XRP,
|
12462
|
+
null,
|
12463
|
+
[
|
12464
|
+
{ type: MemoTypes.DEAD_HOST_PRUNE, format: MemoFormats.HEX, data: memoData.toString('hex') }
|
12465
|
+
]);
|
12324
12466
|
} else
|
12325
|
-
throw "No Registration
|
12467
|
+
throw "No Registration URI token was found for the Host account."
|
12468
|
+
|
12469
|
+
}
|
12470
|
+
|
12471
|
+
/**
|
12472
|
+
* Get proposed candidate info.
|
12473
|
+
* @param {string} ownerAddress [Optional] Address of the owner.
|
12474
|
+
* @returns The candidate information. Returns null if no candidate.
|
12475
|
+
*/
|
12476
|
+
async getCandidateByOwner(ownerAddress = this.xrplAcc.address) {
|
12477
|
+
try {
|
12478
|
+
const ownerStateKey = StateHelpers.generateCandidateOwnerStateKey(ownerAddress);
|
12479
|
+
const ownerStateIndex = StateHelpers.getHookStateIndex(this.governorAddress, ownerStateKey);
|
12480
|
+
const ownerLedgerEntry = await this.xrplApi.getLedgerEntry(ownerStateIndex);
|
12481
|
+
const ownerStateData = ownerLedgerEntry?.HookStateData;
|
12482
|
+
if (ownerStateData) {
|
12483
|
+
const ownerStateDecoded = StateHelpers.decodeCandidateOwnerState(Buffer.from(ownerStateKey, 'hex'), Buffer.from(ownerStateData, 'hex'));
|
12484
|
+
|
12485
|
+
const idStateKey = StateHelpers.generateCandidateIdStateKey(ownerStateDecoded.uniqueId);
|
12486
|
+
const idStateIndex = StateHelpers.getHookStateIndex(this.governorAddress, idStateKey);
|
12487
|
+
const idLedgerEntry = await this.xrplApi.getLedgerEntry(idStateIndex);
|
12488
|
+
|
12489
|
+
const idStateData = idLedgerEntry?.HookStateData;
|
12490
|
+
if (idStateData) {
|
12491
|
+
const idStateDecoded = StateHelpers.decodeCandidateIdState(Buffer.from(idStateData, 'hex'));
|
12492
|
+
return { ...ownerStateDecoded, ...idStateDecoded };
|
12493
|
+
}
|
12494
|
+
}
|
12495
|
+
}
|
12496
|
+
catch (e) {
|
12497
|
+
// If the exception is entryNotFound from Rippled there's no entry for the host, So return null.
|
12498
|
+
if (e?.data?.error !== 'entryNotFound')
|
12499
|
+
throw e;
|
12500
|
+
}
|
12326
12501
|
|
12502
|
+
return null;
|
12503
|
+
}
|
12504
|
+
|
12505
|
+
/**
|
12506
|
+
* Get proposed candidate info.
|
12507
|
+
* @param {string} candidateId Id of the candidate.
|
12508
|
+
* @returns The candidate information. Returns null if no candidate.
|
12509
|
+
*/
|
12510
|
+
async getCandidateById(candidateId) {
|
12511
|
+
try {
|
12512
|
+
const idStateKey = StateHelpers.generateCandidateIdStateKey(candidateId);
|
12513
|
+
const idStateIndex = StateHelpers.getHookStateIndex(this.governorAddress, idStateKey);
|
12514
|
+
const idLedgerEntry = await this.xrplApi.getLedgerEntry(idStateIndex);
|
12515
|
+
const idStateData = idLedgerEntry?.HookStateData;
|
12516
|
+
if (idStateData) {
|
12517
|
+
const idStateDecoded = StateHelpers.decodeCandidateIdState(Buffer.from(idStateData, 'hex'));
|
12518
|
+
|
12519
|
+
const ownerStateKey = StateHelpers.generateCandidateOwnerStateKey(idStateDecoded.ownerAddress);
|
12520
|
+
const ownerStateIndex = StateHelpers.getHookStateIndex(this.governorAddress, ownerStateKey);
|
12521
|
+
const ownerLedgerEntry = await this.xrplApi.getLedgerEntry(ownerStateIndex);
|
12522
|
+
|
12523
|
+
const ownerStateData = ownerLedgerEntry?.HookStateData;
|
12524
|
+
if (ownerStateData) {
|
12525
|
+
const ownerStateDecoded = StateHelpers.decodeCandidateOwnerState(Buffer.from(ownerStateKey, 'hex'), Buffer.from(ownerStateData, 'hex'));
|
12526
|
+
return { ...ownerStateDecoded, ...idStateDecoded };
|
12527
|
+
}
|
12528
|
+
}
|
12529
|
+
}
|
12530
|
+
catch (e) {
|
12531
|
+
// If the exception is entryNotFound from Rippled there's no entry for the host, So return null.
|
12532
|
+
if (e?.data?.error !== 'entryNotFound')
|
12533
|
+
throw e;
|
12534
|
+
}
|
12535
|
+
|
12536
|
+
return null;
|
12537
|
+
}
|
12538
|
+
|
12539
|
+
/**
|
12540
|
+
* Get reported dud host info.
|
12541
|
+
* @param {string} hostAddress [Optional] Address of the dud host.
|
12542
|
+
* @returns The dud host candidate information. Returns null if no candidate.
|
12543
|
+
*/
|
12544
|
+
async getDudHostVoteInfo(hostAddress = this.xrplAcc.address) {
|
12545
|
+
try {
|
12546
|
+
const candidateId = StateHelpers.getDudHostCandidateId(hostAddress);
|
12547
|
+
const idStateKey = StateHelpers.generateCandidateIdStateKey(candidateId);
|
12548
|
+
const idStateIndex = StateHelpers.getHookStateIndex(this.governorAddress, idStateKey);
|
12549
|
+
const idLedgerEntry = await this.xrplApi.getLedgerEntry(idStateIndex);
|
12550
|
+
|
12551
|
+
const idStateData = idLedgerEntry?.HookStateData;
|
12552
|
+
if (idStateData) {
|
12553
|
+
const idStateDecoded = StateHelpers.decodeCandidateIdState(Buffer.from(idStateData, 'hex'));
|
12554
|
+
return idStateDecoded;
|
12555
|
+
}
|
12556
|
+
}
|
12557
|
+
catch (e) {
|
12558
|
+
// If the exception is entryNotFound from Rippled there's no entry for the host, So return null.
|
12559
|
+
if (e?.data?.error !== 'entryNotFound')
|
12560
|
+
throw e;
|
12561
|
+
}
|
12562
|
+
|
12563
|
+
return null;
|
12564
|
+
}
|
12565
|
+
|
12566
|
+
/**
|
12567
|
+
* Get piloted mode vote info.
|
12568
|
+
* @returns The piloted mode candidate information. Returns null if no candidate.
|
12569
|
+
*/
|
12570
|
+
async getPilotedModeVoteInfo() {
|
12571
|
+
try {
|
12572
|
+
const candidateId = StateHelpers.getPilotedModeCandidateId();
|
12573
|
+
const idStateKey = StateHelpers.generateCandidateIdStateKey(candidateId);
|
12574
|
+
const idStateIndex = StateHelpers.getHookStateIndex(this.governorAddress, idStateKey);
|
12575
|
+
const idLedgerEntry = await this.xrplApi.getLedgerEntry(idStateIndex);
|
12576
|
+
|
12577
|
+
const idStateData = idLedgerEntry?.HookStateData;
|
12578
|
+
if (idStateData) {
|
12579
|
+
const idStateDecoded = StateHelpers.decodeCandidateIdState(Buffer.from(idStateData, 'hex'));
|
12580
|
+
return idStateDecoded;
|
12581
|
+
}
|
12582
|
+
}
|
12583
|
+
catch (e) {
|
12584
|
+
// If the exception is entryNotFound from Rippled there's no entry for the host, So return null.
|
12585
|
+
if (e?.data?.error !== 'entryNotFound')
|
12586
|
+
throw e;
|
12587
|
+
}
|
12588
|
+
|
12589
|
+
return null;
|
12590
|
+
}
|
12591
|
+
|
12592
|
+
/**
|
12593
|
+
* Withdraw a hook candidate.
|
12594
|
+
* @param {*} hashes Hook candidate hashes in hex format, <GOVERNOR_HASH(32)><REGISTRY_HASH(32)><HEARTBEAT_HASH(32)>.
|
12595
|
+
* @param {*} shortName Short name for the proposal candidate.
|
12596
|
+
* @param {*} options [Optional] transaction options.
|
12597
|
+
* @returns Proposed candidate id.
|
12598
|
+
*/
|
12599
|
+
async _propose(hashes, shortName, options = {}) {
|
12600
|
+
const hashesBuf = Buffer.from(hashes, 'hex');
|
12601
|
+
if (!hashesBuf || hashesBuf.length != 96)
|
12602
|
+
throw 'Invalid hashes: Hashes should contain all three Governor, Registry, Heartbeat hook hashes.';
|
12603
|
+
|
12604
|
+
// Check whether hook hashes exist in the definition.
|
12605
|
+
let keylets = [];
|
12606
|
+
for (const [i, hook] of EvernodeConstants.HOOKS.entries()) {
|
12607
|
+
const index = HookHelpers.getHookDefinitionIndex(hashes.substr(i * 64, 64));
|
12608
|
+
const ledgerEntry = await this.xrplApi.getLedgerEntry(index);
|
12609
|
+
if (!ledgerEntry)
|
12610
|
+
throw `No hook exists with the specified ${hook} hook hash.`;
|
12611
|
+
else
|
12612
|
+
keylets.push(HookHelpers.getHookDefinitionKeylet(index));
|
12613
|
+
}
|
12614
|
+
|
12615
|
+
const uniqueId = StateHelpers.getNewHookCandidateId(hashesBuf);
|
12616
|
+
const memoBuf = Buffer.alloc(CANDIDATE_PROPOSE_MEMO_SIZE);
|
12617
|
+
Buffer.from(uniqueId, 'hex').copy(memoBuf, CANDIDATE_PROPOSE_UNIQUE_ID_MEMO_OFFSET);
|
12618
|
+
Buffer.from(shortName.substr(0, 20), "utf-8").copy(memoBuf, CANDIDATE_PROPOSE_SHORT_NAME_MEMO_OFFSET);
|
12619
|
+
Buffer.from(keylets.join(''), 'hex').copy(memoBuf, CANDIDATE_PROPOSE_KEYLETS_MEMO_OFFSET);
|
12620
|
+
|
12621
|
+
// Get the proposal fee. Proposal fee is current epochs moment worth of rewards.
|
12622
|
+
const proposalFee = EvernodeHelpers.getEpochRewardQuota(this.config.rewardInfo.epoch, this.config.rewardConfiguration.firstEpochRewardQuota);
|
12623
|
+
|
12624
|
+
await this.xrplAcc.makePayment(this.governorAddress,
|
12625
|
+
proposalFee.toString(),
|
12626
|
+
EvernodeConstants.EVR,
|
12627
|
+
this.config.evrIssuerAddress,
|
12628
|
+
[
|
12629
|
+
{ type: MemoTypes.CANDIDATE_PROPOSE, format: MemoFormats.HEX, data: hashesBuf.toString('hex').toUpperCase() },
|
12630
|
+
{ type: MemoTypes.CANDIDATE_PROPOSE_REF, format: MemoFormats.HEX, data: memoBuf.toString('hex').toUpperCase() }
|
12631
|
+
],
|
12632
|
+
options.transactionOptions);
|
12633
|
+
|
12634
|
+
return uniqueId;
|
12635
|
+
}
|
12636
|
+
|
12637
|
+
/**
|
12638
|
+
* Withdraw a hook candidate.
|
12639
|
+
* @param {string} candidateId Id of the candidate in hex format.
|
12640
|
+
* @param {*} options [Optional] transaction options.
|
12641
|
+
* @returns Transaction result.
|
12642
|
+
*/
|
12643
|
+
async _withdraw(candidateId, options = {}) {
|
12644
|
+
const candidateIdBuf = Buffer.from(candidateId, 'hex');
|
12645
|
+
return await this.xrplAcc.makePayment(this.governorAddress,
|
12646
|
+
XrplConstants.MIN_XRP_AMOUNT,
|
12647
|
+
XrplConstants.XRP,
|
12648
|
+
null,
|
12649
|
+
[
|
12650
|
+
{ type: MemoTypes.CANDIDATE_WITHDRAW, format: MemoFormats.HEX, data: candidateIdBuf.toString('hex').toUpperCase() }
|
12651
|
+
],
|
12652
|
+
options.transactionOptions);
|
12653
|
+
}
|
12654
|
+
|
12655
|
+
/**
|
12656
|
+
* Report dud host for removal.
|
12657
|
+
* @param {*} hostAddress Address of the dud host.
|
12658
|
+
* @param {*} options [Optional] transaction options.
|
12659
|
+
* @returns Transaction result.
|
12660
|
+
*/
|
12661
|
+
async _reportDudHost(hostAddress, options = {}) {
|
12662
|
+
const candidateId = StateHelpers.getDudHostCandidateId(hostAddress);
|
12663
|
+
|
12664
|
+
// Get the proposal fee. Proposal fee is 25% of current epochs moment worth of rewards.
|
12665
|
+
const proposalFee = (EvernodeHelpers.getEpochRewardQuota(this.config.rewardInfo.epoch, this.config.rewardConfiguration.firstEpochRewardQuota) / 4);
|
12666
|
+
|
12667
|
+
return await this.xrplAcc.makePayment(this.governorAddress,
|
12668
|
+
proposalFee.toString(),
|
12669
|
+
EvernodeConstants.EVR,
|
12670
|
+
this.config.evrIssuerAddress,
|
12671
|
+
[
|
12672
|
+
{ type: MemoTypes.DUD_HOST_REPORT, format: MemoFormats.HEX, data: candidateId }
|
12673
|
+
],
|
12674
|
+
options.transactionOptions);
|
12327
12675
|
}
|
12328
12676
|
}
|
12329
12677
|
|
@@ -12332,6 +12680,310 @@ module.exports = {
|
|
12332
12680
|
}
|
12333
12681
|
|
12334
12682
|
|
12683
|
+
/***/ }),
|
12684
|
+
|
12685
|
+
/***/ 2466:
|
12686
|
+
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
12687
|
+
|
12688
|
+
const { Buffer } = __nccwpck_require__(4300);
|
12689
|
+
const { MemoTypes, MemoFormats } = __nccwpck_require__(9849);
|
12690
|
+
const { StateHelpers } = __nccwpck_require__(3860);
|
12691
|
+
const { XrplConstants } = __nccwpck_require__(3307);
|
12692
|
+
const { BaseEvernodeClient } = __nccwpck_require__(6263);
|
12693
|
+
|
12694
|
+
const CANDIDATE_VOTE_UNIQUE_ID_MEMO_OFFSET = 0;
|
12695
|
+
const CANDIDATE_VOTE_VALUE_MEMO_OFFSET = 32;
|
12696
|
+
const CANDIDATE_VOTE_MEMO_SIZE = 33;
|
12697
|
+
|
12698
|
+
const FoundationEvents = {}
|
12699
|
+
|
12700
|
+
class FoundationClient extends BaseEvernodeClient {
|
12701
|
+
|
12702
|
+
/**
|
12703
|
+
* Constructs a tenant client instance.
|
12704
|
+
* @param {string} xrpAddress XRPL address of the tenant.
|
12705
|
+
* @param {string} XRPL secret of the tenant.
|
12706
|
+
* @param {object} options [Optional] An object with 'rippledServer' URL and 'governorAddress'.
|
12707
|
+
*/
|
12708
|
+
constructor(xrpAddress, xrpSecret, options = {}) {
|
12709
|
+
super(xrpAddress, xrpSecret, Object.values(FoundationEvents), false, options);
|
12710
|
+
}
|
12711
|
+
|
12712
|
+
async propose(hashes, shortName, options = {}) {
|
12713
|
+
if (this.xrplAcc.address !== this.config.foundationAddress)
|
12714
|
+
throw `Invalid foundation address ${this.xrplAcc.address}.`;
|
12715
|
+
|
12716
|
+
return await super._propose(hashes, shortName, options);
|
12717
|
+
}
|
12718
|
+
|
12719
|
+
async withdraw(candidateId, options = {}) {
|
12720
|
+
if (this.xrplAcc.address !== this.config.foundationAddress)
|
12721
|
+
throw `Invalid foundation address ${this.xrplAcc.address}.`;
|
12722
|
+
|
12723
|
+
return await super._withdraw(candidateId, options);
|
12724
|
+
}
|
12725
|
+
|
12726
|
+
/**
|
12727
|
+
* Vote for a hook candidate.
|
12728
|
+
* @param {string} candidateId Id of the candidate in hex format.
|
12729
|
+
* @param {int} vote Vote value CandidateVote (0 - Reject, 1 - Support).
|
12730
|
+
* @param {*} options [Optional] transaction options.
|
12731
|
+
* @returns Transaction result.
|
12732
|
+
*/
|
12733
|
+
async vote(candidateId, vote, options = {}) {
|
12734
|
+
if (this.xrplAcc.address !== this.config.foundationAddress)
|
12735
|
+
throw `Invalid foundation address ${this.xrplAcc.address}.`;
|
12736
|
+
|
12737
|
+
const voteBuf = Buffer.alloc(CANDIDATE_VOTE_MEMO_SIZE);
|
12738
|
+
Buffer.from(candidateId, 'hex').copy(voteBuf, CANDIDATE_VOTE_UNIQUE_ID_MEMO_OFFSET);
|
12739
|
+
voteBuf.writeUInt8(vote, CANDIDATE_VOTE_VALUE_MEMO_OFFSET)
|
12740
|
+
|
12741
|
+
return await this.xrplAcc.makePayment(this.governorAddress,
|
12742
|
+
XrplConstants.MIN_XRP_AMOUNT,
|
12743
|
+
XrplConstants.XRP,
|
12744
|
+
null,
|
12745
|
+
[
|
12746
|
+
{ type: MemoTypes.CANDIDATE_VOTE, format: MemoFormats.HEX, data: voteBuf.toString('hex').toUpperCase() }
|
12747
|
+
],
|
12748
|
+
options.transactionOptions);
|
12749
|
+
}
|
12750
|
+
|
12751
|
+
async reportDudHost(hostAddress, options = {}) {
|
12752
|
+
if (this.xrplAcc.address !== this.config.foundationAddress)
|
12753
|
+
throw `Invalid foundation address ${this.xrplAcc.address}.`;
|
12754
|
+
|
12755
|
+
return await this._reportDudHost(hostAddress, options);
|
12756
|
+
}
|
12757
|
+
|
12758
|
+
/**
|
12759
|
+
* Vote for a dud host.
|
12760
|
+
* @param {string} hostAddress Address of the dud host.
|
12761
|
+
* @param {int} vote Vote value CandidateVote (0 - Reject, 1 - Support).
|
12762
|
+
* @param {*} options [Optional] transaction options.
|
12763
|
+
* @returns Transaction result.
|
12764
|
+
*/
|
12765
|
+
async voteDudHost(hostAddress, vote, options = {}) {
|
12766
|
+
if (this.xrplAcc.address !== this.config.foundationAddress)
|
12767
|
+
throw `Invalid foundation address ${this.xrplAcc.address}.`;
|
12768
|
+
|
12769
|
+
const candidateId = StateHelpers.getDudHostCandidateId(hostAddress);
|
12770
|
+
return await this.vote(candidateId, vote, options);
|
12771
|
+
}
|
12772
|
+
|
12773
|
+
/**
|
12774
|
+
* Vote for a piloted mode.
|
12775
|
+
* @param {int} vote Vote value CandidateVote (0 - Reject, 1 - Support).
|
12776
|
+
* @param {*} options [Optional] transaction options.
|
12777
|
+
* @returns Transaction result.
|
12778
|
+
*/
|
12779
|
+
async votePilotedMode(vote, options = {}) {
|
12780
|
+
if (this.xrplAcc.address !== this.config.foundationAddress)
|
12781
|
+
throw `Invalid foundation address ${this.xrplAcc.address}.`;
|
12782
|
+
|
12783
|
+
const candidateId = StateHelpers.getPilotedModeCandidateId();
|
12784
|
+
return await this.vote(candidateId, vote, options);
|
12785
|
+
}
|
12786
|
+
|
12787
|
+
/**
|
12788
|
+
* Change the governance mode.
|
12789
|
+
* @param {int} mode Mode (1 - Piloted, 2 - CoPiloted, 3 - AutoPiloted).
|
12790
|
+
* @param {*} options [Optional] transaction options.
|
12791
|
+
* @returns Transaction result.
|
12792
|
+
*/
|
12793
|
+
async changeGovernanceMode(mode, options = {}) {
|
12794
|
+
if (this.xrplAcc.address !== this.config.foundationAddress)
|
12795
|
+
throw `Invalid foundation address ${this.xrplAcc.address}.`;
|
12796
|
+
|
12797
|
+
const modeBuf = Buffer.alloc(1);
|
12798
|
+
modeBuf.writeUInt8(mode);
|
12799
|
+
|
12800
|
+
return await this.xrplAcc.makePayment(this.governorAddress,
|
12801
|
+
XrplConstants.MIN_XRP_AMOUNT,
|
12802
|
+
XrplConstants.XRP,
|
12803
|
+
null,
|
12804
|
+
[
|
12805
|
+
{ type: MemoTypes.GOVERNANCE_MODE_CHANGE, format: MemoFormats.HEX, data: modeBuf.toString('hex').toUpperCase() }
|
12806
|
+
],
|
12807
|
+
options.transactionOptions);
|
12808
|
+
}
|
12809
|
+
}
|
12810
|
+
|
12811
|
+
module.exports = {
|
12812
|
+
FoundationEvents,
|
12813
|
+
FoundationClient
|
12814
|
+
}
|
12815
|
+
|
12816
|
+
/***/ }),
|
12817
|
+
|
12818
|
+
/***/ 335:
|
12819
|
+
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
12820
|
+
|
12821
|
+
const { BaseEvernodeClient } = __nccwpck_require__(6263);
|
12822
|
+
const { DefaultValues } = __nccwpck_require__(8262);
|
12823
|
+
const { EvernodeEvents } = __nccwpck_require__(9849);
|
12824
|
+
|
12825
|
+
const GovernorEvents = {
|
12826
|
+
Initialized: EvernodeEvents.Initialized,
|
12827
|
+
CandidateProposed: EvernodeEvents.CandidateProposed,
|
12828
|
+
CandidateWithdrew: EvernodeEvents.CandidateWithdrew,
|
12829
|
+
ChildHookUpdated: EvernodeEvents.ChildHookUpdated,
|
12830
|
+
GovernanceModeChanged: EvernodeEvents.GovernanceModeChanged,
|
12831
|
+
FoundationVoted: EvernodeEvents.FoundationVoted,
|
12832
|
+
DudHostReported: EvernodeEvents.DudHostReported,
|
12833
|
+
DudHostRemoved: EvernodeEvents.DudHostRemoved,
|
12834
|
+
DudHostStatusChanged: EvernodeEvents.DudHostStatusChanged,
|
12835
|
+
FallbackToPiloted: EvernodeEvents.FallbackToPiloted,
|
12836
|
+
NewHookStatusChanged: EvernodeEvents.NewHookStatusChanged
|
12837
|
+
}
|
12838
|
+
|
12839
|
+
class GovernorClient extends BaseEvernodeClient {
|
12840
|
+
constructor(options = {}) {
|
12841
|
+
super((options.governorAddress || DefaultValues.governorAddress), null, Object.values(GovernorEvents), false, options);
|
12842
|
+
}
|
12843
|
+
}
|
12844
|
+
|
12845
|
+
module.exports = {
|
12846
|
+
GovernorClient,
|
12847
|
+
GovernorEvents
|
12848
|
+
}
|
12849
|
+
|
12850
|
+
/***/ }),
|
12851
|
+
|
12852
|
+
/***/ 6510:
|
12853
|
+
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
12854
|
+
|
12855
|
+
const { BaseEvernodeClient } = __nccwpck_require__(6263);
|
12856
|
+
const { EvernodeEvents } = __nccwpck_require__(9849);
|
12857
|
+
|
12858
|
+
const HeartbeatEvents = {
|
12859
|
+
Heartbeat: EvernodeEvents.Heartbeat
|
12860
|
+
}
|
12861
|
+
|
12862
|
+
class HeartbeatClient extends BaseEvernodeClient {
|
12863
|
+
constructor(options = {}) {
|
12864
|
+
super(options.heartbeatAddress, null, Object.values(HeartbeatEvents), false, options);
|
12865
|
+
}
|
12866
|
+
}
|
12867
|
+
|
12868
|
+
module.exports = {
|
12869
|
+
HeartbeatClient,
|
12870
|
+
HeartbeatEvents
|
12871
|
+
}
|
12872
|
+
|
12873
|
+
/***/ }),
|
12874
|
+
|
12875
|
+
/***/ 2344:
|
12876
|
+
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
12877
|
+
|
12878
|
+
const { HookTypes } = __nccwpck_require__(8262);
|
12879
|
+
const { RegistryClient } = __nccwpck_require__(8074);
|
12880
|
+
const { GovernorClient } = __nccwpck_require__(335);
|
12881
|
+
const { HeartbeatClient } = __nccwpck_require__(6510);
|
12882
|
+
|
12883
|
+
class HookClientFactory {
|
12884
|
+
static async create(hookType) {
|
12885
|
+
let hookClient;
|
12886
|
+
switch (hookType) {
|
12887
|
+
case HookTypes.governor: {
|
12888
|
+
hookClient = new GovernorClient();
|
12889
|
+
break;
|
12890
|
+
}
|
12891
|
+
case HookTypes.registry: {
|
12892
|
+
const registryAddress = await HookClientFactory.#getAccountAddress(hookType);
|
12893
|
+
hookClient = new RegistryClient({ registryAddress: registryAddress });
|
12894
|
+
break;
|
12895
|
+
}
|
12896
|
+
case HookTypes.heartbeat: {
|
12897
|
+
const heartbeatAddress = await HookClientFactory.#getAccountAddress(hookType);
|
12898
|
+
hookClient = new HeartbeatClient({ heartbeatAddress: heartbeatAddress });
|
12899
|
+
break;
|
12900
|
+
}
|
12901
|
+
default: {
|
12902
|
+
hookClient = null;
|
12903
|
+
break;
|
12904
|
+
}
|
12905
|
+
}
|
12906
|
+
|
12907
|
+
return hookClient;
|
12908
|
+
}
|
12909
|
+
|
12910
|
+
static async #getAccountAddress(hookType) {
|
12911
|
+
const governorHook = await HookClientFactory.create(HookTypes.governor);
|
12912
|
+
|
12913
|
+
let configs;
|
12914
|
+
try {
|
12915
|
+
await governorHook.connect();
|
12916
|
+
configs = governorHook.config;
|
12917
|
+
} catch (error) {
|
12918
|
+
throw (error)
|
12919
|
+
} finally {
|
12920
|
+
await governorHook.disconnect();
|
12921
|
+
}
|
12922
|
+
|
12923
|
+
if (hookType == HookTypes.registry)
|
12924
|
+
return configs.registryAddress;
|
12925
|
+
else if (hookType == HookTypes.heartbeat)
|
12926
|
+
return configs.heartbeatAddress;
|
12927
|
+
|
12928
|
+
}
|
12929
|
+
}
|
12930
|
+
|
12931
|
+
module.exports = {
|
12932
|
+
HookClientFactory
|
12933
|
+
}
|
12934
|
+
|
12935
|
+
/***/ }),
|
12936
|
+
|
12937
|
+
/***/ 8074:
|
12938
|
+
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
12939
|
+
|
12940
|
+
const { BaseEvernodeClient } = __nccwpck_require__(6263);
|
12941
|
+
const { EvernodeEvents } = __nccwpck_require__(9849);
|
12942
|
+
|
12943
|
+
const RegistryEvents = {
|
12944
|
+
HostRegistered: EvernodeEvents.HostRegistered,
|
12945
|
+
HostDeregistered: EvernodeEvents.HostDeregistered,
|
12946
|
+
HostRegUpdated: EvernodeEvents.HostRegUpdated,
|
12947
|
+
DeadHostPrune: EvernodeEvents.DeadHostPrune,
|
12948
|
+
HostTransfer: EvernodeEvents.HostTransfer,
|
12949
|
+
HostRebate: EvernodeEvents.HostRebate
|
12950
|
+
}
|
12951
|
+
|
12952
|
+
class RegistryClient extends BaseEvernodeClient {
|
12953
|
+
|
12954
|
+
constructor(options = {}) {
|
12955
|
+
super(options.registryAddress, null, Object.values(RegistryEvents), false, options);
|
12956
|
+
}
|
12957
|
+
|
12958
|
+
/**
|
12959
|
+
* Gets all the active hosts registered in Evernode without paginating.
|
12960
|
+
* @returns The list of active hosts.
|
12961
|
+
*/
|
12962
|
+
async getActiveHosts() {
|
12963
|
+
let fullHostList = [];
|
12964
|
+
const hosts = await this.getHosts();
|
12965
|
+
if (hosts.nextPageToken) {
|
12966
|
+
let currentPageToken = hosts.nextPageToken;
|
12967
|
+
let nextHosts = null;
|
12968
|
+
fullHostList = fullHostList.concat(hosts.data);
|
12969
|
+
while (currentPageToken) {
|
12970
|
+
nextHosts = await this.getHosts(null, null, currentPageToken);
|
12971
|
+
fullHostList = fullHostList.concat(nextHosts.nextPageToken ? nextHosts.data : nextHosts);
|
12972
|
+
currentPageToken = nextHosts.nextPageToken;
|
12973
|
+
}
|
12974
|
+
} else {
|
12975
|
+
fullHostList = fullHostList.concat(hosts);
|
12976
|
+
}
|
12977
|
+
// Filter only active hosts.
|
12978
|
+
return fullHostList.filter(h => h.active);
|
12979
|
+
}
|
12980
|
+
}
|
12981
|
+
|
12982
|
+
module.exports = {
|
12983
|
+
RegistryClient,
|
12984
|
+
RegistryEvents
|
12985
|
+
}
|
12986
|
+
|
12335
12987
|
/***/ }),
|
12336
12988
|
|
12337
12989
|
/***/ 1437:
|
@@ -12347,6 +12999,7 @@ const codec = __nccwpck_require__(597);
|
|
12347
12999
|
const { XflHelpers } = __nccwpck_require__(3243);
|
12348
13000
|
const { EvernodeHelpers } = __nccwpck_require__(2523);
|
12349
13001
|
const { StateHelpers } = __nccwpck_require__(3860);
|
13002
|
+
const { TransactionHelper } = __nccwpck_require__(7071);
|
12350
13003
|
|
12351
13004
|
const OFFER_WAIT_TIMEOUT = 60;
|
12352
13005
|
|
@@ -12378,33 +13031,26 @@ const HOST_UPDATE_DESCRIPTION_MEMO_OFFSET = 54;
|
|
12378
13031
|
const HOST_UPDATE_VERSION_MEMO_OFFSET = 80;
|
12379
13032
|
const HOST_UPDATE_MEMO_SIZE = 83;
|
12380
13033
|
|
13034
|
+
const VOTE_VALIDATION_ERR = "VOTE_VALIDATION_ERR";
|
13035
|
+
|
12381
13036
|
class HostClient extends BaseEvernodeClient {
|
12382
13037
|
|
12383
13038
|
constructor(xrpAddress, xrpSecret, options = {}) {
|
12384
13039
|
super(xrpAddress, xrpSecret, Object.values(HostEvents), true, options);
|
12385
13040
|
}
|
12386
13041
|
|
12387
|
-
async
|
13042
|
+
async getRegistrationUriToken() {
|
12388
13043
|
// Find an owned NFT with matching Evernode host NFT prefix.
|
12389
|
-
const
|
12390
|
-
|
12391
|
-
// Check whether the token was actually issued from Evernode registry contract.
|
12392
|
-
const issuerHex = nft.NFTokenID.substr(8, 40);
|
12393
|
-
const issuerAddr = codec.encodeAccountID(Buffer.from(issuerHex, 'hex'));
|
12394
|
-
if (issuerAddr == this.registryAddress) {
|
12395
|
-
return nft;
|
12396
|
-
}
|
12397
|
-
}
|
12398
|
-
|
12399
|
-
return null;
|
13044
|
+
const uriToken = (await this.xrplAcc.getURITokens()).find(n => n.URI.startsWith(EvernodeConstants.TOKEN_PREFIX_HEX) && n.Issuer === this.config.registryAddress);
|
13045
|
+
return uriToken ?? null;
|
12400
13046
|
}
|
12401
13047
|
|
12402
13048
|
async getRegistration() {
|
12403
13049
|
// Check whether we own an evernode host token.
|
12404
|
-
const
|
12405
|
-
if (
|
13050
|
+
const regUriToken = await this.getRegistrationUriToken();
|
13051
|
+
if (regUriToken) {
|
12406
13052
|
const host = await this.getHostInfo();
|
12407
|
-
return (host?.
|
13053
|
+
return (host?.uriTokenId == regUriToken.index) ? host : null;
|
12408
13054
|
}
|
12409
13055
|
|
12410
13056
|
return null;
|
@@ -12446,29 +13092,27 @@ class HostClient extends BaseEvernodeClient {
|
|
12446
13092
|
|
12447
13093
|
async offerLease(leaseIndex, leaseAmount, tosHash) {
|
12448
13094
|
// <prefix><lease index 16)><half of tos hash><lease amount (uint32)>
|
12449
|
-
const prefixLen = EvernodeConstants.
|
13095
|
+
const prefixLen = EvernodeConstants.LEASE_TOKEN_PREFIX_HEX.length / 2;
|
12450
13096
|
const halfToSLen = tosHash.length / 4;
|
12451
13097
|
const uriBuf = Buffer.allocUnsafe(prefixLen + halfToSLen + 10);
|
12452
|
-
Buffer.from(EvernodeConstants.
|
13098
|
+
Buffer.from(EvernodeConstants.LEASE_TOKEN_PREFIX_HEX, 'hex').copy(uriBuf);
|
12453
13099
|
uriBuf.writeUInt16BE(leaseIndex, prefixLen);
|
12454
13100
|
Buffer.from(tosHash, 'hex').copy(uriBuf, prefixLen + 2, 0, halfToSLen);
|
12455
13101
|
uriBuf.writeBigInt64BE(XflHelpers.getXfl(leaseAmount.toString()), prefixLen + 2 + halfToSLen);
|
12456
|
-
const uri = uriBuf.toString('
|
12457
|
-
|
12458
|
-
await this.xrplAcc.
|
12459
|
-
|
12460
|
-
const nft = await this.xrplAcc.getNftByUri(uri, true);
|
12461
|
-
if (!nft)
|
13102
|
+
const uri = uriBuf.toString('base64');
|
13103
|
+
await this.xrplAcc.mintURIToken(uri, null, { isBurnable: true, isHexUri: false });
|
13104
|
+
const uriToken = await this.xrplAcc.getURITokenByUri(uri);
|
13105
|
+
if (!uriToken)
|
12462
13106
|
throw "Offer lease NFT creation error.";
|
12463
13107
|
|
12464
|
-
await this.xrplAcc.
|
13108
|
+
await this.xrplAcc.sellURIToken(uriToken.index,
|
12465
13109
|
leaseAmount.toString(),
|
12466
13110
|
EvernodeConstants.EVR,
|
12467
13111
|
this.config.evrIssuerAddress);
|
12468
13112
|
}
|
12469
13113
|
|
12470
|
-
async expireLease(
|
12471
|
-
await this.xrplAcc.
|
13114
|
+
async expireLease(uriTokenId) {
|
13115
|
+
await this.xrplAcc.burnURIToken(uriTokenId);
|
12472
13116
|
}
|
12473
13117
|
|
12474
13118
|
async register(countryCode, cpuMicroSec, ramMb, diskMb, totalInstanceCount, cpuModel, cpuCount, cpuSpeed, description, emailAddress, options = {}) {
|
@@ -12504,14 +13148,16 @@ class HostClient extends BaseEvernodeClient {
|
|
12504
13148
|
|
12505
13149
|
// Check whether is there any missed NFT sell offer that needs to be accepted
|
12506
13150
|
// from the client-side in order to complete the registration.
|
12507
|
-
const
|
12508
|
-
|
13151
|
+
const registryAcc = new XrplAccount(this.config.registryAddress, null, { xrplApi: this.xrplApi });
|
13152
|
+
const regUriToken = await this.getRegistrationUriToken();
|
13153
|
+
|
13154
|
+
if (!regUriToken) {
|
12509
13155
|
const regInfo = await this.getHostInfo(this.xrplAcc.address);
|
12510
13156
|
if (regInfo) {
|
12511
|
-
const
|
12512
|
-
|
13157
|
+
const sellOffer = (await registryAcc.getURITokens()).find(o => o.index == regInfo.uriTokenId && o.Amount);
|
13158
|
+
console.log('sell offer')
|
12513
13159
|
if (sellOffer) {
|
12514
|
-
await this.xrplAcc.
|
13160
|
+
await this.xrplAcc.buyURIToken(sellOffer);
|
12515
13161
|
console.log("Registration was successfully completed after acquiring the NFT.");
|
12516
13162
|
return await this.isRegistered();
|
12517
13163
|
}
|
@@ -12521,7 +13167,7 @@ class HostClient extends BaseEvernodeClient {
|
|
12521
13167
|
// Check the availability of an initiated transfer.
|
12522
13168
|
// Need to modify the amount accordingly.
|
12523
13169
|
const stateTransfereeAddrKey = StateHelpers.generateTransfereeAddrStateKey(this.xrplAcc.address);
|
12524
|
-
const stateTransfereeAddrIndex = StateHelpers.getHookStateIndex(this.
|
13170
|
+
const stateTransfereeAddrIndex = StateHelpers.getHookStateIndex(this.governorAddress, stateTransfereeAddrKey);
|
12525
13171
|
let transfereeAddrLedgerEntry = {};
|
12526
13172
|
let transfereeAddrStateData = {};
|
12527
13173
|
let transferredNFTokenId = null;
|
@@ -12551,31 +13197,35 @@ class HostClient extends BaseEvernodeClient {
|
|
12551
13197
|
Buffer.from(description.substr(0, 26), "utf-8").copy(memoBuf, HOST_DESCRIPTION_MEMO_OFFSET);
|
12552
13198
|
Buffer.from(emailAddress.substr(0, 40), "utf-8").copy(memoBuf, HOST_EMAIL_ADDRESS_MEMO_OFFSET);
|
12553
13199
|
|
12554
|
-
const tx = await this.xrplAcc.makePayment(this.registryAddress,
|
13200
|
+
const tx = await this.xrplAcc.makePayment(this.config.registryAddress,
|
12555
13201
|
(transferredNFTokenId) ? EvernodeConstants.NOW_IN_EVRS : this.config.hostRegFee.toString(),
|
12556
13202
|
EvernodeConstants.EVR,
|
12557
13203
|
this.config.evrIssuerAddress,
|
12558
13204
|
[{ type: MemoTypes.HOST_REG, format: MemoFormats.HEX, data: memoBuf.toString('hex') }],
|
12559
13205
|
options.transactionOptions);
|
12560
13206
|
|
12561
|
-
console.log('Waiting for the sell offer')
|
12562
|
-
|
12563
|
-
let offer = null;
|
13207
|
+
console.log('Waiting for the sell offer', tx.id)
|
13208
|
+
let sellOffer = null;
|
12564
13209
|
let attempts = 0;
|
12565
13210
|
let offerLedgerIndex = 0;
|
13211
|
+
const firstPart = tx.id.substring(0, 8);
|
13212
|
+
const lastPart = tx.id.substring(tx.id.length - 8);
|
13213
|
+
const trxRef = TransactionHelper.asciiToHex(firstPart + lastPart);
|
12566
13214
|
while (attempts < OFFER_WAIT_TIMEOUT) {
|
12567
|
-
|
12568
|
-
|
12569
|
-
|
12570
|
-
|
12571
|
-
|
12572
|
-
|
12573
|
-
await new Promise(resolve => setTimeout(resolve, 1000));
|
12574
|
-
attempts++;
|
12575
|
-
}
|
13215
|
+
sellOffer = (await registryAcc.getURITokens()).find(n => (
|
13216
|
+
n.Amount &&
|
13217
|
+
n.Destination === this.xrplAcc.address &&
|
13218
|
+
(!transferredNFTokenId ?
|
13219
|
+
(n.URI === `${EvernodeConstants.TOKEN_PREFIX_HEX}${trxRef}`) :
|
13220
|
+
(n.index === transferredNFTokenId))));
|
12576
13221
|
|
13222
|
+
offerLedgerIndex = this.xrplApi.ledgerIndex;
|
13223
|
+
if (sellOffer)
|
13224
|
+
break;
|
13225
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
13226
|
+
attempts++;
|
12577
13227
|
}
|
12578
|
-
if (!
|
13228
|
+
if (!sellOffer)
|
12579
13229
|
throw 'No sell offer found within timeout.';
|
12580
13230
|
|
12581
13231
|
console.log('Accepting the sell offer..');
|
@@ -12589,8 +13239,7 @@ class HostClient extends BaseEvernodeClient {
|
|
12589
13239
|
resolve();
|
12590
13240
|
});
|
12591
13241
|
|
12592
|
-
await this.xrplAcc.
|
12593
|
-
|
13242
|
+
await this.xrplAcc.buyURIToken(sellOffer);
|
12594
13243
|
return await this.isRegistered();
|
12595
13244
|
}
|
12596
13245
|
|
@@ -12599,53 +13248,17 @@ class HostClient extends BaseEvernodeClient {
|
|
12599
13248
|
if (!(await this.isRegistered()))
|
12600
13249
|
throw "Host not registered."
|
12601
13250
|
|
12602
|
-
const
|
13251
|
+
const regUriToken = await this.getRegistrationUriToken();
|
12603
13252
|
|
12604
|
-
|
12605
|
-
const nftPageDataBuf = await EvernodeHelpers.getNFTPageAndLocation(regNFT.NFTokenID, this.xrplAcc, this.xrplApi);
|
12606
|
-
|
12607
|
-
await this.xrplAcc.makePayment(this.registryAddress,
|
13253
|
+
await this.xrplAcc.makePayment(this.config.registryAddress,
|
12608
13254
|
XrplConstants.MIN_XRP_AMOUNT,
|
12609
13255
|
XrplConstants.XRP,
|
12610
13256
|
null,
|
12611
13257
|
[
|
12612
|
-
{ type: MemoTypes.HOST_DEREG, format: MemoFormats.HEX, data:
|
12613
|
-
{ type: MemoTypes.HOST_REGISTRY_REF, format: MemoFormats.HEX, data: nftPageDataBuf.toString('hex') }
|
13258
|
+
{ type: MemoTypes.HOST_DEREG, format: MemoFormats.HEX, data: regUriToken.index }
|
12614
13259
|
],
|
12615
13260
|
options.transactionOptions);
|
12616
13261
|
|
12617
|
-
console.log('Waiting for the buy offer')
|
12618
|
-
const regAcc = new XrplAccount(this.registryAddress, null, { xrplApi: this.xrplApi });
|
12619
|
-
let offer = null;
|
12620
|
-
let attempts = 0;
|
12621
|
-
let offerLedgerIndex = 0;
|
12622
|
-
while (attempts < OFFER_WAIT_TIMEOUT) {
|
12623
|
-
offer = (await regAcc.getNftOffers()).find(o => (o.NFTokenID == regNFT.NFTokenID) && (o.Flags === 0));
|
12624
|
-
offerLedgerIndex = this.xrplApi.ledgerIndex;
|
12625
|
-
if (offer)
|
12626
|
-
break;
|
12627
|
-
await new Promise(resolve => setTimeout(resolve, 1000));
|
12628
|
-
attempts++;
|
12629
|
-
}
|
12630
|
-
if (!offer)
|
12631
|
-
throw 'No buy offer found within timeout.';
|
12632
|
-
|
12633
|
-
console.log('Accepting the buy offer..');
|
12634
|
-
|
12635
|
-
// Wait until the next ledger after the offer is created.
|
12636
|
-
// Otherwise if the offer accepted in the same legder which it's been created,
|
12637
|
-
// We cannot fetch the offer from registry contract event handler since it's getting deleted immediately.
|
12638
|
-
await new Promise(async resolve => {
|
12639
|
-
while (this.xrplApi.ledgerIndex <= offerLedgerIndex)
|
12640
|
-
await new Promise(resolve2 => setTimeout(resolve2, 1000));
|
12641
|
-
resolve();
|
12642
|
-
});
|
12643
|
-
|
12644
|
-
await this.xrplAcc.sellNft(
|
12645
|
-
offer.index,
|
12646
|
-
[{ type: MemoTypes.HOST_POST_DEREG, format: MemoFormats.HEX, data: regNFT.NFTokenID }]
|
12647
|
-
);
|
12648
|
-
|
12649
13262
|
return await this.isRegistered();
|
12650
13263
|
}
|
12651
13264
|
|
@@ -12677,36 +13290,48 @@ class HostClient extends BaseEvernodeClient {
|
|
12677
13290
|
memoBuf.writeUInt8(components[2], HOST_UPDATE_VERSION_MEMO_OFFSET + 2);
|
12678
13291
|
}
|
12679
13292
|
|
12680
|
-
|
12681
|
-
if (!tokenID)
|
12682
|
-
tokenID = (await this.getRegistrationNft()).NFTokenID;
|
12683
|
-
const nftPageDataBuf = await EvernodeHelpers.getNFTPageAndLocation(tokenID, this.xrplAcc, this.xrplApi);
|
12684
|
-
|
12685
|
-
return await this.xrplAcc.makePayment(this.registryAddress,
|
13293
|
+
return await this.xrplAcc.makePayment(this.config.registryAddress,
|
12686
13294
|
XrplConstants.MIN_XRP_AMOUNT,
|
12687
13295
|
XrplConstants.XRP,
|
12688
13296
|
null,
|
12689
13297
|
[
|
12690
|
-
{ type: MemoTypes.HOST_UPDATE_INFO, format: MemoFormats.HEX, data: memoBuf.toString('hex') }
|
12691
|
-
{ type: MemoTypes.HOST_REGISTRY_REF, format: MemoFormats.HEX, data: nftPageDataBuf.toString('hex') }
|
13298
|
+
{ type: MemoTypes.HOST_UPDATE_INFO, format: MemoFormats.HEX, data: memoBuf.toString('hex') }
|
12692
13299
|
],
|
12693
13300
|
options.transactionOptions);
|
12694
13301
|
}
|
12695
13302
|
|
12696
|
-
async heartbeat(options = {}) {
|
12697
|
-
|
12698
|
-
|
12699
|
-
|
13303
|
+
async heartbeat(voteInfo = {}, options = {}) {
|
13304
|
+
let data = "";
|
13305
|
+
// Prepare voteInfo
|
13306
|
+
if (Object.keys(voteInfo).length > 1) {
|
13307
|
+
let voteBuf = Buffer.alloc(33);
|
13308
|
+
Buffer.from(voteInfo.candidate, 'hex').copy(voteBuf, 0);
|
13309
|
+
voteBuf.writeUInt8(voteInfo.vote, 32);
|
13310
|
+
data = voteBuf.toString('hex').toUpperCase();
|
13311
|
+
}
|
12700
13312
|
|
12701
|
-
|
12702
|
-
|
12703
|
-
|
12704
|
-
|
12705
|
-
|
12706
|
-
|
12707
|
-
|
12708
|
-
|
12709
|
-
|
13313
|
+
try {
|
13314
|
+
const res = await this.xrplAcc.makePayment(this.config.heartbeatAddress,
|
13315
|
+
XrplConstants.MIN_XRP_AMOUNT,
|
13316
|
+
XrplConstants.XRP,
|
13317
|
+
null,
|
13318
|
+
[
|
13319
|
+
{ type: MemoTypes.HEARTBEAT, format: MemoFormats.HEX, data: data }
|
13320
|
+
],
|
13321
|
+
options.transactionOptions);
|
13322
|
+
return res;
|
13323
|
+
}
|
13324
|
+
catch (e) {
|
13325
|
+
const validationErr = e?.hookExecutionResult?.find(r => r.message.includes(VOTE_VALIDATION_ERR));
|
13326
|
+
if (validationErr) {
|
13327
|
+
console.log('Vote validation error occurred.')
|
13328
|
+
throw {
|
13329
|
+
code: VOTE_VALIDATION_ERR,
|
13330
|
+
error: validationErr.message
|
13331
|
+
}
|
13332
|
+
}
|
13333
|
+
throw e;
|
13334
|
+
}
|
12710
13335
|
}
|
12711
13336
|
|
12712
13337
|
async acquireSuccess(txHash, tenantAddress, instanceInfo, options = {}) {
|
@@ -12789,18 +13414,12 @@ class HostClient extends BaseEvernodeClient {
|
|
12789
13414
|
}
|
12790
13415
|
|
12791
13416
|
async requestRebate(options = {}) {
|
12792
|
-
|
12793
|
-
// To obtain registration NFT Page Keylet and index.
|
12794
|
-
const regNFT = await this.getRegistrationNft();
|
12795
|
-
const nftPageDataBuf = await EvernodeHelpers.getNFTPageAndLocation(regNFT.NFTokenID, this.xrplAcc, this.xrplApi);
|
12796
|
-
|
12797
|
-
return this.xrplAcc.makePayment(this.registryAddress,
|
13417
|
+
return this.xrplAcc.makePayment(this.config.registryAddress,
|
12798
13418
|
XrplConstants.MIN_XRP_AMOUNT,
|
12799
13419
|
XrplConstants.XRP,
|
12800
13420
|
null,
|
12801
13421
|
[
|
12802
|
-
{ type: MemoTypes.HOST_REBATE, format: "", data: "" }
|
12803
|
-
{ type: MemoTypes.HOST_REGISTRY_REF, format: MemoFormats.HEX, data: nftPageDataBuf.toString('hex') }
|
13422
|
+
{ type: MemoTypes.HOST_REBATE, format: "", data: "" }
|
12804
13423
|
],
|
12805
13424
|
options.transactionOptions);
|
12806
13425
|
}
|
@@ -12820,70 +13439,47 @@ class HostClient extends BaseEvernodeClient {
|
|
12820
13439
|
const transfereeAcc = new XrplAccount(transfereeAddress, null, { xrplApi: this.xrplApi });
|
12821
13440
|
|
12822
13441
|
if (this.xrplAcc.address !== transfereeAddress) {
|
12823
|
-
// Find the new transferee also owns an Evernode Host Registration
|
12824
|
-
const
|
12825
|
-
if (
|
12826
|
-
|
12827
|
-
const issuerHex = nft.NFTokenID.substr(8, 40);
|
12828
|
-
const issuerAddr = codec.encodeAccountID(Buffer.from(issuerHex, 'hex'));
|
12829
|
-
if (issuerAddr == this.registryAddress) {
|
12830
|
-
throw "The transferee is already registered in Evernode.";
|
12831
|
-
}
|
12832
|
-
}
|
13442
|
+
// Find the new transferee also owns an Evernode Host Registration token.
|
13443
|
+
const token = (await transfereeAcc.getURITokens()).find(n => n.URI.startsWith(EvernodeConstants.TOKEN_PREFIX_HEX) && n.Issuer === this.config.registryAddress);
|
13444
|
+
if (token)
|
13445
|
+
throw "The transferee is already registered in Evernode.";
|
12833
13446
|
}
|
12834
13447
|
|
12835
13448
|
let memoData = Buffer.allocUnsafe(20);
|
12836
13449
|
codec.decodeAccountID(transfereeAddress).copy(memoData);
|
12837
13450
|
|
12838
|
-
|
12839
|
-
const regNFT = await this.getRegistrationNft();
|
12840
|
-
const nftPageDataBuf = await EvernodeHelpers.getNFTPageAndLocation(regNFT.NFTokenID, this.xrplAcc, this.xrplApi);
|
13451
|
+
const regUriToken = await this.getRegistrationUriToken();
|
12841
13452
|
|
12842
|
-
await this.xrplAcc.
|
13453
|
+
await this.xrplAcc.sellURIToken(regUriToken.index,
|
12843
13454
|
XrplConstants.MIN_XRP_AMOUNT,
|
12844
13455
|
XrplConstants.XRP,
|
12845
13456
|
null,
|
13457
|
+
this.config.registryAddress,
|
12846
13458
|
[
|
12847
|
-
{ type: MemoTypes.HOST_TRANSFER, format: MemoFormats.HEX, data: memoData.toString('hex') }
|
12848
|
-
{ type: MemoTypes.HOST_REGISTRY_REF, format: MemoFormats.HEX, data: nftPageDataBuf.toString('hex') }
|
13459
|
+
{ type: MemoTypes.HOST_TRANSFER, format: MemoFormats.HEX, data: memoData.toString('hex') }
|
12849
13460
|
],
|
12850
13461
|
options.transactionOptions);
|
12851
13462
|
|
12852
|
-
let
|
13463
|
+
let token = null;
|
12853
13464
|
let attempts = 0;
|
12854
|
-
|
12855
|
-
const regAcc = new XrplAccount(this.registryAddress, null, { xrplApi: this.xrplApi });
|
13465
|
+
const regAcc = new XrplAccount(this.config.registryAddress, null, { xrplApi: this.xrplApi });
|
12856
13466
|
|
12857
13467
|
while (attempts < OFFER_WAIT_TIMEOUT) {
|
12858
|
-
|
12859
|
-
|
12860
|
-
if (offer)
|
13468
|
+
token = (await regAcc.getURITokens()).find(o => o.index == regUriToken.index);
|
13469
|
+
if (token)
|
12861
13470
|
break;
|
12862
13471
|
await new Promise(resolve => setTimeout(resolve, 1000));
|
12863
13472
|
attempts++;
|
12864
13473
|
}
|
12865
|
-
if (!
|
12866
|
-
throw '
|
12867
|
-
|
12868
|
-
console.log('Accepting the buy offer..');
|
12869
|
-
|
12870
|
-
// Wait until the next ledger after the offer is created.
|
12871
|
-
// Otherwise if the offer accepted in the same legder which it's been created,
|
12872
|
-
// We cannot fetch the offer from registry contract event handler since it's getting deleted immediately.
|
12873
|
-
await new Promise(async resolve => {
|
12874
|
-
while (this.xrplApi.ledgerIndex <= offerLedgerIndex)
|
12875
|
-
await new Promise(resolve2 => setTimeout(resolve2, 1000));
|
12876
|
-
resolve();
|
12877
|
-
});
|
12878
|
-
|
12879
|
-
await this.xrplAcc.sellNft(offer.index);
|
13474
|
+
if (!token)
|
13475
|
+
throw 'Token hasn\'t transferred within timeout.';
|
12880
13476
|
}
|
12881
13477
|
|
12882
13478
|
async isTransferee() {
|
12883
13479
|
|
12884
13480
|
// Check the availability of TRANSFEREE state for this host address.
|
12885
13481
|
const stateTransfereeAddrKey = StateHelpers.generateTransfereeAddrStateKey(this.xrplAcc.address);
|
12886
|
-
const stateTransfereeAddrIndex = StateHelpers.getHookStateIndex(this.
|
13482
|
+
const stateTransfereeAddrIndex = StateHelpers.getHookStateIndex(this.governorAddress, stateTransfereeAddrKey);
|
12887
13483
|
const res = await this.xrplApi.getLedgerEntry(stateTransfereeAddrIndex);
|
12888
13484
|
|
12889
13485
|
if (res && res?.HookStateData)
|
@@ -12891,74 +13487,35 @@ class HostClient extends BaseEvernodeClient {
|
|
12891
13487
|
|
12892
13488
|
return false;
|
12893
13489
|
}
|
12894
|
-
}
|
12895
|
-
|
12896
|
-
module.exports = {
|
12897
|
-
HostEvents,
|
12898
|
-
HostClient
|
12899
|
-
}
|
12900
|
-
|
12901
|
-
|
12902
|
-
/***/ }),
|
12903
|
-
|
12904
|
-
/***/ 5898:
|
12905
|
-
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
12906
|
-
|
12907
|
-
const { EvernodeEvents } = __nccwpck_require__(9849);
|
12908
|
-
const { BaseEvernodeClient } = __nccwpck_require__(6263);
|
12909
|
-
const { DefaultValues } = __nccwpck_require__(8262);
|
12910
13490
|
|
12911
|
-
|
12912
|
-
|
12913
|
-
|
12914
|
-
HostRegUpdated: EvernodeEvents.HostRegUpdated,
|
12915
|
-
RegistryInitialized: EvernodeEvents.RegistryInitialized,
|
12916
|
-
Heartbeat: EvernodeEvents.Heartbeat,
|
12917
|
-
HostPostDeregistered: EvernodeEvents.HostPostDeregistered,
|
12918
|
-
DeadHostPrune: EvernodeEvents.DeadHostPrune,
|
12919
|
-
HostTransfer: EvernodeEvents.HostTransfer,
|
12920
|
-
HostRebate: EvernodeEvents.HostRebate
|
12921
|
-
}
|
13491
|
+
async propose(hashes, shortName, options = {}) {
|
13492
|
+
if (!(await this.isRegistered()))
|
13493
|
+
throw 'Host should be registered to propose candidates.';
|
12922
13494
|
|
12923
|
-
|
13495
|
+
return await super._propose(hashes, shortName, options);
|
13496
|
+
}
|
12924
13497
|
|
12925
|
-
|
12926
|
-
|
12927
|
-
|
12928
|
-
|
12929
|
-
|
12930
|
-
super((options.registryAddress || DefaultValues.registryAddress), null, Object.values(RegistryEvents), false, options);
|
13498
|
+
async withdraw(candidateId, options = {}) {
|
13499
|
+
if (!(await this.isRegistered()))
|
13500
|
+
throw 'Host should be registered to withdraw candidates.';
|
13501
|
+
|
13502
|
+
return await super._withdraw(candidateId, options);
|
12931
13503
|
}
|
12932
13504
|
|
12933
|
-
|
12934
|
-
|
12935
|
-
|
12936
|
-
|
12937
|
-
|
12938
|
-
let fullHostList = [];
|
12939
|
-
const hosts = await this.getHosts();
|
12940
|
-
if (hosts.nextPageToken) {
|
12941
|
-
let currentPageToken = hosts.nextPageToken;
|
12942
|
-
let nextHosts = null;
|
12943
|
-
fullHostList = fullHostList.concat(hosts.data);
|
12944
|
-
while (currentPageToken) {
|
12945
|
-
nextHosts = await this.getHosts(null, null, currentPageToken);
|
12946
|
-
fullHostList = fullHostList.concat(nextHosts.nextPageToken ? nextHosts.data : nextHosts);
|
12947
|
-
currentPageToken = nextHosts.nextPageToken;
|
12948
|
-
}
|
12949
|
-
} else {
|
12950
|
-
fullHostList = fullHostList.concat(hosts);
|
12951
|
-
}
|
12952
|
-
// Filter only active hosts.
|
12953
|
-
return fullHostList.filter(h => h.active);
|
13505
|
+
async reportDudHost(hostAddress, options = {}) {
|
13506
|
+
if (!(await this.isRegistered()))
|
13507
|
+
throw 'Host should be registered to report dud hosts.';
|
13508
|
+
|
13509
|
+
return await this._reportDudHost(hostAddress, options);
|
12954
13510
|
}
|
12955
13511
|
}
|
12956
13512
|
|
12957
13513
|
module.exports = {
|
12958
|
-
|
12959
|
-
|
13514
|
+
HostEvents,
|
13515
|
+
HostClient
|
12960
13516
|
}
|
12961
13517
|
|
13518
|
+
|
12962
13519
|
/***/ }),
|
12963
13520
|
|
12964
13521
|
/***/ 6449:
|
@@ -12969,8 +13526,6 @@ const { EvernodeEvents, MemoFormats, MemoTypes, ErrorCodes, ErrorReasons, Everno
|
|
12969
13526
|
const { EncryptionHelper } = __nccwpck_require__(4832);
|
12970
13527
|
const { XrplAccount } = __nccwpck_require__(9329);
|
12971
13528
|
const { UtilHelpers } = __nccwpck_require__(6687);
|
12972
|
-
const { Buffer } = __nccwpck_require__(4300);
|
12973
|
-
const codec = __nccwpck_require__(597);
|
12974
13529
|
const { EvernodeHelpers } = __nccwpck_require__(2523);
|
12975
13530
|
const { TransactionHelper } = __nccwpck_require__(7071);
|
12976
13531
|
|
@@ -12989,7 +13544,7 @@ class TenantClient extends BaseEvernodeClient {
|
|
12989
13544
|
* Constructs a tenant client instance.
|
12990
13545
|
* @param {string} xrpAddress XRPL address of the tenant.
|
12991
13546
|
* @param {string} XRPL secret of the tenant.
|
12992
|
-
* @param {object} options [Optional] An object with 'rippledServer' URL and '
|
13547
|
+
* @param {object} options [Optional] An object with 'rippledServer' URL and 'governorAddress'.
|
12993
13548
|
*/
|
12994
13549
|
constructor(xrpAddress, xrpSecret, options = {}) {
|
12995
13550
|
super(xrpAddress, xrpSecret, Object.values(TenantEvents), false, options);
|
@@ -13007,15 +13562,13 @@ class TenantClient extends BaseEvernodeClient {
|
|
13007
13562
|
|
13008
13563
|
async getLeaseHost(hostAddress) {
|
13009
13564
|
const host = new XrplAccount(hostAddress, null, { xrplApi: this.xrplApi });
|
13010
|
-
// Find an owned
|
13011
|
-
const
|
13012
|
-
if (!
|
13565
|
+
// Find an owned URI token with matching Evernode host NFT prefix.
|
13566
|
+
const uriToken = (await host.getURITokens()).find(n => n.URI.startsWith(EvernodeConstants.TOKEN_PREFIX_HEX));
|
13567
|
+
if (!uriToken)
|
13013
13568
|
throw { reason: ErrorReasons.HOST_INVALID, error: "Host is not registered." };
|
13014
13569
|
|
13015
13570
|
// Check whether the token was actually issued from Evernode registry contract.
|
13016
|
-
|
13017
|
-
const issuerAddr = codec.encodeAccountID(Buffer.from(issuerHex, 'hex'));
|
13018
|
-
if (issuerAddr != this.registryAddress)
|
13571
|
+
if (uriToken.Issuer != this.config.registryAddress)
|
13019
13572
|
throw { reason: ErrorReasons.HOST_INVALID, error: "Host is not registered." };
|
13020
13573
|
|
13021
13574
|
// Check whether active.
|
@@ -13040,15 +13593,21 @@ class TenantClient extends BaseEvernodeClient {
|
|
13040
13593
|
const hostAcc = await this.getLeaseHost(hostAddress);
|
13041
13594
|
let selectedOfferIndex = options.leaseOfferIndex;
|
13042
13595
|
|
13043
|
-
|
13044
|
-
|
13045
|
-
const nftOffers = await EvernodeHelpers.getLeaseOffers(hostAcc);
|
13046
|
-
selectedOfferIndex = nftOffers && nftOffers[0] && nftOffers[0].index;
|
13596
|
+
let buyUriOffer = null;
|
13597
|
+
const uriTokenOffers = await EvernodeHelpers.getLeaseOffers(hostAcc);
|
13047
13598
|
|
13048
|
-
|
13049
|
-
|
13599
|
+
if (!selectedOfferIndex) {
|
13600
|
+
// Attempt to get first available offer, if offer is not specified in options.
|
13601
|
+
buyUriOffer = uriTokenOffers && uriTokenOffers[0];
|
13602
|
+
}
|
13603
|
+
else {
|
13604
|
+
// Attempt to get relevant available offer using selectedOfferIndex.
|
13605
|
+
buyUriOffer = uriTokenOffers && uriTokenOffers.find(uriOffer => { uriOffer.index === selectedOfferIndex });
|
13050
13606
|
}
|
13051
13607
|
|
13608
|
+
if (!buyUriOffer)
|
13609
|
+
throw { reason: ErrorReasons.NO_OFFER, error: "No offers available." };
|
13610
|
+
|
13052
13611
|
// Encrypt the requirements with the host's encryption key (Specified in MessageKey field of the host account).
|
13053
13612
|
const encKey = await hostAcc.getMessageKey();
|
13054
13613
|
if (!encKey)
|
@@ -13059,7 +13618,7 @@ class TenantClient extends BaseEvernodeClient {
|
|
13059
13618
|
ephemPrivateKey: options.ephemPrivateKey // Must be null or 32 bytes.
|
13060
13619
|
});
|
13061
13620
|
|
13062
|
-
return this.xrplAcc.
|
13621
|
+
return this.xrplAcc.buyURIToken(buyUriOffer, [{ type: MemoTypes.ACQUIRE_LEASE, format: MemoFormats.BASE64, data: ecrypted }], options.transactionOptions);
|
13063
13622
|
}
|
13064
13623
|
|
13065
13624
|
/**
|
@@ -13185,7 +13744,7 @@ class TenantClient extends BaseEvernodeClient {
|
|
13185
13744
|
resolve({
|
13186
13745
|
transaction: relevantTx?.data.transaction,
|
13187
13746
|
expiryMoment: relevantTx?.data.expiryMoment,
|
13188
|
-
|
13747
|
+
extendRefId: relevantTx?.data.extendRefId
|
13189
13748
|
});
|
13190
13749
|
} else if (relevantTx?.name === TenantEvents.ExtendError) {
|
13191
13750
|
reject({
|
@@ -13209,17 +13768,17 @@ class TenantClient extends BaseEvernodeClient {
|
|
13209
13768
|
extendLease(hostAddress, moments, instanceName, options = {}) {
|
13210
13769
|
return new Promise(async (resolve, reject) => {
|
13211
13770
|
const tokenID = instanceName;
|
13212
|
-
const
|
13771
|
+
const uriToken = (await this.xrplAcc.getURITokens())?.find(n => n.index == tokenID);
|
13213
13772
|
|
13214
|
-
if (!
|
13215
|
-
reject({ error: ErrorCodes.EXTEND_ERR, reason: ErrorReasons.NO_NFT, content: 'Could not find the
|
13773
|
+
if (!uriToken) {
|
13774
|
+
reject({ error: ErrorCodes.EXTEND_ERR, reason: ErrorReasons.NO_NFT, content: 'Could not find the uri token for lease extend request.' });
|
13216
13775
|
return;
|
13217
13776
|
}
|
13218
13777
|
|
13219
13778
|
let minLedgerIndex = this.xrplApi.ledgerIndex;
|
13220
13779
|
|
13221
13780
|
// Get the agreement lease amount from the nft and calculate EVR amount to be sent.
|
13222
|
-
const uriInfo = UtilHelpers.
|
13781
|
+
const uriInfo = UtilHelpers.decodeLeaseTokenUri(uriToken.URI);
|
13223
13782
|
const tx = await this.extendLeaseSubmit(hostAddress, moments * uriInfo.leaseAmount, tokenID, options).catch(error => {
|
13224
13783
|
reject({ error: ErrorCodes.EXTEND_ERR, reason: error.reason || ErrorReasons.TRANSACTION_FAILURE, content: error.error || error });
|
13225
13784
|
});
|
@@ -13241,16 +13800,24 @@ module.exports = {
|
|
13241
13800
|
TenantClient
|
13242
13801
|
}
|
13243
13802
|
|
13803
|
+
|
13244
13804
|
/***/ }),
|
13245
13805
|
|
13246
13806
|
/***/ 8262:
|
13247
13807
|
/***/ ((module) => {
|
13248
13808
|
|
13249
13809
|
const DefaultValues = {
|
13250
|
-
|
13251
|
-
rippledServer: 'wss://hooks-testnet-
|
13810
|
+
governorAddress: 'r9keGGSTDRg58RuiWYAQYuAAA8nqMG7EP5',
|
13811
|
+
rippledServer: 'wss://hooks-testnet-v3.xrpl-labs.com',
|
13252
13812
|
xrplApi: null,
|
13253
|
-
stateIndexId: 'evernodeindex'
|
13813
|
+
stateIndexId: 'evernodeindex',
|
13814
|
+
networkID: 21338
|
13815
|
+
}
|
13816
|
+
|
13817
|
+
const HookTypes = {
|
13818
|
+
governor: 'GOVERNOR',
|
13819
|
+
registry: 'REGISTRY',
|
13820
|
+
heartbeat: 'HEARTBEAT'
|
13254
13821
|
}
|
13255
13822
|
|
13256
13823
|
class Defaults {
|
@@ -13265,7 +13832,8 @@ class Defaults {
|
|
13265
13832
|
|
13266
13833
|
module.exports = {
|
13267
13834
|
DefaultValues,
|
13268
|
-
Defaults
|
13835
|
+
Defaults,
|
13836
|
+
HookTypes
|
13269
13837
|
}
|
13270
13838
|
|
13271
13839
|
/***/ }),
|
@@ -13692,10 +14260,36 @@ module.exports = {
|
|
13692
14260
|
|
13693
14261
|
const EvernodeConstants = {
|
13694
14262
|
EVR: 'EVR',
|
13695
|
-
|
13696
|
-
|
14263
|
+
TOKEN_PREFIX_HEX: '657672686F7374', // evrhost
|
14264
|
+
LEASE_TOKEN_PREFIX_HEX: '6576726C65617365', // evrlease
|
13697
14265
|
HOOK_NAMESPACE: '01EAF09326B4911554384121FF56FA8FECC215FDDE2EC35D9E59F2C53EC665A0',
|
13698
|
-
NOW_IN_EVRS: "0.00000001"
|
14266
|
+
NOW_IN_EVRS: "0.00000001",
|
14267
|
+
HOOKS: [
|
14268
|
+
"Governor",
|
14269
|
+
"Registry",
|
14270
|
+
"Heartbeat"
|
14271
|
+
],
|
14272
|
+
CandidateVote: {
|
14273
|
+
Reject: 0,
|
14274
|
+
Support: 1
|
14275
|
+
},
|
14276
|
+
CandidateTypes: {
|
14277
|
+
NewHook: 1,
|
14278
|
+
PilotedMode: 2,
|
14279
|
+
DudHost: 3
|
14280
|
+
},
|
14281
|
+
GovernanceModes: {
|
14282
|
+
Piloted: 1,
|
14283
|
+
CoPiloted: 2,
|
14284
|
+
AutoPiloted: 3
|
14285
|
+
},
|
14286
|
+
CandidateStatuses: {
|
14287
|
+
CANDIDATE_REJECTED: 0,
|
14288
|
+
CANDIDATE_SUPPORTED: 1,
|
14289
|
+
CANDIDATE_ELECTED: 2,
|
14290
|
+
CANDIDATE_VETOED: 3,
|
14291
|
+
CANDIDATE_EXPIRED: 4
|
14292
|
+
}
|
13699
14293
|
}
|
13700
14294
|
|
13701
14295
|
const MemoTypes = {
|
@@ -13707,18 +14301,24 @@ const MemoTypes = {
|
|
13707
14301
|
HOST_DEREG: 'evnHostDereg',
|
13708
14302
|
HOST_UPDATE_INFO: 'evnHostUpdateReg',
|
13709
14303
|
HEARTBEAT: 'evnHeartbeat',
|
13710
|
-
HOST_POST_DEREG: 'evnHostPostDereg',
|
13711
14304
|
HOST_TRANSFER: 'evnTransfer',
|
13712
14305
|
EXTEND_LEASE: 'evnExtendLease',
|
13713
14306
|
EXTEND_SUCCESS: 'evnExtendSuccess',
|
13714
14307
|
EXTEND_ERROR: 'evnExtendError',
|
13715
14308
|
EXTEND_REF: 'evnExtendRef',
|
13716
|
-
|
14309
|
+
INIT: 'evnInitialize',
|
13717
14310
|
REFUND: 'evnRefund',
|
13718
14311
|
REFUND_REF: 'evnRefundRef',
|
13719
14312
|
DEAD_HOST_PRUNE: 'evnDeadHostPrune',
|
13720
14313
|
HOST_REBATE: 'evnHostRebate',
|
13721
|
-
|
14314
|
+
CANDIDATE_PROPOSE: 'evnCandidatePropose',
|
14315
|
+
CANDIDATE_PROPOSE_REF: 'evnCandidateProposeRef',
|
14316
|
+
CANDIDATE_WITHDRAW: 'evnCandidateWithdraw',
|
14317
|
+
CANDIDATE_VOTE: 'evnCandidateVote',
|
14318
|
+
CANDIDATE_STATUS_CHANGE: 'evnCandidateStatusChange',
|
14319
|
+
DUD_HOST_REPORT: 'evnDudHostReport',
|
14320
|
+
HOOK_UPDATE_RES: 'evnHookUpdateRes',
|
14321
|
+
GOVERNANCE_MODE_CHANGE: 'evnGovernanceModeChange'
|
13722
14322
|
}
|
13723
14323
|
|
13724
14324
|
const MemoFormats = {
|
@@ -13730,7 +14330,8 @@ const MemoFormats = {
|
|
13730
14330
|
|
13731
14331
|
const ErrorCodes = {
|
13732
14332
|
ACQUIRE_ERR: 'ACQUIRE_ERR',
|
13733
|
-
EXTEND_ERR: 'EXTEND_ERR'
|
14333
|
+
EXTEND_ERR: 'EXTEND_ERR',
|
14334
|
+
PROPOSE_ERR: 'PROPOSE_ERR',
|
13734
14335
|
}
|
13735
14336
|
|
13736
14337
|
const ErrorReasons = {
|
@@ -13754,13 +14355,14 @@ const HookStateKeys = {
|
|
13754
14355
|
MINT_LIMIT: "4556520100000000000000000000000000000000000000000000000000000004",
|
13755
14356
|
FIXED_REG_FEE: "4556520100000000000000000000000000000000000000000000000000000005",
|
13756
14357
|
HOST_HEARTBEAT_FREQ: "4556520100000000000000000000000000000000000000000000000000000006",
|
13757
|
-
|
13758
|
-
|
13759
|
-
|
13760
|
-
|
13761
|
-
|
13762
|
-
|
13763
|
-
|
14358
|
+
LEASE_ACQUIRE_WINDOW: "4556520100000000000000000000000000000000000000000000000000000007",
|
14359
|
+
REWARD_CONFIGURATION: "4556520100000000000000000000000000000000000000000000000000000008",
|
14360
|
+
MAX_TOLERABLE_DOWNTIME: "4556520100000000000000000000000000000000000000000000000000000009",
|
14361
|
+
MOMENT_TRANSIT_INFO: "455652010000000000000000000000000000000000000000000000000000000A",
|
14362
|
+
MAX_TRX_EMISSION_FEE: "455652010000000000000000000000000000000000000000000000000000000B",
|
14363
|
+
HEARTBEAT_ADDR: "455652010000000000000000000000000000000000000000000000000000000C",
|
14364
|
+
REGISTRY_ADDR: "455652010000000000000000000000000000000000000000000000000000000D",
|
14365
|
+
GOVERNANCE_CONFIGURATION: "455652010000000000000000000000000000000000000000000000000000000E",
|
13764
14366
|
|
13765
14367
|
// Singleton
|
13766
14368
|
HOST_COUNT: "4556523200000000000000000000000000000000000000000000000000000000",
|
@@ -13768,17 +14370,19 @@ const HookStateKeys = {
|
|
13768
14370
|
HOST_REG_FEE: "4556523400000000000000000000000000000000000000000000000000000000",
|
13769
14371
|
MAX_REG: "4556523500000000000000000000000000000000000000000000000000000000",
|
13770
14372
|
REWARD_INFO: "4556523600000000000000000000000000000000000000000000000000000000",
|
14373
|
+
GOVERNANCE_INFO: "4556523700000000000000000000000000000000000000000000000000000000",
|
13771
14374
|
|
13772
14375
|
// Prefixes
|
13773
14376
|
PREFIX_HOST_TOKENID: "45565202",
|
13774
14377
|
PREFIX_HOST_ADDR: "45565203",
|
13775
14378
|
PREFIX_TRANSFEREE_ADDR: "45565204",
|
14379
|
+
PREFIX_CANDIDATE_OWNER: "45565205",
|
14380
|
+
PREFIX_CANDIDATE_ID: "45565206",
|
13776
14381
|
}
|
13777
14382
|
|
13778
14383
|
const EvernodeEvents = {
|
13779
14384
|
HostRegistered: "HostRegistered",
|
13780
14385
|
HostDeregistered: "HostDeregistered",
|
13781
|
-
HostPostDeregistered: "HostPostDeregistered",
|
13782
14386
|
HostTransfer: "HostTransfer",
|
13783
14387
|
AcquireLease: "AcquireLease",
|
13784
14388
|
AcquireSuccess: "AcquireSuccess",
|
@@ -13789,9 +14393,24 @@ const EvernodeEvents = {
|
|
13789
14393
|
ExtendError: "ExtendError",
|
13790
14394
|
HostRegUpdated: "HostRegUpdated",
|
13791
14395
|
HostReRegistered: "HostReRegistered",
|
13792
|
-
|
14396
|
+
Initialized: "Initialized",
|
13793
14397
|
DeadHostPrune: "DeadHostPrune",
|
13794
|
-
HostRebate: "HostRebate"
|
14398
|
+
HostRebate: "HostRebate",
|
14399
|
+
CandidateProposed: "CandidateProposed",
|
14400
|
+
CandidateWithdrew: "CandidateWithdrew",
|
14401
|
+
ChildHookUpdated: "ChildHookUpdated",
|
14402
|
+
GovernanceModeChanged: "GovernanceModeChanged",
|
14403
|
+
FoundationVoted: "FoundationVoted",
|
14404
|
+
DudHostReported: "DudHostReported",
|
14405
|
+
DudHostRemoved: "DudHostRemoved",
|
14406
|
+
DudHostStatusChanged: "DudHostStatusChanged",
|
14407
|
+
FallbackToPiloted: "FallbackToPiloted",
|
14408
|
+
NewHookStatusChanged: "NewHookStatusChanged"
|
14409
|
+
}
|
14410
|
+
|
14411
|
+
const URITokenTypes = {
|
14412
|
+
LEASE_URI_TOKEN: 1,
|
14413
|
+
REGISTRATION_URI_TOKEN: 2
|
13795
14414
|
}
|
13796
14415
|
|
13797
14416
|
module.exports = {
|
@@ -13801,7 +14420,8 @@ module.exports = {
|
|
13801
14420
|
ErrorCodes,
|
13802
14421
|
ErrorReasons,
|
13803
14422
|
HookStateKeys,
|
13804
|
-
EvernodeEvents
|
14423
|
+
EvernodeEvents,
|
14424
|
+
URITokenTypes
|
13805
14425
|
}
|
13806
14426
|
|
13807
14427
|
/***/ }),
|
@@ -13809,15 +14429,16 @@ module.exports = {
|
|
13809
14429
|
/***/ 2523:
|
13810
14430
|
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
13811
14431
|
|
13812
|
-
const { EvernodeConstants } = __nccwpck_require__(9849);
|
14432
|
+
const { EvernodeConstants, URITokenTypes } = __nccwpck_require__(9849);
|
14433
|
+
const { UtilHelpers } = __nccwpck_require__(6687);
|
14434
|
+
const { TransactionHelper } = __nccwpck_require__(7071);
|
14435
|
+
|
13813
14436
|
const NFT_PAGE_LEDGER_ENTRY_TYPE_HEX = '0050';
|
13814
14437
|
|
13815
14438
|
class EvernodeHelpers {
|
13816
14439
|
static async getLeaseOffers(xrplAcc) {
|
13817
|
-
const
|
13818
|
-
|
13819
|
-
const nftOffers = (await xrplAcc.getNftOffers())?.filter(offer => (offer.Flags == 1 && hostTokenIDs.includes(offer.NFTokenID))); // Filter only sell offers
|
13820
|
-
return nftOffers;
|
14440
|
+
const hostUriOffers = (await xrplAcc.getURITokens()).filter(uriToken => this.isValidURI(uriToken.URI, EvernodeConstants.LEASE_TOKEN_PREFIX_HEX) && uriToken.Flags == 1 && uriToken.Amount);
|
14441
|
+
return hostUriOffers;
|
13821
14442
|
}
|
13822
14443
|
|
13823
14444
|
static async getNFTPageAndLocation(nfTokenId, xrplAcc, xrplApi, buffer = true) {
|
@@ -13849,6 +14470,20 @@ class EvernodeHelpers {
|
|
13849
14470
|
|
13850
14471
|
return nftPageInfo;
|
13851
14472
|
}
|
14473
|
+
|
14474
|
+
static getEpochRewardQuota(epoch, firstEpochRewardQuota) {
|
14475
|
+
const div = (epoch > 1) ? Math.pow(2, epoch - 1) : 1;
|
14476
|
+
return firstEpochRewardQuota / div;
|
14477
|
+
}
|
14478
|
+
|
14479
|
+
static isValidURI(uri, pattern, tokenCategory = URITokenTypes.LEASE_URI_TOKEN) {
|
14480
|
+
if (tokenCategory === URITokenTypes.LEASE_URI_TOKEN) {
|
14481
|
+
uri = TransactionHelper.hexToASCII(uri);
|
14482
|
+
const uriBuf = Buffer.from(uri, 'base64');
|
14483
|
+
uri = uriBuf.toString('hex').toUpperCase();
|
14484
|
+
}
|
14485
|
+
return uri.startsWith(pattern);
|
14486
|
+
}
|
13852
14487
|
}
|
13853
14488
|
|
13854
14489
|
module.exports = {
|
@@ -13874,7 +14509,7 @@ class FirestoreHandler {
|
|
13874
14509
|
|
13875
14510
|
constructor(options = {}) {
|
13876
14511
|
this.#projectId = options.stateIndexId || DefaultValues.stateIndexId;
|
13877
|
-
this.#collectionPrefix = options.collectionPrefix || DefaultValues.
|
14512
|
+
this.#collectionPrefix = options.collectionPrefix || DefaultValues.governorAddress;
|
13878
14513
|
}
|
13879
14514
|
|
13880
14515
|
/**
|
@@ -14156,6 +14791,10 @@ class FirestoreHandler {
|
|
14156
14791
|
return item;
|
14157
14792
|
}
|
14158
14793
|
|
14794
|
+
async getCandidates(filters = null, pageSize = null, nextPageToken = null) {
|
14795
|
+
return await this.#getDocuments(this.getCollectionId('candidates'), filters, pageSize, nextPageToken);
|
14796
|
+
}
|
14797
|
+
|
14159
14798
|
async getHosts(filters = null, pageSize = null, nextPageToken = null) {
|
14160
14799
|
return await this.#getDocuments(this.getCollectionId('hosts'), filters, pageSize, nextPageToken);
|
14161
14800
|
}
|
@@ -14172,13 +14811,56 @@ module.exports = {
|
|
14172
14811
|
|
14173
14812
|
/***/ }),
|
14174
14813
|
|
14814
|
+
/***/ 4675:
|
14815
|
+
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
14816
|
+
|
14817
|
+
const crypto = __nccwpck_require__(6113);
|
14818
|
+
|
14819
|
+
const HOOK_DEFINITION_LEDGER_TYPE_PREFIX = 68; // Decimal value of ASCII 'D'
|
14820
|
+
|
14821
|
+
class HookHelpers {
|
14822
|
+
static getHookDefinitionIndex(hookHash) {
|
14823
|
+
const typeBuf = Buffer.allocUnsafe(2);
|
14824
|
+
typeBuf.writeInt16BE(HOOK_DEFINITION_LEDGER_TYPE_PREFIX);
|
14825
|
+
|
14826
|
+
const hookHashBuf = Buffer.from(hookHash, 'hex');
|
14827
|
+
|
14828
|
+
let hash = crypto.createHash('sha512');
|
14829
|
+
|
14830
|
+
let data = hash.update(typeBuf);
|
14831
|
+
data = hash.update(hookHashBuf);
|
14832
|
+
|
14833
|
+
const digest = data.digest('hex');
|
14834
|
+
// Get the first 32 bytes of hash.
|
14835
|
+
return digest.substring(0, 64).toUpperCase();
|
14836
|
+
}
|
14837
|
+
|
14838
|
+
static getHookDefinitionKeylet(index) {
|
14839
|
+
const keyletBuf = Buffer.allocUnsafe(34);
|
14840
|
+
keyletBuf.writeInt16BE(HOOK_DEFINITION_LEDGER_TYPE_PREFIX);
|
14841
|
+
Buffer.from(index, 'hex').copy(keyletBuf, 2);
|
14842
|
+
|
14843
|
+
return keyletBuf.toString('hex');
|
14844
|
+
}
|
14845
|
+
}
|
14846
|
+
|
14847
|
+
module.exports = {
|
14848
|
+
HookHelpers
|
14849
|
+
}
|
14850
|
+
|
14851
|
+
/***/ }),
|
14852
|
+
|
14175
14853
|
/***/ 5053:
|
14176
14854
|
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
14177
14855
|
|
14178
|
-
const { Defaults } = __nccwpck_require__(8262);
|
14179
|
-
const { RegistryClient, RegistryEvents } = __nccwpck_require__(
|
14856
|
+
const { Defaults, HookTypes } = __nccwpck_require__(8262);
|
14857
|
+
const { RegistryClient, RegistryEvents } = __nccwpck_require__(8074);
|
14858
|
+
const { GovernorClient, GovernorEvents } = __nccwpck_require__(335);
|
14859
|
+
const { HeartbeatClient, HeartbeatEvents } = __nccwpck_require__(6510);
|
14860
|
+
const { HookClientFactory } = __nccwpck_require__(2344);
|
14180
14861
|
const { TenantClient, TenantEvents } = __nccwpck_require__(6449);
|
14181
14862
|
const { HostClient, HostEvents } = __nccwpck_require__(1437);
|
14863
|
+
const { FoundationClient, FoundationEvents } = __nccwpck_require__(2466);
|
14182
14864
|
const { XrplApi } = __nccwpck_require__(1850);
|
14183
14865
|
const { XrplApiEvents, XrplConstants } = __nccwpck_require__(3307);
|
14184
14866
|
const { XrplAccount } = __nccwpck_require__(9329);
|
@@ -14189,14 +14871,22 @@ const { StateHelpers } = __nccwpck_require__(3860);
|
|
14189
14871
|
const { UtilHelpers } = __nccwpck_require__(6687);
|
14190
14872
|
const { TransactionHelper } = __nccwpck_require__(7071);
|
14191
14873
|
const { EncryptionHelper } = __nccwpck_require__(4832);
|
14874
|
+
const { EvernodeHelpers } = __nccwpck_require__(2523);
|
14875
|
+
|
14192
14876
|
|
14193
14877
|
module.exports = {
|
14194
14878
|
RegistryClient,
|
14195
14879
|
RegistryEvents,
|
14880
|
+
GovernorClient,
|
14881
|
+
GovernorEvents,
|
14882
|
+
HeartbeatClient,
|
14883
|
+
HeartbeatEvents,
|
14196
14884
|
TenantClient,
|
14197
14885
|
TenantEvents,
|
14198
14886
|
HostClient,
|
14199
14887
|
HostEvents,
|
14888
|
+
FoundationClient,
|
14889
|
+
FoundationEvents,
|
14200
14890
|
XrplApi,
|
14201
14891
|
XrplApiEvents,
|
14202
14892
|
XrplConstants,
|
@@ -14210,7 +14900,10 @@ module.exports = {
|
|
14210
14900
|
TransactionHelper,
|
14211
14901
|
EncryptionHelper,
|
14212
14902
|
HookStateKeys,
|
14213
|
-
MemoTypes
|
14903
|
+
MemoTypes,
|
14904
|
+
HookTypes,
|
14905
|
+
HookClientFactory,
|
14906
|
+
EvernodeHelpers
|
14214
14907
|
}
|
14215
14908
|
|
14216
14909
|
/***/ }),
|
@@ -14223,6 +14916,8 @@ const { Buffer } = __nccwpck_require__(4300);
|
|
14223
14916
|
const { HookStateKeys, EvernodeConstants } = __nccwpck_require__(9849);
|
14224
14917
|
const { XflHelpers } = __nccwpck_require__(3243);
|
14225
14918
|
const crypto = __nccwpck_require__(6113);
|
14919
|
+
const { UtilHelpers } = __nccwpck_require__(6687);
|
14920
|
+
const { sha512Half } = __nccwpck_require__(4010);
|
14226
14921
|
|
14227
14922
|
const NFTOKEN_PREFIX = '00000000';
|
14228
14923
|
|
@@ -14245,6 +14940,22 @@ const MOMENT_BASE_POINT_OFFSET = 0;
|
|
14245
14940
|
const MOMENT_AT_TRANSITION_OFFSET = 8;
|
14246
14941
|
const MOMENT_TYPE_OFFSET = 12;
|
14247
14942
|
|
14943
|
+
const ELIGIBILITY_PERIOD_OFFSET = 0;
|
14944
|
+
const CANDIDATE_LIFE_PERIOD_OFFSET = 4;
|
14945
|
+
const CANDIDATE_ELECTION_PERIOD_OFFSET = 8;
|
14946
|
+
const CANDIDATE_SUPPORT_AVERAGE_OFFSET = 12;
|
14947
|
+
|
14948
|
+
const GOVERNANCE_MODE_OFFSET = 0;
|
14949
|
+
const LAST_CANDIDATE_IDX_OFFSET = 1;
|
14950
|
+
const VOTER_BASE_COUNT_OFFSET = 5;
|
14951
|
+
const VOTER_BASE_COUNT_CHANGED_TIMESTAMP_OFFSET = 9;
|
14952
|
+
const FOUNDATION_LAST_VOTED_CANDIDATE_IDX = 17;
|
14953
|
+
const FOUNDATION_LAST_VOTED_TIMESTAMP_OFFSET = 21;
|
14954
|
+
const ELECTED_PROPOSAL_UNIQUE_ID_OFFSET = 29;
|
14955
|
+
const PROPOSAL_ELECTED_TIMESTAMP_OFFSET = 61;
|
14956
|
+
const UPDATED_HOOK_COUNT_OFFSET = 69;
|
14957
|
+
const FOUNDATION_SUPPORT_VOTE_FLAG_OFFSET = 70;
|
14958
|
+
|
14248
14959
|
const HOST_TOKEN_ID_OFFSET = 0;
|
14249
14960
|
const HOST_COUNTRY_CODE_OFFSET = 32;
|
14250
14961
|
const HOST_RESERVED_OFFSET = 34;
|
@@ -14253,10 +14964,13 @@ const HOST_REG_LEDGER_OFFSET = 68;
|
|
14253
14964
|
const HOST_REG_FEE_OFFSET = 76;
|
14254
14965
|
const HOST_TOT_INS_COUNT_OFFSET = 84;
|
14255
14966
|
const HOST_ACT_INS_COUNT_OFFSET = 88;
|
14256
|
-
const
|
14967
|
+
const HOST_HEARTBEAT_TIMESTAMP_OFFSET = 92;
|
14257
14968
|
const HOST_VERSION_OFFSET = 100;
|
14258
14969
|
const HOST_REG_TIMESTAMP_OFFSET = 103;
|
14259
14970
|
const HOST_TRANSFER_FLAG_OFFSET = 111;
|
14971
|
+
const HOST_LAST_VOTE_CANDIDATE_IDX_OFFSET = 112;
|
14972
|
+
const HOST_LAST_VOTE_TIMESTAMP_OFFSET = 116;
|
14973
|
+
const HOST_SUPPORT_VOTE_FLAG_OFFSET = 124;
|
14260
14974
|
|
14261
14975
|
const HOST_ADDRESS_OFFSET = 0;
|
14262
14976
|
const HOST_CPU_MODEL_NAME_OFFSET = 20;
|
@@ -14271,10 +14985,27 @@ const PREV_HOST_ADDRESS_OFFSET = 0;
|
|
14271
14985
|
const TRANSFER_LEDGER_IDX_OFFSET = 20;
|
14272
14986
|
const TRANSFERRED_NFT_ID_OFFSET = 28;
|
14273
14987
|
|
14988
|
+
const CANDIDATE_GOVERNOR_HOOK_HASH_OFFSET = 0;
|
14989
|
+
const CANDIDATE_REGISTRY_HOOK_HASH_OFFSET = 32;
|
14990
|
+
const CANDIDATE_HEARTBEAT_HOOK_HASH_OFFSET = 64;
|
14991
|
+
|
14992
|
+
const CANDIDATE_OWNER_ADDRESS_OFFSET = 0;
|
14993
|
+
const CANDIDATE_IDX_OFFSET = 20;
|
14994
|
+
const CANDIDATE_SHORT_NAME_OFFSET = 24;
|
14995
|
+
const CANDIDATE_CREATED_TIMESTAMP_OFFSET = 44;
|
14996
|
+
const CANDIDATE_PROPOSAL_FEE_OFFSET = 52;
|
14997
|
+
const CANDIDATE_POSITIVE_VOTE_COUNT_OFFSET = 60;
|
14998
|
+
const CANDIDATE_LAST_VOTE_TIMESTAMP_OFFSET = 64;
|
14999
|
+
const CANDIDATE_STATUS_OFFSET = 72;
|
15000
|
+
const CANDIDATE_STATUS_CHANGE_TIMESTAMP_OFFSET = 73;
|
15001
|
+
const CANDIDATE_FOUNDATION_VOTE_STATUS_OFFSET = 81;
|
15002
|
+
|
14274
15003
|
const STATE_KEY_TYPES = {
|
14275
15004
|
TOKEN_ID: 2,
|
14276
15005
|
HOST_ADDR: 3,
|
14277
|
-
TRANSFEREE_ADDR: 4
|
15006
|
+
TRANSFEREE_ADDR: 4,
|
15007
|
+
CANDIDATE_OWNER: 5,
|
15008
|
+
CANDIDATE_ID: 6
|
14278
15009
|
}
|
14279
15010
|
|
14280
15011
|
const MOMENT_TYPES = {
|
@@ -14290,6 +15021,7 @@ const TRANSFER_STATES = {
|
|
14290
15021
|
const EVERNODE_PREFIX = 'EVR';
|
14291
15022
|
const HOST_ADDR_KEY_ZERO_COUNT = 8;
|
14292
15023
|
const TRANSFEREE_ADDR_KEY_ZERO_COUNT = 8;
|
15024
|
+
const CANDIDATE_OWNER_KEY_ZERO_COUNT = 8;
|
14293
15025
|
const HOOK_STATE_LEDGER_TYPE_PREFIX = 118; // Decimal value of ASCII 'v'
|
14294
15026
|
const PENDING_TRANSFER = 1;
|
14295
15027
|
const HOST_EMAIL_ADDRESS_LEN = 40;
|
@@ -14300,7 +15032,9 @@ class StateHelpers {
|
|
14300
15032
|
HOST_ADDR: 'hostAddr',
|
14301
15033
|
SIGLETON: 'singleton',
|
14302
15034
|
CONFIGURATION: 'configuration',
|
14303
|
-
TRANSFEREE_ADDR: 'transfereeAddr'
|
15035
|
+
TRANSFEREE_ADDR: 'transfereeAddr',
|
15036
|
+
CANDIDATE_OWNER: 'candidateOwner',
|
15037
|
+
CANDIDATE_ID: 'candidateId'
|
14304
15038
|
}
|
14305
15039
|
|
14306
15040
|
static timeLines = {
|
@@ -14318,16 +15052,19 @@ class StateHelpers {
|
|
14318
15052
|
static decodeHostAddressState(stateKeyBuf, stateDataBuf) {
|
14319
15053
|
let data = {
|
14320
15054
|
address: codec.encodeAccountID(stateKeyBuf.slice(12)),
|
14321
|
-
|
15055
|
+
uriTokenId: stateDataBuf.slice(HOST_TOKEN_ID_OFFSET, HOST_COUNTRY_CODE_OFFSET).toString('hex').toUpperCase(),
|
14322
15056
|
countryCode: stateDataBuf.slice(HOST_COUNTRY_CODE_OFFSET, HOST_RESERVED_OFFSET).toString(),
|
14323
15057
|
description: stateDataBuf.slice(HOST_DESCRIPTION_OFFSET, HOST_REG_LEDGER_OFFSET).toString().replace(/\0/g, ''),
|
14324
15058
|
registrationLedger: Number(stateDataBuf.readBigUInt64BE(HOST_REG_LEDGER_OFFSET)),
|
14325
15059
|
registrationFee: Number(stateDataBuf.readBigUInt64BE(HOST_REG_FEE_OFFSET)),
|
14326
15060
|
maxInstances: stateDataBuf.readUInt32BE(HOST_TOT_INS_COUNT_OFFSET),
|
14327
15061
|
activeInstances: stateDataBuf.readUInt32BE(HOST_ACT_INS_COUNT_OFFSET),
|
14328
|
-
lastHeartbeatIndex: Number(stateDataBuf.readBigUInt64BE(
|
15062
|
+
lastHeartbeatIndex: Number(stateDataBuf.readBigUInt64BE(HOST_HEARTBEAT_TIMESTAMP_OFFSET)),
|
14329
15063
|
version: `${stateDataBuf.readUInt8(HOST_VERSION_OFFSET)}.${stateDataBuf.readUInt8(HOST_VERSION_OFFSET + 1)}.${stateDataBuf.readUInt8(HOST_VERSION_OFFSET + 2)}`,
|
14330
|
-
isATransferer: (stateDataBuf.
|
15064
|
+
isATransferer: (stateDataBuf.readUInt8(HOST_TRANSFER_FLAG_OFFSET) === PENDING_TRANSFER) ? TRANSFER_STATES.HAS_A_TRANSFER : TRANSFER_STATES.NO_TRANSFER,
|
15065
|
+
lastVoteCandidateIdx: stateDataBuf.readUInt32BE(HOST_LAST_VOTE_CANDIDATE_IDX_OFFSET),
|
15066
|
+
lastVoteTimestamp: Number(stateDataBuf.readBigUInt64BE(HOST_LAST_VOTE_TIMESTAMP_OFFSET)),
|
15067
|
+
supportVoteSent: stateDataBuf.readUInt8(HOST_SUPPORT_VOTE_FLAG_OFFSET)
|
14331
15068
|
}
|
14332
15069
|
if (stateDataBuf.length > HOST_REG_TIMESTAMP_OFFSET)
|
14333
15070
|
data.registrationTimestamp = Number(stateDataBuf.readBigUInt64BE(HOST_REG_TIMESTAMP_OFFSET));
|
@@ -14343,13 +15080,10 @@ class StateHelpers {
|
|
14343
15080
|
cpuMicrosec: stateDataBuf.readUInt32BE(HOST_CPU_MICROSEC_OFFSET),
|
14344
15081
|
ramMb: stateDataBuf.readUInt32BE(HOST_RAM_MB_OFFSET),
|
14345
15082
|
diskMb: stateDataBuf.readUInt32BE(HOST_DISK_MB_OFFSET),
|
14346
|
-
email:
|
14347
|
-
stateDataBuf.slice(HOST_EMAIL_ADDRESS_OFFSET, HOST_EMAIL_ADDRESS_OFFSET + HOST_EMAIL_ADDRESS_LEN).toString().toString().replace(/\0/g, '') :
|
14348
|
-
"")
|
15083
|
+
email: stateDataBuf.slice(HOST_EMAIL_ADDRESS_OFFSET, HOST_EMAIL_ADDRESS_OFFSET + HOST_EMAIL_ADDRESS_LEN).toString().toString().replace(/\0/g, '')
|
14349
15084
|
}
|
14350
15085
|
}
|
14351
15086
|
|
14352
|
-
|
14353
15087
|
static decodeTransfereeAddrState(stateKeyBuf, stateDataBuf) {
|
14354
15088
|
const prevHostClassicAddress = codec.encodeAccountID(stateDataBuf.slice(PREV_HOST_ADDRESS_OFFSET, TRANSFER_LEDGER_IDX_OFFSET));
|
14355
15089
|
return {
|
@@ -14361,6 +15095,51 @@ class StateHelpers {
|
|
14361
15095
|
}
|
14362
15096
|
}
|
14363
15097
|
|
15098
|
+
static decodeCandidateOwnerState(stateKeyBuf, stateDataBuf) {
|
15099
|
+
let data = {
|
15100
|
+
ownerAddress: codec.encodeAccountID(stateKeyBuf.slice(12)),
|
15101
|
+
uniqueId: this.getNewHookCandidateId(stateDataBuf),
|
15102
|
+
governorHookHash: stateDataBuf.slice(CANDIDATE_GOVERNOR_HOOK_HASH_OFFSET, CANDIDATE_REGISTRY_HOOK_HASH_OFFSET).toString('hex').toUpperCase(),
|
15103
|
+
registryHookHash: stateDataBuf.slice(CANDIDATE_REGISTRY_HOOK_HASH_OFFSET, CANDIDATE_HEARTBEAT_HOOK_HASH_OFFSET).toString('hex').toUpperCase(),
|
15104
|
+
heartbeatHookHash: stateDataBuf.slice(CANDIDATE_HEARTBEAT_HOOK_HASH_OFFSET, CANDIDATE_HEARTBEAT_HOOK_HASH_OFFSET + 32).toString('hex').toUpperCase(),
|
15105
|
+
}
|
15106
|
+
return data;
|
15107
|
+
}
|
15108
|
+
|
15109
|
+
static decodeCandidateIdState(stateDataBuf) {
|
15110
|
+
let status = '';
|
15111
|
+
switch (stateDataBuf.readUInt8(CANDIDATE_STATUS_OFFSET)) {
|
15112
|
+
case EvernodeConstants.CandidateStatuses.CANDIDATE_SUPPORTED:
|
15113
|
+
status = 'supported';
|
15114
|
+
break;
|
15115
|
+
case EvernodeConstants.CandidateStatuses.CANDIDATE_ELECTED:
|
15116
|
+
status = 'elected';
|
15117
|
+
break;
|
15118
|
+
case EvernodeConstants.CandidateStatuses.CANDIDATE_VETOED:
|
15119
|
+
status = 'vetoed';
|
15120
|
+
break;
|
15121
|
+
case EvernodeConstants.CandidateStatuses.CANDIDATE_EXPIRED:
|
15122
|
+
status = 'expired';
|
15123
|
+
break;
|
15124
|
+
default:
|
15125
|
+
status = 'rejected';
|
15126
|
+
break;
|
15127
|
+
}
|
15128
|
+
|
15129
|
+
return {
|
15130
|
+
ownerAddress: codec.encodeAccountID(stateDataBuf.slice(CANDIDATE_OWNER_ADDRESS_OFFSET, CANDIDATE_IDX_OFFSET)),
|
15131
|
+
index: stateDataBuf.readUInt32BE(CANDIDATE_IDX_OFFSET),
|
15132
|
+
shortName: stateDataBuf.slice(CANDIDATE_SHORT_NAME_OFFSET, CANDIDATE_CREATED_TIMESTAMP_OFFSET).toString().replace(/\x00+$/, ''), // Remove trailing \x00 characters.
|
15133
|
+
createdTimestamp: Number(stateDataBuf.readBigUInt64BE(CANDIDATE_CREATED_TIMESTAMP_OFFSET)),
|
15134
|
+
proposalFee: XflHelpers.toString(stateDataBuf.readBigInt64BE(CANDIDATE_PROPOSAL_FEE_OFFSET)),
|
15135
|
+
positiveVoteCount: stateDataBuf.readUInt32BE(CANDIDATE_POSITIVE_VOTE_COUNT_OFFSET),
|
15136
|
+
lastVoteTimestamp: Number(stateDataBuf.readBigUInt64BE(CANDIDATE_LAST_VOTE_TIMESTAMP_OFFSET)),
|
15137
|
+
status: status,
|
15138
|
+
statusChangeTimestamp: Number(stateDataBuf.readBigUInt64BE(CANDIDATE_STATUS_CHANGE_TIMESTAMP_OFFSET)),
|
15139
|
+
foundationVoteStatus: stateDataBuf.readUInt8(CANDIDATE_FOUNDATION_VOTE_STATUS_OFFSET) === EvernodeConstants.CandidateStatuses.CANDIDATE_SUPPORTED ? 'supported' : 'rejected'
|
15140
|
+
}
|
15141
|
+
}
|
15142
|
+
|
14364
15143
|
static decodeStateData(stateKey, stateData) {
|
14365
15144
|
const hexKey = stateKey.toString('hex').toUpperCase();
|
14366
15145
|
if (Buffer.from(HookStateKeys.PREFIX_HOST_ADDR, 'hex').compare(stateKey, 0, 4) === 0) {
|
@@ -14389,6 +15168,29 @@ class StateHelpers {
|
|
14389
15168
|
...this.decodeTransfereeAddrState(stateKey, stateData)
|
14390
15169
|
}
|
14391
15170
|
}
|
15171
|
+
else if (Buffer.from(HookStateKeys.PREFIX_CANDIDATE_OWNER, 'hex').compare(stateKey, 0, 4) === 0) {
|
15172
|
+
const decoded = this.decodeCandidateOwnerState(stateKey, stateData);
|
15173
|
+
|
15174
|
+
// Generate the address state key.
|
15175
|
+
const idBuf = Buffer.alloc(32, 0);
|
15176
|
+
Buffer.from(HookStateKeys.PREFIX_CANDIDATE_ID, 'hex').copy(idBuf);
|
15177
|
+
Buffer.from(decoded.uniqueId, 'hex').copy(idBuf, 4, 4, 32)
|
15178
|
+
|
15179
|
+
return {
|
15180
|
+
type: this.StateTypes.CANDIDATE_OWNER,
|
15181
|
+
key: hexKey,
|
15182
|
+
idKey: idBuf.toString('hex').toUpperCase(),
|
15183
|
+
...decoded
|
15184
|
+
}
|
15185
|
+
}
|
15186
|
+
else if (Buffer.from(HookStateKeys.PREFIX_CANDIDATE_ID, 'hex').compare(stateKey, 0, 4) === 0) {
|
15187
|
+
// Generate the owner state key.
|
15188
|
+
return {
|
15189
|
+
type: this.StateTypes.CANDIDATE_ID,
|
15190
|
+
key: hexKey,
|
15191
|
+
...this.decodeCandidateIdState(stateData)
|
15192
|
+
}
|
15193
|
+
}
|
14392
15194
|
else if (Buffer.from(HookStateKeys.HOST_COUNT, 'hex').compare(stateKey) === 0) {
|
14393
15195
|
return {
|
14394
15196
|
type: this.StateTypes.SIGLETON,
|
@@ -14414,7 +15216,10 @@ class StateHelpers {
|
|
14414
15216
|
value: Number(stateData.readBigUInt64BE())
|
14415
15217
|
}
|
14416
15218
|
}
|
14417
|
-
else if (Buffer.from(HookStateKeys.
|
15219
|
+
else if (Buffer.from(HookStateKeys.REGISTRY_ADDR, 'hex').compare(stateKey) === 0 ||
|
15220
|
+
Buffer.from(HookStateKeys.HEARTBEAT_ADDR, 'hex').compare(stateKey) === 0 ||
|
15221
|
+
Buffer.from(HookStateKeys.EVR_ISSUER_ADDR, 'hex').compare(stateKey) === 0 ||
|
15222
|
+
Buffer.from(HookStateKeys.FOUNDATION_ADDR, 'hex').compare(stateKey) === 0) {
|
14418
15223
|
return {
|
14419
15224
|
type: this.StateTypes.CONFIGURATION,
|
14420
15225
|
key: hexKey,
|
@@ -14437,15 +15242,6 @@ class StateHelpers {
|
|
14437
15242
|
value: Number(stateData.readBigUInt64BE())
|
14438
15243
|
}
|
14439
15244
|
}
|
14440
|
-
else if (Buffer.from(HookStateKeys.PURCHASER_TARGET_PRICE, 'hex').compare(stateKey) === 0) {
|
14441
|
-
const xfl = stateData.readBigInt64BE(0);
|
14442
|
-
const val = XflHelpers.toString(xfl);
|
14443
|
-
return {
|
14444
|
-
type: this.StateTypes.CONFIGURATION,
|
14445
|
-
key: hexKey,
|
14446
|
-
value: val
|
14447
|
-
}
|
14448
|
-
}
|
14449
15245
|
else if (Buffer.from(HookStateKeys.REWARD_CONFIGURATION, 'hex').compare(stateKey) === 0) {
|
14450
15246
|
return {
|
14451
15247
|
type: this.StateTypes.CONFIGURATION,
|
@@ -14497,6 +15293,51 @@ class StateHelpers {
|
|
14497
15293
|
value: Number(stateData.readBigUInt64BE())
|
14498
15294
|
}
|
14499
15295
|
}
|
15296
|
+
else if (Buffer.from(HookStateKeys.GOVERNANCE_CONFIGURATION, 'hex').compare(stateKey) === 0) {
|
15297
|
+
return {
|
15298
|
+
type: this.StateTypes.CONFIGURATION,
|
15299
|
+
key: hexKey,
|
15300
|
+
value: {
|
15301
|
+
eligibilityPeriod: stateData.readUInt32BE(ELIGIBILITY_PERIOD_OFFSET),
|
15302
|
+
candidateLifePeriod: stateData.readUInt32BE(CANDIDATE_LIFE_PERIOD_OFFSET),
|
15303
|
+
candidateElectionPeriod: stateData.readUInt32BE(CANDIDATE_ELECTION_PERIOD_OFFSET),
|
15304
|
+
candidateSupportAverage: stateData.readUInt16BE(CANDIDATE_SUPPORT_AVERAGE_OFFSET)
|
15305
|
+
}
|
15306
|
+
}
|
15307
|
+
}
|
15308
|
+
else if (Buffer.from(HookStateKeys.GOVERNANCE_INFO, 'hex').compare(stateKey) === 0) {
|
15309
|
+
let mode = '';
|
15310
|
+
switch (stateData.readUInt8(GOVERNANCE_MODE_OFFSET)) {
|
15311
|
+
case EvernodeConstants.GovernanceModes.Piloted:
|
15312
|
+
mode = 'piloted';
|
15313
|
+
break;
|
15314
|
+
case EvernodeConstants.GovernanceModes.CoPiloted:
|
15315
|
+
mode = 'co-piloted';
|
15316
|
+
break;
|
15317
|
+
case EvernodeConstants.GovernanceModes.AutoPiloted:
|
15318
|
+
mode = 'auto-piloted';
|
15319
|
+
break;
|
15320
|
+
default:
|
15321
|
+
mode = 'undefined';
|
15322
|
+
break;
|
15323
|
+
}
|
15324
|
+
return {
|
15325
|
+
type: this.StateTypes.CONFIGURATION,
|
15326
|
+
key: hexKey,
|
15327
|
+
value: {
|
15328
|
+
governanceMode: mode,
|
15329
|
+
lastCandidateIdx: stateData.readUInt32BE(LAST_CANDIDATE_IDX_OFFSET),
|
15330
|
+
voteBaseCount: stateData.readUInt32BE(VOTER_BASE_COUNT_OFFSET),
|
15331
|
+
voteBaseCountChangedTimestamp: Number(stateData.readBigUInt64BE(VOTER_BASE_COUNT_CHANGED_TIMESTAMP_OFFSET)),
|
15332
|
+
foundationLastVotedCandidateIdx: stateData.readUInt32BE(FOUNDATION_LAST_VOTED_CANDIDATE_IDX),
|
15333
|
+
foundationLastVotedTimestamp: Number(stateData.readBigUInt64BE(FOUNDATION_LAST_VOTED_TIMESTAMP_OFFSET)),
|
15334
|
+
electedProposalUniqueId: stateData.readUInt32BE(ELECTED_PROPOSAL_UNIQUE_ID_OFFSET),
|
15335
|
+
proposalElectedTimestamp: Number(stateData.readBigUInt64BE(PROPOSAL_ELECTED_TIMESTAMP_OFFSET)),
|
15336
|
+
updatedHookCount: stateData.readUInt8(UPDATED_HOOK_COUNT_OFFSET),
|
15337
|
+
supportVoteSent: stateData.readUInt8(FOUNDATION_SUPPORT_VOTE_FLAG_OFFSET)
|
15338
|
+
}
|
15339
|
+
}
|
15340
|
+
}
|
14500
15341
|
else
|
14501
15342
|
throw { type: 'Validation Error', message: 'Invalid state key.' };
|
14502
15343
|
}
|
@@ -14521,6 +15362,18 @@ class StateHelpers {
|
|
14521
15362
|
type: this.StateTypes.TRANSFEREE_ADDR
|
14522
15363
|
};
|
14523
15364
|
}
|
15365
|
+
else if (Buffer.from(HookStateKeys.PREFIX_CANDIDATE_ID, 'hex').compare(stateKey, 0, 4) === 0) {
|
15366
|
+
return {
|
15367
|
+
key: hexKey,
|
15368
|
+
type: this.StateTypes.CANDIDATE_ID
|
15369
|
+
};
|
15370
|
+
}
|
15371
|
+
else if (Buffer.from(HookStateKeys.PREFIX_CANDIDATE_OWNER, 'hex').compare(stateKey, 0, 4) === 0) {
|
15372
|
+
return {
|
15373
|
+
key: hexKey,
|
15374
|
+
type: this.StateTypes.CANDIDATE_OWNER
|
15375
|
+
};
|
15376
|
+
}
|
14524
15377
|
else if (Buffer.from(HookStateKeys.HOST_COUNT, 'hex').compare(stateKey) === 0 ||
|
14525
15378
|
Buffer.from(HookStateKeys.MOMENT_BASE_INFO, 'hex').compare(stateKey) === 0 ||
|
14526
15379
|
Buffer.from(HookStateKeys.HOST_REG_FEE, 'hex').compare(stateKey) === 0 ||
|
@@ -14528,13 +15381,12 @@ class StateHelpers {
|
|
14528
15381
|
Buffer.from(HookStateKeys.REWARD_INFO, 'hex').compare(stateKey) === 0) {
|
14529
15382
|
return {
|
14530
15383
|
key: hexKey,
|
14531
|
-
type: this.
|
15384
|
+
type: this.StateTypes.SIGLETON
|
14532
15385
|
};
|
14533
15386
|
}
|
14534
15387
|
else if (Buffer.from(HookStateKeys.EVR_ISSUER_ADDR, 'hex').compare(stateKey) === 0 ||
|
14535
15388
|
Buffer.from(HookStateKeys.FOUNDATION_ADDR, 'hex').compare(stateKey) === 0 ||
|
14536
15389
|
Buffer.from(HookStateKeys.MOMENT_SIZE, 'hex').compare(stateKey) === 0 ||
|
14537
|
-
Buffer.from(HookStateKeys.PURCHASER_TARGET_PRICE, 'hex').compare(stateKey) === 0 ||
|
14538
15390
|
Buffer.from(HookStateKeys.HOST_HEARTBEAT_FREQ, 'hex').compare(stateKey) ||
|
14539
15391
|
Buffer.from(HookStateKeys.MINT_LIMIT, 'hex').compare(stateKey) === 0 ||
|
14540
15392
|
Buffer.from(HookStateKeys.FIXED_REG_FEE, 'hex').compare(stateKey) === 0 ||
|
@@ -14542,23 +15394,27 @@ class StateHelpers {
|
|
14542
15394
|
Buffer.from(HookStateKeys.REWARD_CONFIGURATION, 'hex').compare(stateKey) === 0 ||
|
14543
15395
|
Buffer.from(HookStateKeys.MAX_TOLERABLE_DOWNTIME, 'hex').compare(stateKey) === 0 ||
|
14544
15396
|
Buffer.from(HookStateKeys.MOMENT_TRANSIT_INFO, 'hex').compare(stateKey) === 0 ||
|
14545
|
-
Buffer.from(HookStateKeys.MAX_TRX_EMISSION_FEE, 'hex').compare(stateKey) === 0
|
15397
|
+
Buffer.from(HookStateKeys.MAX_TRX_EMISSION_FEE, 'hex').compare(stateKey) === 0 ||
|
15398
|
+
Buffer.from(HookStateKeys.REGISTRY_ADDR, 'hex').compare(stateKey) === 0 ||
|
15399
|
+
Buffer.from(HookStateKeys.HEARTBEAT_ADDR, 'hex').compare(stateKey) === 0 ||
|
15400
|
+
Buffer.from(HookStateKeys.GOVERNANCE_CONFIGURATION, 'hex').compare(stateKey) === 0 ||
|
15401
|
+
Buffer.from(HookStateKeys.GOVERNANCE_INFO, 'hex').compare(stateKey) === 0) {
|
14546
15402
|
return {
|
14547
15403
|
key: hexKey,
|
14548
|
-
type: this.
|
15404
|
+
type: this.StateTypes.CONFIGURATION
|
14549
15405
|
};
|
14550
15406
|
}
|
14551
15407
|
else
|
14552
15408
|
throw { type: 'Validation Error', message: 'Invalid state key.' };
|
14553
15409
|
}
|
14554
15410
|
|
14555
|
-
static generateTokenIdStateKey(
|
15411
|
+
static generateTokenIdStateKey(uriToken) {
|
14556
15412
|
// 1 byte - Key Type.
|
14557
15413
|
let buf = Buffer.allocUnsafe(1);
|
14558
15414
|
buf.writeUInt8(STATE_KEY_TYPES.TOKEN_ID);
|
14559
15415
|
|
14560
|
-
const
|
14561
|
-
const stateKeyBuf = (Buffer.concat([Buffer.from(EVERNODE_PREFIX, "utf-8"), buf,
|
15416
|
+
const uriTokenBuf = Buffer.from(uriToken, "hex");
|
15417
|
+
const stateKeyBuf = (Buffer.concat([Buffer.from(EVERNODE_PREFIX, "utf-8"), buf, uriTokenBuf.slice(4, 32)]));
|
14562
15418
|
return stateKeyBuf.toString('hex').toUpperCase();
|
14563
15419
|
}
|
14564
15420
|
|
@@ -14590,6 +15446,30 @@ class StateHelpers {
|
|
14590
15446
|
return stateKeyBuf.toString('hex').toUpperCase();
|
14591
15447
|
}
|
14592
15448
|
|
15449
|
+
static generateCandidateIdStateKey(uniqueId) {
|
15450
|
+
// 1 byte - Key Type.
|
15451
|
+
let buf = Buffer.allocUnsafe(1);
|
15452
|
+
buf.writeUInt8(STATE_KEY_TYPES.CANDIDATE_ID);
|
15453
|
+
|
15454
|
+
const idBuf = Buffer.from(uniqueId, "hex");
|
15455
|
+
const stateKeyBuf = (Buffer.concat([Buffer.from(EVERNODE_PREFIX, "utf-8"), buf, idBuf.slice(4, 32)]));
|
15456
|
+
return stateKeyBuf.toString('hex').toUpperCase();
|
15457
|
+
}
|
15458
|
+
|
15459
|
+
static generateCandidateOwnerStateKey(owner) {
|
15460
|
+
// 1 byte - Key Type.
|
15461
|
+
// 8 bytes - Zeros.
|
15462
|
+
let buf = Buffer.allocUnsafe(9);
|
15463
|
+
buf.writeUInt8(STATE_KEY_TYPES.CANDIDATE_OWNER);
|
15464
|
+
for (let i = 0; i < CANDIDATE_OWNER_KEY_ZERO_COUNT; i++) {
|
15465
|
+
buf.writeUInt8(0, i + 1);
|
15466
|
+
}
|
15467
|
+
|
15468
|
+
const addrBuf = Buffer.from(codec.decodeAccountID(owner), "hex");
|
15469
|
+
const stateKeyBuf = Buffer.concat([Buffer.from(EVERNODE_PREFIX, "utf-8"), buf, addrBuf]);
|
15470
|
+
return stateKeyBuf.toString('hex').toUpperCase();
|
15471
|
+
}
|
15472
|
+
|
14593
15473
|
static getHookStateIndex(hookAccount, stateKey, hookNamespace = EvernodeConstants.HOOK_NAMESPACE) {
|
14594
15474
|
const typeBuf = Buffer.allocUnsafe(2);
|
14595
15475
|
typeBuf.writeInt16BE(HOOK_STATE_LEDGER_TYPE_PREFIX);
|
@@ -14609,6 +15489,31 @@ class StateHelpers {
|
|
14609
15489
|
// Get the first 32 bytes of hash.
|
14610
15490
|
return digest.substring(0, 64).toUpperCase();
|
14611
15491
|
}
|
15492
|
+
|
15493
|
+
static getNewHookCandidateId(hashesBuf) {
|
15494
|
+
const idBuf = Buffer.alloc(32, 0);
|
15495
|
+
idBuf.writeUInt8(EvernodeConstants.CandidateTypes.NewHook, 4);
|
15496
|
+
Buffer.from(sha512Half(hashesBuf)).copy(idBuf, 5, 5);
|
15497
|
+
return idBuf.toString('hex').toUpperCase();
|
15498
|
+
}
|
15499
|
+
|
15500
|
+
static getPilotedModeCandidateId() {
|
15501
|
+
const idBuf = Buffer.alloc(32, 0);
|
15502
|
+
idBuf.writeUInt8(EvernodeConstants.CandidateTypes.PilotedMode, 4);
|
15503
|
+
Buffer.from(EvernodeConstants.HOOK_NAMESPACE, 'hex').copy(idBuf, 5, 5);
|
15504
|
+
return idBuf.toString('hex').toUpperCase();
|
15505
|
+
}
|
15506
|
+
|
15507
|
+
static getDudHostCandidateId(hostAddress) {
|
15508
|
+
const idBuf = Buffer.alloc(32, 0);
|
15509
|
+
idBuf.writeUInt8(EvernodeConstants.CandidateTypes.DudHost, 4);
|
15510
|
+
codec.decodeAccountID(hostAddress).copy(idBuf, 12);
|
15511
|
+
return idBuf.toString('hex').toUpperCase();
|
15512
|
+
}
|
15513
|
+
|
15514
|
+
static getCandidateType(candidateId) {
|
15515
|
+
return Buffer.from(candidateId, 'hex').readUInt8(4);
|
15516
|
+
}
|
14612
15517
|
}
|
14613
15518
|
|
14614
15519
|
module.exports = {
|
@@ -14691,6 +15596,7 @@ module.exports = {
|
|
14691
15596
|
const { Buffer } = __nccwpck_require__(4300);
|
14692
15597
|
const { XflHelpers } = __nccwpck_require__(3243);
|
14693
15598
|
const { EvernodeConstants, ErrorReasons } = __nccwpck_require__(9849);
|
15599
|
+
const { TransactionHelper } = __nccwpck_require__(7071);
|
14694
15600
|
|
14695
15601
|
// Utility helper functions.
|
14696
15602
|
class UtilHelpers {
|
@@ -14714,7 +15620,7 @@ class UtilHelpers {
|
|
14714
15620
|
static decodeLeaseNftUri(hexUri) {
|
14715
15621
|
// Get the lease index from the nft URI.
|
14716
15622
|
// <prefix><lease index (uint16)><half of tos hash (16 bytes)><lease amount (uint32)>
|
14717
|
-
const prefixLen = EvernodeConstants.
|
15623
|
+
const prefixLen = EvernodeConstants.LEASE_TOKEN_PREFIX_HEX.length / 2;
|
14718
15624
|
const halfToSLen = 16;
|
14719
15625
|
const uriBuf = Buffer.from(hexUri, 'hex');
|
14720
15626
|
return {
|
@@ -14724,6 +15630,21 @@ class UtilHelpers {
|
|
14724
15630
|
}
|
14725
15631
|
}
|
14726
15632
|
|
15633
|
+
static decodeLeaseTokenUri(hexUri) {
|
15634
|
+
// Get the lease index from the token's URI.
|
15635
|
+
// <prefix><lease index (uint16)><half of tos hash (16 bytes)><lease amount (uint32)>
|
15636
|
+
|
15637
|
+
const asciiUri = TransactionHelper.hexToASCII(hexUri);
|
15638
|
+
const uriBuf = Buffer.from(asciiUri, 'base64');
|
15639
|
+
const prefixLen = EvernodeConstants.LEASE_TOKEN_PREFIX_HEX.length / 2;
|
15640
|
+
const halfToSLen = 16;
|
15641
|
+
return {
|
15642
|
+
leaseIndex: uriBuf.readUint16BE(prefixLen),
|
15643
|
+
halfTos: uriBuf.slice(prefixLen + 2, halfToSLen),
|
15644
|
+
leaseAmount: parseFloat(XflHelpers.toString(uriBuf.readBigInt64BE(prefixLen + 2 + halfToSLen)))
|
15645
|
+
}
|
15646
|
+
}
|
15647
|
+
|
14727
15648
|
static getCurrentUnixTime(format = "sec") {
|
14728
15649
|
const time = Date.now();
|
14729
15650
|
switch (format) {
|
@@ -15339,7 +16260,6 @@ class XrplAccount {
|
|
15339
16260
|
// details: submission and transaction details, (if signing success)
|
15340
16261
|
// error: Any error that prevents submission.
|
15341
16262
|
// }
|
15342
|
-
|
15343
16263
|
return new Promise(async (resolve, reject) => {
|
15344
16264
|
|
15345
16265
|
// Attach tx options to the transaction.
|
@@ -15347,7 +16267,8 @@ class XrplAccount {
|
|
15347
16267
|
LastLedgerSequence: options.maxLedgerIndex || (this.xrplApi.ledgerIndex + XrplConstants.MAX_LEDGER_OFFSET),
|
15348
16268
|
Sequence: options.sequence || await this.getSequence(),
|
15349
16269
|
SigningPubKey: '', // This field is required for fee calculation.
|
15350
|
-
Fee: '0' // This field is required for fee calculation.
|
16270
|
+
Fee: '0', // This field is required for fee calculation.
|
16271
|
+
NetworkID: DefaultValues.networkID
|
15351
16272
|
}
|
15352
16273
|
Object.assign(tx, txOptions);
|
15353
16274
|
const txnBlob = xrplCodec.encode(tx);
|
@@ -15365,10 +16286,17 @@ class XrplAccount {
|
|
15365
16286
|
};
|
15366
16287
|
|
15367
16288
|
console.log("Transaction result: " + txResult.code);
|
16289
|
+
const hookExecRes = txResult.details?.meta?.HookExecutions?.map(o => {
|
16290
|
+
return {
|
16291
|
+
result: o.HookExecution?.HookResult,
|
16292
|
+
returnCode: o.HookExecution?.HookReturnCode,
|
16293
|
+
message: TransactionHelper.hexToASCII(o.HookExecution?.HookReturnString).replace(/\x00+$/, '')
|
16294
|
+
}
|
16295
|
+
});
|
15368
16296
|
if (txResult.code === "tesSUCCESS")
|
15369
|
-
resolve(txResult);
|
16297
|
+
resolve({ ...txResult, ...(hookExecRes ? { hookExecutionResult: hookExecRes } : {}) });
|
15370
16298
|
else
|
15371
|
-
reject(txResult);
|
16299
|
+
reject({ ...txResult, ...(hookExecRes ? { hookExecutionResult: hookExecRes } : {}) });
|
15372
16300
|
}
|
15373
16301
|
catch (err) {
|
15374
16302
|
console.log("Error submitting transaction:", err);
|
@@ -15403,10 +16331,17 @@ class XrplAccount {
|
|
15403
16331
|
};
|
15404
16332
|
|
15405
16333
|
console.log("Transaction result: " + txResult.code);
|
16334
|
+
const hookExecRes = txResult.details?.meta?.HookExecutions?.map(o => {
|
16335
|
+
return {
|
16336
|
+
result: o.HookExecution?.HookResult,
|
16337
|
+
returnCode: o.HookExecution?.HookReturnCode,
|
16338
|
+
message: TransactionHelper.hexToASCII(o.HookExecution?.HookReturnString).replace(/\x00+$/, '')
|
16339
|
+
}
|
16340
|
+
});
|
15406
16341
|
if (txResult.code === "tesSUCCESS")
|
15407
|
-
resolve(txResult);
|
16342
|
+
resolve({ ...txResult, ...(hookExecRes ? { hookExecutionResult: hookExecRes } : {}) });
|
15408
16343
|
else
|
15409
|
-
reject(txResult);
|
16344
|
+
reject({ ...txResult, ...(hookExecRes ? { hookExecutionResult: hookExecRes } : {}) });
|
15410
16345
|
}
|
15411
16346
|
catch (err) {
|
15412
16347
|
console.log("Error submitting transaction:", err);
|
@@ -15425,6 +16360,83 @@ class XrplAccount {
|
|
15425
16360
|
sign(tx, isMultiSign = false) {
|
15426
16361
|
return this.wallet.sign(tx, isMultiSign);
|
15427
16362
|
}
|
16363
|
+
|
16364
|
+
// URIToken related methods
|
16365
|
+
|
16366
|
+
mintURIToken(uri, digest = null, flags = {}, options = {}) {
|
16367
|
+
const tx = {
|
16368
|
+
Account: this.address,
|
16369
|
+
TransactionType: "URITokenMint",
|
16370
|
+
URI: flags.isHexUri ? uri : TransactionHelper.asciiToHex(uri).toUpperCase(),
|
16371
|
+
Flags: flags.isBurnable ? 1 : 0
|
16372
|
+
}
|
16373
|
+
|
16374
|
+
if (digest)
|
16375
|
+
tx.Digest = digest;
|
16376
|
+
|
16377
|
+
return this.#submitAndVerifyTransaction(tx, options);
|
16378
|
+
}
|
16379
|
+
|
16380
|
+
burnURIToken(uriTokenID, options = {}) {
|
16381
|
+
const tx = {
|
16382
|
+
Account: this.address,
|
16383
|
+
TransactionType: "URITokenBurn",
|
16384
|
+
URITokenID: uriTokenID
|
16385
|
+
}
|
16386
|
+
return this.#submitAndVerifyTransaction(tx, options);
|
16387
|
+
}
|
16388
|
+
|
16389
|
+
sellURIToken(uriTokenID, amount, currency, issuer = null, toAddr = null, memos = null, options = {}) {
|
16390
|
+
const amountObj = makeAmountObject(amount, currency, issuer);
|
16391
|
+
|
16392
|
+
const tx = {
|
16393
|
+
Account: this.address,
|
16394
|
+
TransactionType: "URITokenCreateSellOffer",
|
16395
|
+
Amount: amountObj,
|
16396
|
+
URITokenID: uriTokenID
|
16397
|
+
};
|
16398
|
+
|
16399
|
+
if (toAddr)
|
16400
|
+
tx.Destination = toAddr;
|
16401
|
+
|
16402
|
+
if (memos)
|
16403
|
+
tx.Memos = TransactionHelper.formatMemos(memos);
|
16404
|
+
|
16405
|
+
return this.#submitAndVerifyTransaction(tx, options);
|
16406
|
+
}
|
16407
|
+
|
16408
|
+
buyURIToken(uriToken, memos = null, options = {}) {
|
16409
|
+
const tx = {
|
16410
|
+
Account: this.address,
|
16411
|
+
TransactionType: "URITokenBuy",
|
16412
|
+
Amount: uriToken.Amount,
|
16413
|
+
URITokenID: uriToken.index
|
16414
|
+
}
|
16415
|
+
|
16416
|
+
if (memos)
|
16417
|
+
tx.Memos = TransactionHelper.formatMemos(memos);
|
16418
|
+
|
16419
|
+
return this.#submitAndVerifyTransaction(tx, options);
|
16420
|
+
}
|
16421
|
+
|
16422
|
+
async clearURITokenOffer(uriTokenID, options = {}) {
|
16423
|
+
return this.#submitAndVerifyTransaction({
|
16424
|
+
Account: this.address,
|
16425
|
+
TransactionType: "URITokenCancelSellOffer",
|
16426
|
+
URITokenID: uriTokenID
|
16427
|
+
}, options);
|
16428
|
+
}
|
16429
|
+
|
16430
|
+
async getURITokens(options) {
|
16431
|
+
const obj = await this.getAccountObjects(options);
|
16432
|
+
return obj.filter(t => t.LedgerEntryType == 'URIToken');
|
16433
|
+
}
|
16434
|
+
|
16435
|
+
async getURITokenByUri(uri, isHexUri = false) {
|
16436
|
+
const tokens = await this.getURITokens();
|
16437
|
+
const hexUri = isHexUri ? uri : TransactionHelper.asciiToHex(uri).toUpperCase();
|
16438
|
+
return tokens.find(t => t.URI == hexUri);
|
16439
|
+
}
|
15428
16440
|
}
|
15429
16441
|
|
15430
16442
|
function makeAmountObject(amount, currency, issuer) {
|
@@ -15445,6 +16457,7 @@ module.exports = {
|
|
15445
16457
|
XrplAccount
|
15446
16458
|
}
|
15447
16459
|
|
16460
|
+
|
15448
16461
|
/***/ }),
|
15449
16462
|
|
15450
16463
|
/***/ 1850:
|
@@ -15456,6 +16469,7 @@ const { EventEmitter } = __nccwpck_require__(6170);
|
|
15456
16469
|
const { DefaultValues } = __nccwpck_require__(8262);
|
15457
16470
|
const { TransactionHelper } = __nccwpck_require__(7071);
|
15458
16471
|
const { XrplApiEvents } = __nccwpck_require__(3307);
|
16472
|
+
const { XrplAccount } = __nccwpck_require__(9329);
|
15459
16473
|
|
15460
16474
|
const MAX_PAGE_LIMIT = 400;
|
15461
16475
|
const API_REQ_TYPE = {
|
@@ -15511,19 +16525,20 @@ class XrplApi {
|
|
15511
16525
|
this.#client.on("transaction", async (data) => {
|
15512
16526
|
if (data.validated) {
|
15513
16527
|
// NFTokenAcceptOffer transactions does not contain a Destination. So we check whether the accepted offer is created by which subscribed account
|
15514
|
-
if (data.transaction.TransactionType === '
|
16528
|
+
if (data.transaction.TransactionType === 'URITokenBuy') {
|
15515
16529
|
// We take all the offers created by subscribed accounts in previous ledger until we get the respective offer.
|
15516
16530
|
for (const subscription of this.#addressSubscriptions) {
|
15517
|
-
const
|
16531
|
+
const acc = new XrplAccount(subscription.address, null);
|
16532
|
+
// Here we access the offers that were there in this account based on the given ledger index.
|
16533
|
+
const offers = await acc.getURITokens({ ledger_index: data.ledger_index - 1 });
|
16534
|
+
// Filter out the matching URI token offer for the scenario.
|
16535
|
+
const offer = offers.find(o => o.index === data.transaction.URITokenID && o.Amount);
|
15518
16536
|
// When we find the respective offer. We populate the destination and offer info and then we break the loop.
|
15519
16537
|
if (offer) {
|
15520
16538
|
// We populate some sell offer properties to the transaction to be sent with the event.
|
15521
16539
|
data.transaction.Destination = subscription.address;
|
15522
16540
|
// Replace the offer with the found offer object.
|
15523
|
-
|
15524
|
-
data.transaction.NFTokenSellOffer = offer;
|
15525
|
-
else if (data.transaction.NFTokenBuyOffer)
|
15526
|
-
data.transaction.NFTokenBuyOffer = offer;
|
16541
|
+
data.transaction.URITokenSellOffer = offer;
|
15527
16542
|
break;
|
15528
16543
|
}
|
15529
16544
|
}
|
@@ -15670,6 +16685,11 @@ class XrplApi {
|
|
15670
16685
|
return resp?.result?.account_data;
|
15671
16686
|
}
|
15672
16687
|
|
16688
|
+
async getServerDefinition() {
|
16689
|
+
const resp = (await this.#client.request({ command: 'server_definitions' }));
|
16690
|
+
return resp?.result;
|
16691
|
+
}
|
16692
|
+
|
15673
16693
|
async getAccountObjects(address, options) {
|
15674
16694
|
return this.#requestWithPaging({ command: 'account_objects', account: address, ...options }, API_REQ_TYPE.ACCOUNT_OBJECTS);
|
15675
16695
|
}
|
@@ -15747,6 +16767,10 @@ class XrplApi {
|
|
15747
16767
|
await this.#client.request({ command: 'subscribe', streams: [streamName] });
|
15748
16768
|
}
|
15749
16769
|
|
16770
|
+
async submitMultisigned(tx) {
|
16771
|
+
return await this.#client.request({ command: 'submit_multisigned', tx_json: tx });
|
16772
|
+
}
|
16773
|
+
|
15750
16774
|
/**
|
15751
16775
|
* Join the given the array of signed transactions into one multi-signed transaction.
|
15752
16776
|
* For more details: https://js.xrpl.org/functions/multisign.html
|
@@ -15755,10 +16779,10 @@ class XrplApi {
|
|
15755
16779
|
* @returns A single signed Transaction string which has all Signers from transactions within it.
|
15756
16780
|
*/
|
15757
16781
|
multiSign(transactions) {
|
15758
|
-
if(transactions.length > 0){
|
16782
|
+
if (transactions.length > 0) {
|
15759
16783
|
return xrpl.multisign(transactions);
|
15760
16784
|
} else
|
15761
|
-
throw("Transaction list is empty for multi-signing.");
|
16785
|
+
throw ("Transaction list is empty for multi-signing.");
|
15762
16786
|
}
|
15763
16787
|
}
|
15764
16788
|
|
@@ -15775,7 +16799,9 @@ const XrplApiEvents = {
|
|
15775
16799
|
LEDGER: 'ledger',
|
15776
16800
|
PAYMENT: 'payment',
|
15777
16801
|
NFT_OFFER_CREATE: 'nftokencreateoffer',
|
15778
|
-
NFT_OFFER_ACCEPT: 'nftokenacceptoffer'
|
16802
|
+
NFT_OFFER_ACCEPT: 'nftokenacceptoffer',
|
16803
|
+
URI_TOKEN_CREATE_SELL_OFFER: 'uritokencreateselloffer', // For Transfers
|
16804
|
+
URI_TOKEN_BUY: 'uritokenbuy' // For Acquires
|
15779
16805
|
}
|
15780
16806
|
|
15781
16807
|
const XrplConstants = {
|
@@ -15875,7 +16901,7 @@ module.exports = require("xrpl");
|
|
15875
16901
|
/***/ ((module) => {
|
15876
16902
|
|
15877
16903
|
"use strict";
|
15878
|
-
module.exports = JSON.parse('{"TYPES":{"Done":-1,"Unknown":-2,"NotPresent":0,"UInt16":1,"UInt32":2,"UInt64":3,"Hash128":4,"Hash256":5,"Amount":6,"Blob":7,"AccountID":8,"STObject":14,"STArray":15,"UInt8":16,"Hash160":17,"PathSet":18,"Vector256":19,"UInt96":20,"UInt192":21,"UInt384":22,"UInt512":23,"Transaction":10001,"LedgerEntry":10002,"Validation":10003,"Metadata":10004},"LEDGER_ENTRY_TYPES":{"Invalid":-1,"AccountRoot":97,"DirectoryNode":100,"RippleState":114,"Ticket":84,"SignerList":83,"Offer":111,"LedgerHashes":104,"Amendments":102,"FeeSettings":115,"Escrow":117,"PayChannel":120,"Check":67,"DepositPreauth":112,"NegativeUnl":78,"Any":0,"Child":7378,"Nickname":110,"Contract":99,"GeneratorMap":103},"FIELDS":[["Generic",{"nth":0,"isVLEncoded":false,"isSerialized":false,"isSigningField":false,"type":"Unknown"}],["Invalid",{"nth":-1,"isVLEncoded":false,"isSerialized":false,"isSigningField":false,"type":"Unknown"}],["ObjectEndMarker",{"nth":1,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STObject"}],["ArrayEndMarker",{"nth":1,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STArray"}],["hash",{"nth":257,"isVLEncoded":false,"isSerialized":false,"isSigningField":false,"type":"Hash256"}],["index",{"nth":258,"isVLEncoded":false,"isSerialized":false,"isSigningField":false,"type":"Hash256"}],["taker_gets_funded",{"nth":258,"isVLEncoded":false,"isSerialized":false,"isSigningField":false,"type":"Amount"}],["taker_pays_funded",{"nth":259,"isVLEncoded":false,"isSerialized":false,"isSigningField":false,"type":"Amount"}],["LedgerEntry",{"nth":257,"isVLEncoded":false,"isSerialized":false,"isSigningField":true,"type":"LedgerEntry"}],["Transaction",{"nth":257,"isVLEncoded":false,"isSerialized":false,"isSigningField":true,"type":"Transaction"}],["Validation",{"nth":257,"isVLEncoded":false,"isSerialized":false,"isSigningField":true,"type":"Validation"}],["Metadata",{"nth":257,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Metadata"}],["CloseResolution",{"nth":1,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt8"}],["Method",{"nth":2,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt8"}],["TransactionResult",{"nth":3,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt8"}],["TickSize",{"nth":16,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt8"}],["UNLModifyDisabling",{"nth":17,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt8"}],["HookResult",{"nth":18,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt8"}],["LedgerEntryType",{"nth":1,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt16"}],["TransactionType",{"nth":2,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt16"}],["SignerWeight",{"nth":3,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt16"}],["TransferFee",{"nth":4,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt16"}],["Version",{"nth":16,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt16"}],["HookStateChangeCount",{"nth":17,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt16"}],["HookEmitCount",{"nth":18,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt16"}],["HookExecutionIndex",{"nth":19,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt16"}],["HookApiVersion",{"nth":20,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt16"}],["Flags",{"nth":2,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["SourceTag",{"nth":3,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["Sequence",{"nth":4,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["PreviousTxnLgrSeq",{"nth":5,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["LedgerSequence",{"nth":6,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["CloseTime",{"nth":7,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["ParentCloseTime",{"nth":8,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["SigningTime",{"nth":9,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["Expiration",{"nth":10,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["TransferRate",{"nth":11,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["WalletSize",{"nth":12,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["OwnerCount",{"nth":13,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["DestinationTag",{"nth":14,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["HighQualityIn",{"nth":16,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["HighQualityOut",{"nth":17,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["LowQualityIn",{"nth":18,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["LowQualityOut",{"nth":19,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["QualityIn",{"nth":20,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["QualityOut",{"nth":21,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["StampEscrow",{"nth":22,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["BondAmount",{"nth":23,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["LoadFee",{"nth":24,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["OfferSequence",{"nth":25,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["FirstLedgerSequence",{"nth":26,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["LastLedgerSequence",{"nth":27,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["TransactionIndex",{"nth":28,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["OperationLimit",{"nth":29,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["ReferenceFeeUnits",{"nth":30,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["ReserveBase",{"nth":31,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["ReserveIncrement",{"nth":32,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["SetFlag",{"nth":33,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["ClearFlag",{"nth":34,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["SignerQuorum",{"nth":35,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["CancelAfter",{"nth":36,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["FinishAfter",{"nth":37,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["SignerListID",{"nth":38,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["SettleDelay",{"nth":39,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["TicketCount",{"nth":40,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["TicketSequence",{"nth":41,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["NFTokenTaxon",{"nth":42,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["MintedNFTokens",{"nth":43,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["BurnedNFTokens",{"nth":44,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["HookStateCount",{"nth":45,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["EmitGeneration",{"nth":46,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt32"}],["IndexNext",{"nth":1,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt64"}],["IndexPrevious",{"nth":2,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt64"}],["BookNode",{"nth":3,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt64"}],["OwnerNode",{"nth":4,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt64"}],["BaseFee",{"nth":5,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt64"}],["ExchangeRate",{"nth":6,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt64"}],["LowNode",{"nth":7,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt64"}],["HighNode",{"nth":8,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt64"}],["DestinationNode",{"nth":9,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt64"}],["Cookie",{"nth":10,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt64"}],["ServerVersion",{"nth":11,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt64"}],["NFTokenOfferNode",{"nth":12,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt64"}],["EmitBurden",{"nth":13,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt64"}],["HookOn",{"nth":16,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt64"}],["HookInstructionCount",{"nth":17,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt64"}],["HookReturnCode",{"nth":18,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt64"}],["ReferenceCount",{"nth":19,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"UInt64"}],["EmailHash",{"nth":1,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash128"}],["TakerPaysCurrency",{"nth":1,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash160"}],["TakerPaysIssuer",{"nth":2,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash160"}],["TakerGetsCurrency",{"nth":3,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash160"}],["TakerGetsIssuer",{"nth":4,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash160"}],["LedgerHash",{"nth":1,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash256"}],["ParentHash",{"nth":2,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash256"}],["TransactionHash",{"nth":3,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash256"}],["AccountHash",{"nth":4,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash256"}],["PreviousTxnID",{"nth":5,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash256"}],["LedgerIndex",{"nth":6,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash256"}],["WalletLocator",{"nth":7,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash256"}],["RootIndex",{"nth":8,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash256"}],["AccountTxnID",{"nth":9,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash256"}],["NFTokenID",{"nth":10,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash256"}],["EmitParentTxnID",{"nth":11,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash256"}],["EmitNonce",{"nth":12,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash256"}],["EmitHookHash",{"nth":13,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash256"}],["BookDirectory",{"nth":16,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash256"}],["InvoiceID",{"nth":17,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash256"}],["Nickname",{"nth":18,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash256"}],["Amendment",{"nth":19,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash256"}],["Digest",{"nth":21,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash256"}],["Channel",{"nth":22,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash256"}],["ConsensusHash",{"nth":23,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash256"}],["CheckID",{"nth":24,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash256"}],["ValidatedHash",{"nth":25,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash256"}],["PreviousPageMin",{"nth":26,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash256"}],["NextPageMin",{"nth":27,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash256"}],["NFTokenBuyOffer",{"nth":28,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash256"}],["NFTokenSellOffer",{"nth":29,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash256"}],["HookStateKey",{"nth":30,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash256"}],["HookHash",{"nth":31,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash256"}],["HookNamespace",{"nth":32,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash256"}],["HookSetTxnID",{"nth":33,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Hash256"}],["Amount",{"nth":1,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Amount"}],["Balance",{"nth":2,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Amount"}],["LimitAmount",{"nth":3,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Amount"}],["TakerPays",{"nth":4,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Amount"}],["TakerGets",{"nth":5,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Amount"}],["LowLimit",{"nth":6,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Amount"}],["HighLimit",{"nth":7,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Amount"}],["Fee",{"nth":8,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Amount"}],["SendMax",{"nth":9,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Amount"}],["DeliverMin",{"nth":10,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Amount"}],["MinimumOffer",{"nth":16,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Amount"}],["RippleEscrow",{"nth":17,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Amount"}],["DeliveredAmount",{"nth":18,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Amount"}],["NFTokenBrokerFee",{"nth":19,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"Amount"}],["PublicKey",{"nth":1,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"Blob"}],["MessageKey",{"nth":2,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"Blob"}],["SigningPubKey",{"nth":3,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"Blob"}],["TxnSignature",{"nth":4,"isVLEncoded":true,"isSerialized":true,"isSigningField":false,"type":"Blob"}],["URI",{"nth":5,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"Blob"}],["Signature",{"nth":6,"isVLEncoded":true,"isSerialized":true,"isSigningField":false,"type":"Blob"}],["Domain",{"nth":7,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"Blob"}],["FundCode",{"nth":8,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"Blob"}],["RemoveCode",{"nth":9,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"Blob"}],["ExpireCode",{"nth":10,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"Blob"}],["CreateCode",{"nth":11,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"Blob"}],["MemoType",{"nth":12,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"Blob"}],["MemoData",{"nth":13,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"Blob"}],["MemoFormat",{"nth":14,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"Blob"}],["Fulfillment",{"nth":16,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"Blob"}],["Condition",{"nth":17,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"Blob"}],["MasterSignature",{"nth":18,"isVLEncoded":true,"isSerialized":true,"isSigningField":false,"type":"Blob"}],["UNLModifyValidator",{"nth":19,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"Blob"}],["ValidatorToDisable",{"nth":20,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"Blob"}],["ValidatorToReEnable",{"nth":21,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"Blob"}],["HookStateData",{"nth":22,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"Blob"}],["HookReturnString",{"nth":23,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"Blob"}],["HookParameterName",{"nth":24,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"Blob"}],["HookParameterValue",{"nth":25,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"Blob"}],["Account",{"nth":1,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"AccountID"}],["Owner",{"nth":2,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"AccountID"}],["Destination",{"nth":3,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"AccountID"}],["Issuer",{"nth":4,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"AccountID"}],["Authorize",{"nth":5,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"AccountID"}],["Unauthorize",{"nth":6,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"AccountID"}],["RegularKey",{"nth":8,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"AccountID"}],["NFTokenMinter",{"nth":9,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"AccountID"}],["EmitCallback",{"nth":10,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"AccountID"}],["HookAccount",{"nth":16,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"AccountID"}],["Indexes",{"nth":1,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"Vector256"}],["Hashes",{"nth":2,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"Vector256"}],["Amendments",{"nth":3,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"Vector256"}],["NFTokenOffers",{"nth":4,"isVLEncoded":true,"isSerialized":true,"isSigningField":true,"type":"Vector256"}],["Paths",{"nth":1,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"PathSet"}],["TransactionMetaData",{"nth":2,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STObject"}],["CreatedNode",{"nth":3,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STObject"}],["DeletedNode",{"nth":4,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STObject"}],["ModifiedNode",{"nth":5,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STObject"}],["PreviousFields",{"nth":6,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STObject"}],["FinalFields",{"nth":7,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STObject"}],["NewFields",{"nth":8,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STObject"}],["TemplateEntry",{"nth":9,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STObject"}],["Memo",{"nth":10,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STObject"}],["SignerEntry",{"nth":11,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STObject"}],["NFToken",{"nth":12,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STObject"}],["EmitDetails",{"nth":13,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STObject"}],["Hook",{"nth":14,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STObject"}],["Signer",{"nth":16,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STObject"}],["Majority",{"nth":18,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STObject"}],["DisabledValidator",{"nth":19,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STObject"}],["EmittedTxn",{"nth":20,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STObject"}],["HookExecution",{"nth":21,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STObject"}],["HookDefinition",{"nth":22,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STObject"}],["HookParameter",{"nth":23,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STObject"}],["HookGrant",{"nth":24,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STObject"}],["Signers",{"nth":3,"isVLEncoded":false,"isSerialized":true,"isSigningField":false,"type":"STArray"}],["SignerEntries",{"nth":4,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STArray"}],["Template",{"nth":5,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STArray"}],["Necessary",{"nth":6,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STArray"}],["Sufficient",{"nth":7,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STArray"}],["AffectedNodes",{"nth":8,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STArray"}],["Memos",{"nth":9,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STArray"}],["NFTokens",{"nth":10,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STArray"}],["Hooks",{"nth":11,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STArray"}],["Majorities",{"nth":16,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STArray"}],["DisabledValidators",{"nth":17,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STArray"}],["HookExecutions",{"nth":18,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STArray"}],["HookParameters",{"nth":19,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STArray"}],["HookGrants",{"nth":20,"isVLEncoded":false,"isSerialized":true,"isSigningField":true,"type":"STArray"}]],"TRANSACTION_RESULTS":{"telLOCAL_ERROR":-399,"telBAD_DOMAIN":-398,"telBAD_PATH_COUNT":-397,"telBAD_PUBLIC_KEY":-396,"telFAILED_PROCESSING":-395,"telINSUF_FEE_P":-394,"telNO_DST_PARTIAL":-393,"telCAN_NOT_QUEUE":-392,"telCAN_NOT_QUEUE_BALANCE":-391,"telCAN_NOT_QUEUE_BLOCKS":-390,"telCAN_NOT_QUEUE_BLOCKED":-389,"telCAN_NOT_QUEUE_FEE":-388,"telCAN_NOT_QUEUE_FULL":-387,"temMALFORMED":-299,"temBAD_AMOUNT":-298,"temBAD_CURRENCY":-297,"temBAD_EXPIRATION":-296,"temBAD_FEE":-295,"temBAD_ISSUER":-294,"temBAD_LIMIT":-293,"temBAD_OFFER":-292,"temBAD_PATH":-291,"temBAD_PATH_LOOP":-290,"temBAD_REGKEY":-289,"temBAD_SEND_XRP_LIMIT":-288,"temBAD_SEND_XRP_MAX":-287,"temBAD_SEND_XRP_NO_DIRECT":-286,"temBAD_SEND_XRP_PARTIAL":-285,"temBAD_SEND_XRP_PATHS":-284,"temBAD_SEQUENCE":-283,"temBAD_SIGNATURE":-282,"temBAD_SRC_ACCOUNT":-281,"temBAD_TRANSFER_RATE":-280,"temDST_IS_SRC":-279,"temDST_NEEDED":-278,"temINVALID":-277,"temINVALID_FLAG":-276,"temREDUNDANT":-275,"temRIPPLE_EMPTY":-274,"temDISABLED":-273,"temBAD_SIGNER":-272,"temBAD_QUORUM":-271,"temBAD_WEIGHT":-270,"temBAD_TICK_SIZE":-269,"temINVALID_ACCOUNT_ID":-268,"temCANNOT_PREAUTH_SELF":-267,"temUNCERTAIN":-266,"temUNKNOWN":-265,"temSEQ_AND_TICKET":-264,"temBAD_NFTOKEN_TRANSFER_FEE":-263,"tefFAILURE":-199,"tefALREADY":-198,"tefBAD_ADD_AUTH":-197,"tefBAD_AUTH":-196,"tefBAD_LEDGER":-195,"tefCREATED":-194,"tefEXCEPTION":-193,"tefINTERNAL":-192,"tefNO_AUTH_REQUIRED":-191,"tefPAST_SEQ":-190,"tefWRONG_PRIOR":-189,"tefMASTER_DISABLED":-188,"tefMAX_LEDGER":-187,"tefBAD_SIGNATURE":-186,"tefBAD_QUORUM":-185,"tefNOT_MULTI_SIGNING":-184,"tefBAD_AUTH_MASTER":-183,"tefINVARIANT_FAILED":-182,"tefTOO_BIG":-181,"tefNO_TICKET":-180,"tefNFTOKEN_IS_NOT_TRANSFERABLE":-179,"terRETRY":-99,"terFUNDS_SPENT":-98,"terINSUF_FEE_B":-97,"terNO_ACCOUNT":-96,"terNO_AUTH":-95,"terNO_LINE":-94,"terOWNERS":-93,"terPRE_SEQ":-92,"terLAST":-91,"terNO_RIPPLE":-90,"terQUEUED":-89,"terPRE_TICKET":-88,"tesSUCCESS":0,"tecCLAIM":100,"tecPATH_PARTIAL":101,"tecUNFUNDED_ADD":102,"tecUNFUNDED_OFFER":103,"tecUNFUNDED_PAYMENT":104,"tecFAILED_PROCESSING":105,"tecDIR_FULL":121,"tecINSUF_RESERVE_LINE":122,"tecINSUF_RESERVE_OFFER":123,"tecNO_DST":124,"tecNO_DST_INSUF_XRP":125,"tecNO_LINE_INSUF_RESERVE":126,"tecNO_LINE_REDUNDANT":127,"tecPATH_DRY":128,"tecUNFUNDED":129,"tecNO_ALTERNATIVE_KEY":130,"tecNO_REGULAR_KEY":131,"tecOWNERS":132,"tecNO_ISSUER":133,"tecNO_AUTH":134,"tecNO_LINE":135,"tecINSUFF_FEE":136,"tecFROZEN":137,"tecNO_TARGET":138,"tecNO_PERMISSION":139,"tecNO_ENTRY":140,"tecINSUFFICIENT_RESERVE":141,"tecNEED_MASTER_KEY":142,"tecDST_TAG_NEEDED":143,"tecINTERNAL":144,"tecOVERSIZE":145,"tecCRYPTOCONDITION_ERROR":146,"tecINVARIANT_FAILED":147,"tecEXPIRED":148,"tecDUPLICATE":149,"tecKILLED":150,"tecHAS_OBLIGATIONS":151,"tecTOO_SOON":152,"tecHOOK_REJECTED":153,"tecMAX_SEQUENCE_REACHED":154,"tecNO_SUITABLE_NFTOKEN_PAGE":155,"tecNFTOKEN_BUY_SELL_MISMATCH":156,"tecNFTOKEN_OFFER_TYPE_MISMATCH":157,"tecCANT_ACCEPT_OWN_NFTOKEN_OFFER":158,"tecINSUFFICIENT_FUNDS":159,"tecOBJECT_NOT_FOUND":160,"tecINSUFFICIENT_PAYMENT":161,"tecINCORRECT_ASSET":162,"tecTOO_MANY":163},"TRANSACTION_TYPES":{"Invalid":-1,"Payment":0,"EscrowCreate":1,"EscrowFinish":2,"AccountSet":3,"EscrowCancel":4,"SetRegularKey":5,"NickNameSet":6,"OfferCreate":7,"OfferCancel":8,"Contract":9,"TicketCreate":10,"TicketCancel":11,"SignerListSet":12,"PaymentChannelCreate":13,"PaymentChannelFund":14,"PaymentChannelClaim":15,"CheckCreate":16,"CheckCash":17,"CheckCancel":18,"DepositPreauth":19,"TrustSet":20,"AccountDelete":21,"SetHook":22,"NFTokenMint":25,"NFTokenBurn":26,"NFTokenCreateOffer":27,"NFTokenCancelOffer":28,"NFTokenAcceptOffer":29,"EnableAmendment":100,"SetFee":101,"UNLModify":102}}');
|
16904
|
+
module.exports = JSON.parse('{"FIELDS":[["Generic",{"isSerialized":false,"isSigningField":false,"isVLEncoded":false,"nth":0,"type":"Unknown"}],["Invalid",{"isSerialized":false,"isSigningField":false,"isVLEncoded":false,"nth":-1,"type":"Unknown"}],["ObjectEndMarker",{"isSerialized":false,"isSigningField":true,"isVLEncoded":false,"nth":1,"type":"STObject"}],["ArrayEndMarker",{"isSerialized":false,"isSigningField":true,"isVLEncoded":false,"nth":1,"type":"STArray"}],["hash",{"isSerialized":false,"isSigningField":false,"isVLEncoded":false,"nth":257,"type":"Hash256"}],["index",{"isSerialized":false,"isSigningField":false,"isVLEncoded":false,"nth":258,"type":"Hash256"}],["taker_gets_funded",{"isSerialized":false,"isSigningField":false,"isVLEncoded":false,"nth":258,"type":"Amount"}],["taker_pays_funded",{"isSerialized":false,"isSigningField":false,"isVLEncoded":false,"nth":259,"type":"Amount"}],["LedgerEntryType",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":1,"type":"UInt16"}],["TransactionType",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":2,"type":"UInt16"}],["SignerWeight",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":3,"type":"UInt16"}],["TransferFee",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":4,"type":"UInt16"}],["Version",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":16,"type":"UInt16"}],["HookStateChangeCount",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":17,"type":"UInt16"}],["HookEmitCount",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":18,"type":"UInt16"}],["HookExecutionIndex",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":19,"type":"UInt16"}],["HookApiVersion",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":20,"type":"UInt16"}],["NetworkID",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":1,"type":"UInt32"}],["Flags",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":2,"type":"UInt32"}],["SourceTag",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":3,"type":"UInt32"}],["Sequence",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":4,"type":"UInt32"}],["PreviousTxnLgrSeq",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":5,"type":"UInt32"}],["LedgerSequence",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":6,"type":"UInt32"}],["CloseTime",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":7,"type":"UInt32"}],["ParentCloseTime",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":8,"type":"UInt32"}],["SigningTime",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":9,"type":"UInt32"}],["Expiration",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":10,"type":"UInt32"}],["TransferRate",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":11,"type":"UInt32"}],["WalletSize",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":12,"type":"UInt32"}],["OwnerCount",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":13,"type":"UInt32"}],["DestinationTag",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":14,"type":"UInt32"}],["HighQualityIn",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":16,"type":"UInt32"}],["HighQualityOut",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":17,"type":"UInt32"}],["LowQualityIn",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":18,"type":"UInt32"}],["LowQualityOut",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":19,"type":"UInt32"}],["QualityIn",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":20,"type":"UInt32"}],["QualityOut",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":21,"type":"UInt32"}],["StampEscrow",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":22,"type":"UInt32"}],["BondAmount",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":23,"type":"UInt32"}],["LoadFee",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":24,"type":"UInt32"}],["OfferSequence",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":25,"type":"UInt32"}],["FirstLedgerSequence",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":26,"type":"UInt32"}],["LastLedgerSequence",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":27,"type":"UInt32"}],["TransactionIndex",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":28,"type":"UInt32"}],["OperationLimit",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":29,"type":"UInt32"}],["ReferenceFeeUnits",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":30,"type":"UInt32"}],["ReserveBase",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":31,"type":"UInt32"}],["ReserveIncrement",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":32,"type":"UInt32"}],["SetFlag",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":33,"type":"UInt32"}],["ClearFlag",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":34,"type":"UInt32"}],["SignerQuorum",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":35,"type":"UInt32"}],["CancelAfter",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":36,"type":"UInt32"}],["FinishAfter",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":37,"type":"UInt32"}],["SignerListID",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":38,"type":"UInt32"}],["SettleDelay",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":39,"type":"UInt32"}],["TicketCount",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":40,"type":"UInt32"}],["TicketSequence",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":41,"type":"UInt32"}],["NFTokenTaxon",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":42,"type":"UInt32"}],["MintedNFTokens",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":43,"type":"UInt32"}],["BurnedNFTokens",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":44,"type":"UInt32"}],["HookStateCount",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":45,"type":"UInt32"}],["EmitGeneration",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":46,"type":"UInt32"}],["LockCount",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":47,"type":"UInt32"}],["RewardTime",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":98,"type":"UInt32"}],["RewardLgrFirst",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":99,"type":"UInt32"}],["RewardLgrLast",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":100,"type":"UInt32"}],["IndexNext",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":1,"type":"UInt64"}],["IndexPrevious",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":2,"type":"UInt64"}],["BookNode",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":3,"type":"UInt64"}],["OwnerNode",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":4,"type":"UInt64"}],["BaseFee",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":5,"type":"UInt64"}],["ExchangeRate",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":6,"type":"UInt64"}],["LowNode",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":7,"type":"UInt64"}],["HighNode",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":8,"type":"UInt64"}],["DestinationNode",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":9,"type":"UInt64"}],["Cookie",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":10,"type":"UInt64"}],["ServerVersion",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":11,"type":"UInt64"}],["NFTokenOfferNode",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":12,"type":"UInt64"}],["EmitBurden",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":13,"type":"UInt64"}],["HookInstructionCount",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":17,"type":"UInt64"}],["HookReturnCode",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":18,"type":"UInt64"}],["ReferenceCount",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":19,"type":"UInt64"}],["RewardAccumulator",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":100,"type":"UInt64"}],["EmailHash",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":1,"type":"Hash128"}],["LedgerHash",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":1,"type":"Hash256"}],["ParentHash",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":2,"type":"Hash256"}],["TransactionHash",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":3,"type":"Hash256"}],["AccountHash",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":4,"type":"Hash256"}],["PreviousTxnID",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":5,"type":"Hash256"}],["LedgerIndex",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":6,"type":"Hash256"}],["WalletLocator",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":7,"type":"Hash256"}],["RootIndex",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":8,"type":"Hash256"}],["AccountTxnID",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":9,"type":"Hash256"}],["NFTokenID",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":10,"type":"Hash256"}],["EmitParentTxnID",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":11,"type":"Hash256"}],["EmitNonce",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":12,"type":"Hash256"}],["EmitHookHash",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":13,"type":"Hash256"}],["BookDirectory",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":16,"type":"Hash256"}],["InvoiceID",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":17,"type":"Hash256"}],["Nickname",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":18,"type":"Hash256"}],["Amendment",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":19,"type":"Hash256"}],["HookOn",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":20,"type":"Hash256"}],["Digest",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":21,"type":"Hash256"}],["Channel",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":22,"type":"Hash256"}],["ConsensusHash",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":23,"type":"Hash256"}],["CheckID",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":24,"type":"Hash256"}],["ValidatedHash",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":25,"type":"Hash256"}],["PreviousPageMin",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":26,"type":"Hash256"}],["NextPageMin",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":27,"type":"Hash256"}],["NFTokenBuyOffer",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":28,"type":"Hash256"}],["NFTokenSellOffer",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":29,"type":"Hash256"}],["HookStateKey",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":30,"type":"Hash256"}],["HookHash",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":31,"type":"Hash256"}],["HookNamespace",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":32,"type":"Hash256"}],["HookSetTxnID",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":33,"type":"Hash256"}],["OfferID",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":34,"type":"Hash256"}],["EscrowID",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":35,"type":"Hash256"}],["URITokenID",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":36,"type":"Hash256"}],["hash",{"isSerialized":true,"isSigningField":false,"isVLEncoded":false,"nth":1,"type":"Hash256"}],["index",{"isSerialized":true,"isSigningField":false,"isVLEncoded":false,"nth":2,"type":"Hash256"}],["Amount",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":1,"type":"Amount"}],["Balance",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":2,"type":"Amount"}],["LimitAmount",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":3,"type":"Amount"}],["TakerPays",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":4,"type":"Amount"}],["TakerGets",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":5,"type":"Amount"}],["LowLimit",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":6,"type":"Amount"}],["HighLimit",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":7,"type":"Amount"}],["Fee",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":8,"type":"Amount"}],["SendMax",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":9,"type":"Amount"}],["DeliverMin",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":10,"type":"Amount"}],["MinimumOffer",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":16,"type":"Amount"}],["RippleEscrow",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":17,"type":"Amount"}],["DeliveredAmount",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":18,"type":"Amount"}],["NFTokenBrokerFee",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":19,"type":"Amount"}],["HookCallbackFee",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":20,"type":"Amount"}],["LockedBalance",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":21,"type":"Amount"}],["PublicKey",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":1,"type":"Blob"}],["MessageKey",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":2,"type":"Blob"}],["SigningPubKey",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":3,"type":"Blob"}],["TxnSignature",{"isSerialized":true,"isSigningField":false,"isVLEncoded":true,"nth":4,"type":"Blob"}],["URI",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":5,"type":"Blob"}],["Signature",{"isSerialized":true,"isSigningField":false,"isVLEncoded":true,"nth":6,"type":"Blob"}],["Domain",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":7,"type":"Blob"}],["FundCode",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":8,"type":"Blob"}],["RemoveCode",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":9,"type":"Blob"}],["ExpireCode",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":10,"type":"Blob"}],["CreateCode",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":11,"type":"Blob"}],["MemoType",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":12,"type":"Blob"}],["MemoData",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":13,"type":"Blob"}],["MemoFormat",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":14,"type":"Blob"}],["Fulfillment",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":16,"type":"Blob"}],["Condition",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":17,"type":"Blob"}],["MasterSignature",{"isSerialized":true,"isSigningField":false,"isVLEncoded":true,"nth":18,"type":"Blob"}],["UNLModifyValidator",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":19,"type":"Blob"}],["ValidatorToDisable",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":20,"type":"Blob"}],["ValidatorToReEnable",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":21,"type":"Blob"}],["HookStateData",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":22,"type":"Blob"}],["HookReturnString",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":23,"type":"Blob"}],["HookParameterName",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":24,"type":"Blob"}],["HookParameterValue",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":25,"type":"Blob"}],["Blob",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":26,"type":"Blob"}],["Account",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":1,"type":"AccountID"}],["Owner",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":2,"type":"AccountID"}],["Destination",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":3,"type":"AccountID"}],["Issuer",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":4,"type":"AccountID"}],["Authorize",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":5,"type":"AccountID"}],["Unauthorize",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":6,"type":"AccountID"}],["RegularKey",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":8,"type":"AccountID"}],["NFTokenMinter",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":9,"type":"AccountID"}],["EmitCallback",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":10,"type":"AccountID"}],["HookAccount",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":16,"type":"AccountID"}],["TransactionMetaData",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":2,"type":"STObject"}],["CreatedNode",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":3,"type":"STObject"}],["DeletedNode",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":4,"type":"STObject"}],["ModifiedNode",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":5,"type":"STObject"}],["PreviousFields",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":6,"type":"STObject"}],["FinalFields",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":7,"type":"STObject"}],["NewFields",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":8,"type":"STObject"}],["TemplateEntry",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":9,"type":"STObject"}],["Memo",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":10,"type":"STObject"}],["SignerEntry",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":11,"type":"STObject"}],["NFToken",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":12,"type":"STObject"}],["EmitDetails",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":13,"type":"STObject"}],["Hook",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":14,"type":"STObject"}],["Signer",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":16,"type":"STObject"}],["Majority",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":18,"type":"STObject"}],["DisabledValidator",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":19,"type":"STObject"}],["EmittedTxn",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":20,"type":"STObject"}],["HookExecution",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":21,"type":"STObject"}],["HookDefinition",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":22,"type":"STObject"}],["HookParameter",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":23,"type":"STObject"}],["HookGrant",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":24,"type":"STObject"}],["Signers",{"isSerialized":true,"isSigningField":false,"isVLEncoded":false,"nth":3,"type":"STArray"}],["SignerEntries",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":4,"type":"STArray"}],["Template",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":5,"type":"STArray"}],["Necessary",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":6,"type":"STArray"}],["Sufficient",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":7,"type":"STArray"}],["AffectedNodes",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":8,"type":"STArray"}],["Memos",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":9,"type":"STArray"}],["NFTokens",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":10,"type":"STArray"}],["Hooks",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":11,"type":"STArray"}],["Majorities",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":16,"type":"STArray"}],["DisabledValidators",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":17,"type":"STArray"}],["HookExecutions",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":18,"type":"STArray"}],["HookParameters",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":19,"type":"STArray"}],["HookGrants",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":20,"type":"STArray"}],["CloseResolution",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":1,"type":"UInt8"}],["Method",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":2,"type":"UInt8"}],["TransactionResult",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":3,"type":"UInt8"}],["TickSize",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":16,"type":"UInt8"}],["UNLModifyDisabling",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":17,"type":"UInt8"}],["HookResult",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":18,"type":"UInt8"}],["TakerPaysCurrency",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":1,"type":"Hash160"}],["TakerPaysIssuer",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":2,"type":"Hash160"}],["TakerGetsCurrency",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":3,"type":"Hash160"}],["TakerGetsIssuer",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":4,"type":"Hash160"}],["Paths",{"isSerialized":true,"isSigningField":true,"isVLEncoded":false,"nth":1,"type":"PathSet"}],["Indexes",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":1,"type":"Vector256"}],["Hashes",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":2,"type":"Vector256"}],["Amendments",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":3,"type":"Vector256"}],["NFTokenOffers",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":4,"type":"Vector256"}],["HookNamespaces",{"isSerialized":true,"isSigningField":true,"isVLEncoded":true,"nth":5,"type":"Vector256"}],["Transaction",{"isSerialized":false,"isSigningField":false,"isVLEncoded":false,"nth":1,"type":"Transaction"}],["LedgerEntry",{"isSerialized":false,"isSigningField":false,"isVLEncoded":false,"nth":1,"type":"LedgerEntry"}],["Validation",{"isSerialized":false,"isSigningField":false,"isVLEncoded":false,"nth":1,"type":"Validation"}],["Metadata",{"isSerialized":false,"isSigningField":false,"isVLEncoded":false,"nth":1,"type":"Metadata"}]],"LEDGER_ENTRY_TYPES":{"AccountRoot":97,"Amendments":102,"Any":0,"Check":67,"Child":7378,"Contract":99,"DepositPreauth":112,"DirectoryNode":100,"EmittedTxn":69,"Escrow":117,"FeeSettings":115,"GeneratorMap":103,"Hook":72,"HookDefinition":68,"HookState":118,"Invalid":-1,"LedgerHashes":104,"NFTokenOffer":55,"NFTokenPage":80,"NegativeUNL":78,"Nickname":110,"Offer":111,"PayChannel":120,"RippleState":114,"SignerList":83,"Ticket":84,"URIToken":85},"TRANSACTION_RESULTS":{"tecCANT_ACCEPT_OWN_NFTOKEN_OFFER":158,"tecCLAIM":100,"tecCRYPTOCONDITION_ERROR":146,"tecDIR_FULL":121,"tecDST_TAG_NEEDED":143,"tecDUPLICATE":149,"tecEXPIRED":148,"tecFAILED_PROCESSING":105,"tecFROZEN":137,"tecHAS_OBLIGATIONS":151,"tecHOOK_REJECTED":153,"tecINSUFFICIENT_FUNDS":159,"tecINSUFFICIENT_PAYMENT":161,"tecINSUFFICIENT_RESERVE":141,"tecINSUFF_FEE":136,"tecINSUF_RESERVE_LINE":122,"tecINSUF_RESERVE_OFFER":123,"tecINTERNAL":144,"tecINVARIANT_FAILED":147,"tecKILLED":150,"tecMAX_SEQUENCE_REACHED":154,"tecNEED_MASTER_KEY":142,"tecNFTOKEN_BUY_SELL_MISMATCH":156,"tecNFTOKEN_OFFER_TYPE_MISMATCH":157,"tecNO_ALTERNATIVE_KEY":130,"tecNO_AUTH":134,"tecNO_DST":124,"tecNO_DST_INSUF_XRP":125,"tecNO_ENTRY":140,"tecNO_ISSUER":133,"tecNO_LINE":135,"tecNO_LINE_INSUF_RESERVE":126,"tecNO_LINE_REDUNDANT":127,"tecNO_PERMISSION":139,"tecNO_REGULAR_KEY":131,"tecNO_SUITABLE_NFTOKEN_PAGE":155,"tecNO_TARGET":138,"tecOBJECT_NOT_FOUND":160,"tecOVERSIZE":145,"tecOWNERS":132,"tecPATH_DRY":128,"tecPATH_PARTIAL":101,"tecPRECISION_LOSS":163,"tecREQUIRES_FLAG":162,"tecTOO_SOON":152,"tecUNFUNDED":129,"tecUNFUNDED_ADD":102,"tecUNFUNDED_OFFER":103,"tecUNFUNDED_PAYMENT":104,"tefALREADY":-198,"tefBAD_ADD_AUTH":-197,"tefBAD_AUTH":-196,"tefBAD_AUTH_MASTER":-183,"tefBAD_LEDGER":-195,"tefBAD_QUORUM":-185,"tefBAD_SIGNATURE":-186,"tefCREATED":-194,"tefEXCEPTION":-193,"tefFAILURE":-199,"tefINTERNAL":-192,"tefINVARIANT_FAILED":-182,"tefMASTER_DISABLED":-188,"tefMAX_LEDGER":-187,"tefNFTOKEN_IS_NOT_TRANSFERABLE":-179,"tefNOT_MULTI_SIGNING":-184,"tefNO_AUTH_REQUIRED":-191,"tefNO_TICKET":-180,"tefPAST_SEQ":-190,"tefTOO_BIG":-181,"tefWRONG_PRIOR":-189,"telBAD_DOMAIN":-398,"telBAD_PATH_COUNT":-397,"telBAD_PUBLIC_KEY":-396,"telCAN_NOT_QUEUE":-392,"telCAN_NOT_QUEUE_BALANCE":-391,"telCAN_NOT_QUEUE_BLOCKED":-389,"telCAN_NOT_QUEUE_BLOCKS":-390,"telCAN_NOT_QUEUE_FEE":-388,"telCAN_NOT_QUEUE_FULL":-387,"telFAILED_PROCESSING":-395,"telINSUF_FEE_P":-394,"telLOCAL_ERROR":-399,"telNETWORK_ID_MAKES_TX_NON_CANONICAL":-384,"telNON_LOCAL_EMITTED_TXN":-383,"telNO_DST_PARTIAL":-393,"telREQUIRES_NETWORK_ID":-385,"telWRONG_NETWORK":-386,"temBAD_AMOUNT":-298,"temBAD_CURRENCY":-297,"temBAD_EXPIRATION":-296,"temBAD_FEE":-295,"temBAD_ISSUER":-294,"temBAD_LIMIT":-293,"temBAD_NFTOKEN_TRANSFER_FEE":-260,"temBAD_OFFER":-292,"temBAD_PATH":-291,"temBAD_PATH_LOOP":-290,"temBAD_QUORUM":-271,"temBAD_REGKEY":-289,"temBAD_SEND_XRP_LIMIT":-288,"temBAD_SEND_XRP_MAX":-287,"temBAD_SEND_XRP_NO_DIRECT":-286,"temBAD_SEND_XRP_PARTIAL":-285,"temBAD_SEND_XRP_PATHS":-284,"temBAD_SEQUENCE":-283,"temBAD_SIGNATURE":-282,"temBAD_SIGNER":-272,"temBAD_SRC_ACCOUNT":-281,"temBAD_TICK_SIZE":-269,"temBAD_TRANSFER_RATE":-280,"temBAD_WEIGHT":-270,"temCANNOT_PREAUTH_SELF":-267,"temDISABLED":-273,"temDST_IS_SRC":-279,"temDST_NEEDED":-278,"temHOOK_DATA_TOO_LARGE":-265,"temHOOK_REJECTED":-264,"temINVALID":-277,"temINVALID_ACCOUNT_ID":-268,"temINVALID_COUNT":-266,"temINVALID_FLAG":-276,"temMALFORMED":-299,"temREDUNDANT":-275,"temRIPPLE_EMPTY":-274,"temSEQ_AND_TICKET":-261,"temUNCERTAIN":-263,"temUNKNOWN":-262,"terFUNDS_SPENT":-98,"terINSUF_FEE_B":-97,"terLAST":-91,"terNO_ACCOUNT":-96,"terNO_AUTH":-95,"terNO_HOOK":-87,"terNO_LINE":-94,"terNO_RIPPLE":-90,"terOWNERS":-93,"terPRE_SEQ":-92,"terPRE_TICKET":-88,"terQUEUED":-89,"terRETRY":-99,"tesSUCCESS":0},"TRANSACTION_TYPES":{"AccountDelete":21,"AccountSet":3,"Amendment":100,"CheckCancel":18,"CheckCash":17,"CheckCreate":16,"ClaimReward":98,"Contract":9,"DepositPreauth":19,"EmitFailure":103,"EscrowCancel":4,"EscrowCreate":1,"EscrowFinish":2,"Fee":101,"Invalid":-1,"Invoke":99,"NFTokenAcceptOffer":29,"NFTokenBurn":26,"NFTokenCancelOffer":28,"NFTokenCreateOffer":27,"NFTokenMint":25,"NicknameSet":6,"OfferCancel":8,"OfferCreate":7,"Payment":0,"PaymentChannelClaim":15,"PaymentChannelCreate":13,"PaymentChannelFund":14,"SetHook":22,"SetRegularKey":5,"SignerListSet":12,"SpinalTap":11,"TicketCreate":10,"TrustSet":20,"UNLModify":102,"URITokenBurn":46,"URITokenBuy":47,"URITokenCancelSellOffer":49,"URITokenCreateSellOffer":48,"URITokenMint":45},"TYPES":{"AccountID":8,"Amount":6,"Blob":7,"Done":-1,"Hash128":4,"Hash160":17,"Hash256":5,"LedgerEntry":10002,"Metadata":10004,"NotPresent":0,"PathSet":18,"STArray":15,"STObject":14,"Transaction":10001,"UInt16":1,"UInt192":21,"UInt32":2,"UInt384":22,"UInt512":23,"UInt64":3,"UInt8":16,"UInt96":20,"Unknown":-2,"Validation":10003,"Vector256":19},"hash":"67D2FC42C6321687BCC47B1D912D7EB2E077A7016D6E2D5B8A2E128D7493B650"}');
|
15879
16905
|
|
15880
16906
|
/***/ })
|
15881
16907
|
|