parent
ccc581210a
commit
6b1acd4dee
@ -0,0 +1,84 @@ |
||||
package services |
||||
|
||||
import ( |
||||
"context" |
||||
|
||||
"github.com/coinbase/rosetta-sdk-go/server" |
||||
"github.com/coinbase/rosetta-sdk-go/types" |
||||
ethCommon "github.com/ethereum/go-ethereum/common" |
||||
"github.com/ethereum/go-ethereum/rpc" |
||||
|
||||
hmyTypes "github.com/harmony-one/harmony/core/types" |
||||
"github.com/harmony-one/harmony/hmy" |
||||
hmyCommon "github.com/harmony-one/harmony/internal/common" |
||||
"github.com/harmony-one/harmony/rosetta/common" |
||||
) |
||||
|
||||
// AccountAPI implements the server.AccountAPIServicer interface.
|
||||
type AccountAPI struct { |
||||
hmy *hmy.Harmony |
||||
} |
||||
|
||||
// NewAccountAPI creates a new instance of a BlockAPI.
|
||||
func NewAccountAPI(hmy *hmy.Harmony) server.AccountAPIServicer { |
||||
return &AccountAPI{ |
||||
hmy: hmy, |
||||
} |
||||
} |
||||
|
||||
// AccountBalance ...
|
||||
func (s *AccountAPI) AccountBalance( |
||||
ctx context.Context, req *types.AccountBalanceRequest, |
||||
) (*types.AccountBalanceResponse, *types.Error) { |
||||
if err := assertValidNetworkIdentifier(req.NetworkIdentifier, s.hmy.ShardID); err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
var block *hmyTypes.Block |
||||
if req.BlockIdentifier == nil { |
||||
block = s.hmy.CurrentBlock() |
||||
} else { |
||||
var err error |
||||
if req.BlockIdentifier.Hash != nil { |
||||
blockHash := ethCommon.HexToHash(*req.BlockIdentifier.Hash) |
||||
block, err = s.hmy.GetBlock(ctx, blockHash) |
||||
if err != nil { |
||||
return nil, common.NewError(common.BlockNotFoundError, map[string]interface{}{ |
||||
"message": "block hash not found", |
||||
}) |
||||
} |
||||
} else { |
||||
blockNum := rpc.BlockNumber(*req.BlockIdentifier.Index) |
||||
block, err = s.hmy.BlockByNumber(ctx, blockNum) |
||||
if err != nil { |
||||
return nil, common.NewError(common.BlockNotFoundError, map[string]interface{}{ |
||||
"message": "block index not found", |
||||
}) |
||||
} |
||||
} |
||||
} |
||||
|
||||
addr := hmyCommon.ParseAddr(req.AccountIdentifier.Address) |
||||
blockNum := rpc.BlockNumber(block.Header().Header.Number().Int64()) |
||||
balance, err := s.hmy.GetBalance(ctx, addr, blockNum) |
||||
if err != nil { |
||||
return nil, common.NewError(common.CatchAllError, map[string]interface{}{ |
||||
"message": "invalid address", |
||||
}) |
||||
} |
||||
|
||||
amount := types.Amount{ |
||||
Value: balance.String(), |
||||
Currency: &common.Currency, |
||||
} |
||||
|
||||
respBlock := types.BlockIdentifier{ |
||||
Index: blockNum.Int64(), |
||||
Hash: block.Header().Hash().String(), |
||||
} |
||||
|
||||
return &types.AccountBalanceResponse{ |
||||
BlockIdentifier: &respBlock, |
||||
Balances: []*types.Amount{&amount}, |
||||
}, nil |
||||
} |
Loading…
Reference in new issue