github.com/Debrief-BC/go-debrief@v0.0.0-20200420203408-0c26ca968123/internal/ethapi/debrief.go (about)

     1  package ethapi
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"math/big"
     7  
     8  	"github.com/Debrief-BC/go-debrief/accounts"
     9  	"github.com/Debrief-BC/go-debrief/common"
    10  	"github.com/Debrief-BC/go-debrief/common/hexutil"
    11  	"github.com/Debrief-BC/go-debrief/debrief"
    12  	"github.com/Debrief-BC/go-debrief/rpc"
    13  )
    14  
    15  // PublicDebriefAPI  doc soon
    16  type PublicDebriefAPI struct {
    17  	b         Backend
    18  	nonceLock *AddrLocker
    19  }
    20  
    21  // NewPublicDebriefAPI creates a new Debrief protocol API.
    22  func NewPublicDebriefAPI(b Backend, nonceLock *AddrLocker) *PublicDebriefAPI {
    23  	return &PublicDebriefAPI{b, nonceLock}
    24  }
    25  
    26  // Register   doc soon
    27  func (s *PublicDebriefAPI) Register(ctx context.Context, address common.Address, nickname string, publicKey hexutil.Bytes, blockNrOrHash rpc.BlockNumberOrHash) (common.Hash, error) {
    28  
    29  	state, _, err := s.b.StateAndHeaderByNumberOrHash(ctx, blockNrOrHash)
    30  	if state == nil || err != nil {
    31  		return common.Hash{}, err
    32  	}
    33  
    34  	u, err := state.GetUser(address)
    35  	if err != nil {
    36  		return common.Hash{}, err
    37  	}
    38  	if u != nil {
    39  		return common.Hash{}, errors.New("Registered")
    40  	}
    41  
    42  	data, err := debrief.SerializeRegisterCall(nickname, publicKey)
    43  	if err != nil {
    44  		return common.Hash{}, err
    45  	}
    46  
    47  	account := accounts.Account{Address: address}
    48  	wallet, err := s.b.AccountManager().Find(account)
    49  	if err != nil {
    50  		return common.Hash{}, err
    51  	}
    52  
    53  	var argsData = hexutil.Bytes(data)
    54  	args := SendTxArgs{
    55  		From:  address,
    56  		To:    &debrief.RegisterCallAddress,
    57  		Value: (*hexutil.Big)(big.NewInt(0)),
    58  		Data:  &argsData,
    59  	}
    60  
    61  	if args.Nonce == nil {
    62  		s.nonceLock.LockAddr(args.From)
    63  		defer s.nonceLock.UnlockAddr(args.From)
    64  	}
    65  
    66  	if err := args.setDefaults(ctx, s.b); err != nil {
    67  		return common.Hash{}, err
    68  	}
    69  
    70  	tx := args.toTransaction()
    71  	signed, err := wallet.SignTx(account, tx, s.b.ChainConfig().ChainID)
    72  
    73  	if err != nil {
    74  		return common.Hash{}, err
    75  	}
    76  	return SubmitTransaction(ctx, s.b, signed)
    77  }
    78  
    79  // GetUser   doc soon
    80  func (s *PublicDebriefAPI) GetUser(ctx context.Context, address common.Address, blockNrOrHash rpc.BlockNumberOrHash) (*debrief.User, error) {
    81  	state, _, err := s.b.StateAndHeaderByNumberOrHash(ctx, blockNrOrHash)
    82  	if state == nil || err != nil {
    83  		return nil, err
    84  	}
    85  	return state.GetUser(address)
    86  }
    87  
    88  // GetUsers   doc soon
    89  func (s *PublicDebriefAPI) GetUsers(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) ([]debrief.User, error) {
    90  	state, _, err := s.b.StateAndHeaderByNumberOrHash(ctx, blockNrOrHash)
    91  	if state == nil || err != nil {
    92  		return nil, err
    93  	}
    94  	return state.GetUsers()
    95  }