| 17 | ) |
| 18 | |
| 19 | func handler(context client.Context) http.HandlerFunc { |
| 20 | return func(responseWriter http.ResponseWriter, httpRequest *http.Request) { |
| 21 | var request request |
| 22 | if !rest.ReadRESTReq(responseWriter, httpRequest, context.LegacyAmino, &request) { |
| 23 | rest.WriteErrorResponse(responseWriter, http.StatusBadRequest, "") |
| 24 | return |
| 25 | } |
| 26 | |
| 27 | if request.BaseRequest.ChainID == "" { |
| 28 | request.BaseRequest.ChainID = viper.GetString(flags.FlagChainID) |
| 29 | if request.BaseRequest.ChainID == "" { |
| 30 | rest.WriteErrorResponse(responseWriter, http.StatusBadRequest, "Chain-ID required but not specified") |
| 31 | return |
| 32 | } |
| 33 | } |
| 34 | |
| 35 | context = context.WithFrom(request.BaseRequest.From).WithChainID(request.BaseRequest.ChainID) |
| 36 | |
| 37 | keyInfo, err := context.Keyring.Key(request.BaseRequest.From) |
| 38 | if err != nil { |
| 39 | rest.WriteErrorResponse(responseWriter, http.StatusBadRequest, err.Error()) |
| 40 | return |
| 41 | } |
| 42 | context = context.WithFromAddress(keyInfo.GetAddress()) |
| 43 | account, err := context.AccountRetriever.GetAccount(context, keyInfo.GetAddress()) |
| 44 | if err != nil { |
| 45 | rest.WriteErrorResponse(responseWriter, http.StatusBadRequest, err.Error()) |
| 46 | return |
| 47 | } |
| 48 | |
| 49 | txFactory := tx.Factory{}.WithKeybase(context.Keyring).WithTxConfig(context.TxConfig).WithAccountRetriever(context.AccountRetriever).WithAccountNumber(account.GetAccountNumber()).WithSequence(account.GetSequence()).WithFees(request.BaseRequest.Fees.String()) |
| 50 | txFactory = txFactory.WithChainID(request.BaseRequest.ChainID) |
| 51 | txBuilder, err := tx.BuildUnsignedTx(txFactory, request.StdTx.GetMsgs()...) |
| 52 | if err != nil { |
| 53 | rest.WriteErrorResponse(responseWriter, http.StatusBadRequest, err.Error()) |
| 54 | return |
| 55 | } |
| 56 | |
| 57 | signerData := authSigning.SignerData{ |
| 58 | ChainID: context.ChainID, |
| 59 | AccountNumber: account.GetAccountNumber(), |
| 60 | Sequence: account.GetSequence(), |
| 61 | } |
| 62 | signatureData := signing.SingleSignatureData{ |
| 63 | SignMode: context.TxConfig.SignModeHandler().DefaultMode(), |
| 64 | Signature: nil, |
| 65 | } |
| 66 | signature := signing.SignatureV2{ |
| 67 | PubKey: account.GetPubKey(), |
| 68 | Data: &signatureData, |
| 69 | Sequence: txFactory.Sequence(), |
| 70 | } |
| 71 | |
| 72 | signMode := context.TxConfig.SignModeHandler().DefaultMode() |
| 73 | bytesToSign, err := context.TxConfig.SignModeHandler().GetSignBytes(signMode, signerData, txBuilder.GetTx()) |
| 74 | if err != nil { |
| 75 | rest.WriteErrorResponse(responseWriter, http.StatusBadRequest, err.Error()) |
| 76 | return |