10
10
from gnosis .eth import EthereumNetwork , EthereumNetworkNotSupported
11
11
from gnosis .eth .eip712 import eip712_encode_hash
12
12
13
+ from ..eth .constants import NULL_ADDRESS
13
14
from .order import Order , OrderKind
14
15
15
16
@@ -27,8 +28,8 @@ class TradeResponse(TypedDict):
27
28
28
29
29
30
class AmountResponse (TypedDict ):
30
- amount : str
31
- token : AnyAddress
31
+ sellAmount : int
32
+ buyAmount : int
32
33
33
34
34
35
class ErrorResponse (TypedDict ):
@@ -77,13 +78,15 @@ def weth_address(self) -> ChecksumAddress:
77
78
else : # XDAI
78
79
return ChecksumAddress ("0x6A023CCd1ff6F2045C3309768eAd9E68F978f6e1" )
79
80
80
- def get_fee (self , order : Order , from_address : ChecksumAddress ) -> int :
81
+ def get_quote (
82
+ self , order : Order , from_address : ChecksumAddress
83
+ ) -> Union [Dict [str , Any ], ErrorResponse ]:
81
84
url = self .base_url + "quote"
82
85
data_json = {
83
86
"sellToken" : order .sellToken .lower (),
84
87
"buyToken" : order .buyToken .lower (),
85
88
"sellAmountBeforeFee" : str (order .sellAmount ),
86
- "validTo" : order .validTo ,
89
+ # "validTo": order.validTo,
87
90
"appData" : HexBytes (order .appData ).hex ()
88
91
if isinstance (order .appData , bytes )
89
92
else order .appData ,
@@ -96,10 +99,20 @@ def get_fee(self, order: Order, from_address: ChecksumAddress) -> int:
96
99
}
97
100
r = self .http_session .post (url , json = data_json )
98
101
if r .ok :
99
- return int ( r .json ()[ "quote" ][ "feeAmount" ] )
102
+ return r .json ()
100
103
else :
101
104
return ErrorResponse (r .json ())
102
105
106
+ def get_fee (
107
+ self , order : Order , from_address : ChecksumAddress
108
+ ) -> Union [int , ErrorResponse ]:
109
+ quote = self .get_quote (order , from_address )
110
+
111
+ if "quote" in quote :
112
+ return int (quote ["quote" ]["feeAmount" ])
113
+ else :
114
+ return quote
115
+
103
116
def place_order (
104
117
self , order : Order , private_key : HexStr
105
118
) -> Union [HexStr , ErrorResponse ]:
@@ -193,14 +206,36 @@ def get_estimated_amount(
193
206
base_token : ChecksumAddress ,
194
207
quote_token : ChecksumAddress ,
195
208
kind : OrderKind ,
196
- amount : int ,
209
+ amount_wei : int ,
197
210
) -> Union [AmountResponse , ErrorResponse ]:
198
211
"""
199
- The estimated amount in quote token for either buying or selling amount of baseToken.
212
+
213
+ :param base_token:
214
+ :param quote_token:
215
+ :param kind:
216
+ :param amount_wei:
217
+ :return: Both `sellAmount` and `buyAmount` as they can be adjusted by CowSwap API
200
218
"""
201
- url = self .base_url + f"markets/{ base_token } -{ quote_token } /{ kind .name } /{ amount } "
202
- r = self .http_session .get (url )
203
- if r .ok :
204
- return AmountResponse (r .json ())
219
+ order = Order (
220
+ sellToken = base_token ,
221
+ buyToken = quote_token ,
222
+ receiver = NULL_ADDRESS ,
223
+ sellAmount = amount_wei * 10 if kind == OrderKind .SELL else 0 ,
224
+ buyAmount = amount_wei * 10 if kind == OrderKind .BUY else 0 ,
225
+ validTo = 0 , # Valid for 1 hour
226
+ appData = "0x0000000000000000000000000000000000000000000000000000000000000000" ,
227
+ feeAmount = 0 ,
228
+ kind = kind .name .lower (), # `sell` or `buy`
229
+ partiallyFillable = False ,
230
+ sellTokenBalance = "erc20" , # `erc20`, `external` or `internal`
231
+ buyTokenBalance = "erc20" , # `erc20` or `internal`
232
+ )
233
+
234
+ quote = self .get_quote (order , NULL_ADDRESS )
235
+ if "quote" in quote :
236
+ return {
237
+ "buyAmount" : int (quote ["quote" ]["buyAmount" ]),
238
+ "sellAmount" : int (quote ["quote" ]["sellAmount" ]),
239
+ }
205
240
else :
206
- return ErrorResponse ( r . json ())
241
+ return quote
0 commit comments