diff --git a/.gitignore b/.gitignore index e8a3d4d..db14b68 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.idea/ # notebook checkpoints .ipynb_checkpoints diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..0ebff02 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,52 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..8fed5de --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..f949e9f --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/pyserum.iml b/.idea/pyserum.iml new file mode 100644 index 0000000..3bc3dc3 --- /dev/null +++ b/.idea/pyserum.iml @@ -0,0 +1,15 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/pyserum/examples/ids.json b/pyserum/examples/ids.json new file mode 100644 index 0000000..35faab1 --- /dev/null +++ b/pyserum/examples/ids.json @@ -0,0 +1,403 @@ +{ + "groups": [ + { + "publicKey": "78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX", + "cluster": "MAINNET", + "name": "MAINNET.0", + "mangoProgramId": "4MangoMjqJ2firMokCjjGgoK8d4MXcrgL7XJaL3w6fVg", + "insuranceVault": "F1vqFqkZHh5jd5rf8BcEzT8kqfd1snB1adRkayJ9KPNY", + "insuranceMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + "insuranceMintDecimals": 6, + "perpMarkets": [ + { + "group": "78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX", + "publicKey": "HwhVGkfsSQ9JSQeQYu2CbkRCLvsh3qRZxG6m4oMVwZpN", + "marketIndex": 0, + "name": "BTC-PERP", + "baseDecimals": 6, + "baseLotSize": 100, + "quoteLotSize": 10, + "oracle": "GVXRSBjFk6e6J3NbVPXohDJetcTjaeeuykUpbQF8UoMU", + "active": true, + "settleTokenIndex": 0 + }, + { + "group": "78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX", + "publicKey": "9Y8paZ5wUpzLFfQuHz8j2RtPrKsDtHx9sbgFmWb5abCw", + "marketIndex": 1, + "name": "MNGO-PERP", + "baseDecimals": 6, + "baseLotSize": 1000000, + "quoteLotSize": 100, + "oracle": "79wm3jjcPr6RaNQ4DGvP5KxG1mNd3gEBsg6FsNVFezK4", + "active": false, + "settleTokenIndex": 0 + }, + { + "group": "78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX", + "publicKey": "ESdnpnNLgTkBCZRuTJkZLi5wKEZ2z47SG3PJrhundSQ2", + "marketIndex": 2, + "name": "SOL-PERP", + "baseDecimals": 9, + "baseLotSize": 10000000, + "quoteLotSize": 100, + "oracle": "H6ARHf6YXhGYeQfUzQNGk6rDNnLBQKrenN712K4AQJEG", + "active": true, + "settleTokenIndex": 0 + }, + { + "group": "78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX", + "publicKey": "Fgh9JSZ2qfSjCw9RPJ85W2xbihsp2muLvfRztzoVR7f1", + "marketIndex": 3, + "name": "ETH-PERP", + "baseDecimals": 6, + "baseLotSize": 100, + "quoteLotSize": 1, + "oracle": "JBu1AL4obBcCMqKBBxhpWCNUt136ijcuMZLFvTP7iWdB", + "active": true, + "settleTokenIndex": 0 + } + ], + "tokens": [ + { + "group": "78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX", + "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + "tokenIndex": 0, + "symbol": "USDC", + "decimals": 6, + "oracle": "7e7xcRkdb4uJ4A6xShYwBJrWJk5V4AmrEFqAPhSMvzSx", + "mintInfo": "9jPkVdufMKbg62ndJHv5CqCAkzssmstyDi9kxsvrjbSc", + "banks": [ + { + "bankNum": 0, + "publicKey": "J6MsZiJUU6bjKSCkbfQsiHkd8gvJoddG2hsdSFsZQEZV" + } + ], + "active": true + }, + { + "group": "78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX", + "mint": "MangoCzJ36AjZyKwVj3VnYU4GTonjfVEnJmvvWaxLac", + "tokenIndex": 6, + "symbol": "MNGO", + "decimals": 6, + "oracle": "79wm3jjcPr6RaNQ4DGvP5KxG1mNd3gEBsg6FsNVFezK4", + "mintInfo": "2rbDQ2E1kDK4SHPbr1VUzB6sKdxkcJxDq8jYf44R4oVi", + "banks": [ + { + "bankNum": 0, + "publicKey": "5covW85GcCq3kHCJtcKCKYyQoxZLnHiz3zw5TEZEYgKj" + } + ], + "active": true + }, + { + "group": "78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX", + "mint": "mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So", + "tokenIndex": 5, + "symbol": "MSOL", + "decimals": 9, + "oracle": "E4v1BBgoso9s64TQvmyownAVJbhbEPGyzA3qn4n46qj9", + "mintInfo": "HopzURnbkLPpQch37o5sN31knjpYGrENuwy9UASXkhfC", + "banks": [ + { + "bankNum": 0, + "publicKey": "AL2BeApHWeHdzERdiCy13ZrmPXaiBWG8s11deHrZPuSt" + } + ], + "active": true + }, + { + "group": "78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX", + "mint": "7vfCXTUXx5WJV5JADk17DUJ4ksgau7utNKj4b963voxs", + "tokenIndex": 3, + "symbol": "ETH", + "decimals": 8, + "oracle": "JBu1AL4obBcCMqKBBxhpWCNUt136ijcuMZLFvTP7iWdB", + "mintInfo": "J8Mq6JQUqaKfWjn9fjaYq8S5haCJXuUGtavjtQHzW4Vm", + "banks": [ + { + "bankNum": 0, + "publicKey": "5h2KcPQQijX1RR35yhBJPDzvrsLd4sUcTtXUq3PhVhY9" + } + ], + "active": true + }, + { + "group": "78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX", + "mint": "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB", + "tokenIndex": 1, + "symbol": "USDT", + "decimals": 6, + "oracle": "3vxLXJqLqF3JG5TCbYycbKWRBbCJQLxQmBGCkyqEEefL", + "mintInfo": "HPmQ7dvQpZV7yoRo8NqMS9jVZBJXocE472b1bbGoLG1Q", + "banks": [ + { + "bankNum": 0, + "publicKey": "3k87hyqCaFR2G4SVwsLNMyPmR1mFN6uo7dUytzKQYu9d" + } + ], + "active": true + }, + { + "group": "78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX", + "mint": "EjmyN6qEC1Tf1JxiG1ae7UTJhUxSwk1TCWNWqxWV4J6o", + "tokenIndex": 2, + "symbol": "DAI", + "decimals": 8, + "oracle": "CtJ8EkqLmeYyGB8s4jevpeNsvmD4dxVR2krfsDLcvV8Y", + "mintInfo": "A2EmRoXjscbwzbWS84rTnsvWwF2S9T7cdUNwshLWJcbf", + "banks": [ + { + "bankNum": 0, + "publicKey": "2AyZpjYWZf42ui1wzWJ642KWMCCY5YEU9GnKRWzQHLYW" + } + ], + "active": true + }, + { + "group": "78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX", + "mint": "So11111111111111111111111111111111111111112", + "tokenIndex": 4, + "symbol": "SOL", + "decimals": 9, + "oracle": "H6ARHf6YXhGYeQfUzQNGk6rDNnLBQKrenN712K4AQJEG", + "mintInfo": "EzQYaAhP3mdL4C8VQAAYxec9idCe31yCyAmzxWHLR4QJ", + "banks": [ + { + "bankNum": 0, + "publicKey": "FqEhSJSP3ao8RwRSekaAQ9sNQBSANhfb6EPtxQBByyh5" + } + ], + "active": true + }, + { + "group": "78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX", + "mint": "3NZ9JMVBmGAqocybic2c7LQCJScmgsAZ6vQqTDzcqmJh", + "tokenIndex": 8, + "symbol": "wBTC (Portal)", + "decimals": 8, + "oracle": "GVXRSBjFk6e6J3NbVPXohDJetcTjaeeuykUpbQF8UoMU", + "mintInfo": "59rgC1pa45EziDPyFgJgE7gbv7Dd7VaGmd2D93i1dtFk", + "banks": [ + { + "bankNum": 0, + "publicKey": "8gabXzwdPn5TvtuQvysh3CxVbjfNY3TZd5XEG5qnueUm" + } + ], + "active": true + }, + { + "group": "78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX", + "mint": "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263", + "tokenIndex": 7, + "symbol": "BONK", + "decimals": 5, + "oracle": "4SZ1qb4MtSUrZcoeaeQ3BDzVCyqxw3VwSFpPiMTmn4GE", + "mintInfo": "HweVqvYPKwcxb1vsFxz3qMWKu4wqYWBpCraTFvinJrZZ", + "banks": [ + { + "bankNum": 0, + "publicKey": "CwyxwCugWhWDMZTo2xCjVr3CqjLorpBMpqHKZCLYpPod" + } + ], + "active": true + } + ], + "stubOracles": [ + { + "group": "78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX", + "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + "publicKey": "7e7xcRkdb4uJ4A6xShYwBJrWJk5V4AmrEFqAPhSMvzSx" + } + ], + "serum3Markets": [ + { + "group": "78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX", + "publicKey": "8JTrmcsZYABLL2HQcNnFo7q7osCVAsRW7m9ggE9Dj9Dw", + "marketIndex": 0, + "name": "SOL/USDC", + "baseTokenIndex": 4, + "quoteTokenIndex": 0, + "serumProgram": "srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX", + "serumMarketExternal": "8BnEgHoWFysVcuFFX7QztDmzuH8r5ZFvyP3sYwn1XTh6", + "active": true + }, + { + "group": "78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX", + "publicKey": "Dp6vp6PfK29gvUMxbjMLhZHiTTFuiStGqvLrZNovvk17", + "marketIndex": 5, + "name": "wBTCpo/USDC", + "baseTokenIndex": 8, + "quoteTokenIndex": 0, + "serumProgram": "srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX", + "serumMarketExternal": "3BAKsQd3RuhZKES2DGysMhjBdwjZYKYmxRqnSMtZ4KSN", + "active": true + }, + { + "group": "78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX", + "publicKey": "Cq3Hs8WYcVHfvvnz1nv8MnAfZJGBrgj1PAhLtxYZwEBJ", + "marketIndex": 6, + "name": "MNGO/USDC", + "baseTokenIndex": 6, + "quoteTokenIndex": 0, + "serumProgram": "srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX", + "serumMarketExternal": "3NnxQvDcZXputNMxaxsGvqiKpqgPfSYXpNigZNFcknmD", + "active": true + }, + { + "group": "78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX", + "publicKey": "6M7Zrd9UtWc8bhfa6zVnsuN9QULskY6x5bPcZ543hVUQ", + "marketIndex": 2, + "name": "mSOL/USDC", + "baseTokenIndex": 5, + "quoteTokenIndex": 0, + "serumProgram": "srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX", + "serumMarketExternal": "9Lyhks5bQQxb9EyyX55NtgKQzpM4WK7JCmeaWuQ5MoXD", + "active": true + }, + { + "group": "78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX", + "publicKey": "CjjmHLg9tLFZ86jun4Gbi9c6r6ndZqEiVTevhAf3br7x", + "marketIndex": 1, + "name": "ETH/USDC", + "baseTokenIndex": 3, + "quoteTokenIndex": 0, + "serumProgram": "srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX", + "serumMarketExternal": "FZxi3yWkE5mMjyaZj6utmYL54QQYfMCKMcLaQZq4UwnA", + "active": false + }, + { + "group": "78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX", + "publicKey": "Da4TtMXAKv9uf8sNvhco3agbV9Bvj9S6otgG3Xf9yCv3", + "marketIndex": 3, + "name": "ETHpo/USDC", + "baseTokenIndex": 3, + "quoteTokenIndex": 0, + "serumProgram": "srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX", + "serumMarketExternal": "BbJgE7HZMaDp5NTYvRh5jZSkQPVDTU8ubPFtpogUkEj4", + "active": true + }, + { + "group": "78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX", + "publicKey": "4JptAVNgDYqn8XPcPQgVK8sy99bjyDuv5aTNnFuU8vC9", + "marketIndex": 4, + "name": "BONK/USDC", + "baseTokenIndex": 7, + "quoteTokenIndex": 0, + "serumProgram": "srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX", + "serumMarketExternal": "8PhnCfgqpgFM7ZJvttGdBVMXHuU4Q23ACxCvWkbs1M71", + "active": true + } + ] + }, + { + "publicKey": "Czdh6uGt9x7EW7TAvN7ZwheSwYjiv29z6VD4yavkmHqe", + "cluster": "MAINNET", + "name": "MAINNET.200", + "mangoProgramId": "4MangoMjqJ2firMokCjjGgoK8d4MXcrgL7XJaL3w6fVg", + "insuranceVault": "GuiM3jt34uuCQPNQkdaCJMZ5XeBHyemttRDBCY8HvxUV", + "insuranceMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + "insuranceMintDecimals": 6, + "perpMarkets": [ + { + "group": "Czdh6uGt9x7EW7TAvN7ZwheSwYjiv29z6VD4yavkmHqe", + "publicKey": "GqmHjhyhgpYkPgu5NtEq6FHGraLop8d1FHcuCqvQMwgo", + "marketIndex": 0, + "name": "MNGO-PERP", + "baseDecimals": 6, + "baseLotSize": 100000, + "quoteLotSize": 10, + "oracle": "95HSiuPDcg18S2peG1XkftwUConMmphAAGkHzLJxXTVF", + "active": false, + "settleTokenIndex": 0 + } + ], + "tokens": [ + { + "group": "Czdh6uGt9x7EW7TAvN7ZwheSwYjiv29z6VD4yavkmHqe", + "mint": "7vfCXTUXx5WJV5JADk17DUJ4ksgau7utNKj4b963voxs", + "tokenIndex": 1, + "symbol": "ETH", + "decimals": 8, + "oracle": "6cNTNmN5JiiJRDDmT9jVETRQHFer6CPnLu5sB7sJa4SW", + "mintInfo": "B4pt1G25pyEWpUZ2qKytRpCaGk8XsWCXXDYnDCinjfiv", + "banks": [ + { + "bankNum": 0, + "publicKey": "BXMgtNFW8w7H34MZaeavD45obZdLw2RA9A65LoifbMMg" + } + ], + "active": false + }, + { + "group": "Czdh6uGt9x7EW7TAvN7ZwheSwYjiv29z6VD4yavkmHqe", + "mint": "So11111111111111111111111111111111111111112", + "tokenIndex": 2, + "symbol": "SOL", + "decimals": 9, + "oracle": "CUefdnSmmA2iesNXLhMGhSBueDCTSX4NQUnAMFtwknL6", + "mintInfo": "A2nLp6LdEz4hwADNrpccvwqPH2Qw4CuwU6W4ZnsrLCba", + "banks": [ + { + "bankNum": 0, + "publicKey": "AW6BM2paRj7BhK26rLhTNeDT73YRdB1Eg78xNmd9WPJC" + } + ], + "active": false + }, + { + "group": "Czdh6uGt9x7EW7TAvN7ZwheSwYjiv29z6VD4yavkmHqe", + "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + "tokenIndex": 0, + "symbol": "USDC", + "decimals": 6, + "oracle": "4HxZ8spXvVKtuji4WNj1K4zEygUj8SPW3ZQnaCUFN11w", + "mintInfo": "8hW94pJYGCE1vYjinZtXgzy2FSFNLTaD9ckqG5ZXJ6Dk", + "banks": [ + { + "bankNum": 0, + "publicKey": "5TX5f6UA4vEyHmxrfhAQzubB9so6k6ojmYCcyYTzN1qK" + } + ], + "active": false + } + ], + "stubOracles": [ + { + "group": "Czdh6uGt9x7EW7TAvN7ZwheSwYjiv29z6VD4yavkmHqe", + "mint": "MangoCzJ36AjZyKwVj3VnYU4GTonjfVEnJmvvWaxLac", + "publicKey": "95HSiuPDcg18S2peG1XkftwUConMmphAAGkHzLJxXTVF" + }, + { + "group": "Czdh6uGt9x7EW7TAvN7ZwheSwYjiv29z6VD4yavkmHqe", + "mint": "7vfCXTUXx5WJV5JADk17DUJ4ksgau7utNKj4b963voxs", + "publicKey": "6cNTNmN5JiiJRDDmT9jVETRQHFer6CPnLu5sB7sJa4SW" + }, + { + "group": "Czdh6uGt9x7EW7TAvN7ZwheSwYjiv29z6VD4yavkmHqe", + "mint": "So11111111111111111111111111111111111111112", + "publicKey": "CUefdnSmmA2iesNXLhMGhSBueDCTSX4NQUnAMFtwknL6" + }, + { + "group": "Czdh6uGt9x7EW7TAvN7ZwheSwYjiv29z6VD4yavkmHqe", + "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + "publicKey": "4HxZ8spXvVKtuji4WNj1K4zEygUj8SPW3ZQnaCUFN11w" + } + ], + "serum3Markets": [ + { + "group": "Czdh6uGt9x7EW7TAvN7ZwheSwYjiv29z6VD4yavkmHqe", + "publicKey": "6FCuSyVdekzM5yoVE47ndps7sXcbRgbbXv56d5yU38S2", + "marketIndex": 1, + "name": "SOL/USDC", + "baseTokenIndex": 2, + "quoteTokenIndex": 0, + "serumProgram": "srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX", + "serumMarketExternal": "8BnEgHoWFysVcuFFX7QztDmzuH8r5ZFvyP3sYwn1XTh6", + "active": false + } + ] + } + ] +} diff --git a/pyserum/examples/markets.py b/pyserum/examples/markets.py new file mode 100644 index 0000000..e7b6083 --- /dev/null +++ b/pyserum/examples/markets.py @@ -0,0 +1,25 @@ +import asyncio +import json +import pathlib +from pyserum.market import AsyncMarket +from solana.rpc.async_api import AsyncClient +from solana.publickey import PublicKey + + +async def main(): + ids = json.load(open(pathlib.Path(__file__).parent / 'ids.json')) + + group = [group for group in ids['groups'] if group['publicKey'] == '78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX'][0] + + connection = AsyncClient('https://mango.rpcpool.com/0f9acc0d45173b51bf7d7e09c1e5') + + serum_markets = await asyncio.gather(*[ + AsyncMarket.load(connection, Publ(serum_market_config['serumMarketExternal']), Pubkey(serum_market_config['serumProgram'])) + for serum_market_config in group['serum3Markets'] + ]) + + print(serum_markets) + + +if __name__ == '__main__': + asyncio.run(main()) \ No newline at end of file diff --git a/pyserum/market/types.py b/pyserum/market/types.py index ddd435c..2844701 100644 --- a/pyserum/market/types.py +++ b/pyserum/market/types.py @@ -39,15 +39,15 @@ class AccountFlags(NamedTuple): class FilledOrder(NamedTuple): - order_id: int + client_order_id: int """""" - side: Side + side: str """""" price: float """""" size: float """""" - fee_cost: int + fee_cost: float """""" diff --git a/setup.py b/setup.py index 55bffdc..b8e181a 100644 --- a/setup.py +++ b/setup.py @@ -3,8 +3,13 @@ from setuptools import find_packages, setup setup( +<<<<<<< Updated upstream name="pyserum", version="0.6.0a", +======= + name="pyopenbook", + version="0.7.0a", +>>>>>>> Stashed changes author="serum-community", description="""Python client library for interacting with the Project Serum DEX.""", install_requires=[ @@ -16,7 +21,7 @@ setup( license="MIT", package_data={"pyserum": ["py.typed"]}, packages=find_packages(exclude=("tests", "tests.*")), - url="https://github.com/serum-community/pyserum", + url="https://github.com/blockworks-foundation/pyopenbook", zip_safe=False, # required per mypy classifiers=[ "Development Status :: 2 - Pre-Alpha",