Advertisement
Guest User

Untitled

a guest
Aug 25th, 2021
694
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.23 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 = "YOUR_PRIVATE_KEY_YOU_CAN_E.G._EXPORT_FROM_METAMASK"
  18.     public_address = "YOUR_ADDRESS"
  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 = "YOUR_PRIVATE_KEY_YOU_CAN_E"
  23.     public_address = "YOUR_ADDRESS"
  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.  
  46.     my_bytes = myorder.signable_bytes(domain)
  47.     hash = w3.keccak(my_bytes)
  48.     message = encode_defunct(primitive=hash)
  49.  
  50.  
  51.     signed_message = w3.eth.account.sign_message(message, private_key=private_key)
  52.     #print(signed_message)
  53.  
  54.  
  55.     json_str = '''{
  56.      "sellToken": "''' + str(myorder["sellToken"]) + '''",
  57.      "buyToken": "''' + str(myorder["buyToken"]) + '''",
  58.      "receiver": "''' + str(myorder["receiver"]) + '''",
  59.      "sellAmount": "''' + str(myorder["sellAmount"]) + '''",
  60.      "buyAmount": "''' + str(myorder["buyAmount"]) + '''",
  61.      "validTo": ''' + str(myorder["validTo"]) + ''',
  62.      "appData": "''' + str(myorder["appData"].hex()) + '''",
  63.      "feeAmount": "''' + str(myorder["feeAmount"]) + '''",
  64.      "kind": "''' + str(myorder["kind"]) + '''",
  65.      "partiallyFillable": ''' + str(myorder["partiallyFillable"]).lower() + ''',
  66.      "signature": "''' + str(signed_message.signature.hex()) + '''",
  67.      "signingScheme": "ethsign",
  68.      "sellTokenBalance": "''' + str(myorder["sellTokenBalance"]) +'''",
  69.      "buyTokenBalance": "''' + str(myorder["buyTokenBalance"]) +'''",
  70.      "from": "''' + public_address + '''"
  71.    }'''
  72.  
  73.     print(json_str)
  74.     '''json_dict = {}
  75.    json_dict["sellToken"] = sellToken
  76.    json_dict["buyToken"] = buyToken
  77.    json_dict["receiver"] = receiver
  78.    json_dict["sellAmount"] = str(sellAmount)
  79.    json_dict["buyAmount"] = str(buyAmount)
  80.    json_dict["validTo"] = validTo
  81.    json_dict["appData"] = appData
  82.    json_dict["feeAmount"] = str(feeAmount)
  83.    json_dict["kind"] = kind
  84.    json_dict["partiallyFillable"] = str(partiallyFillable).lower()
  85.    json_dict["signature"] = str(signed_message.signature.hex())
  86.    json_dict["signingScheme"] = "ethsign"
  87.    json_dict["sellTokenBalance"] = str(sellTokenBalance)
  88.    json_dict["buyTokenBalance"] = str(buyTokenBalance)
  89.    json_dict["from"] = public_address'''
  90.  
  91.     #print(json_str)
  92.     j = json.loads(json_str)
  93.  
  94.     #pprint.pprint(j)
  95.  
  96.     r = requests.post(base_url + "orders", json=j)
  97.  
  98.     print("Status code: ", r.status_code)
  99.     print(r.json())
  100.  
  101. query = "solvable_orders"
  102. first_response = requests.get(base_url+query)
  103. response_list=first_response.json()
  104.  
  105.  
  106. pprint.pprint(response_list)
  107.  
  108.  
  109. def createCounterOrder(order):
  110.     return_order = Order()
  111.     return_order["sellToken"] = order["buyToken"]
  112.     if(return_order["sellToken"]=="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"):
  113.         #TODO use WETH address for mainnet
  114.         return_order["sellToken"] = "0xe91d153e0b41518a2ce8dd3d7944fa863463a97d"
  115.     return_order["buyToken"] = order["sellToken"]
  116.     if(return_order["buyToken"]=="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"):
  117.         return_order["buyToken"] = "0xe91d153e0b41518a2ce8dd3d7944fa863463a97d"
  118.     return_order["receiver"] = public_address
  119.     return_order["sellAmount"] = int(int(order["buyAmount"]) * 1.0025)
  120.     return_order["buyAmount"] = int(int(order["sellAmount"]) * 0.9985)
  121.     return_order["validTo"] = int(time.time()) + 120
  122.     return_order["appData"] = HexBytes("0x0000000000000000000000000000000000000000000000000000000000000ccc")
  123.     if (order["kind"] == "sell"):
  124.         return_order["kind"] = "buy"
  125.     else:
  126.         return_order["kind"] = "sell"
  127.    
  128.     return_order["feeAmount"] = int(getFee(return_order))
  129.     return_order["partiallyFillable"] = False
  130.     return_order["sellTokenBalance"] = "erc20"
  131.     return_order["buyTokenBalance"] = "erc20"
  132.     return(return_order)
  133.    
  134.  
  135. def getFee(order):
  136.     if (order["kind"] == "sell"):
  137.         fee = requests.get(base_url +  "fee?sellToken=" + order["sellToken"] +  "&buyToken=" + order["buyToken"] + "&amount=" + str(order["sellAmount"]) + "&kind=" + order["kind"])
  138.     elif (order["kind"] == "buy"):
  139.         fee = requests.get(base_url +  "fee?sellToken=" + order["sellToken"] +  "&buyToken=" + order["buyToken"] + "&amount=" + str(order["buyAmount"]) + "&kind=" + order["kind"])
  140.     else:
  141.         print("Unknown order type")
  142.         return
  143.     print(fee.json())
  144.     return fee.json()["amount"]
  145.  
  146. stablecoins = {}
  147. #USDC
  148. stablecoins["0xddafbb505ad214d7b80b1f830fccc89b60fb7a83"] = 6
  149. #wxDAI
  150. stablecoins["0xe91d153e0b41518a2ce8dd3d7944fa863463a97d"] = 18
  151. #USDT
  152. stablecoins["0x4ecaba5870353805a9f068101a40e0f32ed605c6"] = 6
  153.  
  154. for i in range((len(response_list))):
  155.     counter_order = createCounterOrder(response_list[i])
  156.     if(counter_order["sellToken"] in stablecoins.keys()) and \
  157.         counter_order["buyToken"] in stablecoins.keys() and \
  158.         counter_order["buyAmount"] / 10** stablecoins[counter_order["buyToken"]] > counter_order["sellAmount"] / 10** stablecoins[counter_order["sellToken"]]:
  159.  
  160.         print("hurray")
  161.         print(counter_order["buyAmount"] / 10** stablecoins[counter_order["buyToken"]])
  162.         print(counter_order["sellAmount"] / 10** stablecoins[counter_order["sellToken"]])
  163.         placeOrder(counter_order)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement