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  }