7 "github.com/vapor/consensus"
8 "github.com/vapor/protocol/bc/types"
9 "github.com/vapor/protocol/state"
10 "github.com/vapor/protocol/vm/vmutil"
11 "github.com/vapor/testutil"
14 func TestCalCoinbaseTxReward(t *testing.T) {
15 consensus.ActiveNetParams.ProducerSubsidys = []consensus.ProducerSubsidy{
16 {BeginBlock: 0, EndBlock: 0, Subsidy: 24},
17 {BeginBlock: 1, EndBlock: 840000, Subsidy: 24},
18 {BeginBlock: 840001, EndBlock: 1680000, Subsidy: 12},
19 {BeginBlock: 1680001, EndBlock: 3360000, Subsidy: 6},
21 reductionInterval := uint64(840000)
26 consensusResult *state.ConsensusResult
27 wantReward state.CoinbaseReward
30 desc: "the block height is reductionInterval - 1",
32 BlockHeader: types.BlockHeader{
33 Height: reductionInterval - 1,
35 Transactions: []*types.Tx{nil},
37 consensusResult: &state.ConsensusResult{
38 CoinbaseReward: map[string]uint64{},
40 wantReward: state.CoinbaseReward{
42 ControlProgram: []byte{0x51},
46 desc: "the block height is reductionInterval",
48 BlockHeader: types.BlockHeader{
49 Height: reductionInterval,
51 Transactions: []*types.Tx{nil},
53 consensusResult: &state.ConsensusResult{
54 CoinbaseReward: map[string]uint64{},
56 wantReward: state.CoinbaseReward{
58 ControlProgram: []byte{0x51},
62 desc: "the block height is reductionInterval + 1",
64 BlockHeader: types.BlockHeader{
65 Height: reductionInterval + 1,
67 Transactions: []*types.Tx{nil},
69 consensusResult: &state.ConsensusResult{
70 CoinbaseReward: map[string]uint64{},
72 wantReward: state.CoinbaseReward{
74 ControlProgram: []byte{0x51},
78 desc: "the block height is reductionInterval * 2",
80 BlockHeader: types.BlockHeader{
81 Height: reductionInterval * 2,
83 Transactions: []*types.Tx{nil},
85 consensusResult: &state.ConsensusResult{
86 CoinbaseReward: map[string]uint64{},
88 wantReward: state.CoinbaseReward{
90 ControlProgram: []byte{0x51},
94 desc: "the block height is 2*reductionInterval + 1",
96 BlockHeader: types.BlockHeader{
97 Height: 2*reductionInterval + 1,
99 Transactions: []*types.Tx{nil},
101 consensusResult: &state.ConsensusResult{
102 CoinbaseReward: map[string]uint64{},
104 wantReward: state.CoinbaseReward{
106 ControlProgram: []byte{0x51},
112 for i, c := range cases {
113 c.block.Transactions[0], err = createCoinbaseTx(nil, c.block.Height)
118 if err := c.consensusResult.AttachCoinbaseReward(c.block); err != nil {
122 defaultProgram, _ := vmutil.DefaultCoinbaseProgram()
123 gotReward := state.CoinbaseReward{
124 Amount: c.consensusResult.CoinbaseReward[hex.EncodeToString(defaultProgram)],
125 ControlProgram: defaultProgram,
128 if !testutil.DeepEqual(gotReward, c.wantReward) {
129 t.Fatalf("test case %d: %s, the coinbase reward got: %v, want: %v", i, c.desc, gotReward, c.wantReward)
134 func TestCountCoinbaseTxRewards(t *testing.T) {
135 consensus.ActiveNetParams.ProducerSubsidys = []consensus.ProducerSubsidy{
136 {BeginBlock: 0, EndBlock: 0, Subsidy: 24},
137 {BeginBlock: 1, EndBlock: 840000, Subsidy: 24},
138 {BeginBlock: 840001, EndBlock: 1680000, Subsidy: 12},
139 {BeginBlock: 1680001, EndBlock: 3360000, Subsidy: 6},
145 consensusResult *state.ConsensusResult
146 wantRewards []state.CoinbaseReward
149 desc: "the block height is RoundVoteBlockNums - 1",
151 BlockHeader: types.BlockHeader{
152 Height: consensus.ActiveNetParams.RoundVoteBlockNums - 1,
154 Transactions: []*types.Tx{nil},
156 consensusResult: &state.ConsensusResult{
157 CoinbaseReward: map[string]uint64{
161 wantRewards: []state.CoinbaseReward{},
164 desc: "the block height is RoundVoteBlockNums",
166 BlockHeader: types.BlockHeader{
167 Height: consensus.ActiveNetParams.RoundVoteBlockNums,
169 Transactions: []*types.Tx{nil},
171 consensusResult: &state.ConsensusResult{
172 CoinbaseReward: map[string]uint64{
177 wantRewards: []state.CoinbaseReward{
178 state.CoinbaseReward{
180 ControlProgram: []byte{0x51},
182 state.CoinbaseReward{
184 ControlProgram: []byte{0x52},
189 desc: "the block height is RoundVoteBlockNums + 1",
191 BlockHeader: types.BlockHeader{
192 Height: consensus.ActiveNetParams.RoundVoteBlockNums + 1,
194 Transactions: []*types.Tx{nil},
196 consensusResult: &state.ConsensusResult{
197 CoinbaseReward: map[string]uint64{
201 wantRewards: []state.CoinbaseReward{},
204 desc: "the block height is RoundVoteBlockNums * 2",
206 BlockHeader: types.BlockHeader{
207 Height: consensus.ActiveNetParams.RoundVoteBlockNums * 2,
209 Transactions: []*types.Tx{nil},
211 consensusResult: &state.ConsensusResult{
212 CoinbaseReward: map[string]uint64{
219 wantRewards: []state.CoinbaseReward{
220 state.CoinbaseReward{
222 ControlProgram: []byte{0x51},
224 state.CoinbaseReward{
226 ControlProgram: []byte{0x53},
228 state.CoinbaseReward{
230 ControlProgram: []byte{0x52},
232 state.CoinbaseReward{
234 ControlProgram: []byte{0x50},
239 desc: "the block height is 2*RoundVoteBlockNums + 1",
241 BlockHeader: types.BlockHeader{
242 Height: 2*consensus.ActiveNetParams.RoundVoteBlockNums + 1,
244 Transactions: []*types.Tx{nil},
246 consensusResult: &state.ConsensusResult{
247 CoinbaseReward: map[string]uint64{},
249 wantRewards: []state.CoinbaseReward{},
254 for i, c := range cases {
255 c.block.Transactions[0], err = createCoinbaseTx(nil, c.block.Height)
260 if err := c.consensusResult.AttachCoinbaseReward(c.block); err != nil {
264 rewards, err := c.consensusResult.GetCoinbaseRewards(c.block.Height)
268 if !testutil.DeepEqual(rewards, c.wantRewards) {
269 t.Fatalf("test case %d: %s, the coinbase reward got: %v, want: %v", i, c.desc, rewards, c.wantRewards)