UNPKG

20 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const tslib_1 = require("tslib");
4const client_common_1 = require("@neo-one/client-common");
5const node_core_1 = require("@neo-one/node-core");
6const lodash_1 = tslib_1.__importDefault(require("lodash"));
7const operators_1 = require("rxjs/operators");
8class ValidatorCache {
9 constructor(blockchain) {
10 this.blockchain = blockchain;
11 this.mutableAccounts = {};
12 this.mutableValidators = {};
13 }
14 async getAccount(hash) {
15 let account = this.mutableAccounts[client_common_1.common.uInt160ToHex(hash)];
16 if (account === undefined) {
17 account = await this.blockchain.account.tryGet({ hash });
18 }
19 if (account === undefined) {
20 account = new node_core_1.Account({ hash });
21 }
22 this.mutableAccounts[client_common_1.common.uInt160ToHex(hash)] = account;
23 return account;
24 }
25 async updateAccountBalance(hash, asset, value) {
26 const assetHex = client_common_1.common.uInt256ToHex(asset);
27 await this.getAccount(hash);
28 const hashHex = client_common_1.common.uInt160ToHex(hash);
29 const account = this.mutableAccounts[hashHex];
30 const balance = account.balances[assetHex];
31 this.mutableAccounts[hashHex] = account.update({
32 balances: Object.assign({}, account.balances, { [assetHex]: value.add(balance === undefined ? client_common_1.utils.ZERO : balance) }),
33 });
34 }
35 async getValidator(publicKey) {
36 const publicKeyHex = client_common_1.common.ecPointToHex(publicKey);
37 let validator = this.mutableValidators[publicKeyHex];
38 if (validator === undefined) {
39 validator = await this.blockchain.validator.tryGet({ publicKey });
40 }
41 if (validator === undefined) {
42 validator = new node_core_1.Validator({ publicKey });
43 }
44 this.mutableValidators[publicKeyHex] = validator;
45 return validator;
46 }
47 async addValidator(validator) {
48 this.mutableValidators[client_common_1.common.ecPointToHex(validator.publicKey)] = validator;
49 }
50 async deleteValidator(publicKey) {
51 this.mutableValidators[client_common_1.common.ecPointToHex(publicKey)] = undefined;
52 }
53 async updateValidatorVotes(publicKey, value) {
54 await this.getValidator(publicKey);
55 const publicKeyHex = client_common_1.common.ecPointToHex(publicKey);
56 const validator = this.mutableValidators[publicKeyHex];
57 if (validator === undefined) {
58 throw new Error('For Flow');
59 }
60 this.mutableValidators[publicKeyHex] = validator.update({
61 votes: validator.votes.add(value),
62 });
63 }
64 async updateValidator(publicKey, update) {
65 await this.getValidator(publicKey);
66 const publicKeyHex = client_common_1.common.ecPointToHex(publicKey);
67 const validator = this.mutableValidators[publicKeyHex];
68 if (validator === undefined) {
69 throw new Error('For Flow');
70 }
71 const newValidator = validator.update(update);
72 this.mutableValidators[publicKeyHex] = newValidator;
73 return newValidator;
74 }
75 async getAllValidators() {
76 const validators = await this.blockchain.validator.all$.pipe(operators_1.toArray()).toPromise();
77 const mutablePublicKeyToValidator = lodash_1.default.fromPairs(validators.map((validator) => [client_common_1.common.ecPointToHex(validator.publicKey), validator]));
78 Object.entries(this.mutableValidators).forEach(([publicKey, validator]) => {
79 const publicKeyHex = client_common_1.common.ecPointToHex(publicKey);
80 if (validator === undefined) {
81 delete mutablePublicKeyToValidator[publicKeyHex];
82 }
83 else {
84 mutablePublicKeyToValidator[publicKeyHex] = validator;
85 }
86 });
87 return Object.values(mutablePublicKeyToValidator);
88 }
89 async getValidatorsCount() {
90 let validatorsCount = this.mutableValidatorsCount;
91 if (validatorsCount === undefined) {
92 validatorsCount = await this.blockchain.validatorsCount.tryGet();
93 }
94 if (validatorsCount === undefined) {
95 validatorsCount = new node_core_1.ValidatorsCount();
96 }
97 this.mutableValidatorsCount = validatorsCount;
98 return validatorsCount;
99 }
100 async updateValidatorsCountVotes(index, value) {
101 await this.getValidatorsCount();
102 const validatorsCount = this.mutableValidatorsCount;
103 if (validatorsCount === undefined) {
104 throw new Error('For Flow');
105 }
106 const votes = validatorsCount.votes[index];
107 this.mutableValidatorsCount = validatorsCount.update({
108 votes: validatorsCount.votes
109 .slice(0, index)
110 .concat((votes === undefined ? client_common_1.utils.ZERO : votes).add(value))
111 .concat(validatorsCount.votes.slice(index + 1)),
112 });
113 }
114 async addValidatorsCount(validatorsCount) {
115 this.mutableValidatorsCount = validatorsCount;
116 }
117 async updateValidatorsCount(update) {
118 await this.getValidatorsCount();
119 const validatorsCount = this.mutableValidatorsCount;
120 if (validatorsCount === undefined) {
121 throw new Error('For Flow');
122 }
123 this.mutableValidatorsCount = validatorsCount.update(update);
124 return this.mutableValidatorsCount;
125 }
126}
127exports.ValidatorCache = ValidatorCache;
128
129//# sourceMappingURL=data:application/json;charset=utf8;base64,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QUFDLE1BQTZCO1FBQzlELE1BQU0sSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDaEMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDO1FBQ3BELElBQUksZUFBZSxLQUFLLFNBQVMsRUFBRTtZQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQzdCO1FBRUQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFN0QsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUM7SUFDckMsQ0FBQztDQUNGO0FBaktELHdDQWlLQyIsImZpbGUiOiJuZW8tb25lLW5vZGUtYmxvY2tjaGFpbi9zcmMvVmFsaWRhdG9yQ2FjaGUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21tb24sIEVDUG9pbnQsIFVJbnQxNjAsIFVJbnQyNTYsIHV0aWxzIH0gZnJvbSAnQG5lby1vbmUvY2xpZW50LWNvbW1vbic7XG5pbXBvcnQgeyBBY2NvdW50LCBWYWxpZGF0b3IsIFZhbGlkYXRvcnNDb3VudCwgVmFsaWRhdG9yc0NvdW50VXBkYXRlLCBWYWxpZGF0b3JVcGRhdGUgfSBmcm9tICdAbmVvLW9uZS9ub2RlLWNvcmUnO1xuaW1wb3J0IHsgQk4gfSBmcm9tICdibi5qcyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgdG9BcnJheSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEJsb2NrY2hhaW4gfSBmcm9tICcuL0Jsb2NrY2hhaW4nO1xuXG5leHBvcnQgY2xhc3MgVmFsaWRhdG9yQ2FjaGUge1xuICBwcml2YXRlIHJlYWRvbmx5IGJsb2NrY2hhaW46IEJsb2NrY2hhaW47XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSByZWFkb25seS1rZXl3b3JkXG4gIHByaXZhdGUgcmVhZG9ubHkgbXV0YWJsZUFjY291bnRzOiB7IFtrZXk6IHN0cmluZ106IEFjY291bnQgfTtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIHJlYWRvbmx5LWtleXdvcmRcbiAgcHJpdmF0ZSByZWFkb25seSBtdXRhYmxlVmFsaWRhdG9yczogeyBba2V5OiBzdHJpbmddOiBWYWxpZGF0b3IgfCB1bmRlZmluZWQgfTtcbiAgcHJpdmF0ZSBtdXRhYmxlVmFsaWRhdG9yc0NvdW50OiBWYWxpZGF0b3JzQ291bnQgfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGJsb2NrY2hhaW46IEJsb2NrY2hhaW4pIHtcbiAgICB0aGlzLmJsb2NrY2hhaW4gPSBibG9ja2NoYWluO1xuICAgIHRoaXMubXV0YWJsZUFjY291bnRzID0ge307XG4gICAgdGhpcy5tdXRhYmxlVmFsaWRhdG9ycyA9IHt9O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEFjY291bnQoaGFzaDogVUludDE2MCk6IFByb21pc2U8QWNjb3VudD4ge1xuICAgIGxldCBhY2NvdW50ID0gdGhpcy5tdXRhYmxlQWNjb3VudHNbY29tbW9uLnVJbnQxNjBUb0hleChoYXNoKV0gYXMgQWNjb3VudCB8IHVuZGVmaW5lZDtcbiAgICBpZiAoYWNjb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhY2NvdW50ID0gYXdhaXQgdGhpcy5ibG9ja2NoYWluLmFjY291bnQudHJ5R2V0KHsgaGFzaCB9KTtcbiAgICB9XG5cbiAgICBpZiAoYWNjb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhY2NvdW50ID0gbmV3IEFjY291bnQoeyBoYXNoIH0pO1xuICAgIH1cblxuICAgIHRoaXMubXV0YWJsZUFjY291bnRzW2NvbW1vbi51SW50MTYwVG9IZXgoaGFzaCldID0gYWNjb3VudDtcblxuICAgIHJldHVybiBhY2NvdW50O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHVwZGF0ZUFjY291bnRCYWxhbmNlKGhhc2g6IFVJbnQxNjAsIGFzc2V0OiBVSW50MjU2LCB2YWx1ZTogQk4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhc3NldEhleCA9IGNvbW1vbi51SW50MjU2VG9IZXgoYXNzZXQpO1xuICAgIGF3YWl0IHRoaXMuZ2V0QWNjb3VudChoYXNoKTtcbiAgICBjb25zdCBoYXNoSGV4ID0gY29tbW9uLnVJbnQxNjBUb0hleChoYXNoKTtcbiAgICBjb25zdCBhY2NvdW50ID0gdGhpcy5tdXRhYmxlQWNjb3VudHNbaGFzaEhleF07XG4gICAgY29uc3QgYmFsYW5jZSA9IGFjY291bnQuYmFsYW5jZXNbYXNzZXRIZXhdO1xuICAgIHRoaXMubXV0YWJsZUFjY291bnRzW2hhc2hIZXhdID0gYWNjb3VudC51cGRhdGUoe1xuICAgICAgYmFsYW5jZXM6IHtcbiAgICAgICAgLi4uYWNjb3VudC5iYWxhbmNlcyxcbiAgICAgICAgW2Fzc2V0SGV4XTogdmFsdWUuYWRkKGJhbGFuY2UgPT09IHVuZGVmaW5lZCA/IHV0aWxzLlpFUk8gOiBiYWxhbmNlKSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0VmFsaWRhdG9yKHB1YmxpY0tleTogRUNQb2ludCk6IFByb21pc2U8VmFsaWRhdG9yPiB7XG4gICAgY29uc3QgcHVibGljS2V5SGV4ID0gY29tbW9uLmVjUG9pbnRUb0hleChwdWJsaWNLZXkpO1xuXG4gICAgbGV0IHZhbGlkYXRvciA9IHRoaXMubXV0YWJsZVZhbGlkYXRvcnNbcHVibGljS2V5SGV4XTtcbiAgICBpZiAodmFsaWRhdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhbGlkYXRvciA9IGF3YWl0IHRoaXMuYmxvY2tjaGFpbi52YWxpZGF0b3IudHJ5R2V0KHsgcHVibGljS2V5IH0pO1xuICAgIH1cblxuICAgIGlmICh2YWxpZGF0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsaWRhdG9yID0gbmV3IFZhbGlkYXRvcih7IHB1YmxpY0tleSB9KTtcbiAgICB9XG5cbiAgICB0aGlzLm11dGFibGVWYWxpZGF0b3JzW3B1YmxpY0tleUhleF0gPSB2YWxpZGF0b3I7XG5cbiAgICByZXR1cm4gdmFsaWRhdG9yO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFkZFZhbGlkYXRvcih2YWxpZGF0b3I6IFZhbGlkYXRvcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubXV0YWJsZVZhbGlkYXRvcnNbY29tbW9uLmVjUG9pbnRUb0hleCh2YWxpZGF0b3IucHVibGljS2V5KV0gPSB2YWxpZGF0b3I7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGVsZXRlVmFsaWRhdG9yKHB1YmxpY0tleTogRUNQb2ludCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubXV0YWJsZVZhbGlkYXRvcnNbY29tbW9uLmVjUG9pbnRUb0hleChwdWJsaWNLZXkpXSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVWYWxpZGF0b3JWb3RlcyhwdWJsaWNLZXk6IEVDUG9pbnQsIHZhbHVlOiBCTik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZ2V0VmFsaWRhdG9yKHB1YmxpY0tleSk7XG4gICAgY29uc3QgcHVibGljS2V5SGV4ID0gY29tbW9uLmVjUG9pbnRUb0hleChwdWJsaWNLZXkpO1xuICAgIGNvbnN0IHZhbGlkYXRvciA9IHRoaXMubXV0YWJsZVZhbGlkYXRvcnNbcHVibGljS2V5SGV4XTtcbiAgICBpZiAodmFsaWRhdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRm9yIEZsb3cnKTtcbiAgICB9XG5cbiAgICB0aGlzLm11dGFibGVWYWxpZGF0b3JzW3B1YmxpY0tleUhleF0gPSB2YWxpZGF0b3IudXBkYXRlKHtcbiAgICAgIHZvdGVzOiB2YWxpZGF0b3Iudm90ZXMuYWRkKHZhbHVlKSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVWYWxpZGF0b3IocHVibGljS2V5OiBFQ1BvaW50LCB1cGRhdGU6IFZhbGlkYXRvclVwZGF0ZSk6IFByb21pc2U8VmFsaWRhdG9yPiB7XG4gICAgYXdhaXQgdGhpcy5nZXRWYWxpZGF0b3IocHVibGljS2V5KTtcbiAgICBjb25zdCBwdWJsaWNLZXlIZXggPSBjb21tb24uZWNQb2ludFRvSGV4KHB1YmxpY0tleSk7XG4gICAgY29uc3QgdmFsaWRhdG9yID0gdGhpcy5tdXRhYmxlVmFsaWRhdG9yc1twdWJsaWNLZXlIZXhdO1xuICAgIGlmICh2YWxpZGF0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3IgRmxvdycpO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1ZhbGlkYXRvciA9IHZhbGlkYXRvci51cGRhdGUodXBkYXRlKTtcbiAgICB0aGlzLm11dGFibGVWYWxpZGF0b3JzW3B1YmxpY0tleUhleF0gPSBuZXdWYWxpZGF0b3I7XG5cbiAgICByZXR1cm4gbmV3VmFsaWRhdG9yO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEFsbFZhbGlkYXRvcnMoKTogUHJvbWlzZTxyZWFkb25seSBWYWxpZGF0b3JbXT4ge1xuICAgIGNvbnN0IHZhbGlkYXRvcnMgPSBhd2FpdCB0aGlzLmJsb2NrY2hhaW4udmFsaWRhdG9yLmFsbCQucGlwZSh0b0FycmF5KCkpLnRvUHJvbWlzZSgpO1xuICAgIGNvbnN0IG11dGFibGVQdWJsaWNLZXlUb1ZhbGlkYXRvciA9IF8uZnJvbVBhaXJzKFxuICAgICAgdmFsaWRhdG9ycy5tYXAoKHZhbGlkYXRvcikgPT4gW2NvbW1vbi5lY1BvaW50VG9IZXgodmFsaWRhdG9yLnB1YmxpY0tleSksIHZhbGlkYXRvcl0pLFxuICAgICk7XG5cbiAgICBPYmplY3QuZW50cmllcyh0aGlzLm11dGFibGVWYWxpZGF0b3JzKS5mb3JFYWNoKChbcHVibGljS2V5LCB2YWxpZGF0b3JdKSA9PiB7XG4gICAgICBjb25zdCBwdWJsaWNLZXlIZXggPSBjb21tb24uZWNQb2ludFRvSGV4KHB1YmxpY0tleSk7XG4gICAgICBpZiAodmFsaWRhdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWR5bmFtaWMtZGVsZXRlXG4gICAgICAgIGRlbGV0ZSBtdXRhYmxlUHVibGljS2V5VG9WYWxpZGF0b3JbcHVibGljS2V5SGV4XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG11dGFibGVQdWJsaWNLZXlUb1ZhbGlkYXRvcltwdWJsaWNLZXlIZXhdID0gdmFsaWRhdG9yO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMobXV0YWJsZVB1YmxpY0tleVRvVmFsaWRhdG9yKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRWYWxpZGF0b3JzQ291bnQoKTogUHJvbWlzZTxWYWxpZGF0b3JzQ291bnQ+IHtcbiAgICBsZXQgdmFsaWRhdG9yc0NvdW50ID0gdGhpcy5tdXRhYmxlVmFsaWRhdG9yc0NvdW50O1xuICAgIGlmICh2YWxpZGF0b3JzQ291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsaWRhdG9yc0NvdW50ID0gYXdhaXQgdGhpcy5ibG9ja2NoYWluLnZhbGlkYXRvcnNDb3VudC50cnlHZXQoKTtcbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdG9yc0NvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhbGlkYXRvcnNDb3VudCA9IG5ldyBWYWxpZGF0b3JzQ291bnQoKTtcbiAgICB9XG5cbiAgICB0aGlzLm11dGFibGVWYWxpZGF0b3JzQ291bnQgPSB2YWxpZGF0b3JzQ291bnQ7XG5cbiAgICByZXR1cm4gdmFsaWRhdG9yc0NvdW50O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHVwZGF0ZVZhbGlkYXRvcnNDb3VudFZvdGVzKGluZGV4OiBudW1iZXIsIHZhbHVlOiBCTik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZ2V0VmFsaWRhdG9yc0NvdW50KCk7XG4gICAgY29uc3QgdmFsaWRhdG9yc0NvdW50ID0gdGhpcy5tdXRhYmxlVmFsaWRhdG9yc0NvdW50O1xuICAgIGlmICh2YWxpZGF0b3JzQ291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3IgRmxvdycpO1xuICAgIH1cblxuICAgIGNvbnN0IHZvdGVzID0gdmFsaWRhdG9yc0NvdW50LnZvdGVzW2luZGV4XTtcblxuICAgIHRoaXMubXV0YWJsZVZhbGlkYXRvcnNDb3VudCA9IHZhbGlkYXRvcnNDb3VudC51cGRhdGUoe1xuICAgICAgdm90ZXM6IHZhbGlkYXRvcnNDb3VudC52b3Rlc1xuICAgICAgICAuc2xpY2UoMCwgaW5kZXgpXG4gICAgICAgIC5jb25jYXQoKHZvdGVzID09PSB1bmRlZmluZWQgPyB1dGlscy5aRVJPIDogdm90ZXMpLmFkZCh2YWx1ZSkpXG4gICAgICAgIC5jb25jYXQodmFsaWRhdG9yc0NvdW50LnZvdGVzLnNsaWNlKGluZGV4ICsgMSkpLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFkZFZhbGlkYXRvcnNDb3VudCh2YWxpZGF0b3JzQ291bnQ6IFZhbGlkYXRvcnNDb3VudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubXV0YWJsZVZhbGlkYXRvcnNDb3VudCA9IHZhbGlkYXRvcnNDb3VudDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVWYWxpZGF0b3JzQ291bnQodXBkYXRlOiBWYWxpZGF0b3JzQ291bnRVcGRhdGUpOiBQcm9taXNlPFZhbGlkYXRvcnNDb3VudD4ge1xuICAgIGF3YWl0IHRoaXMuZ2V0VmFsaWRhdG9yc0NvdW50KCk7XG4gICAgY29uc3QgdmFsaWRhdG9yc0NvdW50ID0gdGhpcy5tdXRhYmxlVmFsaWRhdG9yc0NvdW50O1xuICAgIGlmICh2YWxpZGF0b3JzQ291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3IgRmxvdycpO1xuICAgIH1cblxuICAgIHRoaXMubXV0YWJsZVZhbGlkYXRvcnNDb3VudCA9IHZhbGlkYXRvcnNDb3VudC51cGRhdGUodXBkYXRlKTtcblxuICAgIHJldHVybiB0aGlzLm11dGFibGVWYWxpZGF0b3JzQ291bnQ7XG4gIH1cbn1cbiJdfQ==