github.com/status-im/status-go@v1.1.0/services/connector/commands/send_transaction.go (about) 1 package commands 2 3 import ( 4 "database/sql" 5 "encoding/json" 6 "errors" 7 "fmt" 8 9 persistence "github.com/status-im/status-go/services/connector/database" 10 "github.com/status-im/status-go/signal" 11 "github.com/status-im/status-go/transactions" 12 ) 13 14 var ( 15 ErrParamsFromAddressIsNotShared = errors.New("from parameter address is not dApp's shared account") 16 ErrNoTransactionParamsFound = errors.New("no transaction in params found") 17 ) 18 19 type SendTransactionCommand struct { 20 Db *sql.DB 21 ClientHandler ClientSideHandlerInterface 22 } 23 24 func (r *RPCRequest) getSendTransactionParams() (*transactions.SendTxArgs, error) { 25 if r.Params == nil || len(r.Params) == 0 { 26 return nil, ErrEmptyRPCParams 27 } 28 29 paramMap, ok := r.Params[0].(map[string]interface{}) 30 if !ok { 31 return nil, ErrNoTransactionParamsFound 32 } 33 34 paramBytes, err := json.Marshal(paramMap) 35 if err != nil { 36 return nil, fmt.Errorf("error marshalling first transaction param: %v", err) 37 } 38 39 var sendTxArgs transactions.SendTxArgs 40 err = json.Unmarshal(paramBytes, &sendTxArgs) 41 if err != nil { 42 return nil, fmt.Errorf("error unmarshalling first transaction param to SendTxArgs: %v", err) 43 } 44 45 return &sendTxArgs, nil 46 } 47 48 func (c *SendTransactionCommand) Execute(request RPCRequest) (interface{}, error) { 49 err := request.Validate() 50 if err != nil { 51 return "", err 52 } 53 54 dApp, err := persistence.SelectDAppByUrl(c.Db, request.URL) 55 if err != nil { 56 return "", err 57 } 58 59 if dApp == nil { 60 return "", ErrDAppIsNotPermittedByUser 61 } 62 63 params, err := request.getSendTransactionParams() 64 if err != nil { 65 return "", err 66 } 67 68 if params.From != dApp.SharedAccount { 69 return "", ErrParamsFromAddressIsNotShared 70 } 71 72 hash, err := c.ClientHandler.RequestSendTransaction(signal.ConnectorDApp{ 73 URL: request.URL, 74 Name: request.Name, 75 IconURL: request.IconURL, 76 }, dApp.ChainID, params) 77 if err != nil { 78 return "", err 79 } 80 return hash.String(), nil 81 }