@@ -32,14 +32,21 @@ public struct BinanceSpotNewOrderRequest: NetworkRequest {
32
32
var urlRequest = URLRequest ( url: try spotNewOrderResource. url)
33
33
urlRequest. httpMethod = HTTPMethod . POST. rawValue
34
34
35
- // Parameters.
36
- let dataParameter = try createDataParameter ( from: orderParameters)
37
- urlRequest. httpBody = dataParameter
35
+ // Body parameters.
36
+ let stringParameters = createStringParameters ( from: orderParameters)
37
+ let dataParameters = try createDataParameter ( from: stringParameters)
38
+
39
+ // Signature parameter.
40
+ let stringSignature = try createSignature ( for: dataParameters, binanceAuth: binanceAuth)
41
+ let dataSignature = try createDataParameter ( from: stringParameters + " & \( stringSignature) " )
42
+
43
+ // Add the parameters.
44
+ urlRequest. httpBody = dataSignature
45
+
46
+ // Add header fields.
38
47
urlRequest. addValue ( HTTPHeader . Value. urlEncoded, forHTTPHeaderField: HTTPHeader . Field. contentType)
39
48
try BinanceAPI . setRequestHeaderFields ( request: & urlRequest, binanceAuth: binanceAuth. spot)
40
49
41
- #warning("TODO: Add signature - here?")
42
-
43
50
return urlRequest
44
51
}
45
52
}
@@ -85,21 +92,34 @@ public extension BinanceSpotNewOrderRequest {
85
92
86
93
private extension BinanceSpotNewOrderRequest {
87
94
88
- func createDataParameter( from orderParameters: BinanceSpotNewOrderParameters ) throws -> Data {
89
- let symbolParameter = " \( BinanceSpotNewOrderParameterKey . symbol. rawValue) = \( orderParameters. symbol) "
90
- let sideParameter = " \( BinanceSpotNewOrderParameterKey . side. rawValue) = \( orderParameters. side) "
91
- let typeParameter = " \( BinanceSpotNewOrderParameterKey . type. rawValue) = \( orderParameters. type) "
92
- let quoteQtyParameter = " \( BinanceSpotNewOrderParameterKey . quoteOrderQty. rawValue) = \( orderParameters. quoteOrderQty) "
93
-
94
- #warning("TODO: Add timestamp")
95
-
96
- // E.g.: "symbol=BTCUSDT&side=buy&type=market"eOrderQty=100.0"
97
- let stringParameter = " \( symbolParameter) & \( sideParameter) & \( typeParameter) & \( quoteQtyParameter) "
98
-
99
- if let dataParameter = stringParameter. data ( using: . utf8) {
100
- return dataParameter
95
+ /// Creates the `String` parameters to be later added into the request body.
96
+ ///
97
+ /// For example: *symbol=BTCUSDT&side=buy&type=market"eOrderQty=100.0×tamp=1670998246731*
98
+ ///
99
+ func createStringParameters( from orderParameters: BinanceSpotNewOrderParameters ) -> String {
100
+ let symbolParam = " \( BinanceSpotNewOrderParameterKey . symbol. rawValue) = \( orderParameters. symbol) "
101
+ let sideParam = " \( BinanceSpotNewOrderParameterKey . side. rawValue) = \( orderParameters. side) "
102
+ let typeParam = " \( BinanceSpotNewOrderParameterKey . type. rawValue) = \( orderParameters. type) "
103
+ let quoteQtyParam = " \( BinanceSpotNewOrderParameterKey . quoteOrderQty. rawValue) = \( orderParameters. quoteOrderQty) "
104
+ let timestampParam = " \( BinanceSpotNewOrderParameterKey . timestamp. rawValue) = \( Date ( ) . timestampMilliseconds) "
105
+
106
+ return " \( symbolParam) & \( sideParam) & \( typeParam) & \( quoteQtyParam) & \( timestampParam) "
107
+ }
108
+
109
+ /// Creates the `Data` parameter to be added into the request body via `urlRequest.httpBody = dataParameter`.
110
+ func createDataParameter( from string: String ) throws -> Data {
111
+ if let data = string. data ( using: . utf8) {
112
+ return data
101
113
} else {
102
- throw NetworkRequestError . invalidDataFromString ( string: stringParameter )
114
+ throw NetworkRequestError . invalidDataFromString ( string: string )
103
115
}
104
116
}
117
+
118
+ func createSignature( for data: Data , binanceAuth: BinanceAuth ) throws -> String {
119
+ let signature = try NetworkRequestSignee . createHMACSignature ( for: data,
120
+ secret: binanceAuth. spot. apiSecret,
121
+ isHexString: true )
122
+ let symbolParam = " \( BinanceSpotNewOrderParameterKey . signature. rawValue) = \( signature) "
123
+ return symbolParam
124
+ }
105
125
}
0 commit comments