func CalCoinbaseReward(block *types.Block) (*CoinbaseReward, error) {
var coinbaseReceiver []byte
if len(block.Transactions) > 0 && len(block.Transactions[0].InputIDs) > 0 && len(block.Transactions[0].Outputs) > 0 {
- coinbaseTx := block.Transactions[0]
- if _, ok := coinbaseTx.Entries[coinbaseTx.InputIDs[0]].(*bc.Coinbase); ok {
- coinbaseReceiver = coinbaseTx.Outputs[0].ControlProgram()
+ if block.Transactions[0].Inputs[0].InputType() == types.CoinbaseInputType {
+ coinbaseReceiver = block.Transactions[0].Outputs[0].ControlProgram()
}
}
rewards = append([]state.CoinbaseReward{state.CoinbaseReward{Amount: uint64(0)}}, rewards...)
for i, output := range tx.TxHeader.ResultIds {
- e, ok := tx.Entries[*output].(*bc.IntraChainOutput)
- if !ok {
- return errors.Wrapf(bc.ErrEntryType, "entry %x has unexpected type %T", output.Bytes(), output)
+ out, err := tx.IntraChainOutput(*output)
+ if err != nil {
+ return err
}
- coinbaseAmount := e.Source.Value.Amount
- if rewards[i].Amount != coinbaseAmount {
- return errors.Wrapf(ErrWrongCoinbaseTransaction, "dismatch output amount, got:%d, want:%d", coinbaseAmount, rewards[i].Amount)
+ if rewards[i].Amount != out.Source.Value.Amount {
+ return errors.Wrapf(ErrWrongCoinbaseTransaction, "dismatch output amount, got:%d, want:%d", out.Source.Value.Amount, rewards[i].Amount)
}
}
return nil