The core protocol of WoopChain
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
woop/rosetta/services/mempool.go

95 lines
2.7 KiB

package services
import (
"context"
"math/big"
"github.com/coinbase/rosetta-sdk-go/server"
"github.com/coinbase/rosetta-sdk-go/types"
ethCommon "github.com/ethereum/go-ethereum/common"
hmyTypes "github.com/harmony-one/harmony/core/types"
"github.com/harmony-one/harmony/hmy"
"github.com/harmony-one/harmony/rosetta/common"
"github.com/harmony-one/harmony/staking"
)
// MempoolAPI implements the server.MempoolAPIServicer interface
type MempoolAPI struct {
hmy *hmy.Harmony
}
// NewMempoolAPI creates a new instance of MempoolAPI
func NewMempoolAPI(hmy *hmy.Harmony) server.MempoolAPIServicer {
return &MempoolAPI{
hmy: hmy,
}
}
// Mempool implements the /mempool endpoint.
func (s *MempoolAPI) Mempool(
ctx context.Context, req *types.NetworkRequest,
) (*types.MempoolResponse, *types.Error) {
if err := assertValidNetworkIdentifier(req.NetworkIdentifier, s.hmy.ShardID); err != nil {
return nil, err
}
pool, err := s.hmy.GetPoolTransactions()
if err != nil {
return nil, common.NewError(common.CatchAllError, map[string]interface{}{
"message": "unable to fetch pool transactions",
})
}
txIDs := make([]*types.TransactionIdentifier, pool.Len())
for i, tx := range pool {
txIDs[i] = &types.TransactionIdentifier{
Hash: tx.Hash().String(),
}
}
return &types.MempoolResponse{
TransactionIdentifiers: txIDs,
}, nil
}
// MempoolTransaction implements the /mempool/transaction endpoint.
func (s *MempoolAPI) MempoolTransaction(
ctx context.Context, req *types.MempoolTransactionRequest,
) (*types.MempoolTransactionResponse, *types.Error) {
if err := assertValidNetworkIdentifier(req.NetworkIdentifier, s.hmy.ShardID); err != nil {
return nil, err
}
hash := ethCommon.HexToHash(req.TransactionIdentifier.Hash)
poolTx := s.hmy.GetPoolTransaction(hash)
if poolTx == nil {
return nil, &common.TransactionNotFoundError
}
var nilAddress ethCommon.Address
senderAddr, _ := poolTx.SenderAddress()
estLog := &hmyTypes.Log{
Address: senderAddr,
Topics: []ethCommon.Hash{staking.CollectRewardsTopic},
Data: big.NewInt(0).Bytes(),
BlockNumber: s.hmy.CurrentBlock().NumberU64(),
}
estReceipt := &hmyTypes.Receipt{
PostState: []byte{},
Status: hmyTypes.ReceiptStatusSuccessful, // Assume transaction will succeed
CumulativeGasUsed: poolTx.Gas(),
Bloom: [256]byte{},
Logs: []*hmyTypes.Log{estLog},
TxHash: poolTx.Hash(),
ContractAddress: nilAddress, // ContractAddress is only for smart contract creation & can not be determined until transaction is finalized
GasUsed: poolTx.Gas(),
}
respTx, err := FormatTransaction(poolTx, estReceipt)
if err != nil {
return nil, err
}
return &types.MempoolTransactionResponse{
Transaction: respTx,
}, nil
}