Advertisement
Guest User

Untitled

a guest
Aug 30th, 2021
1,636
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.14 KB | None | 0 0
  1. from web3.auto import w3
  2. from eth_account.messages import encode_defunct
  3. import requests
  4. import json
  5. import pprint
  6. from eip712_structs import make_domain
  7. from eip712_structs import Address, Boolean, Bytes, String, Uint
  8. from eip712_structs import EIP712Struct
  9. import time
  10. from hexbytes import HexBytes
  11.  
  12.  
  13. network = "xdai"
  14.  
  15. if(network == "mainnet"):
  16.     base_url = "https://protocol-mainnet.gnosis.io/api/v1/"
  17.     private_key = "XXXX"
  18.     public_address = "0xE2A4dFC3Cab6dCdb198C83066B93110D62d95F09"
  19.     domain = make_domain(name='Gnosis Protocol', version='v2', chainId='1', verifyingContract="0x9008D19f58AAbD9eD0D60971565AA8510560ab41")  # Make a Domain Separator
  20. else:
  21.     base_url = "https://protocol-xdai.gnosis.io/api/v1/"
  22.     private_key = "XXXX"
  23.     public_address = "0x89145F922BB420453bCd8a7Be87dA830C0941f22"
  24.     domain = make_domain(name='Gnosis Protocol', version='v2', chainId='100', verifyingContract="0x9008D19f58AAbD9eD0D60971565AA8510560ab41")  # Make a Domain Separator
  25.  
  26.  
  27.  
  28. class Order(EIP712Struct):
  29.     sellToken = Address()
  30.     buyToken = Address()
  31.     receiver = Address()
  32.     sellAmount = Uint(256)
  33.     buyAmount = Uint(256)
  34.     validTo = Uint(32)
  35.     appData = Bytes(32)
  36.     feeAmount = Uint(256)
  37.     kind = String()
  38.     partiallyFillable = Boolean()
  39.     sellTokenBalance = String()
  40.     buyTokenBalance = String()
  41.  
  42.  
  43. def placeOrder(myorder):
  44.  
  45.     myorder["feeAmount"] = getFee(myorder)
  46.  
  47.     my_bytes = myorder.signable_bytes(domain)
  48.     hash = w3.keccak(my_bytes)
  49.     message = encode_defunct(primitive=hash)
  50.  
  51.  
  52.     signed_message = w3.eth.account.sign_message(message, private_key=private_key)
  53.     #print(signed_message)
  54.  
  55.  
  56.     json_str = '''{
  57.      "sellToken": "''' + str(myorder["sellToken"]) + '''",
  58.      "buyToken": "''' + str(myorder["buyToken"]) + '''",
  59.      "receiver": "''' + str(myorder["receiver"]) + '''",
  60.      "sellAmount": "''' + str(myorder["sellAmount"]) + '''",
  61.      "buyAmount": "''' + str(myorder["buyAmount"]) + '''",
  62.      "validTo": ''' + str(myorder["validTo"]) + ''',
  63.      "appData": "''' + str(myorder["appData"].hex()) + '''",
  64.      "feeAmount": "''' + str(myorder["feeAmount"]) + '''",
  65.      "kind": "''' + str(myorder["kind"]) + '''",
  66.      "partiallyFillable": ''' + str(myorder["partiallyFillable"]).lower() + ''',
  67.      "signature": "''' + str(signed_message.signature.hex()) + '''",
  68.      "signingScheme": "ethsign",
  69.      "sellTokenBalance": "''' + str(myorder["sellTokenBalance"]) +'''",
  70.      "buyTokenBalance": "''' + str(myorder["buyTokenBalance"]) +'''",
  71.      "from": "''' + public_address + '''"
  72.    }'''
  73.  
  74.     print(json_str)
  75.     '''json_dict = {}
  76.    json_dict["sellToken"] = sellToken
  77.    json_dict["buyToken"] = buyToken
  78.    json_dict["receiver"] = receiver
  79.    json_dict["sellAmount"] = str(sellAmount)
  80.    json_dict["buyAmount"] = str(buyAmount)
  81.    json_dict["validTo"] = validTo
  82.    json_dict["appData"] = appData
  83.    json_dict["feeAmount"] = str(feeAmount)
  84.    json_dict["kind"] = kind
  85.    json_dict["partiallyFillable"] = str(partiallyFillable).lower()
  86.    json_dict["signature"] = str(signed_message.signature.hex())
  87.    json_dict["signingScheme"] = "ethsign"
  88.    json_dict["sellTokenBalance"] = str(sellTokenBalance)
  89.    json_dict["buyTokenBalance"] = str(buyTokenBalance)
  90.    json_dict["from"] = public_address'''
  91.  
  92.     #print(json_str)
  93.     j = json.loads(json_str)
  94.  
  95.     #pprint.pprint(j)
  96.  
  97.     r = requests.post(base_url + "orders", json=j)
  98.  
  99.     print("Status code: ", r.status_code)
  100.     print(r.json())
  101.  
  102.  
  103.  
  104.  
  105. def createCounterOrder(order):
  106.     return_order = Order()
  107.     return_order["sellToken"] = order["buyToken"]
  108.     if(return_order["sellToken"]=="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"):
  109.         #TODO use WETH address for mainnet
  110.         return_order["sellToken"] = "0xe91d153e0b41518a2ce8dd3d7944fa863463a97d"
  111.     return_order["buyToken"] = order["sellToken"]
  112.     if(return_order["buyToken"]=="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"):
  113.         return_order["buyToken"] = "0xe91d153e0b41518a2ce8dd3d7944fa863463a97d"
  114.     return_order["receiver"] = public_address
  115.     return_order["sellAmount"] = int(int(order["buyAmount"]))
  116.     return_order["buyAmount"] = int(int(order["sellAmount"]))
  117.     return_order["validTo"] = int(time.time()) + 120
  118.     return_order["appData"] = HexBytes("0x0000000000000000000000000000000000000000000000000000000000000ccc")
  119.     if (order["kind"] == "sell"):
  120.         return_order["kind"] = "buy"
  121.     else:
  122.         return_order["kind"] = "sell"
  123.  
  124.     return_order["feeAmount"] = int(getFee(return_order))
  125.     return_order["partiallyFillable"] = False
  126.     return_order["sellTokenBalance"] = "erc20"
  127.     return_order["buyTokenBalance"] = "erc20"
  128.     return(return_order)
  129.  
  130.  
  131. def getFee(order):
  132.     if (order["kind"] == "sell"):
  133.         fee = requests.get(base_url +  "fee?sellToken=" + order["sellToken"] +  "&buyToken=" + order["buyToken"] + "&amount=" + str(order["sellAmount"]) + "&kind=" + order["kind"])
  134.     elif (order["kind"] == "buy"):
  135.         fee = requests.get(base_url +  "fee?sellToken=" + order["sellToken"] +  "&buyToken=" + order["buyToken"] + "&amount=" + str(order["buyAmount"]) + "&kind=" + order["kind"])
  136.     else:
  137.         print("Unknown order type")
  138.         return
  139.     print(fee.json())
  140.     if ("amount" in fee.json().keys()):
  141.         return int(fee.json()["amount"])
  142.     else:
  143.         return 0
  144.  
  145. stablecoins = {}
  146. #USDC
  147. stablecoins["0xddafbb505ad214d7b80b1f830fccc89b60fb7a83"] = 6
  148. #wxDAI
  149. stablecoins["0xe91d153e0b41518a2ce8dd3d7944fa863463a97d"] = 18
  150. #USDT
  151. stablecoins["0x4ecaba5870353805a9f068101a40e0f32ed605c6"] = 6
  152.  
  153. while(True):
  154.  
  155.     query = "solvable_orders"
  156.     first_response = requests.get(base_url+query)
  157.     print("Status code: ", first_response.status_code)
  158.     response_list=first_response.json()
  159.  
  160.     '''response_list = [{'appData': '0x0000000000000000000000000000000000000000000000000000000000000001',
  161. 'availableBalance': '74440826130096183546',
  162. 'buyAmount': '5000000000000000000',
  163. 'buyToken': '0xc60e38c6352875c051b481cbe79dd0383adb7817',
  164. 'buyTokenBalance': 'erc20',
  165. 'creationDate': '2021-08-30T07:10:46.887306Z',
  166. 'executedBuyAmount': '0',
  167. 'executedFeeAmount': '0',
  168. 'executedSellAmount': '0',
  169. 'executedSellAmountBeforeFees': '0',
  170. 'feeAmount': '200000247000000',
  171. 'invalidated': False,
  172. 'kind': 'buy',
  173. 'owner': '0x2aec96b1b11be4a6c00bea6f41110b1938eb0768',
  174. 'partiallyFillable': False,
  175. 'receiver': '0x2aec96b1b11be4a6c00bea6f41110b1938eb0768',
  176. 'sellAmount': '4353224499094049015',
  177. 'sellToken': '0xe91d153e0b41518a2ce8dd3d7944fa863463a97d',
  178. 'sellTokenBalance': 'erc20',
  179. 'settlementContract': '0x9008d19f58aabd9ed0d60971565aa8510560ab41',
  180. 'signature': '0x78419a25bdcc55050066818a3238e07ccff092a4ea7a90af500b748915a6a7574c89b38fdbe9aa048ada563812936ffb4f26ae6a9407f9418f14f17e4b9dc93f1c',
  181. 'signingScheme': 'eip712',
  182. 'status': 'open',
  183. 'uid': '0xfc869e13f2983aab442744c40037674a3f1cbe458d22f0d4fbf41be72cc77dd82aec96b1b11be4a6c00bea6f41110b1938eb0768612c8b7b',
  184. 'validTo': 1630309243}]'''
  185.  
  186.  
  187.     for i in range((len(response_list))):
  188.         if(response_list[i]["owner"].lower() != public_address.lower()):
  189.             print(response_list[i]["owner"].lower())
  190.             print(public_address.lower())
  191.             pprint.pprint(response_list[i])
  192.             counter_order = createCounterOrder(response_list[i])
  193.             if(counter_order["sellToken"] in stablecoins.keys()) or \
  194.                 counter_order["buyToken"] in stablecoins.keys():
  195.                 print("hurray")
  196.                 pprint.pprint(counter_order["buyToken"])
  197.                 pprint.pprint(counter_order["sellToken"])
  198.                 print("test123")
  199.  
  200.  
  201.                 if(counter_order["kind"] == "buy" and counter_order["buyToken"] in stablecoins.keys() or (not counter_order["sellToken"] in stablecoins.keys() and counter_order["buyToken"] in stablecoins.keys())):
  202.                     for j in stablecoins.keys():
  203.                         if (j == counter_order["buyToken"]):
  204.                             continue
  205.                         counter_order["sellToken"] = j
  206.                         counter_order["sellAmount"] = int(counter_order["buyAmount"] / 10** stablecoins[counter_order["buyToken"]] * 10** stablecoins[counter_order["sellToken"]] * 0.9996)
  207.                         print(counter_order["buyAmount"] / 10** stablecoins[counter_order["buyToken"]])
  208.                         print(counter_order["sellAmount"] / 10** stablecoins[counter_order["sellToken"]])
  209.                         placeOrder(counter_order)
  210.                 else:
  211.                     for j in stablecoins.keys():
  212.                         if (j == counter_order["sellToken"]):
  213.                             continue
  214.                         counter_order["buyToken"] = j
  215.                         counter_order["buyAmount"] = int(counter_order["sellAmount"] / 10** stablecoins[counter_order["sellToken"]] * 10** stablecoins[counter_order["buyToken"]] * 1.0004)
  216.                         print(counter_order["buyAmount"] / 10** stablecoins[counter_order["buyToken"]])
  217.                         print(counter_order["sellAmount"] / 10** stablecoins[counter_order["sellToken"]])
  218.                         placeOrder(counter_order)
  219.     time.sleep(10)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement