Created
March 13, 2022 11:49
-
-
Save koeppelmann/819313de804a6705b90fb4f330d0a845 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| from web3.auto import w3 | |
| from eth_account.messages import encode_defunct | |
| import requests | |
| import json | |
| import pprint | |
| from eip712_structs import make_domain | |
| from eip712_structs import Address, Boolean, Bytes, String, Uint | |
| from eip712_structs import EIP712Struct | |
| import time | |
| from hexbytes import HexBytes | |
| network = "mainnet" | |
| if(network == "mainnet"): | |
| base_url = "https://protocol-mainnet.gnosis.io/api/v1/" | |
| private_key = "xxx" | |
| public_address = "0xe63A13Eedd01B624958AcFe32145298788a7a7BA" | |
| domain = make_domain(name='Gnosis Protocol', version='v2', chainId='1', verifyingContract="0x9008D19f58AAbD9eD0D60971565AA8510560ab41") # Make a Domain Separator | |
| stablecoins = {} | |
| #DAI | |
| stablecoins["0x6b175474e89094c44da98b954eedeac495271d0f"] = 18 | |
| #USDC | |
| stablecoins["0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"] = 6 | |
| #USDT | |
| stablecoins["0xdac17f958d2ee523a2206206994597c13d831ec7"] = 6 | |
| else: | |
| base_url = "https://protocol-xdai.gnosis.io/api/v1/" | |
| private_key = "xxx" | |
| public_address = "0x89145F922BB420453bCd8a7Be87dA830C0941f22" | |
| domain = make_domain(name='Gnosis Protocol', version='v2', chainId='100', verifyingContract="0x9008D19f58AAbD9eD0D60971565AA8510560ab41") # Make a Domain Separator | |
| stablecoins = {} | |
| #USDC | |
| stablecoins["0xddafbb505ad214d7b80b1f830fccc89b60fb7a83"] = 6 | |
| #wxDAI | |
| stablecoins["0xe91d153e0b41518a2ce8dd3d7944fa863463a97d"] = 18 | |
| #USDT | |
| stablecoins["0x4ecaba5870353805a9f068101a40e0f32ed605c6"] = 6 | |
| class Order(EIP712Struct): | |
| sellToken = Address() | |
| buyToken = Address() | |
| receiver = Address() | |
| sellAmount = Uint(256) | |
| buyAmount = Uint(256) | |
| validTo = Uint(32) | |
| appData = Bytes(32) | |
| feeAmount = Uint(256) | |
| kind = String() | |
| partiallyFillable = Boolean() | |
| sellTokenBalance = String() | |
| buyTokenBalance = String() | |
| def placeOrder(myorder): | |
| #myorder["feeAmount"] = getFee(myorder) | |
| my_bytes = myorder.signable_bytes(domain) | |
| hash = w3.keccak(my_bytes) | |
| message = encode_defunct(primitive=hash) | |
| signed_message = w3.eth.account.sign_message(message, private_key=private_key) | |
| #print(signed_message) | |
| json_str = '''{ | |
| "sellToken": "''' + str(myorder["sellToken"]) + '''", | |
| "buyToken": "''' + str(myorder["buyToken"]) + '''", | |
| "receiver": "''' + str(myorder["receiver"]) + '''", | |
| "sellAmount": "''' + str(myorder["sellAmount"]) + '''", | |
| "buyAmount": "''' + str(myorder["buyAmount"]) + '''", | |
| "validTo": ''' + str(myorder["validTo"]) + ''', | |
| "appData": "''' + str(myorder["appData"].hex()) + '''", | |
| "feeAmount": "''' + str(myorder["feeAmount"]) + '''", | |
| "kind": "''' + str(myorder["kind"]) + '''", | |
| "partiallyFillable": ''' + str(myorder["partiallyFillable"]).lower() + ''', | |
| "signature": "''' + str(signed_message.signature.hex()) + '''", | |
| "signingScheme": "ethsign", | |
| "sellTokenBalance": "''' + str(myorder["sellTokenBalance"]) +'''", | |
| "buyTokenBalance": "''' + str(myorder["buyTokenBalance"]) +'''", | |
| "from": "''' + public_address + '''" | |
| }''' | |
| print(json_str) | |
| '''json_dict = {} | |
| json_dict["sellToken"] = sellToken | |
| json_dict["buyToken"] = buyToken | |
| json_dict["receiver"] = receiver | |
| json_dict["sellAmount"] = str(sellAmount) | |
| json_dict["buyAmount"] = str(buyAmount) | |
| json_dict["validTo"] = validTo | |
| json_dict["appData"] = appData | |
| json_dict["feeAmount"] = str(feeAmount) | |
| json_dict["kind"] = kind | |
| json_dict["partiallyFillable"] = str(partiallyFillable).lower() | |
| json_dict["signature"] = str(signed_message.signature.hex()) | |
| json_dict["signingScheme"] = "ethsign" | |
| json_dict["sellTokenBalance"] = str(sellTokenBalance) | |
| json_dict["buyTokenBalance"] = str(buyTokenBalance) | |
| json_dict["from"] = public_address''' | |
| #print(json_str) | |
| j = json.loads(json_str) | |
| #pprint.pprint(j) | |
| r = requests.post(base_url + "orders", json=j) | |
| print("Status code: ", r.status_code) | |
| print(r.json()) | |
| def createCounterOrder(order): | |
| return_order = Order() | |
| return_order["sellToken"] = order["buyToken"] | |
| if(return_order["sellToken"]=="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"): | |
| #TODO use WETH address for mainnet | |
| return_order["sellToken"] = "0xe91d153e0b41518a2ce8dd3d7944fa863463a97d" | |
| return_order["buyToken"] = order["sellToken"] | |
| if(return_order["buyToken"]=="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"): | |
| return_order["buyToken"] = "0xe91d153e0b41518a2ce8dd3d7944fa863463a97d" | |
| return_order["receiver"] = public_address | |
| return_order["sellAmount"] = int(int(order["buyAmount"])) | |
| return_order["buyAmount"] = int(int(order["sellAmount"])) | |
| return_order["validTo"] = int(time.time()) + 120 | |
| return_order["appData"] = HexBytes("0x00000000000000000000000055662e225a3376759c24331a9aed764f8f0c9fbb") | |
| if (order["kind"] == "sell"): | |
| return_order["kind"] = "buy" | |
| else: | |
| return_order["kind"] = "sell" | |
| return_order["feeAmount"] = int(getFee(return_order)) | |
| return_order["partiallyFillable"] = False | |
| return_order["sellTokenBalance"] = "erc20" | |
| return_order["buyTokenBalance"] = "erc20" | |
| return(return_order) | |
| def getEffectivePrice(order): | |
| sellAmount = (order["sellAmount"] + order["feeAmount"])/ 10** stablecoins[order["sellToken"]] | |
| buyAmount = order["buyAmount"]/ 10** stablecoins[order["buyToken"]] | |
| return sellAmount / buyAmount | |
| def getFee(order): | |
| if (order["kind"] == "sell"): | |
| fee = requests.get(base_url + "fee?sellToken=" + order["sellToken"] + "&buyToken=" + order["buyToken"] + "&amount=" + str(order["sellAmount"]) + "&kind=" + order["kind"]) | |
| elif (order["kind"] == "buy"): | |
| fee = requests.get(base_url + "fee?sellToken=" + order["sellToken"] + "&buyToken=" + order["buyToken"] + "&amount=" + str(order["buyAmount"]) + "&kind=" + order["kind"]) | |
| else: | |
| print("Unknown order type") | |
| return | |
| print(fee.json()) | |
| if ("amount" in fee.json().keys()): | |
| return int(int(fee.json()["amount"])*0.125) | |
| else: | |
| return 0 | |
| while(True): | |
| query = "solvable_orders" | |
| first_response = requests.get(base_url+query) | |
| print("Status code: ", first_response.status_code) | |
| response_list=first_response.json() | |
| '''response_list = [{'appData': '0x0000000000000000000000000000000000000000000000000000000000000001', | |
| 'availableBalance': '74440826130096183546', | |
| 'buyAmount': '5000000000000000000', | |
| 'buyToken': '0xc60e38c6352875c051b481cbe79dd0383adb7817', | |
| 'buyTokenBalance': 'erc20', | |
| 'creationDate': '2021-08-30T07:10:46.887306Z', | |
| 'executedBuyAmount': '0', | |
| 'executedFeeAmount': '0', | |
| 'executedSellAmount': '0', | |
| 'executedSellAmountBeforeFees': '0', | |
| 'feeAmount': '200000247000000', | |
| 'invalidated': False, | |
| 'kind': 'buy', | |
| 'owner': '0x2aec96b1b11be4a6c00bea6f41110b1938eb0768', | |
| 'partiallyFillable': False, | |
| 'receiver': '0x2aec96b1b11be4a6c00bea6f41110b1938eb0768', | |
| 'sellAmount': '4353224499094049015', | |
| 'sellToken': '0xe91d153e0b41518a2ce8dd3d7944fa863463a97d', | |
| 'sellTokenBalance': 'erc20', | |
| 'settlementContract': '0x9008d19f58aabd9ed0d60971565aa8510560ab41', | |
| 'signature': '0x78419a25bdcc55050066818a3238e07ccff092a4ea7a90af500b748915a6a7574c89b38fdbe9aa048ada563812936ffb4f26ae6a9407f9418f14f17e4b9dc93f1c', | |
| 'signingScheme': 'eip712', | |
| 'status': 'open', | |
| 'uid': '0xfc869e13f2983aab442744c40037674a3f1cbe458d22f0d4fbf41be72cc77dd82aec96b1b11be4a6c00bea6f41110b1938eb0768612c8b7b', | |
| 'validTo': 1630309243}]''' | |
| placedOrders = 0 | |
| for i in range((len(response_list))): | |
| if(response_list[i]["owner"].lower() != public_address.lower() and placedOrders <=3) : | |
| print(response_list[i]["owner"].lower()) | |
| print(public_address.lower()) | |
| pprint.pprint(response_list[i]) | |
| counter_order = createCounterOrder(response_list[i]) | |
| if(counter_order["sellToken"] in stablecoins.keys()) or \ | |
| counter_order["buyToken"] in stablecoins.keys(): | |
| print("hurray") | |
| pprint.pprint(counter_order["buyToken"]) | |
| pprint.pprint(counter_order["sellToken"]) | |
| print("test123") | |
| 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())): | |
| for j in stablecoins.keys(): | |
| if (j == counter_order["buyToken"]): | |
| continue | |
| counter_order["sellToken"] = j | |
| counter_order["sellAmount"] = int(counter_order["buyAmount"] / 10** stablecoins[counter_order["buyToken"]] * 10** stablecoins[counter_order["sellToken"]] * 0.9998) | |
| print(counter_order["buyAmount"] / 10** stablecoins[counter_order["buyToken"]]) | |
| print(counter_order["sellAmount"] / 10** stablecoins[counter_order["sellToken"]]) | |
| counter_order["feeAmount"] = getFee(counter_order) | |
| print(int(counter_order["sellAmount"]) - int(counter_order["feeAmount"])) | |
| counter_order["sellAmount"] = max(1,int(counter_order["sellAmount"]) - int(counter_order["feeAmount"])) | |
| if (counter_order["buyAmount"] / 10** stablecoins[counter_order["buyToken"]] < 20000): | |
| print("order too small") | |
| continue | |
| placeOrder(counter_order) | |
| placedOrders += 1 | |
| else: | |
| for j in stablecoins.keys(): | |
| if (j == counter_order["sellToken"]): | |
| continue | |
| counter_order["buyToken"] = j | |
| counter_order["buyAmount"] = int(counter_order["sellAmount"] / 10** stablecoins[counter_order["sellToken"]] * 10** stablecoins[counter_order["buyToken"]] * 1.0002) | |
| print(counter_order["buyAmount"] / 10** stablecoins[counter_order["buyToken"]]) | |
| print(counter_order["sellAmount"] / 10** stablecoins[counter_order["sellToken"]]) | |
| counter_order["feeAmount"] = getFee(counter_order) | |
| print(int(counter_order["sellAmount"]) - int(counter_order["feeAmount"])) | |
| counter_order["sellAmount"] = max(1,int(counter_order["sellAmount"]) - int(counter_order["feeAmount"])) | |
| if (counter_order["buyAmount"] / 10** stablecoins[counter_order["buyToken"]] < 20000): | |
| print("order too small") | |
| continue | |
| placeOrder(counter_order) | |
| placedOrders += 1 | |
| time.sleep(10) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment