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 }