evernode-js-client 0.5.15 → 0.5.17-beta-v3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|