/
transaction_request.go
130 lines (114 loc) · 5.2 KB
/
transaction_request.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// Copyright [2021] - [2022], AssetMantle Pte. Ltd. and the code contributors
// SPDX-License-Identifier: Apache-2.0
package put
import (
"encoding/json"
codecUtilities "github.com/AssetMantle/schema/go/codec/utilities"
errorConstants "github.com/AssetMantle/schema/go/errors/constants"
"github.com/AssetMantle/schema/go/ids"
baseIDs "github.com/AssetMantle/schema/go/ids/base"
baseTypes "github.com/AssetMantle/schema/go/types/base"
"github.com/asaskevich/govalidator"
"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/codec"
sdkTypes "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/rest"
"github.com/AssetMantle/modules/helpers"
"github.com/AssetMantle/modules/helpers/constants"
)
type transactionRequest struct {
BaseReq rest.BaseReq `json:"baseReq"`
FromID string `json:"fromID" valid:"required~required field fromID missing, matches(^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$)~invalid field fromID"`
MakerAssetID string `json:"makerAssetID" valid:"required~required field makerAssetID missing, matches(^(COI|AI)\|((?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4}|[A-Za-z0-9]{32}))$)~invalid field makerAssetID"`
TakerAssetID string `json:"takerAssetID" valid:"required~required field takerAssetID missing, matches(^(COI|AI)\|((?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4}|[A-Za-z0-9]{32}))$)~invalid field takerAssetID"`
MakerSplit string `json:"makerSplit" valid:"required~required field makerSplit missing, matches(^[0-9.]+$)~invalid field makerSplit"`
TakerSplit string `json:"takerSplit" valid:"required~required field takerSplit missing, matches(^[0-9.]+$)~invalid field takerSplit"`
ExpiryHeight int64 `json:"expiryHeight" valid:"required~required field expiryHeight missing, matches(^[0-9]+$)~invalid field expiryHeight"`
}
var _ helpers.TransactionRequest = (*transactionRequest)(nil)
// Validate godoc
// @Summary Make order transaction
// @Description Make order transaction
// @Accept text/plain
// @Produce json
// @Tags Orders
// @Param body transactionRequest true "Request body to make order"
// @Success 200 {object} transactionResponse "Message for a successful response."
// @Failure default {object} transactionResponse "Message for an unexpected error response."
// @Router /orders/make [post]
func (transactionRequest transactionRequest) Validate() error {
_, err := govalidator.ValidateStruct(transactionRequest)
return err
}
func (transactionRequest transactionRequest) FromCLI(cliCommand helpers.CLICommand, context client.Context) (helpers.TransactionRequest, error) {
return newTransactionRequest(
cliCommand.ReadBaseReq(context),
cliCommand.ReadString(constants.FromIdentityID),
cliCommand.ReadString(constants.MakerAssetID),
cliCommand.ReadString(constants.TakerAssetID),
cliCommand.ReadString(constants.MakerSplit),
cliCommand.ReadString(constants.TakerSplit),
cliCommand.ReadInt64(constants.ExpiryHeight),
), nil
}
func (transactionRequest transactionRequest) FromJSON(rawMessage json.RawMessage) (helpers.TransactionRequest, error) {
if err := json.Unmarshal(rawMessage, &transactionRequest); err != nil {
return nil, err
}
return transactionRequest, nil
}
func (transactionRequest transactionRequest) GetBaseReq() rest.BaseReq {
return transactionRequest.BaseReq
}
func (transactionRequest transactionRequest) MakeMsg() (sdkTypes.Msg, error) {
from, err := sdkTypes.AccAddressFromBech32(transactionRequest.GetBaseReq().From)
if err != nil {
return nil, err
}
fromID, err := baseIDs.PrototypeIdentityID().FromString(transactionRequest.FromID)
if err != nil {
return nil, err
}
makerAssetID, err := baseIDs.PrototypeAssetID().FromString(transactionRequest.MakerAssetID)
if err != nil {
return nil, err
}
takerAssetID, err := baseIDs.PrototypeAssetID().FromString(transactionRequest.TakerAssetID)
if err != nil {
return nil, err
}
makerSplit, ok := sdkTypes.NewIntFromString(transactionRequest.MakerSplit)
if !ok {
return nil, errorConstants.IncorrectFormat.Wrapf("maker split %s is not a valid integer", transactionRequest.MakerSplit)
}
takerSplit, ok := sdkTypes.NewIntFromString(transactionRequest.TakerSplit)
if !ok {
return nil, errorConstants.IncorrectFormat.Wrapf("taker split %s is not a valid integer", transactionRequest.TakerSplit)
}
return NewMessage(
from,
fromID.(ids.IdentityID),
makerAssetID.(ids.AssetID),
takerAssetID.(ids.AssetID),
makerSplit,
takerSplit,
baseTypes.NewHeight(transactionRequest.ExpiryHeight),
), nil
}
func (transactionRequest) RegisterLegacyAminoCodec(legacyAmino *codec.LegacyAmino) {
codecUtilities.RegisterModuleConcrete(legacyAmino, transactionRequest{})
}
func requestPrototype() helpers.TransactionRequest {
return transactionRequest{}
}
func newTransactionRequest(baseReq rest.BaseReq, fromID string, makerAssetID string, takerAssetID string, makerSplit, takerSplit string, expiryHeight int64) helpers.TransactionRequest {
return transactionRequest{
BaseReq: baseReq,
FromID: fromID,
MakerAssetID: makerAssetID,
TakerAssetID: takerAssetID,
MakerSplit: makerSplit,
TakerSplit: takerSplit,
ExpiryHeight: expiryHeight,
}
}