@mainsail/blockchain-utils 0.0.1-evm.17 → 0.0.1-evm.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/distribution/fee-calculator.js +1 -1
- package/distribution/fee-calculator.js.map +1 -1
- package/distribution/index.d.ts.map +1 -1
- package/distribution/index.js +13 -4
- package/distribution/index.js.map +1 -1
- package/distribution/is-block-chained.js +7 -7
- package/distribution/is-block-chained.js.map +1 -1
- package/distribution/is-majority.d.ts +1 -1
- package/distribution/is-majority.d.ts.map +1 -1
- package/distribution/is-majority.js +1 -1
- package/distribution/is-majority.js.map +1 -1
- package/distribution/is-minority.d.ts +1 -1
- package/distribution/is-minority.d.ts.map +1 -1
- package/distribution/is-minority.js +1 -1
- package/distribution/is-minority.js.map +1 -1
- package/distribution/proposer-calculator.d.ts +0 -1
- package/distribution/proposer-calculator.d.ts.map +1 -1
- package/distribution/proposer-calculator.js +2 -10
- package/distribution/proposer-calculator.js.map +1 -1
- package/distribution/round-calculator.js +18 -18
- package/distribution/round-calculator.js.map +1 -1
- package/distribution/timestamp-calculator.js +1 -1
- package/package.json +6 -6
- package/distribution/supply-calculator.d.ts +0 -7
- package/distribution/supply-calculator.d.ts.map +0 -1
- package/distribution/supply-calculator.js +0 -48
- package/distribution/supply-calculator.js.map +0 -1
@@ -8,7 +8,7 @@ import { injectable } from "@mainsail/container";
|
|
8
8
|
import { BigNumber } from "@mainsail/utils";
|
9
9
|
let FeeCalculator = class FeeCalculator {
|
10
10
|
calculate(transaction) {
|
11
|
-
return BigNumber.make(transaction.data.gasPrice).times(transaction.data.
|
11
|
+
return BigNumber.make(transaction.data.gasPrice).times(transaction.data.gas);
|
12
12
|
}
|
13
13
|
calculateConsumed(gasPrice, gasUsed) {
|
14
14
|
return BigNumber.make(gasPrice).times(gasUsed);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"fee-calculator.js","sourceRoot":"","sources":["../source/fee-calculator.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGrC,IAAM,aAAa,GAAnB,MAAM,aAAa;IAClB,SAAS,CAAC,WAAyC;QACzD,OAAO,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,
|
1
|
+
{"version":3,"file":"fee-calculator.js","sourceRoot":"","sources":["../source/fee-calculator.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGrC,IAAM,aAAa,GAAnB,MAAM,aAAa;IAClB,SAAS,CAAC,WAAyC;QACzD,OAAO,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9E,CAAC;IAEM,iBAAiB,CAAC,QAAgB,EAAE,OAAe;QACzD,OAAO,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;CACD,CAAA;AARY,aAAa;IADzB,UAAU,EAAE;GACA,aAAa,CAQzB"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../source/index.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../source/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAO7C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,8BAA8B,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,qBACa,eAAgB,SAAQ,SAAS,CAAC,eAAe;IAChD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAMtC"}
|
package/distribution/index.js
CHANGED
@@ -1,21 +1,30 @@
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
6
|
+
};
|
7
|
+
import { injectable } from "@mainsail/container";
|
1
8
|
import { Identifiers } from "@mainsail/contracts";
|
2
9
|
import { Providers } from "@mainsail/kernel";
|
3
10
|
import { FeeCalculator } from "./fee-calculator.js";
|
4
11
|
import { ProposerCalculator } from "./proposer-calculator.js";
|
5
12
|
import { RoundCalculator } from "./round-calculator.js";
|
6
|
-
import { SupplyCalculator } from "./supply-calculator.js";
|
7
13
|
import { TimestampCalculator } from "./timestamp-calculator.js";
|
8
14
|
export { formatCurrency } from "./format-currency.js";
|
9
15
|
export { getBlockNotChainedErrorMessage, isBlockChained } from "./is-block-chained.js";
|
10
16
|
export { isMajority } from "./is-majority.js";
|
11
17
|
export { isMinority } from "./is-minority.js";
|
12
|
-
|
18
|
+
let ServiceProvider = class ServiceProvider extends Providers.ServiceProvider {
|
13
19
|
async register() {
|
14
20
|
this.app.bind(Identifiers.BlockchainUtils.ProposerCalculator).to(ProposerCalculator).inSingletonScope();
|
15
21
|
this.app.bind(Identifiers.BlockchainUtils.FeeCalculator).to(FeeCalculator).inSingletonScope();
|
16
22
|
this.app.bind(Identifiers.BlockchainUtils.RoundCalculator).to(RoundCalculator).inSingletonScope();
|
17
|
-
this.app.bind(Identifiers.BlockchainUtils.SupplyCalculator).to(SupplyCalculator).inSingletonScope();
|
18
23
|
this.app.bind(Identifiers.BlockchainUtils.TimestampCalculator).to(TimestampCalculator).inSingletonScope();
|
19
24
|
}
|
20
|
-
}
|
25
|
+
};
|
26
|
+
ServiceProvider = __decorate([
|
27
|
+
injectable()
|
28
|
+
], ServiceProvider);
|
29
|
+
export { ServiceProvider };
|
21
30
|
//# sourceMappingURL=index.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../source/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../source/index.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,8BAA8B,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGvC,IAAM,eAAe,GAArB,MAAM,eAAgB,SAAQ,SAAS,CAAC,eAAe;IACtD,KAAK,CAAC,QAAQ;QACpB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACxG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAC9F,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAClG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,gBAAgB,EAAE,CAAC;IAC3G,CAAC;CACD,CAAA;AAPY,eAAe;IAD3B,UAAU,EAAE;GACA,eAAe,CAO3B"}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
const getBlockChainedDetails = (previousBlock, nextBlock) => {
|
2
|
-
const followsPrevious = nextBlock.
|
3
|
-
const isPlusOne = nextBlock.
|
2
|
+
const followsPrevious = nextBlock.parentHash === previousBlock.hash;
|
3
|
+
const isPlusOne = nextBlock.number === previousBlock.number + 1;
|
4
4
|
const isAfterPrevious = previousBlock.timestamp < nextBlock.timestamp;
|
5
5
|
const isChained = followsPrevious && isPlusOne && isAfterPrevious;
|
6
6
|
return { followsPrevious, isAfterPrevious, isChained, isPlusOne };
|
@@ -11,15 +11,15 @@ export const getBlockNotChainedErrorMessage = (previousBlock, nextBlock) => {
|
|
11
11
|
if (details.isChained) {
|
12
12
|
throw new Error("Block had no chain error");
|
13
13
|
}
|
14
|
-
const messagePrefix = `Block {
|
15
|
-
`
|
16
|
-
`previous block {
|
14
|
+
const messagePrefix = `Block { number: ${nextBlock.number}, hash: ${nextBlock.hash}, ` +
|
15
|
+
`parentHash: ${nextBlock.parentHash} } is not chained to the ` +
|
16
|
+
`previous block { number: ${previousBlock.number}, hash: ${previousBlock.hash} }`;
|
17
17
|
let messageDetail;
|
18
18
|
if (!details.followsPrevious) {
|
19
|
-
messageDetail = `previous block
|
19
|
+
messageDetail = `previous block hash mismatch`;
|
20
20
|
}
|
21
21
|
else if (!details.isPlusOne) {
|
22
|
-
messageDetail = `
|
22
|
+
messageDetail = `number is not plus one`;
|
23
23
|
}
|
24
24
|
else if (!details.isAfterPrevious) {
|
25
25
|
messageDetail = `previous timestamp is after current timestamp: ${previousBlock.timestamp} VS ${nextBlock.timestamp}`;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"is-block-chained.js","sourceRoot":"","sources":["../source/is-block-chained.ts"],"names":[],"mappings":"AASA,MAAM,sBAAsB,GAAG,CAC9B,aAAyC,EACzC,SAAqC,EACf,EAAE;IACxB,MAAM,eAAe,GAAY,SAAS,CAAC,
|
1
|
+
{"version":3,"file":"is-block-chained.js","sourceRoot":"","sources":["../source/is-block-chained.ts"],"names":[],"mappings":"AASA,MAAM,sBAAsB,GAAG,CAC9B,aAAyC,EACzC,SAAqC,EACf,EAAE;IACxB,MAAM,eAAe,GAAY,SAAS,CAAC,UAAU,KAAK,aAAa,CAAC,IAAI,CAAC;IAC7E,MAAM,SAAS,GAAY,SAAS,CAAC,MAAM,KAAK,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;IAEzE,MAAM,eAAe,GAAY,aAAa,CAAC,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;IAE/E,MAAM,SAAS,GAAY,eAAe,IAAI,SAAS,IAAI,eAAe,CAAC;IAE3E,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AACnE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAC7B,aAAyC,EACzC,SAAqC,EAC3B,EAAE,CAAC,sBAAsB,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,SAAS,CAAC;AAEzE,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAC7C,aAAyC,EACzC,SAAqC,EAC5B,EAAE;IACX,MAAM,OAAO,GAAwB,sBAAsB,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAEtF,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,aAAa,GAClB,mBAAmB,SAAS,CAAC,MAAM,WAAW,SAAS,CAAC,IAAI,IAAI;QAChE,eAAe,SAAS,CAAC,UAAU,2BAA2B;QAC9D,4BAA4B,aAAa,CAAC,MAAM,WAAW,aAAa,CAAC,IAAI,IAAI,CAAC;IAEnF,IAAI,aAAiC,CAAC;IAEtC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;QAC9B,aAAa,GAAG,8BAA8B,CAAC;IAChD,CAAC;SAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QAC/B,aAAa,GAAG,wBAAwB,CAAC;IAC1C,CAAC;SAAM,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;QACrC,aAAa,GAAG,kDAAkD,aAAa,CAAC,SAAS,OAAO,SAAS,CAAC,SAAS,EAAE,CAAC;IACvH,CAAC;IAED,OAAO,GAAG,aAAa,KAAK,aAAa,EAAE,CAAC;AAC7C,CAAC,CAAC"}
|
@@ -1,2 +1,2 @@
|
|
1
|
-
export declare const isMajority: (size: number,
|
1
|
+
export declare const isMajority: (size: number, roundValidators: number) => boolean;
|
2
2
|
//# sourceMappingURL=is-majority.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"is-majority.d.ts","sourceRoot":"","sources":["../source/is-majority.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,EAAE,
|
1
|
+
{"version":3,"file":"is-majority.d.ts","sourceRoot":"","sources":["../source/is-majority.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,EAAE,iBAAiB,MAAM,KAAG,OAA2C,CAAC"}
|
@@ -1,2 +1,2 @@
|
|
1
|
-
export const isMajority = (size,
|
1
|
+
export const isMajority = (size, roundValidators) => size > (roundValidators / 3) * 2;
|
2
2
|
//# sourceMappingURL=is-majority.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"is-majority.js","sourceRoot":"","sources":["../source/is-majority.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,
|
1
|
+
{"version":3,"file":"is-majority.js","sourceRoot":"","sources":["../source/is-majority.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,eAAuB,EAAW,EAAE,CAAC,IAAI,GAAG,CAAC,eAAe,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC"}
|
@@ -1,2 +1,2 @@
|
|
1
|
-
export declare const isMinority: (size: number,
|
1
|
+
export declare const isMinority: (size: number, roundValidators: number) => boolean;
|
2
2
|
//# sourceMappingURL=is-minority.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"is-minority.d.ts","sourceRoot":"","sources":["../source/is-minority.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,EAAE,
|
1
|
+
{"version":3,"file":"is-minority.d.ts","sourceRoot":"","sources":["../source/is-minority.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,EAAE,iBAAiB,MAAM,KAAG,OAAqC,CAAC"}
|
@@ -1,2 +1,2 @@
|
|
1
|
-
export const isMinority = (size,
|
1
|
+
export const isMinority = (size, roundValidators) => size > roundValidators / 3;
|
2
2
|
//# sourceMappingURL=is-minority.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"is-minority.js","sourceRoot":"","sources":["../source/is-minority.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,
|
1
|
+
{"version":3,"file":"is-minority.js","sourceRoot":"","sources":["../source/is-minority.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,eAAuB,EAAW,EAAE,CAAC,IAAI,GAAG,eAAe,GAAG,CAAC,CAAC"}
|
@@ -2,7 +2,6 @@ import { Contracts } from "@mainsail/contracts";
|
|
2
2
|
export declare class ProposerCalculator implements Contracts.BlockchainUtils.ProposerCalculator {
|
3
3
|
private readonly configuration;
|
4
4
|
private readonly stateStore;
|
5
|
-
private validatorMatrix;
|
6
5
|
getValidatorIndex(round: number): number;
|
7
6
|
}
|
8
7
|
//# sourceMappingURL=proposer-calculator.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"proposer-calculator.d.ts","sourceRoot":"","sources":["../source/proposer-calculator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAe,MAAM,qBAAqB,CAAC;
|
1
|
+
{"version":3,"file":"proposer-calculator.d.ts","sourceRoot":"","sources":["../source/proposer-calculator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAe,MAAM,qBAAqB,CAAC;AAE7D,qBACa,kBAAmB,YAAW,SAAS,CAAC,eAAe,CAAC,kBAAkB;IAEtF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkC;IAGhE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IAE7C,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;CAK/C"}
|
@@ -9,18 +9,10 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
9
|
};
|
10
10
|
import { inject, injectable } from "@mainsail/container";
|
11
11
|
import { Contracts, Identifiers } from "@mainsail/contracts";
|
12
|
-
import { assert } from "@mainsail/utils";
|
13
12
|
let ProposerCalculator = class ProposerCalculator {
|
14
|
-
constructor() {
|
15
|
-
// TODO: Support validator changes
|
16
|
-
this.validatorMatrix = [...Array.from({ length: 53 }).keys()];
|
17
|
-
}
|
18
13
|
getValidatorIndex(round) {
|
19
|
-
const {
|
20
|
-
|
21
|
-
const result = this.validatorMatrix[offset % activeValidators];
|
22
|
-
assert.number(result);
|
23
|
-
return result;
|
14
|
+
const { roundValidators } = this.configuration.getMilestone();
|
15
|
+
return (this.stateStore.getTotalRound() + round) % roundValidators; // This method will work fine on roundValidators change. We are not trying to get sequential indexes on value change, because validators are randomized every round.
|
24
16
|
}
|
25
17
|
};
|
26
18
|
__decorate([
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"proposer-calculator.js","sourceRoot":"","sources":["../source/proposer-calculator.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;
|
1
|
+
{"version":3,"file":"proposer-calculator.js","sourceRoot":"","sources":["../source/proposer-calculator.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGtD,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IAOvB,iBAAiB,CAAC,KAAa;QACrC,MAAM,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;QAE9D,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,GAAG,KAAK,CAAC,GAAG,eAAe,CAAC,CAAC,oKAAoK;IACzO,CAAC;CACD,CAAA;AAViB;IADhB,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,aAAa,CAAC;;yDACiB;AAG/C;IADhB,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC;;sDACoB;AALxC,kBAAkB;IAD9B,UAAU,EAAE;GACA,kBAAkB,CAY9B"}
|
@@ -16,15 +16,15 @@ let RoundCalculator = class RoundCalculator {
|
|
16
16
|
const genesisHeight = this.configuration.getGenesisHeight();
|
17
17
|
const milestones = [
|
18
18
|
{
|
19
|
-
data: configuration.getMilestone(genesisHeight).
|
19
|
+
data: configuration.getMilestone(genesisHeight).roundValidators,
|
20
20
|
found: true,
|
21
21
|
height: genesisHeight,
|
22
22
|
},
|
23
23
|
];
|
24
|
-
let nextMilestone = configuration.getNextMilestoneWithNewKey(genesisHeight, "
|
24
|
+
let nextMilestone = configuration.getNextMilestoneWithNewKey(genesisHeight, "roundValidators");
|
25
25
|
while (nextMilestone.found) {
|
26
26
|
milestones.push(nextMilestone);
|
27
|
-
nextMilestone = configuration.getNextMilestoneWithNewKey(nextMilestone.height, "
|
27
|
+
nextMilestone = configuration.getNextMilestoneWithNewKey(nextMilestone.height, "roundValidators");
|
28
28
|
}
|
29
29
|
return milestones;
|
30
30
|
};
|
@@ -39,19 +39,19 @@ let RoundCalculator = class RoundCalculator {
|
|
39
39
|
if (temporary.height > height) {
|
40
40
|
continue;
|
41
41
|
}
|
42
|
-
if (!milestone || temporary.
|
42
|
+
if (!milestone || temporary.roundValidators === milestone.roundValidators) {
|
43
43
|
milestone = temporary;
|
44
44
|
}
|
45
45
|
else {
|
46
46
|
break;
|
47
47
|
}
|
48
48
|
}
|
49
|
-
return height === genesisHeight || (height - Math.max(milestone.height, 1)) % milestone.
|
49
|
+
return height === genesisHeight || (height - Math.max(milestone.height, 1)) % milestone.roundValidators === 0;
|
50
50
|
}
|
51
51
|
calculateRound(height) {
|
52
52
|
const genesisHeight = this.configuration.getGenesisHeight();
|
53
|
-
let nextMilestone = this.configuration.getNextMilestoneWithNewKey(genesisHeight, "
|
54
|
-
let
|
53
|
+
let nextMilestone = this.configuration.getNextMilestoneWithNewKey(genesisHeight, "roundValidators");
|
54
|
+
let roundValidators = this.configuration.getMilestone(genesisHeight).roundValidators;
|
55
55
|
// Genesis round requires special treatment
|
56
56
|
if (height === genesisHeight) {
|
57
57
|
return { maxValidators: 0, nextRound: 1, round: 0, roundHeight: genesisHeight };
|
@@ -69,25 +69,25 @@ let RoundCalculator = class RoundCalculator {
|
|
69
69
|
break;
|
70
70
|
}
|
71
71
|
const spanHeight = nextMilestone.height - milestoneHeight - 1;
|
72
|
-
if (milestoneHeight > genesisHeight && spanHeight %
|
72
|
+
if (milestoneHeight > genesisHeight && spanHeight % roundValidators !== 0) {
|
73
73
|
throw new Exceptions.InvalidMilestoneConfigurationError(`Bad milestone at height: ${height}. The number of validators can only be changed at the beginning of a new round.`);
|
74
74
|
}
|
75
|
-
result.round += spanHeight / Math.max(1,
|
75
|
+
result.round += spanHeight / Math.max(1, roundValidators);
|
76
76
|
result.roundHeight = nextMilestone.height;
|
77
77
|
assert.number(nextMilestone.data);
|
78
78
|
result.maxValidators = nextMilestone.data;
|
79
|
-
|
79
|
+
roundValidators = nextMilestone.data;
|
80
80
|
milestoneHeight = nextMilestone.height - 1;
|
81
|
-
nextMilestone = this.configuration.getNextMilestoneWithNewKey(nextMilestone.height, "
|
81
|
+
nextMilestone = this.configuration.getNextMilestoneWithNewKey(nextMilestone.height, "roundValidators");
|
82
82
|
}
|
83
|
-
const
|
83
|
+
const minRoundValidators = Math.max(1, roundValidators);
|
84
84
|
const heightFromLastSpan = height - milestoneHeight - 1;
|
85
|
-
const roundIncrease = Math.floor(heightFromLastSpan /
|
86
|
-
const nextRoundIncrease = (heightFromLastSpan + 1) %
|
85
|
+
const roundIncrease = Math.floor(heightFromLastSpan / minRoundValidators);
|
86
|
+
const nextRoundIncrease = (heightFromLastSpan + 1) % minRoundValidators === 0 ? 1 : 0;
|
87
87
|
result.round += roundIncrease;
|
88
|
-
result.roundHeight += roundIncrease *
|
88
|
+
result.roundHeight += roundIncrease * minRoundValidators;
|
89
89
|
result.nextRound = result.round + nextRoundIncrease;
|
90
|
-
result.maxValidators =
|
90
|
+
result.maxValidators = minRoundValidators;
|
91
91
|
return result;
|
92
92
|
}
|
93
93
|
calculateRoundInfoByRound(round) {
|
@@ -100,8 +100,8 @@ let RoundCalculator = class RoundCalculator {
|
|
100
100
|
let maxValidators = 0;
|
101
101
|
for (let index = 1; index < milestones.length - 1; index++) {
|
102
102
|
const milestone = milestones[index];
|
103
|
-
maxValidators = milestone.
|
104
|
-
roundHeight += (round - 1) * milestone.
|
103
|
+
maxValidators = milestone.roundValidators;
|
104
|
+
roundHeight += (round - 1) * milestone.roundValidators;
|
105
105
|
}
|
106
106
|
return {
|
107
107
|
maxValidators,
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"round-calculator.js","sourceRoot":"","sources":["../source/round-calculator.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AASlC,IAAM,eAAe,GAArB,MAAM,eAAe;IAArB;QA2GC,iDAA4C,GAAG,CACrD,aAA6C,EACd,EAAE;YACjC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC;YAE5D,MAAM,UAAU,GAAiC;gBAChD;oBACC,IAAI,EAAE,aAAa,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,
|
1
|
+
{"version":3,"file":"round-calculator.js","sourceRoot":"","sources":["../source/round-calculator.ts"],"names":[],"mappings":"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"}
|
@@ -16,7 +16,7 @@ let TimestampCalculator = class TimestampCalculator {
|
|
16
16
|
if (round > 100_000) {
|
17
17
|
throw new Error(`Round ${round} is too high`);
|
18
18
|
}
|
19
|
-
const milestone = this.configuration.getMilestone(previousBlock.data.
|
19
|
+
const milestone = this.configuration.getMilestone(previousBlock.data.number + 1);
|
20
20
|
const roundForMath = Math.max(0, round - 1);
|
21
21
|
return (previousBlock.data.timestamp +
|
22
22
|
// Append block time
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@mainsail/blockchain-utils",
|
3
|
-
"version": "0.0.1-evm.
|
3
|
+
"version": "0.0.1-evm.19",
|
4
4
|
"description": "Common blockchain utils for the Mainsail blockchain.",
|
5
5
|
"license": "GPL-3.0-only",
|
6
6
|
"contributors": [],
|
@@ -11,10 +11,10 @@
|
|
11
11
|
"/distribution"
|
12
12
|
],
|
13
13
|
"dependencies": {
|
14
|
-
"@mainsail/container": "0.0.1-evm.
|
15
|
-
"@mainsail/
|
16
|
-
"@mainsail/
|
17
|
-
"@mainsail/
|
14
|
+
"@mainsail/container": "0.0.1-evm.19",
|
15
|
+
"@mainsail/utils": "0.0.1-evm.19",
|
16
|
+
"@mainsail/kernel": "0.0.1-evm.19",
|
17
|
+
"@mainsail/contracts": "0.0.1-evm.19"
|
18
18
|
},
|
19
19
|
"devDependencies": {
|
20
20
|
"uvu": "0.5.6"
|
@@ -28,7 +28,7 @@
|
|
28
28
|
"clean": "del distribution",
|
29
29
|
"release": "pnpm publish --access public",
|
30
30
|
"test": "pnpm run uvu source .test.ts",
|
31
|
-
"test:coverage": "c8 pnpm run test",
|
31
|
+
"test:coverage": "c8 -r=text -r=lcov --all pnpm run test",
|
32
32
|
"test:coverage:html": "c8 -r html --all pnpm run test",
|
33
33
|
"test:file": "pnpm run uvu source",
|
34
34
|
"uvu": "tsx --tsconfig ../../tsconfig.test.json ./node_modules/uvu/bin.js"
|
@@ -1,7 +0,0 @@
|
|
1
|
-
import { Contracts } from "@mainsail/contracts";
|
2
|
-
import { BigNumber } from "@mainsail/utils";
|
3
|
-
export declare class SupplyCalculator implements Contracts.BlockchainUtils.SupplyCalculator {
|
4
|
-
private readonly configuration;
|
5
|
-
calculateSupply(height: number): BigNumber;
|
6
|
-
}
|
7
|
-
//# sourceMappingURL=supply-calculator.d.ts.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"supply-calculator.d.ts","sourceRoot":"","sources":["../source/supply-calculator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAe,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,qBACa,gBAAiB,YAAW,SAAS,CAAC,eAAe,CAAC,gBAAgB;IAElF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkC;IAEhE,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS;CAkC1C"}
|
@@ -1,48 +0,0 @@
|
|
1
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
2
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
3
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
4
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
5
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
6
|
-
};
|
7
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
8
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
9
|
-
};
|
10
|
-
import { inject, injectable } from "@mainsail/container";
|
11
|
-
import { Contracts, Identifiers } from "@mainsail/contracts";
|
12
|
-
import { BigNumber } from "@mainsail/utils";
|
13
|
-
let SupplyCalculator = class SupplyCalculator {
|
14
|
-
calculateSupply(height) {
|
15
|
-
const initialSupply = BigNumber.make(this.configuration.get("genesisBlock.block.totalAmount"));
|
16
|
-
const milestones = this.configuration.get("milestones");
|
17
|
-
const genesisHeight = this.configuration.getGenesisHeight();
|
18
|
-
if (height === genesisHeight || milestones.length === 0) {
|
19
|
-
return initialSupply;
|
20
|
-
}
|
21
|
-
let accumulatedRewards = BigNumber.ZERO;
|
22
|
-
let currentHeight = 0;
|
23
|
-
let constantIndex = 0;
|
24
|
-
while (currentHeight < height) {
|
25
|
-
const constants = milestones[constantIndex];
|
26
|
-
const nextConstants = milestones[constantIndex + 1];
|
27
|
-
let heightJump = height - currentHeight;
|
28
|
-
if (nextConstants && height >= nextConstants.height && currentHeight < nextConstants.height - 1) {
|
29
|
-
heightJump = nextConstants.height - 1 - currentHeight;
|
30
|
-
constantIndex += 1;
|
31
|
-
}
|
32
|
-
currentHeight += heightJump;
|
33
|
-
if (currentHeight >= constants.height) {
|
34
|
-
accumulatedRewards = accumulatedRewards.plus(BigNumber.make(constants.reward).times(heightJump));
|
35
|
-
}
|
36
|
-
}
|
37
|
-
return initialSupply.plus(accumulatedRewards);
|
38
|
-
}
|
39
|
-
};
|
40
|
-
__decorate([
|
41
|
-
inject(Identifiers.Cryptography.Configuration),
|
42
|
-
__metadata("design:type", Object)
|
43
|
-
], SupplyCalculator.prototype, "configuration", void 0);
|
44
|
-
SupplyCalculator = __decorate([
|
45
|
-
injectable()
|
46
|
-
], SupplyCalculator);
|
47
|
-
export { SupplyCalculator };
|
48
|
-
//# sourceMappingURL=supply-calculator.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"supply-calculator.js","sourceRoot":"","sources":["../source/supply-calculator.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGrC,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAI5B,eAAe,CAAC,MAAc;QAC7B,MAAM,aAAa,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC,CAAC;QAE/F,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACxD,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC;QAE5D,IAAI,MAAM,KAAK,aAAa,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzD,OAAO,aAAa,CAAC;QACtB,CAAC;QAED,IAAI,kBAAkB,GAAG,SAAS,CAAC,IAAI,CAAC;QACxC,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,aAAa,GAAG,CAAC,CAAC;QAEtB,OAAO,aAAa,GAAG,MAAM,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;YAC5C,MAAM,aAAa,GAAG,UAAU,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;YAEpD,IAAI,UAAU,GAAW,MAAM,GAAG,aAAa,CAAC;YAEhD,IAAI,aAAa,IAAI,MAAM,IAAI,aAAa,CAAC,MAAM,IAAI,aAAa,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjG,UAAU,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,GAAG,aAAa,CAAC;gBACtD,aAAa,IAAI,CAAC,CAAC;YACpB,CAAC;YAED,aAAa,IAAI,UAAU,CAAC;YAE5B,IAAI,aAAa,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;gBACvC,kBAAkB,GAAG,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;YAClG,CAAC;QACF,CAAC;QAED,OAAO,aAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC/C,CAAC;CACD,CAAA;AApCiB;IADhB,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,aAAa,CAAC;;uDACiB;AAFpD,gBAAgB;IAD5B,UAAU,EAAE;GACA,gBAAgB,CAsC5B"}
|