diff --git a/README.md b/README.md
index e17a4c90afe..970d1b96508 100644
--- a/README.md
+++ b/README.md
@@ -45,7 +45,6 @@ taiko-mono/
│ ├── relayer: Bridge backend relayer in Go
│ ├── starter-dapp: Template for Taiko dapps
│ ├── status-page: Taiko protocol status page
-│ ├── tokenomics: Taiko tokenomics simulations
│ ├── website: Main documentation website at taiko.xyz (https://taiko.xyz/)
│ └── whitepaper: Whitepaper source files with automated publishing
...
diff --git a/packages/protocol/contracts/L1/TaikoL1.sol b/packages/protocol/contracts/L1/TaikoL1.sol
index b8b9901a7a2..8e5f0d7a6c3 100644
--- a/packages/protocol/contracts/L1/TaikoL1.sol
+++ b/packages/protocol/contracts/L1/TaikoL1.sol
@@ -158,20 +158,19 @@ contract TaikoL1 is EssentialContract, IXchainSync, TaikoEvents, TaikoErrors {
return state.balances[addr];
}
- function getBlockFee() public view returns (uint64 fee) {
- fee = LibTokenomics.getBlockFee(state);
+ function getBlockFee() public view returns (uint64) {
+ return state.basefee;
}
function getProofReward(
uint64 provenAt,
uint64 proposedAt
- ) public view returns (uint64 reward) {
- reward = LibTokenomics.getProofReward({
- state: state,
- config: getConfig(),
- provenAt: provenAt,
- proposedAt: proposedAt
- });
+ ) public view returns (uint64) {
+ return
+ LibTokenomics.getProofReward({
+ state: state,
+ proofTime: provenAt - proposedAt
+ });
}
function getBlock(
@@ -252,4 +251,8 @@ contract TaikoL1 is EssentialContract, IXchainSync, TaikoEvents, TaikoErrors {
function getConfig() public pure virtual returns (TaikoData.Config memory) {
return TaikoConfig.getConfig();
}
+
+ function getVerifierName(uint16 id) public pure returns (string memory) {
+ return LibUtils.getVerifierName(id);
+ }
}
diff --git a/packages/protocol/contracts/L1/libs/LibProposing.sol b/packages/protocol/contracts/L1/libs/LibProposing.sol
index e1a7148bd63..265e6c0729d 100644
--- a/packages/protocol/contracts/L1/libs/LibProposing.sol
+++ b/packages/protocol/contracts/L1/libs/LibProposing.sol
@@ -90,17 +90,13 @@ library LibProposing {
blk.metaHash = LibUtils.hashMetadata(meta);
blk.proposer = msg.sender;
- if (config.proofTimeTarget != 0) {
- uint64 fee = LibTokenomics.getBlockFee(state);
+ if (state.balances[msg.sender] < state.basefee)
+ revert L1_INSUFFICIENT_TOKEN();
- if (state.balances[msg.sender] < fee)
- revert L1_INSUFFICIENT_TOKEN();
-
- unchecked {
- state.balances[msg.sender] -= fee;
- state.accBlockFees += fee;
- state.accProposedAt += meta.timestamp;
- }
+ unchecked {
+ state.balances[msg.sender] -= state.basefee;
+ state.accBlockFees += state.basefee;
+ state.accProposedAt += meta.timestamp;
}
emit BlockProposed(state.numBlocks, meta);
diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol
index f262842dfbf..086ce3ca84a 100644
--- a/packages/protocol/contracts/L1/libs/LibProving.sol
+++ b/packages/protocol/contracts/L1/libs/LibProving.sol
@@ -201,13 +201,11 @@ library LibProving {
}
}
- bytes memory verifierId = abi.encodePacked(
- "verifier_",
- evidence.zkproof.verifierId
- );
-
(bool verified, bytes memory ret) = resolver
- .resolve(string(verifierId), false)
+ .resolve(
+ LibUtils.getVerifierName(evidence.zkproof.verifierId),
+ false
+ )
.staticcall(bytes.concat(instance, evidence.zkproof.data));
if (
diff --git a/packages/protocol/contracts/L1/libs/LibTokenomics.sol b/packages/protocol/contracts/L1/libs/LibTokenomics.sol
index 2be0b84ea0a..8ec38cfd1a2 100644
--- a/packages/protocol/contracts/L1/libs/LibTokenomics.sol
+++ b/packages/protocol/contracts/L1/libs/LibTokenomics.sol
@@ -55,100 +55,73 @@ library LibTokenomics {
}
}
- function getBlockFee(
- TaikoData.State storage state
- ) internal view returns (uint64 fee) {
- return state.basefee;
- }
-
- function getProofReward(
- TaikoData.State storage state,
- TaikoData.Config memory config,
- uint64 provenAt,
- uint64 proposedAt
- ) internal view returns (uint64 reward) {
- (reward, , ) = calculateBasefee(state, config, (provenAt - proposedAt));
- }
-
/**
* Update the baseFee for proofs
*
* @param state The actual state data
- * @param config Config data
* @param proofTime The actual proof time
* @return reward Amount of reward given - if blocked is proved and verified
- * @return newProofTimeIssued Accumulated proof time
- * @return newBasefee New basefee
*/
- function calculateBasefee(
+ function getProofReward(
TaikoData.State storage state,
- TaikoData.Config memory config,
uint64 proofTime
- )
- internal
- view
- returns (uint64 reward, uint64 newProofTimeIssued, uint64 newBasefee)
- {
- newProofTimeIssued = state.proofTimeIssued;
-
- newProofTimeIssued = (newProofTimeIssued > config.proofTimeTarget)
- ? newProofTimeIssued - config.proofTimeTarget
- : uint64(0);
- newProofTimeIssued += proofTime;
-
- newBasefee = _calcBasefee(
- newProofTimeIssued,
- config.proofTimeTarget,
- config.adjustmentQuotient
- );
-
- uint64 numBlocksUnpaid = state.numBlocks -
+ ) internal view returns (uint64) {
+ uint64 numBlocksUnverified = state.numBlocks -
state.lastVerifiedBlockId -
1;
- if (numBlocksUnpaid == 0) {
- reward = uint64(0);
+ if (numBlocksUnverified == 0) {
+ return 0;
} else {
uint64 totalNumProvingSeconds = uint64(
- uint256(numBlocksUnpaid) * block.timestamp - state.accProposedAt
+ uint256(numBlocksUnverified) *
+ block.timestamp -
+ state.accProposedAt
);
- ///@dev If block timestamp is equal to state.accProposedAt (not really, but theoretically possible)
- ///@dev there will be division by 0 error
+ // If block timestamp is equal to state.accProposedAt (not really, but theoretically possible)
+ // there will be division by 0 error
if (totalNumProvingSeconds == 0) {
totalNumProvingSeconds = 1;
}
- reward = uint64(
- (uint256(state.accBlockFees) * proofTime) /
- totalNumProvingSeconds
- );
+ return
+ uint64(
+ (uint256(state.accBlockFees) * proofTime) /
+ totalNumProvingSeconds
+ );
}
}
/**
- * Calculating the exponential smoothened with (target/quotient)
+ * Calculate the newProofTimeIssued and newBasefee
*
- * @param value Result of cumulativeProofTime
- * @param target Target proof time
- * @param quotient Quotient
- * @return uint64 Calculated new basefee
+ * @param state The actual state data
+ * @param config Config data
+ * @param proofTime The actual proof time
+ * @return newProofTimeIssued Accumulated proof time
+ * @return newBasefee New basefee
*/
- function _calcBasefee(
- uint256 value,
- uint256 target,
- uint256 quotient
- ) private pure returns (uint64) {
- uint256 x = (value * Math.SCALING_FACTOR_1E18) / (target * quotient);
+ function getNewBaseFeeandProofTimeIssued(
+ TaikoData.State storage state,
+ TaikoData.Config memory config,
+ uint64 proofTime
+ ) internal view returns (uint64 newProofTimeIssued, uint64 newBasefee) {
+ newProofTimeIssued = (state.proofTimeIssued > config.proofTimeTarget)
+ ? state.proofTimeIssued - config.proofTimeTarget
+ : uint64(0);
+ newProofTimeIssued += proofTime;
+
+ uint256 x = (newProofTimeIssued * Math.SCALING_FACTOR_1E18) /
+ (config.proofTimeTarget * config.adjustmentQuotient);
if (Math.MAX_EXP_INPUT <= x) {
x = Math.MAX_EXP_INPUT;
}
uint256 result = (uint256(Math.exp(int256(x))) /
- Math.SCALING_FACTOR_1E18) / (target * quotient);
-
- if (result > type(uint64).max) return type(uint64).max;
+ Math.SCALING_FACTOR_1E18) /
+ (config.proofTimeTarget * config.adjustmentQuotient);
- return uint64(result);
+ newBasefee = uint64(result.min(type(uint64).max));
}
}
diff --git a/packages/protocol/contracts/L1/libs/LibUtils.sol b/packages/protocol/contracts/L1/libs/LibUtils.sol
index 50a7a0d3824..b88ad8bf95b 100644
--- a/packages/protocol/contracts/L1/libs/LibUtils.sol
+++ b/packages/protocol/contracts/L1/libs/LibUtils.sol
@@ -132,4 +132,8 @@ library LibUtils {
mstore(0x40, add(ptr, 64))
}
}
+
+ function getVerifierName(uint16 id) public pure returns (string memory) {
+ return string(bytes.concat(bytes("verifier_"), bytes2(id)));
+ }
}
diff --git a/packages/protocol/contracts/L1/libs/LibVerifying.sol b/packages/protocol/contracts/L1/libs/LibVerifying.sol
index 245afc35d62..457e88e166f 100644
--- a/packages/protocol/contracts/L1/libs/LibVerifying.sol
+++ b/packages/protocol/contracts/L1/libs/LibVerifying.sol
@@ -130,23 +130,16 @@ library LibVerifying {
uint24 fcId
) private {
if (config.proofTimeTarget != 0) {
- uint256 proofTime;
+ uint64 proofTime;
unchecked {
- proofTime = (fc.provenAt - blk.proposedAt);
+ proofTime = uint64(fc.provenAt - blk.proposedAt);
}
- (
- uint64 reward,
- uint64 proofTimeIssued,
- uint64 newBasefee
- ) = LibTokenomics.calculateBasefee(
- state,
- config,
- uint64(proofTime)
- );
-
- state.basefee = newBasefee;
- state.proofTimeIssued = proofTimeIssued;
+ uint64 reward = LibTokenomics.getProofReward(state, proofTime);
+
+ (state.proofTimeIssued, state.basefee) = LibTokenomics
+ .getNewBaseFeeandProofTimeIssued(state, config, proofTime);
+
unchecked {
state.accBlockFees -= reward;
state.accProposedAt -= blk.proposedAt;
diff --git a/packages/protocol/script/DeployOnL1.s.sol b/packages/protocol/script/DeployOnL1.s.sol
index 3fe1c8b6778..9609502dba0 100644
--- a/packages/protocol/script/DeployOnL1.s.sol
+++ b/packages/protocol/script/DeployOnL1.s.sol
@@ -48,6 +48,7 @@ contract DeployOnL1 is Script, AddressResolver {
uint256 public taikoTokenPremintAmount =
vm.envUint("TAIKO_TOKEN_PREMINT_AMOUNT");
+ TaikoL1 taikoL1;
address public addressManagerProxy;
// New fee/reward related variables
@@ -118,7 +119,7 @@ contract DeployOnL1 is Script, AddressResolver {
console.log("BullToken", bullToken);
// TaikoL1
- TaikoL1 taikoL1 = new TaikoL1();
+ taikoL1 = new TaikoL1();
uint64 feeBase = 1 ** 8; // Taiko Token's decimals is 8, not 18
@@ -200,10 +201,7 @@ contract DeployOnL1 is Script, AddressResolver {
);
for (uint16 i = 0; i < plonkVerifiers.length; ++i) {
- setAddress(
- string(abi.encodePacked("verifier_", i)),
- plonkVerifiers[i]
- );
+ setAddress(taikoL1.getVerifierName(i), plonkVerifiers[i]);
}
}
diff --git a/packages/protocol/test2/LibLn.sol b/packages/protocol/test2/LibLn.sol
index 97ff0a65212..bcb8ff552d8 100644
--- a/packages/protocol/test2/LibLn.sol
+++ b/packages/protocol/test2/LibLn.sol
@@ -2,13 +2,12 @@
pragma solidity ^0.8.18;
// Taken from: https://github.com/recmo/experiment-solexp/blob/main/src/FixedPointMathLib.sol
+import {LibFixedPointMath} from "../contracts/thirdparty/LibFixedPointMath.sol";
+
library LibLn {
error Overflow();
error LnNegativeUndefined();
- // Helper, common variable for 'off-chain' initProofTimeTarget generation
- uint256 public constant SCALING_E18 = 1e18;
-
// Integer log2 (alternative implementation)
// @returns floor(log2(x)) if x is nonzero, otherwise 0.
// Consumes 317 gas. This could have been an 3 gas EVM opcode though.
@@ -216,11 +215,12 @@ library LibLn {
) public pure returns (uint64 initProofTimeIssued) {
uint256 scale = uint256(proofTimeTarget) * adjustmentQuotient;
// ln_pub() expects 1e18 fixed format
- uint256 lnReq = scale * basefee * SCALING_E18;
+ uint256 lnReq = scale * basefee * LibFixedPointMath.SCALING_FACTOR_1E18;
require(lnReq <= uint256(type(int256).max));
int256 log_result = ln_pub(int256(lnReq));
initProofTimeIssued = uint64(
- ((scale * (uint256(log_result))) / (SCALING_E18))
+ ((scale * (uint256(log_result))) /
+ (LibFixedPointMath.SCALING_FACTOR_1E18))
);
}
}
diff --git a/packages/protocol/test2/TaikoL1.sim.sol b/packages/protocol/test2/TaikoL1.sim.sol
index 1d37ade4f0d..4861f9887c3 100644
--- a/packages/protocol/test2/TaikoL1.sim.sol
+++ b/packages/protocol/test2/TaikoL1.sim.sol
@@ -53,18 +53,14 @@ contract TaikoL1Simulation is TaikoL1TestBase, FoundryRandom {
);
TaikoL1TestBase.setUp();
- // TODO(daniel): update string key generation using bytes.concat
- _registerAddress(
- string(abi.encodePacked("verifier_", uint16(100))),
- address(new Verifier())
- );
+ registerAddress(L1.getVerifierName(100), address(new Verifier()));
}
function testGeneratingManyRandomBlocks() external {
uint256 time = block.timestamp;
assertEq(time, 1);
- _depositTaikoToken(Alice, 1E6 * 1E8, 10000 ether);
+ depositTaikoToken(Alice, 1E6 * 1E8, 10000 ether);
bytes32 parentHash = GENESIS_BLOCK_HASH;
uint32 parentGasUsed;
@@ -165,7 +161,7 @@ contract TaikoL1Simulation is TaikoL1TestBase, FoundryRandom {
function pickRandomProveTime(
uint256 randomNum
- ) internal view returns (uint8) {
+ ) internal pure returns (uint8) {
// Result shall be between 8-12 (inclusive)
// so that it will result in a 160-240s proof time
// while the proof time target is 200s
diff --git a/packages/protocol/test2/TaikoL1.t.sol b/packages/protocol/test2/TaikoL1.t.sol
index 78b5f64f16a..48b1cbc790b 100644
--- a/packages/protocol/test2/TaikoL1.t.sol
+++ b/packages/protocol/test2/TaikoL1.t.sol
@@ -43,9 +43,9 @@ contract TaikoL1Test is TaikoL1TestBase {
/// @dev Test we can propose, prove, then verify more blocks than 'maxNumProposedBlocks'
function test_more_blocks_than_ring_buffer_size() external {
- _depositTaikoToken(Alice, 1E6 * 1E8, 100 ether);
- _depositTaikoToken(Bob, 1E6 * 1E8, 100 ether);
- _depositTaikoToken(Carol, 1E6 * 1E8, 100 ether);
+ depositTaikoToken(Alice, 1E6 * 1E8, 100 ether);
+ depositTaikoToken(Bob, 1E6 * 1E8, 100 ether);
+ depositTaikoToken(Carol, 1E6 * 1E8, 100 ether);
bytes32 parentHash = GENESIS_BLOCK_HASH;
uint32 parentGasUsed = 0;
@@ -87,7 +87,7 @@ contract TaikoL1Test is TaikoL1TestBase {
/// @dev Test more than one block can be proposed, proven, & verified in the
/// same L1 block.
function test_multiple_blocks_in_one_L1_block() external {
- _depositTaikoToken(Alice, 1000 * 1E8, 1000 ether);
+ depositTaikoToken(Alice, 1000 * 1E8, 1000 ether);
bytes32 parentHash = GENESIS_BLOCK_HASH;
uint32 parentGasUsed = 0;
@@ -122,7 +122,7 @@ contract TaikoL1Test is TaikoL1TestBase {
/// @dev Test verifying multiple blocks in one transaction
function test_verifying_multiple_blocks_once() external {
- _depositTaikoToken(Alice, 1E6 * 1E8, 1000 ether);
+ depositTaikoToken(Alice, 1E6 * 1E8, 1000 ether);
bytes32 parentHash = GENESIS_BLOCK_HASH;
uint32 parentGasUsed = 0;
diff --git a/packages/protocol/test2/TaikoL1LibTokenomicsMainnet.t.sol b/packages/protocol/test2/TaikoL1LibTokenomicsMainnet.t.sol
index fc7b8624e77..f866ff488d8 100644
--- a/packages/protocol/test2/TaikoL1LibTokenomicsMainnet.t.sol
+++ b/packages/protocol/test2/TaikoL1LibTokenomicsMainnet.t.sol
@@ -59,9 +59,9 @@ contract TaikoL1LibTokenomicsMainnet is TaikoL1TestBase, FoundryRandom {
TaikoL1TestBase.setUp();
- _depositTaikoToken(Alice, 1E8 * 1E8, 100 ether);
- _depositTaikoToken(Bob, 1E8 * 1E8, 100 ether);
- _depositTaikoToken(Carol, 1E8 * 1E8, 100 ether);
+ depositTaikoToken(Alice, 1E8 * 1E8, 100 ether);
+ depositTaikoToken(Bob, 1E8 * 1E8, 100 ether);
+ depositTaikoToken(Carol, 1E8 * 1E8, 100 ether);
Alice_start_balance = L1.getBalance(Alice);
Bob_start_balance = L1.getBalance(Bob);
@@ -77,9 +77,9 @@ contract TaikoL1LibTokenomicsMainnet is TaikoL1TestBase, FoundryRandom {
vm.pauseGasMetering();
mine(1);
- _depositTaikoToken(Alice, 1E8 * 1E8, 1000 ether);
- _depositTaikoToken(Bob, 1E8 * 1E8, 1000 ether);
- _depositTaikoToken(Carol, 1E8 * 1E8, 1000 ether);
+ depositTaikoToken(Alice, 1E8 * 1E8, 1000 ether);
+ depositTaikoToken(Bob, 1E8 * 1E8, 1000 ether);
+ depositTaikoToken(Carol, 1E8 * 1E8, 1000 ether);
// Check balances
Alice_start_balance = L1.getBalance(Alice);
diff --git a/packages/protocol/test2/TaikoL1LibTokenomicsTestnet.t.sol b/packages/protocol/test2/TaikoL1LibTokenomicsTestnet.t.sol
index dacef8417bc..6399411a295 100644
--- a/packages/protocol/test2/TaikoL1LibTokenomicsTestnet.t.sol
+++ b/packages/protocol/test2/TaikoL1LibTokenomicsTestnet.t.sol
@@ -51,9 +51,9 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase {
TaikoL1TestBase.setUp();
- _depositTaikoToken(Alice, 1E6 * 1E8, 100 ether);
- _depositTaikoToken(Bob, 1E6 * 1E8, 100 ether);
- _depositTaikoToken(Carol, 1E6 * 1E8, 100 ether);
+ depositTaikoToken(Alice, 1E6 * 1E8, 100 ether);
+ depositTaikoToken(Bob, 1E6 * 1E8, 100 ether);
+ depositTaikoToken(Carol, 1E6 * 1E8, 100 ether);
}
/// @dev Test what happens when proof time increases
@@ -61,9 +61,9 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase {
external
{
mine(1);
- _depositTaikoToken(Alice, 1E6 * 1E8, 100 ether);
- _depositTaikoToken(Bob, 1E6 * 1E8, 100 ether);
- _depositTaikoToken(Carol, 1E6 * 1E8, 100 ether);
+ depositTaikoToken(Alice, 1E6 * 1E8, 100 ether);
+ depositTaikoToken(Bob, 1E6 * 1E8, 100 ether);
+ depositTaikoToken(Carol, 1E6 * 1E8, 100 ether);
bytes32 parentHash = GENESIS_BLOCK_HASH;
@@ -162,9 +162,9 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase {
{
mine(1);
//Needs lot of token here - because there is lots of time elapsed between 2 'propose' blocks, which will raise the fee
- _depositTaikoToken(Alice, 1E8 * 1E8, 100 ether);
- _depositTaikoToken(Bob, 1E8 * 1E8, 100 ether);
- _depositTaikoToken(Carol, 1E8 * 1E8, 100 ether);
+ depositTaikoToken(Alice, 1E8 * 1E8, 100 ether);
+ depositTaikoToken(Bob, 1E8 * 1E8, 100 ether);
+ depositTaikoToken(Carol, 1E8 * 1E8, 100 ether);
TaikoData.BlockMetadata[] memory metas = new TaikoData.BlockMetadata[](
20
@@ -268,9 +268,9 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase {
external
{
mine(1);
- _depositTaikoToken(Alice, 1E6 * 1E8, 100 ether);
- _depositTaikoToken(Bob, 1E6 * 1E8, 100 ether);
- _depositTaikoToken(Carol, 1E6 * 1E8, 100 ether);
+ depositTaikoToken(Alice, 1E6 * 1E8, 100 ether);
+ depositTaikoToken(Bob, 1E6 * 1E8, 100 ether);
+ depositTaikoToken(Carol, 1E6 * 1E8, 100 ether);
bytes32 parentHash = GENESIS_BLOCK_HASH;
@@ -329,9 +329,9 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase {
external
{
mine(1);
- _depositTaikoToken(Alice, 1E6 * 1E8, 100 ether);
- _depositTaikoToken(Bob, 1E6 * 1E8, 100 ether);
- _depositTaikoToken(Carol, 1E6 * 1E8, 100 ether);
+ depositTaikoToken(Alice, 1E6 * 1E8, 100 ether);
+ depositTaikoToken(Bob, 1E6 * 1E8, 100 ether);
+ depositTaikoToken(Carol, 1E6 * 1E8, 100 ether);
TaikoData.BlockMetadata[] memory meta = new TaikoData.BlockMetadata[](
30
@@ -399,9 +399,9 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase {
external
{
mine(1);
- _depositTaikoToken(Alice, 1E6 * 1E8, 100 ether);
- _depositTaikoToken(Bob, 1E6 * 1E8, 100 ether);
- _depositTaikoToken(Carol, 1E6 * 1E8, 100 ether);
+ depositTaikoToken(Alice, 1E6 * 1E8, 100 ether);
+ depositTaikoToken(Bob, 1E6 * 1E8, 100 ether);
+ depositTaikoToken(Carol, 1E6 * 1E8, 100 ether);
TaikoData.BlockMetadata[] memory meta = new TaikoData.BlockMetadata[](
20
@@ -465,9 +465,9 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase {
external
{
mine(1);
- _depositTaikoToken(Alice, 1E6 * 1E8, 100 ether);
- _depositTaikoToken(Bob, 1E6 * 1E8, 100 ether);
- _depositTaikoToken(Carol, 1E6 * 1E8, 100 ether);
+ depositTaikoToken(Alice, 1E6 * 1E8, 100 ether);
+ depositTaikoToken(Bob, 1E6 * 1E8, 100 ether);
+ depositTaikoToken(Carol, 1E6 * 1E8, 100 ether);
bytes32 parentHash = GENESIS_BLOCK_HASH;
@@ -526,9 +526,9 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase {
external
{
mine(1);
- _depositTaikoToken(Alice, 1E6 * 1E8, 100 ether);
- _depositTaikoToken(Bob, 1E6 * 1E8, 100 ether);
- _depositTaikoToken(Carol, 1E6 * 1E8, 100 ether);
+ depositTaikoToken(Alice, 1E6 * 1E8, 100 ether);
+ depositTaikoToken(Bob, 1E6 * 1E8, 100 ether);
+ depositTaikoToken(Carol, 1E6 * 1E8, 100 ether);
TaikoData.BlockMetadata[] memory meta = new TaikoData.BlockMetadata[](
30
@@ -595,9 +595,9 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase {
external
{
mine(1);
- _depositTaikoToken(Alice, 1E6 * 1E8, 100 ether);
- _depositTaikoToken(Bob, 1E6 * 1E8, 100 ether);
- _depositTaikoToken(Carol, 1E6 * 1E8, 100 ether);
+ depositTaikoToken(Alice, 1E6 * 1E8, 100 ether);
+ depositTaikoToken(Bob, 1E6 * 1E8, 100 ether);
+ depositTaikoToken(Carol, 1E6 * 1E8, 100 ether);
bytes32 parentHash = GENESIS_BLOCK_HASH;
@@ -695,9 +695,9 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase {
{
mine(1);
// Requires a bit more tokens
- _depositTaikoToken(Alice, 1E8 * 1E8, 100 ether);
- _depositTaikoToken(Bob, 1E8 * 1E8, 100 ether);
- _depositTaikoToken(Carol, 1E8 * 1E8, 100 ether);
+ depositTaikoToken(Alice, 1E8 * 1E8, 100 ether);
+ depositTaikoToken(Bob, 1E8 * 1E8, 100 ether);
+ depositTaikoToken(Carol, 1E8 * 1E8, 100 ether);
TaikoData.BlockMetadata[]
memory metaArr = new TaikoData.BlockMetadata[](20);
@@ -803,9 +803,9 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase {
external
{
mine(1);
- _depositTaikoToken(Alice, 1E6 * 1E8, 100 ether);
- _depositTaikoToken(Bob, 1E6 * 1E8, 100 ether);
- _depositTaikoToken(Carol, 1E6 * 1E8, 100 ether);
+ depositTaikoToken(Alice, 1E6 * 1E8, 100 ether);
+ depositTaikoToken(Bob, 1E6 * 1E8, 100 ether);
+ depositTaikoToken(Carol, 1E6 * 1E8, 100 ether);
bytes32 parentHash = GENESIS_BLOCK_HASH;
diff --git a/packages/protocol/test2/TaikoL1OracleProver.t.sol b/packages/protocol/test2/TaikoL1OracleProver.t.sol
index e7574116635..3b0634f060e 100644
--- a/packages/protocol/test2/TaikoL1OracleProver.t.sol
+++ b/packages/protocol/test2/TaikoL1OracleProver.t.sol
@@ -44,21 +44,17 @@ contract TaikoL1Test is TaikoL1TestBase {
function setUp() public override {
TaikoL1TestBase.setUp();
- // TODO(daniel): update string key generation using bytes.concat
- _registerAddress(
- string(abi.encodePacked("verifier_", uint16(100))),
- address(new Verifier())
- );
+ registerAddress(L1.getVerifierName(100), address(new Verifier()));
- _registerAddress("oracle_prover", Alice);
+ registerAddress("oracle_prover", Alice);
}
// Test a block can be oracle-proven multiple times by the
// oracle prover
function testOracleProver() external {
- _depositTaikoToken(Alice, 1000 * 1E8, 1000 ether);
- _depositTaikoToken(Bob, 1000 * 1E8, 1000 ether);
- _depositTaikoToken(Carol, 1000 * 1E8, 1000 ether);
+ depositTaikoToken(Alice, 1000 * 1E8, 1000 ether);
+ depositTaikoToken(Bob, 1000 * 1E8, 1000 ether);
+ depositTaikoToken(Carol, 1000 * 1E8, 1000 ether);
bytes32 parentHash = GENESIS_BLOCK_HASH;
diff --git a/packages/protocol/test2/TaikoL1TestBase.t.sol b/packages/protocol/test2/TaikoL1TestBase.t.sol
index b2f887a7ba3..21be8dd66c2 100644
--- a/packages/protocol/test2/TaikoL1TestBase.t.sol
+++ b/packages/protocol/test2/TaikoL1TestBase.t.sol
@@ -77,21 +77,17 @@ abstract contract TaikoL1TestBase is Test {
ss.init(address(addressManager));
// set proto_broker to this address to mint some TKO
- _registerAddress("proto_broker", address(this));
+ registerAddress("proto_broker", address(this));
tko.mint(address(this), 1E9 * 1E8);
// register all addresses
- _registerAddress("taiko_token", address(tko));
- _registerAddress("proto_broker", address(L1));
- _registerAddress("signal_service", address(ss));
- _registerL2Address("treasure", L2Treasure);
- _registerL2Address("signal_service", address(L2SS));
- _registerL2Address("taiko_l2", address(L2TaikoL2));
- // TODO(daniel): update string key generation using bytes.concat
- _registerAddress(
- string(abi.encodePacked("verifier_", uint16(100))),
- address(new Verifier())
- );
+ registerAddress("taiko_token", address(tko));
+ registerAddress("proto_broker", address(L1));
+ registerAddress("signal_service", address(ss));
+ registerL2Address("treasure", L2Treasure);
+ registerL2Address("signal_service", address(L2SS));
+ registerL2Address("taiko_l2", address(L2TaikoL2));
+ registerAddress(L1.getVerifierName(100), address(new Verifier()));
printVariables("init ");
}
@@ -195,19 +191,19 @@ abstract contract TaikoL1TestBase is Test {
L1.verifyBlocks(count);
}
- function _registerAddress(string memory name, address addr) internal {
+ function registerAddress(string memory name, address addr) internal {
string memory key = L1.keyForName(block.chainid, name);
addressManager.setAddress(key, addr);
console2.log(key, unicode"→", addr);
}
- function _registerL2Address(string memory name, address addr) internal {
+ function registerL2Address(string memory name, address addr) internal {
string memory key = L1.keyForName(conf.chainId, name);
addressManager.setAddress(key, addr);
console2.log(key, unicode"→", addr);
}
- function _depositTaikoToken(
+ function depositTaikoToken(
address who,
uint256 amountTko,
uint256 amountEth
diff --git a/packages/tokenomics/.gitignore b/packages/tokenomics/.gitignore
deleted file mode 100644
index 932765aeba6..00000000000
--- a/packages/tokenomics/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-__pycache__/
-venv
diff --git a/packages/tokenomics/CHANGELOG.md b/packages/tokenomics/CHANGELOG.md
deleted file mode 100644
index 61b27a90fae..00000000000
--- a/packages/tokenomics/CHANGELOG.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Changelog
-
-## [0.1.0](https://github.com/taikoxyz/taiko-mono/compare/tokenomics-v0.0.1...tokenomics-v0.1.0) (2023-01-19)
-
-
-### Features
-
-* implement release-please workflow ([#12967](https://github.com/taikoxyz/taiko-mono/issues/12967)) ([b0c8b60](https://github.com/taikoxyz/taiko-mono/commit/b0c8b60da0af3160db758f83c1f6368a3a712593))
-* **protocol:** implement & simulate tokenomics ([#376](https://github.com/taikoxyz/taiko-mono/issues/376)) ([191eb11](https://github.com/taikoxyz/taiko-mono/commit/191eb110990d60b49883eb3f3d7841c33421d067))
diff --git a/packages/tokenomics/README.md b/packages/tokenomics/README.md
deleted file mode 100644
index fc129660dc5..00000000000
--- a/packages/tokenomics/README.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# README
-
-## Installation
-
-You need to install python, **salabim**, **streamlit**, and **matplotlib**.
-
-```sh
-python3 -m venv venv
-pip install salabim streamlit matplotlib
-```
-
-## Usage
-
-Then in this directory, simply run `streamlit run main.py`,
-then visit [http://localhost:8501](http://localhost:8501/) to see simulation results.
diff --git a/packages/tokenomics/main.py b/packages/tokenomics/main.py
deleted file mode 100644
index 4715352c779..00000000000
--- a/packages/tokenomics/main.py
+++ /dev/null
@@ -1,395 +0,0 @@
-import salabim as sim
-import matplotlib.pyplot as plt
-import streamlit as st
-from enum import Enum
-from typing import NamedTuple
-from plots import plot
-from present import Config, Present
-from presents.p0 import present as p0
-from presents.cbvp1 import present as cbvp1
-from presents.cbvp2 import present as cbvp2
-from presents.vbcp1 import present as vbcp1
-from presents.vbcp2 import present as vbcp2
-from presents.vbvps1 import present as vbvps1
-from presents.vbvps2 import present as vbvps2
-
-# from presents.p7 import present as p7
-# from presents.p8 import present as p8
-# from presents.p9 import present as p9
-# from presents.p10 import present as p10
-# from presents.p11 import present as p11
-
-DAY = 24 * 3600
-K_FEE_GRACE_PERIOD = 125
-K_FEE_MAX_PERIOD = 375
-K_BLOCK_TIME_CAP = 48 # 48 seconds
-K_PROOF_TIME_CAP = 3600 * 1.5 # 1.5 hour
-
-
-class Status(Enum):
- PENDING = 1
- PROVEN = 2
- VERIFIED = 3
-
-
-class Block(NamedTuple):
- status: Status
- fee: int
- proposed_at: int
- proven_at: int
-
-
-def get_day(config):
- day = int(env.now() / DAY)
- if day >= len(config.timing):
- day = len(config.timing) - 1
- return day
-
-
-def get_block_time_avg_second(config):
- return config.timing[get_day(config)].block_time_avg_second
-
-
-def get_proof_time_avg_second(config):
- return config.timing[get_day(config)].proof_time_avg_minute * 60
-
-
-def moving_average(ma, v, maf):
- if ma == 0:
- return v
- else:
- _ma = (ma * (maf - 1) + v) * 1.0 / maf
- if _ma > 0:
- return _ma
- else:
- return ma
-
-
-class Protocol(sim.Component):
- def setup(self, config):
- self.config = config
- self.fee_base = config.fee_base
- self.last_proposed_at = env.now()
- self.last_VERIFIED_id = 0
- self.tko_supply = 0
- self.avg_block_time = 0
- self.avg_proof_time = 0
-
- genesis = Block(
- status=Status.VERIFIED,
- fee=0,
- proposed_at=env.now(),
- proven_at=env.now(),
- )
- self.blocks = [genesis]
-
- # monitors
- self.m_pending_count = sim.Monitor("m_pending_count", level=True)
- self.m_fee_base = sim.Monitor(
- "m_fee_base", level=True, initial_tally=self.fee_base
- )
- self.m_block_fee = sim.Monitor("m_block_fee", level=True)
- self.m_proof_reward = sim.Monitor("m_proof_reward", level=True)
- self.m_tko_supply = sim.Monitor("m_tko_supply", level=True)
- self.m_block_time = sim.Monitor("m_block_time", level=True)
- self.m_proof_time = sim.Monitor("m_proof_time", level=True)
-
- def get_time_adjusted_fee(self, is_proposal, t_now, t_last, t_avg, t_cap):
- # if (tAvg == 0) {
- # return s.basefee;
- # }
- # uint256 _tAvg = tAvg > tCap ? tCap : tAvg;
- # uint256 tGrace = (LibConstants.K_FEE_GRACE_PERIOD * _tAvg) / 100;
- # uint256 tMax = (LibConstants.K_FEE_MAX_PERIOD * _tAvg) / 100;
- # uint256 a = tLast + tGrace;
- # uint256 b = tNow > a ? tNow - a : 0;
- # uint256 tRel = (b.min(tMax) * 10000) / tMax; // [0 - 10000]
- # uint256 alpha = 10000 +
- # ((LibConstants.K_REWARD_MULTIPLIER - 100) * tRel) /
- # 100;
- # if (isProposal) {
- # return (s.basefee * 10000) / alpha; // fee
- # } else {
- # return (s.basefee * alpha) / 10000; // reward
- # }
-
- if t_avg == 0:
- return self.fee_base
-
- if t_avg > t_cap:
- _avg = t_cap
- else:
- _avg = t_avg
-
- t_grace = K_FEE_GRACE_PERIOD * _avg / 100.0
- t_max = K_FEE_MAX_PERIOD * _avg / 100.0
- a = t_last + t_grace
-
- if t_now > a:
- b = t_now - a
- else:
- b = 0
-
- if b > t_max:
- b = t_max
-
- t_rel = 10000 * b / t_max
-
- alpha = 10000 + (self.config.reward_multiplier - 1) * t_rel
-
- if is_proposal:
- return self.fee_base * 10000 / alpha
- else:
- return self.fee_base * alpha / 10000
-
- def get_slots_adjusted_fee(self, is_proposal, fee):
- # uint256 m = LibConstants.K_MAX_NUM_BLOCKS -
- # 1 +
- # LibConstants.K_FEE_PREMIUM_LAMDA;
- # uint256 n = s.nextBlockId - s.latestVERIFIEDId - 1;
- # uint256 k = isProposal ? m - n - 1 : m - n + 1;
- # return (fee * (m - 1) * m) / (m - n) / k;
-
- m = self.config.max_blocks - 1 + self.config.lamda
- n = self.num_pending()
- if is_proposal: # fee
- k = m - n - 1
- else: # reward
- k = m - n + 1
- return fee * (m - 1) * m / (m - n) / k
-
- def get_block_fee(self):
- fee = self.get_time_adjusted_fee(
- True,
- env.now(),
- self.last_proposed_at,
- self.avg_block_time,
- K_BLOCK_TIME_CAP,
- )
-
- premium_fee = self.get_slots_adjusted_fee(True, fee)
- # bootstrap discount not simulated
- return (fee, premium_fee)
-
- def get_proof_reward(self, proven_at, proposed_at):
- reward = self.get_time_adjusted_fee(
- False, proven_at, proposed_at, self.avg_proof_time, K_PROOF_TIME_CAP
- )
- premium_reward = self.get_slots_adjusted_fee(False, reward)
- return (reward, premium_reward)
-
- def print_me(self, st):
- st.markdown("-----")
- st.markdown("##### Protocol state")
- st.write("last_VERIFIED_id = {}".format(self.last_VERIFIED_id))
- st.write("num_blocks = {}".format(self.num_pending()))
- st.write("fee_base = {}".format(self.fee_base))
- st.write("tko_supply = {}".format(self.tko_supply))
-
- def num_pending(self):
- return len(self.blocks) - self.last_VERIFIED_id - 1
-
- def can_propose(self):
- return self.num_pending() < self.config.max_blocks
-
- def propose_block(self):
- if env.now() == 0 or not self.can_propose():
- return
-
- block_time = env.now() - self.last_proposed_at
-
- (fee, premium_fee) = self.get_block_fee()
-
- self.fee_base = moving_average(self.fee_base, fee, self.config.fee_maf)
- self.avg_block_time = moving_average(
- self.avg_block_time,
- block_time,
- self.config.time_avg_maf,
- )
- self.last_proposed_at = env.now()
- self.tko_supply -= premium_fee
-
- block = Block(
- status=Status.PENDING,
- fee=premium_fee,
- proposed_at=env.now(),
- proven_at=0,
- )
- self.blocks.append(block)
-
- Prover(protocol=self, config=self.config, blockId=len(self.blocks) - 1)
- self.verify_block()
-
- self.m_fee_base.tally(self.fee_base)
- self.m_block_fee.tally(premium_fee)
- self.m_tko_supply.tally(self.tko_supply)
- self.m_block_time.tally(block_time)
- self.m_pending_count.tally(self.num_pending())
-
- def can_prove(self, id):
- return (
- id > self.last_VERIFIED_id
- and len(self.blocks) > id
- and self.blocks[id].status == Status.PENDING
- )
-
- def prove_block(self, id):
- if self.can_prove(id):
- self.blocks[id] = self.blocks[id]._replace(
- status=Status.PROVEN, proven_at=env.now()
- )
- self.verify_block()
-
- def can_verify(self):
- return (
- len(self.blocks) > self.last_VERIFIED_id + 1
- and self.blocks[self.last_VERIFIED_id + 1].status == Status.PROVEN
- and env.now()
- > self.blocks[self.last_VERIFIED_id + 1].proven_at + self.avg_proof_time
- )
-
- def verify_block(self):
- for i in range(0, 5):
- if self.can_verify():
-
- k = self.last_VERIFIED_id + 1
-
- self.blocks[k] = self.blocks[k]._replace(status=Status.VERIFIED)
-
- proof_time = self.blocks[k].proven_at - self.blocks[k].proposed_at
-
- (reward, premium_reward) = self.get_proof_reward(
- self.blocks[k].proven_at, self.blocks[k].proposed_at
- )
-
- self.fee_base = moving_average(
- self.fee_base,
- reward,
- self.config.fee_maf,
- )
-
- self.avg_proof_time = moving_average(
- self.avg_proof_time,
- proof_time,
- self.config.time_avg_maf,
- )
-
- self.tko_supply += premium_reward
- self.m_fee_base.tally(self.fee_base)
- self.m_proof_reward.tally(premium_reward)
- self.m_tko_supply.tally(self.tko_supply)
- self.m_proof_time.tally(proof_time)
-
- self.last_VERIFIED_id = k
- else:
- break
-
- self.m_pending_count.tally(self.num_pending())
-
-
-class Prover(sim.Component):
- def setup(self, protocol, config, blockId):
- self.protocol = protocol
- self.config = config
- self.blockId = blockId
-
- def process(self):
- _proof_time_avg_second = get_proof_time_avg_second(self.config)
- yield self.hold(
- sim.Bounded(
- sim.Normal(
- _proof_time_avg_second,
- _proof_time_avg_second * self.config.proof_time_sd_pctg / 100,
- ),
- lowerbound=1,
- ).sample()
- )
- self.protocol.prove_block(self.blockId)
-
-
-class Proposer(sim.Component):
- def setup(self, protocol):
- self.protocol = protocol
- self.config = protocol.config
-
- def process(self):
- while True:
- if not self.protocol.can_propose():
- yield self.hold(1)
- else:
- self.protocol.propose_block()
- _block_time_avg_second = get_block_time_avg_second(self.config)
- yield self.hold(
- sim.Bounded(
- sim.Normal(
- _block_time_avg_second,
- _block_time_avg_second
- * self.config.block_time_sd_pctg
- / 100,
- ),
- lowerbound=1,
- ).sample()
- )
-
-
-def simulate(config, days):
- st.markdown("-----")
- st.markdown("##### Block & proof time and deviation settings")
- st.caption("[block_time (seconds), proof_time (minutes)]")
- time_str = ""
- for t in config.timing:
- time_str += str(t._asdict().values())
- st.write(time_str.replace("dict_values", " ☀️").replace("(", "").replace(")", ""))
-
- st.markdown("-----")
- st.markdown("##### You can change these settings")
- cols = st.columns([1, 1, 1, 1])
- inputs = {}
- i = 0
- for (k, v) in config._asdict().items():
- if k != "timing":
- inputs[k] = cols[i % 4].number_input(k, value=v)
- i += 1
-
- st.markdown("-----")
- if st.button("Simulate {} days".format(days), key="run"):
- actual_config = Config(timing=config.timing, **inputs)
-
- protocol = Protocol(config=actual_config)
- proposer = Proposer(protocol=protocol)
-
- env.run(till=days * DAY)
-
- st.markdown("-----")
- st.markdown("##### Block/Proof Time")
- plot(days, [(protocol.m_block_time, "block time")], color="tab:blue")
- plot(days, [(protocol.m_proof_time, "proof time")], color="tab:blue")
-
- st.markdown("-----")
- st.markdown("##### Result")
- plot(days, [(protocol.m_pending_count, "num pending blocks")])
- plot(days, [(protocol.m_fee_base, "fee_base")])
- plot(days, [(protocol.m_block_fee, "block fee")], color="tab:green")
- plot(days, [(protocol.m_proof_reward, "proof reward")])
-
- plot(days, [(protocol.m_tko_supply, "tko supply")], color="tab:red")
-
- protocol.print_me(st)
-
-
-if __name__ == "__main__":
- env = sim.Environment(trace=False)
- st.title("Taiko Block Fee/Reward Simulation")
-
- presents = [p0, cbvp1, cbvp2, vbcp1, vbcp2, vbvps1, vbvps2]
- st.markdown("## Configs")
- selected = st.radio(
- "Please choose one of the following predefined configs:",
- range(0, len(presents)),
- format_func=lambda x: presents[x].title,
- )
- present = presents[selected]
- st.markdown("-----")
- st.markdown("##### Description")
- st.markdown(present.desc)
- simulate(present.config, present.days)
diff --git a/packages/tokenomics/package.json b/packages/tokenomics/package.json
deleted file mode 100644
index c7190abde75..00000000000
--- a/packages/tokenomics/package.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "name": "@taiko/tokenomics",
- "version": "0.1.0",
- "private": true
-}
diff --git a/packages/tokenomics/plots.py b/packages/tokenomics/plots.py
deleted file mode 100644
index 926848d139b..00000000000
--- a/packages/tokenomics/plots.py
+++ /dev/null
@@ -1,22 +0,0 @@
-import matplotlib.pyplot as plt
-import matplotlib.ticker as ticker
-import streamlit as st
-import numpy as np
-
-
-@ticker.FuncFormatter
-def major_formatter(x, pos):
- return "d%d" % (x / 24 / 3600)
-
-
-def plot(days, sources, color="#E28BFD"):
- fig, ax = plt.subplots(figsize=(15, 5), nrows=1, ncols=1)
- for s in sources:
- data = s[0].xt()
- ax.plot(data[1], data[0], color, label=s[1])
- ax.legend(loc="lower center", fontsize=18.0)
- ax.xaxis.set_ticks(np.arange(0, 24 * 3600 * (days + 1), 24 * 3600))
- ax.xaxis.set_tick_params(labelrotation=45)
- ax.xaxis.set_major_formatter(major_formatter)
-
- st.write(fig)
diff --git a/packages/tokenomics/present.py b/packages/tokenomics/present.py
deleted file mode 100644
index 02b2e819762..00000000000
--- a/packages/tokenomics/present.py
+++ /dev/null
@@ -1,25 +0,0 @@
-from typing import NamedTuple
-
-
-class Timing(NamedTuple):
- block_time_avg_second: int
- proof_time_avg_minute: int
-
-
-class Config(NamedTuple):
- max_blocks: int
- lamda: float
- fee_base: int
- fee_maf: int
- reward_multiplier: float
- block_time_sd_pctg: int
- proof_time_sd_pctg: int
- time_avg_maf: int
- timing: list[Timing]
-
-
-class Present(NamedTuple):
- title: str
- desc: str
- days: int
- config: Config
diff --git a/packages/tokenomics/presents/cbvp1.py b/packages/tokenomics/presents/cbvp1.py
deleted file mode 100644
index f94cb1b9027..00000000000
--- a/packages/tokenomics/presents/cbvp1.py
+++ /dev/null
@@ -1,66 +0,0 @@
-from present import Config, Timing, Present
-
-present = Present(
- title="cbvp1: constant block time, proof time goes down, up, then restores",
- desc="""
-
-**About this config**
-
-- the block time average set to a constant.
-- the proof time average varies but eventually changes back to the initial value.
-
-**What to verify**
-- fee_base will become smaller if proof time becomes larger.
-- fee_base remains the same if proof time becomes smaller.
-
-""",
- days=21,
- config=Config(
- max_blocks=2048,
- lamda=590,
- fee_base=100.0,
- fee_maf=1024,
- reward_multiplier=4.0,
- time_avg_maf=1024,
- block_time_sd_pctg=0,
- proof_time_sd_pctg=0,
- timing=[
- Timing(
- block_time_avg_second=15,
- proof_time_avg_minute=45,
- ),
- Timing(
- block_time_avg_second=15,
- proof_time_avg_minute=45/1.3,
- ),
- Timing(
- block_time_avg_second=15,
- proof_time_avg_minute=45/1.3/1.3,
- ),
- Timing(
- block_time_avg_second=15,
- proof_time_avg_minute=45/1.3,
- ),
- Timing(
- block_time_avg_second=15,
- proof_time_avg_minute=45,
- ),
- Timing(
- block_time_avg_second=15,
- proof_time_avg_minute=45*1.3,
- ),
- Timing(
- block_time_avg_second=15,
- proof_time_avg_minute=45*1.3*1.3,
- ),
- Timing(
- block_time_avg_second=15,
- proof_time_avg_minute=45*1.3,
- ),
- Timing(
- block_time_avg_second=15,
- proof_time_avg_minute=45,
- ),
- ],
- ),
-)
diff --git a/packages/tokenomics/presents/cbvp2.py b/packages/tokenomics/presents/cbvp2.py
deleted file mode 100644
index efa29142887..00000000000
--- a/packages/tokenomics/presents/cbvp2.py
+++ /dev/null
@@ -1,66 +0,0 @@
-from present import Config, Timing, Present
-
-present = Present(
- title="cbvp2: constant block time, proof time goes up, down, then restores",
- desc="""
-
-**About this config**
-
-- the block time average set to a constant.
-- the proof time average varies but eventually changes back to the initial value.
-
-**What to verify**
-- fee_base will become smaller if proof time becomes larger.
-- fee_base remains the same if proof time becomes smaller.
-
-""",
- days=21,
- config=Config(
- max_blocks=2048,
- lamda=590,
- fee_base=100.0,
- fee_maf=1024,
- reward_multiplier=4.0,
- time_avg_maf=1024,
- block_time_sd_pctg=0,
- proof_time_sd_pctg=0,
- timing=[
- Timing(
- block_time_avg_second=15,
- proof_time_avg_minute=45,
- ),
- Timing(
- block_time_avg_second=15,
- proof_time_avg_minute=45*1.3,
- ),
- Timing(
- block_time_avg_second=15,
- proof_time_avg_minute=45*1.3*1.3,
- ),
- Timing(
- block_time_avg_second=15,
- proof_time_avg_minute=45*1.3,
- ),
- Timing(
- block_time_avg_second=15,
- proof_time_avg_minute=45,
- ),
- Timing(
- block_time_avg_second=15,
- proof_time_avg_minute=45/1.3,
- ),
- Timing(
- block_time_avg_second=15,
- proof_time_avg_minute=45/1.3/1.3,
- ),
- Timing(
- block_time_avg_second=15,
- proof_time_avg_minute=45/1.3,
- ),
- Timing(
- block_time_avg_second=15,
- proof_time_avg_minute=45,
- ),
- ],
- ),
-)
diff --git a/packages/tokenomics/presents/p0.py b/packages/tokenomics/presents/p0.py
deleted file mode 100644
index 52da6756a95..00000000000
--- a/packages/tokenomics/presents/p0.py
+++ /dev/null
@@ -1,34 +0,0 @@
-from present import Config, Timing, Present
-
-present = Present(
- title="p0: block time and proof time both constant",
- desc="""
-
-**What to simulate?**
-
-The most basic model where the block time average and proof time average are both constant.
-
-**About this config**
-
-- TKO supply changes initially but stablizes.
-- fee_base remains constant
-
-""",
- days=7,
- config=Config(
- max_blocks=2048,
- lamda=590,
- fee_base=100.0,
- fee_maf=1024,
- reward_multiplier=4.0,
- time_avg_maf=1024,
- block_time_sd_pctg=0,
- proof_time_sd_pctg=0,
- timing=[
- Timing(
- block_time_avg_second=15,
- proof_time_avg_minute=45,
- ),
- ],
- ),
-)
diff --git a/packages/tokenomics/presents/vbcp1.py b/packages/tokenomics/presents/vbcp1.py
deleted file mode 100644
index 476c4d05397..00000000000
--- a/packages/tokenomics/presents/vbcp1.py
+++ /dev/null
@@ -1,66 +0,0 @@
-from present import Config, Timing, Present
-
-present = Present(
- title="vbcp1: constant proof time, block time goes down, up, then restores",
- desc="""
-
-**About this config**
-
-- the proof time average set to a constant.
-- the block time average varies but eventually changes back to the initial value.
-
-**What to verify**
-- fee_base will become smaller if block time becomes larger.
-- fee_base remains the same if block time becomes smaller.
-
-""",
- days=21,
- config=Config(
- max_blocks=2048,
- lamda=590,
- fee_base=100.0,
- fee_maf=1024,
- reward_multiplier=4.0,
- time_avg_maf=1024,
- block_time_sd_pctg=0,
- proof_time_sd_pctg=0,
- timing=[
- Timing(
- block_time_avg_second=15,
- proof_time_avg_minute=45,
- ),
- Timing(
- block_time_avg_second=15/1.3,
- proof_time_avg_minute=45,
- ),
- Timing(
- block_time_avg_second=15/1.3/1.3,
- proof_time_avg_minute=45,
- ),
- Timing(
- block_time_avg_second=15/1.3,
- proof_time_avg_minute=45,
- ),
- Timing(
- block_time_avg_second=15,
- proof_time_avg_minute=45,
- ),
- Timing(
- block_time_avg_second=15*1.3,
- proof_time_avg_minute=45,
- ),
- Timing(
- block_time_avg_second=15*1.3*1.3,
- proof_time_avg_minute=45,
- ),
- Timing(
- block_time_avg_second=15*1.3,
- proof_time_avg_minute=45,
- ),
- Timing(
- block_time_avg_second=15,
- proof_time_avg_minute=45,
- ),
- ],
- ),
-)
diff --git a/packages/tokenomics/presents/vbcp2.py b/packages/tokenomics/presents/vbcp2.py
deleted file mode 100644
index c581fdb0c25..00000000000
--- a/packages/tokenomics/presents/vbcp2.py
+++ /dev/null
@@ -1,66 +0,0 @@
-from present import Config, Timing, Present
-
-present = Present(
- title="vbcp2: constant proof time, block time goes up, down, then restores",
- desc="""
-
-**About this config**
-
-- the proof time average set to a constant.
-- the block time average varies but eventually changes back to the initial value.
-
-**What to verify**
-- fee_base will become smaller if block time becomes larger.
-- fee_base remains the same if block time becomes smaller.
-
-""",
- days=21,
- config=Config(
- max_blocks=2048,
- lamda=590,
- fee_base=100.0,
- fee_maf=1024,
- reward_multiplier=4.0,
- time_avg_maf=1024,
- block_time_sd_pctg=0,
- proof_time_sd_pctg=0,
- timing=[
- Timing(
- block_time_avg_second=15,
- proof_time_avg_minute=45,
- ),
- Timing(
- block_time_avg_second=15*1.3,
- proof_time_avg_minute=45,
- ),
- Timing(
- block_time_avg_second=15*1.3*1.3,
- proof_time_avg_minute=45,
- ),
- Timing(
- block_time_avg_second=15*1.3,
- proof_time_avg_minute=45,
- ),
- Timing(
- block_time_avg_second=15,
- proof_time_avg_minute=45,
- ),
- Timing(
- block_time_avg_second=15/1.3,
- proof_time_avg_minute=45,
- ),
- Timing(
- block_time_avg_second=15/1.3/1.3,
- proof_time_avg_minute=45,
- ),
- Timing(
- block_time_avg_second=15/1.3,
- proof_time_avg_minute=45,
- ),
- Timing(
- block_time_avg_second=15,
- proof_time_avg_minute=45,
- ),
- ],
- ),
-)
diff --git a/packages/tokenomics/presents/vbvps1.py b/packages/tokenomics/presents/vbvps1.py
deleted file mode 100644
index 1808d62b917..00000000000
--- a/packages/tokenomics/presents/vbvps1.py
+++ /dev/null
@@ -1,57 +0,0 @@
-from present import Config, Timing, Present
-
-present = Present(
- title="vbvps1: block time & proof time both go down, up to the SAME direction, then restores",
- desc="""
-
-""",
- days=21,
- config=Config(
- max_blocks=2048,
- lamda=590,
- fee_base=100.0,
- fee_maf=1024,
- reward_multiplier=4.0,
- time_avg_maf=1024,
- block_time_sd_pctg=0,
- proof_time_sd_pctg=0,
- timing=[
- Timing(
- block_time_avg_second=15,
- proof_time_avg_minute=45,
- ),
- Timing(
- block_time_avg_second=15/1.3,
- proof_time_avg_minute=45/1.3,
- ),
- Timing(
- block_time_avg_second=15/1.3/1.3,
- proof_time_avg_minute=45/1.3/1.3,
- ),
- Timing(
- block_time_avg_second=15/1.3,
- proof_time_avg_minute=45/1.3,
- ),
- Timing(
- block_time_avg_second=15,
- proof_time_avg_minute=45,
- ),
- Timing(
- block_time_avg_second=15*1.3,
- proof_time_avg_minute=45*1.3,
- ),
- Timing(
- block_time_avg_second=15*1.3*1.3,
- proof_time_avg_minute=45*1.3*1.3,
- ),
- Timing(
- block_time_avg_second=15*1.3,
- proof_time_avg_minute=45*1.3,
- ),
- Timing(
- block_time_avg_second=15,
- proof_time_avg_minute=45,
- ),
- ],
- ),
-)
diff --git a/packages/tokenomics/presents/vbvps2.py b/packages/tokenomics/presents/vbvps2.py
deleted file mode 100644
index f93e04f0df8..00000000000
--- a/packages/tokenomics/presents/vbvps2.py
+++ /dev/null
@@ -1,56 +0,0 @@
-from present import Config, Timing, Present
-
-present = Present(
- title="vbvps2: block time & proof time both go up, down to the SAME direction, then restores",
- desc="""
-""",
- days=21,
- config=Config(
- max_blocks=2048,
- lamda=590,
- fee_base=100.0,
- fee_maf=1024,
- reward_multiplier=4.0,
- time_avg_maf=1024,
- block_time_sd_pctg=0,
- proof_time_sd_pctg=0,
- timing=[
- Timing(
- block_time_avg_second=15,
- proof_time_avg_minute=45,
- ),
- Timing(
- block_time_avg_second=15*1.3,
- proof_time_avg_minute=45*1.3,
- ),
- Timing(
- block_time_avg_second=15*1.3*1.3,
- proof_time_avg_minute=45*1.3*1.3,
- ),
- Timing(
- block_time_avg_second=15*1.3,
- proof_time_avg_minute=45*1.3,
- ),
- Timing(
- block_time_avg_second=15,
- proof_time_avg_minute=45,
- ),
- Timing(
- block_time_avg_second=15/1.3,
- proof_time_avg_minute=45/1.3,
- ),
- Timing(
- block_time_avg_second=15/1.3/1.3,
- proof_time_avg_minute=45/1.3/1.3,
- ),
- Timing(
- block_time_avg_second=15/1.3,
- proof_time_avg_minute=45/1.3,
- ),
- Timing(
- block_time_avg_second=15,
- proof_time_avg_minute=45,
- ),
- ],
- ),
-)
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index eeaf03b7125..9b5850a0fd2 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -639,8 +639,6 @@ importers:
specifier: ^0.12.0
version: 0.12.0(vite@3.2.4)
- packages/tokenomics: {}
-
packages/website:
dependencies:
next: