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: