[
  {
    "path": ".editorconfig",
    "content": "root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\nindent_style = space\ntrim_trailing_whitespace = true\ninsert_final_newline = true\n\n[*.{py}]\nindent_style = space\nindent_size = 4\n\n\n[*.json]\nindent_style = space\nindent_size = 2\n\n[*.yaml]\nindent_style = space\nindent_size = 2\nquote_type = single\n"
  },
  {
    "path": ".github/CODEOWNERS",
    "content": "# All PRs on any file must be reviewed by one of the following team members\n# Wildcard (*) for all files\n* @Polymarket/eng-platform\n"
  },
  {
    "path": ".github/CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as\ncontributors and maintainers pledge to making participation in our project and\nour community a harassment-free experience for everyone, regardless of age, body\nsize, disability, ethnicity, sex characteristics, gender identity and expression,\nlevel of experience, education, socioeconomic status, nationality, personal\nappearance, race, religion, or sexual identity and orientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment\ninclude:\n\n- Using welcoming and inclusive language\n- Being respectful of differing viewpoints and experiences\n- Gracefully accepting constructive criticism\n- Focusing on what is best for the community\n- Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n- The use of sexualized language or imagery and unwelcome sexual attention or\n  advances\n- Trolling, insulting/derogatory comments, and personal or political attacks\n- Public or private harassment\n- Publishing others' private information, such as a physical or electronic\n  address, without explicit permission\n- Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable\nbehavior and are expected to take appropriate and fair corrective action in\nresponse to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or\nreject comments, commits, code, wiki edits, issues, and other contributions\nthat are not aligned to this Code of Conduct, or to ban temporarily or\npermanently any contributor for other behaviors that they deem inappropriate,\nthreatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies within all project spaces, and it also applies when\nan individual is representing the project or its community in public spaces.\nExamples of representing a project or community include using an official\nproject e-mail address, posting via an official social media account, or acting\nas an appointed representative at an online or offline event. Representation of\na project may be further defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported by contacting the project team at [`liam@polymarket.com`](mailto:liam@polymarket.com). All\ncomplaints will be reviewed and investigated and will result in a response that\nis deemed necessary and appropriate to the circumstances. The project team is\nobligated to maintain confidentiality with regard to the reporter of an incident.\nFurther details of specific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good\nfaith may face temporary or permanent repercussions as determined by other\nmembers of the project's leadership.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,\navailable at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html\n\n[homepage]: https://www.contributor-covenant.org\n\nFor answers to common questions about this code of conduct, see\nhttps://www.contributor-covenant.org/faq\n"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "content": "## python-order-utils Monorepo Contribution Guide\n\nAll contributions to the python-order-utils are welcome and greatly appreciated! This document serves to outline the process for contributions and help you get set up.\n\n### Steps to get started\n\n1. Fork 'Polymarket/python-order-utils'\n2. Clone your fork\n3. Follow the [installation instructions](./README.md) in the monorepo's top level README.\n4. Open pull requests with the `[WIP]` flag against the `main` branch and include a description of the intended change in the PR description.\n\nBefore removing the `[WIP]` tag and submitting a PR for review, make sure that:\n\n- it passes our linter checks\n- the test suite passes for all packages\n- it passes our continuous integration tests\n- your fork is up to date with `main`\n\n### Branch structure & naming\n\nOur main branch, `main`, represents the current development state of the codebase. All pull requests should be opened against `main`.\n\nName your branch with the format `{fix | feat | refactor | chore }/{ description }`\n\n- A `fix` addresses a bug or other issue\n- A `feat` adds new functionality/interface surface area\n- A `refactor` changes no business logic or interfaces, but improves implementation\n- A `chore` addresses minor improvements or configuration changes\n\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "content": "<!-- Please use tags to indicate weather this issue is a bug, new feature, or discussion. -->\n<!-- Omit and add sections as necessary. -->\n\n## Overview\n\n<!-- One or two sentences. Essentially a expanded title. -->\n\n## Description\n\n<!-- Most information should be here. -->\n<!-- Include as much detail as necessary, and add sub-sections if needed. -->\n\n## Notes\n\n<!-- Additional info, links, considerations, etc. -->\n\n## Action items\n\n- [ ] Tag issue (bug, enhancement, feature, etc.)\n- [ ] Initial discussion/assign team member\n- [ ] Move discussion to PR if necessary and when ready\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "<!-- Delete any sub-sections not used rather than leaving them empty. -->\n\n## Overview\n\n<!-- Provide a brief (1-3 sentence) summary of the PR and it's purpose. May include plans if a [WIP]. -->\n\n## Description\n\n<!-- Describe in detail what changes you plan to make in this section and sub-sections. -->\n\n## Testing instructions\n\n<!-- If the PR changes how tests should be run, describe here. -->\n\n## Types of changes\n\n<!-- Check one of the boxes below, and add additional information as necessary. -->\n\n- [ ] Refactor/enhancement <!-- Non-breaking (patch bump). -->\n- [ ] Bug fix/behavior correction <!-- Non-breaking (patch bump). -->\n- [ ] New feature <!-- Non-breaking (minor bump), unless also specified as breaking. -->\n- [ ] Breaking change <!-- Feature or bug fix that changes behavior and requires a major version bump. -->\n- [ ] Other, additional <!-- Describe below/above. -->\n\n## Notes\n\n<!-- Include any additional comments, links, questions, or discussion items here. -->\n\n## Status\n\n<!-- Check any boxes that are already complete upon creation of the PR, and update whenever necessary. -->\n<!-- Make sure to check the \"Ready for review\" box when you are signing off on your changes for merge! -->\n\n- [ ] Prefix PR title with `[WIP]` if necessary (changes not yet made).\n- [ ] Add tests to cover changes as needed.\n- [ ] Update documentation/changelog as needed.\n- [ ] Verify all tests run correctly in CI and pass.\n- [ ] Ready for review/merge.\n"
  },
  {
    "path": ".github/workflows/release.yaml",
    "content": "name: Release\n\non:\n  release:\n    types: [published]\n\npermissions:\n  id-token: write\n\njobs:\n  release:\n    name: release\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout Code\n        uses: actions/checkout@v6\n        with:\n          persist-credentials: false\n\n      - uses: actions/setup-python@v5\n        with:\n          python-version: 3.9\n\n      - run: |\n          python -m pip install --upgrade pip\n          pip install -r requirements.txt\n          pip install -e .\n\n      - name: Run Tests\n        run: make test\n\n      # If your build system reads version dynamically, set it here.\n      # Common pattern: setuptools-scm or hatch-vcs will pick up the git tag automatically.\n      - name: Install build tooling\n        run: |\n          pip install build\n\n      - name: Build sdist and wheel\n        env:\n          # Many tools will respect this if you wire it up (optional)\n          PACKAGE_VERSION: ${{ github.ref_name }}\n        run: python -m build\n\n      - name: Publish to PyPI\n        uses: pypa/gh-action-pypi-publish@release/v1\n"
  },
  {
    "path": ".github/workflows/workflow.yaml",
    "content": "name: Test\n\non:\n  push:\n    branches: [main]\n  pull_request:\n\npermissions:\n  contents: read\n  pull-requests: read\n\njobs:\n  build-lint-test:\n    name: Test\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout Code\n        uses: actions/checkout@v6\n        with:\n          persist-credentials: false\n\n      - uses: actions/setup-python@v5\n        with:\n          python-version: 3.9\n\n      - run: |\n          python -m pip install --upgrade pip\n          pip install -r requirements.txt\n          pip install -e .\n\n      - name: Run Tests\n        run: make test\n"
  },
  {
    "path": ".gitignore",
    "content": ".idea/\n# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\npip-wheel-metadata/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# IPython\nprofile_default/\nipython_config.py\n\n# pyenv\n.python-version\n\n# pipenv\n#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.\n#   However, in case of collaboration, if having platform-specific dependencies or dependencies\n#   having no cross-platform support, pipenv may install dependencies that don't work, or not\n#   install all needed dependencies.\n#Pipfile.lock\n\n# PEP 582; used by e.g. github.com/David-OConnor/pyflow\n__pypackages__/\n\n# Celery stuff\ncelerybeat-schedule\ncelerybeat.pid\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n.dmypy.json\ndmypy.json\n\n# Pyre type checker\n.pyre/\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "### Contributing\n\nThanks for helping improve `py-clob-client`.\n\n- Fork the repo and create a feature branch.\n- Create focused edits with tests where applicable.\n- Run the examples to sanity‑check trading flows against a sandbox.\n- Open a PR with a clear description of the change and motivation.\n\nFor security issues, please see `SECURITY.md`.\n\n\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2022 Polymarket\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Makefile",
    "content": "init:\n\tpip install -r requirements.txt\n\ntest:\n\tpytest -s\n\nfmt:\n\tblack ./."
  },
  {
    "path": "README.md",
    "content": "# Polymarket Python CLOB Client\n\n<a href='https://pypi.org/project/py-clob-client'>\n    <img src='https://img.shields.io/pypi/v/py-clob-client.svg' alt='PyPI'/>\n</a>\n\nPython client for the Polymarket Central Limit Order Book (CLOB).\n\n## Documentation\n\n## Installation\n\n```bash\n# install from PyPI (Python 3.9>)\npip install py-clob-client\n```\n## Usage\n\nThe examples below are short and copy‑pasteable.\n\n- What you need:\n  - **Python 3.9+**\n  - **Private key** that owns funds on Polymarket\n  - Optional: a **proxy/funder address** if you use an email or smart‑contract wallet\n  - Tip: store secrets in environment variables (e.g., with `.env`)\n\n### Quickstart (read‑only)\n\n```python\nfrom py_clob_client.client import ClobClient\n\nclient = ClobClient(\"https://clob.polymarket.com\")  # Level 0 (no auth)\n\nok = client.get_ok()\ntime = client.get_server_time()\nprint(ok, time)\n```\n\n### Start trading (EOA)\n\n**Note**: If using MetaMask or hardware wallet, you must first set token allowances. See [Token Allowances section](#important-token-allowances-for-metamaskeoa-users) below.\n\n```python\nfrom py_clob_client.client import ClobClient\n\nHOST = \"https://clob.polymarket.com\"\nCHAIN_ID = 137\nPRIVATE_KEY = \"<your-private-key>\"\nFUNDER = \"<your-funder-address>\"\n\nclient = ClobClient(\n    HOST,  # The CLOB API endpoint\n    key=PRIVATE_KEY,  # Your wallet's private key\n    chain_id=CHAIN_ID,  # Polygon chain ID (137)\n    signature_type=1,  # 1 for email/Magic wallet signatures\n    funder=FUNDER  # Address that holds your funds\n)\nclient.set_api_creds(client.create_or_derive_api_creds())\n```\n\n### Start trading (proxy wallet)\n\nFor email/Magic or browser wallet proxies, you need to specify two additional parameters:\n\n#### Funder Address\nThe **funder address** is the actual address that holds your funds on Polymarket. When using proxy wallets (email wallets like Magic or browser extension wallets), the signing key differs from the address holding the funds. The funder address ensures orders are properly attributed to your funded account.\n\n#### Signature Types\nThe **signature_type** parameter tells the system how to verify your signatures:\n- `signature_type=0` (default): Standard EOA (Externally Owned Account) signatures - includes MetaMask, hardware wallets, and any wallet where you control the private key directly\n- `signature_type=1`: Email/Magic wallet signatures (delegated signing)\n- `signature_type=2`: Browser wallet proxy signatures (when using a proxy contract, not direct wallet connections)\n\n```python\nfrom py_clob_client.client import ClobClient\n\nHOST = \"https://clob.polymarket.com\"\nCHAIN_ID = 137\nPRIVATE_KEY = \"<your-private-key>\"\nPROXY_FUNDER = \"<your-proxy-or-smart-wallet-address>\"  # Address that holds your funds\n\nclient = ClobClient(\n    HOST,  # The CLOB API endpoint\n    key=PRIVATE_KEY,  # Your wallet's private key\n    chain_id=CHAIN_ID,  # Polygon chain ID (137)\n    signature_type=1,  # 1 for email/Magic wallet signatures\n    funder=PROXY_FUNDER  # Address that holds your funds\n)\nclient.set_api_creds(client.create_or_derive_api_creds())\n```\n\n### Find markets, prices, and orderbooks\n\n```python\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import BookParams\n\nclient = ClobClient(\"https://clob.polymarket.com\")  # read-only\n\ntoken_id = \"<token-id>\"  # Get a token ID: https://docs.polymarket.com/developers/gamma-markets-api/get-markets\n\nmid = client.get_midpoint(token_id)\nprice = client.get_price(token_id, side=\"BUY\")\nbook = client.get_order_book(token_id)\nbooks = client.get_order_books([BookParams(token_id=token_id)])\nprint(mid, price, book.market, len(books))\n```\n\n### Place a market order (buy by $ amount)\n\n**Note**: EOA/MetaMask users must set token allowances before trading. See [Token Allowances section](#important-token-allowances-for-metamaskeoa-users) below.\n\n```python\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import MarketOrderArgs, OrderType\nfrom py_clob_client.order_builder.constants import BUY\n\nHOST = \"https://clob.polymarket.com\"\nCHAIN_ID = 137\nPRIVATE_KEY = \"<your-private-key>\"\nFUNDER = \"<your-funder-address>\"\n\nclient = ClobClient(\n    HOST,  # The CLOB API endpoint\n    key=PRIVATE_KEY,  # Your wallet's private key\n    chain_id=CHAIN_ID,  # Polygon chain ID (137)\n    signature_type=1,  # 1 for email/Magic wallet signatures\n    funder=FUNDER  # Address that holds your funds\n)\nclient.set_api_creds(client.create_or_derive_api_creds())\n\nmo = MarketOrderArgs(token_id=\"<token-id>\", amount=25.0, side=BUY, order_type=OrderType.FOK)  # Get a token ID: https://docs.polymarket.com/developers/gamma-markets-api/get-markets\nsigned = client.create_market_order(mo)\nresp = client.post_order(signed, OrderType.FOK)\nprint(resp)\n```\n\n### Place a limit order (shares at a price)\n\n**Note**: EOA/MetaMask users must set token allowances before trading. See [Token Allowances section](#important-token-allowances-for-metamaskeoa-users) below.\n\n```python\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import OrderArgs, OrderType\nfrom py_clob_client.order_builder.constants import BUY\n\nHOST = \"https://clob.polymarket.com\"\nCHAIN_ID = 137\nPRIVATE_KEY = \"<your-private-key>\"\nFUNDER = \"<your-funder-address>\"\n\nclient = ClobClient(\n    HOST,  # The CLOB API endpoint\n    key=PRIVATE_KEY,  # Your wallet's private key\n    chain_id=CHAIN_ID,  # Polygon chain ID (137)\n    signature_type=1,  # 1 for email/Magic wallet signatures\n    funder=FUNDER  # Address that holds your funds\n)\nclient.set_api_creds(client.create_or_derive_api_creds())\n\norder = OrderArgs(token_id=\"<token-id>\", price=0.01, size=5.0, side=BUY)  # Get a token ID: https://docs.polymarket.com/developers/gamma-markets-api/get-markets\nsigned = client.create_order(order)\nresp = client.post_order(signed, OrderType.GTC)\nprint(resp)\n```\n\n### Manage orders\n\n**Note**: EOA/MetaMask users must set token allowances before trading. See [Token Allowances section](#important-token-allowances-for-metamaskeoa-users) below.\n\n```python\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import OpenOrderParams\n\nHOST = \"https://clob.polymarket.com\"\nCHAIN_ID = 137\nPRIVATE_KEY = \"<your-private-key>\"\nFUNDER = \"<your-funder-address>\"\n\nclient = ClobClient(\n    HOST,  # The CLOB API endpoint\n    key=PRIVATE_KEY,  # Your wallet's private key\n    chain_id=CHAIN_ID,  # Polygon chain ID (137)\n    signature_type=1,  # 1 for email/Magic wallet signatures\n    funder=FUNDER  # Address that holds your funds\n)\nclient.set_api_creds(client.create_or_derive_api_creds())\n\nopen_orders = client.get_orders(OpenOrderParams())\n\norder_id = open_orders[0][\"id\"] if open_orders else None\nif order_id:\n    client.cancel(order_id)\n\nclient.cancel_all()\n```\n\n### Markets (read‑only)\n\n```python\nfrom py_clob_client.client import ClobClient\n\nclient = ClobClient(\"https://clob.polymarket.com\")\nmarkets = client.get_simplified_markets()\nprint(markets[\"data\"][:1])\n```\n\n### User trades (requires auth)\n\n**Note**: EOA/MetaMask users must set token allowances before trading. See [Token Allowances section](#important-token-allowances-for-metamaskeoa-users) below.\n\n```python\nfrom py_clob_client.client import ClobClient\n\nHOST = \"https://clob.polymarket.com\"\nCHAIN_ID = 137\nPRIVATE_KEY = \"<your-private-key>\"\nFUNDER = \"<your-funder-address>\"\n\nclient = ClobClient(\n    HOST,  # The CLOB API endpoint\n    key=PRIVATE_KEY,  # Your wallet's private key\n    chain_id=CHAIN_ID,  # Polygon chain ID (137)\n    signature_type=1,  # 1 for email/Magic wallet signatures\n    funder=FUNDER  # Address that holds your funds\n)\nclient.set_api_creds(client.create_or_derive_api_creds())\n\nlast = client.get_last_trade_price(\"<token-id>\")\ntrades = client.get_trades()\nprint(last, len(trades))\n```\n\n## Important: Token Allowances for MetaMask/EOA Users\n\n### Do I need to set allowances?\n- **Using email/Magic wallet?** No action needed - allowances are set automatically.\n- **Using MetaMask or hardware wallet?** You need to set allowances before trading.\n\n### What are allowances?\nThink of allowances as permissions. Before Polymarket can move your funds to execute trades, you need to give the exchange contracts permission to access your USDC and conditional tokens.\n\n### Quick Setup\nYou need to approve two types of tokens:\n1. **USDC** (for deposits and trading)\n2. **Conditional Tokens** (the outcome tokens you trade)\n\nEach needs approval for the exchange contracts to work properly.\n\n### Setting Allowances\nHere's a simple breakdown of what needs to be approved:\n\n**For USDC (your trading currency):**\n- Token: `0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174`\n- Approve for these contracts:\n  - `0x4bFb41d5B3570DeFd03C39a9A4D8dE6Bd8B8982E` (Main exchange)\n  - `0xC5d563A36AE78145C45a50134d48A1215220f80a` (Neg risk markets)\n  - `0xd91E80cF2E7be2e162c6513ceD06f1dD0dA35296` (Neg risk adapter)\n\n**For Conditional Tokens (your outcome tokens):**\n- Token: `0x4D97DCd97eC945f40cF65F87097ACe5EA0476045`\n- Approve for the same three contracts above\n\n### Example Code\nSee [this Python example](https://gist.github.com/poly-rodr/44313920481de58d5a3f6d1f8226bd5e) for setting allowances programmatically.\n\n**Pro tip**: You only need to set these once per wallet. After that, you can trade freely.\n\n## Notes\n- To discover token IDs, use the Markets API Explorer: [Get Markets](https://docs.polymarket.com/developers/gamma-markets-api/get-markets).\n- Prices are in dollars from 0.00 to 1.00. Shares are whole or fractional units of the outcome token.\n\nSee [/example](/examples) for more."
  },
  {
    "path": "SECURITY.md",
    "content": "### Security\n\nIf you believe you’ve found a security vulnerability, please email security@polymarket.com. Do not open a public issue.\n\nInclude:\n- A description of the issue and potential impact\n- Steps to reproduce or a minimal proof of concept\n- Any relevant logs or environment details\n\nWe will acknowledge receipt, investigate, and provide guidance on next steps.\n\n\n"
  },
  {
    "path": "examples/GTD_order.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds, OrderArgs, OrderType\nfrom dotenv import load_dotenv\nfrom py_clob_client.constants import AMOY\n\nfrom py_clob_client.order_builder.constants import BUY\n\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    chain_id = AMOY\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    # Create and sign a limit order buying 100 YES tokens for 0.50c each\n    order_args = OrderArgs(\n        price=0.50,\n        size=100.0,\n        side=BUY,\n        token_id=\"71321045679252212594626385532706912750332728571942532289631379312455583992563\",\n        expiration=\"1000000000000\",\n    )\n    signed_order = client.create_order(order_args)\n    resp = client.post_order(signed_order, OrderType.GTD)\n    print(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/are_orders_scoring.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds, OrdersScoringParams\nfrom dotenv import load_dotenv\nfrom py_clob_client.constants import AMOY\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    chain_id = AMOY\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    scoring = client.are_orders_scoring(\n        OrdersScoringParams(\n            orderIds=[\n                \"0xb816482a5187a3d3db49cbaf6fe3ddf24f53e6c712b5a4bf5e01d0ec7b11dabc\"\n            ]\n        )\n    )\n    print(scoring)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/cancel_all.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds\nfrom dotenv import load_dotenv\n\nfrom py_clob_client.constants import AMOY\n\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    chain_id = AMOY\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    resp = client.cancel_all()\n    print(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/cancel_market_orders.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds\nfrom dotenv import load_dotenv\n\nfrom py_clob_client.constants import AMOY\n\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    chain_id = AMOY\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    resp = client.cancel_market_orders(market=\"0xaaa\", asset_id=\"100\")\n    print(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/cancel_order.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds\nfrom dotenv import load_dotenv\n\nfrom py_clob_client.constants import AMOY\n\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    chain_id = AMOY\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    resp = client.cancel(order_id=\"0xaaaa\")\n    print(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/cancel_orders.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds\nfrom dotenv import load_dotenv\n\nfrom py_clob_client.constants import AMOY\n\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    chain_id = AMOY\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    resp = client.cancel_orders([\"0xaaaa\"])\n    print(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/create_api_key.py",
    "content": "from dotenv import load_dotenv\nimport os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.constants import AMOY\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    chain_id = AMOY\n    client = ClobClient(host, key=key, chain_id=chain_id)\n\n    print(client.create_api_key())\n\n\nmain()\n"
  },
  {
    "path": "examples/create_readonly_api_key.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds\nfrom dotenv import load_dotenv\n\nfrom py_clob_client.constants import AMOY\n\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    chain_id = AMOY\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    resp = client.create_readonly_api_key()\n    print(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/delete_readonly_api_key.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds\nfrom dotenv import load_dotenv\n\nfrom py_clob_client.constants import AMOY\n\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    chain_id = AMOY\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    # Replace with the readonly API key you want to delete\n    readonly_api_key = \"019aee85-4ea1-79cd-a287-8508f21209a2\"\n\n    resp = client.delete_readonly_api_key(readonly_api_key)\n    print(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/derive_api_key.py",
    "content": "from dotenv import load_dotenv\nimport os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.constants import AMOY\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    chain_id = AMOY\n    client = ClobClient(host, key=key, chain_id=chain_id)\n\n    print(client.derive_api_key())\n\n\nmain()\n"
  },
  {
    "path": "examples/drop_notifications.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\n\nfrom py_clob_client.clob_types import ApiCreds, DropNotificationParams\nfrom dotenv import load_dotenv\n\nfrom py_clob_client.constants import AMOY\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    chain_id = AMOY\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    print(client.drop_notifications(params=DropNotificationParams(ids=[\"1\", \"2\"])))\n\n\nmain()\n"
  },
  {
    "path": "examples/get_api_keys.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds\nfrom dotenv import load_dotenv\n\nfrom py_clob_client.constants import AMOY\n\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    chain_id = AMOY\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    print(client.get_api_keys())\n\n\nmain()\n"
  },
  {
    "path": "examples/get_balance_allowance.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds, BalanceAllowanceParams, AssetType\nfrom dotenv import load_dotenv\nfrom py_clob_client.constants import AMOY\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    chain_id = AMOY\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    collateral = client.get_balance_allowance(\n        params=BalanceAllowanceParams(asset_type=AssetType.COLLATERAL)\n    )\n    print(collateral)\n\n    yes = client.get_balance_allowance(\n        params=BalanceAllowanceParams(\n            asset_type=AssetType.CONDITIONAL,\n            token_id=\"52114319501245915516055106046884209969926127482827954674443846427813813222426\",\n        )\n    )\n    print(yes)\n\n    no = client.get_balance_allowance(\n        params=BalanceAllowanceParams(\n            asset_type=AssetType.CONDITIONAL,\n            token_id=\"71321045679252212594626385532706912750332728571942532289631379312455583992563\",\n        )\n    )\n    print(no)\n\n\nmain()\n"
  },
  {
    "path": "examples/get_builder_trades.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds, TradeParams\nfrom py_builder_signing_sdk.config import BuilderConfig, BuilderApiKeyCreds\n\nfrom dotenv import load_dotenv\nfrom pprint import pprint\n\nfrom py_clob_client.constants import AMOY\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    chain_id = AMOY\n    builder_config = BuilderConfig(\n        local_builder_creds=BuilderApiKeyCreds(\n            key=os.getenv(\"BUILDER_API_KEY\"),\n            secret=os.getenv(\"BUILDER_SECRET\"),\n            passphrase=os.getenv(\"BUILDER_PASS_PHRASE\"),\n        )\n    )\n\n    client = ClobClient(\n        host, key=key, chain_id=chain_id, creds=creds, builder_config=builder_config\n    )\n\n    resp = client.get_builder_trades()\n    pprint(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/get_closed_only_mode.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds\nfrom dotenv import load_dotenv\n\nfrom py_clob_client.constants import AMOY\n\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    chain_id = AMOY\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    print(client.get_closed_only_mode())\n\n\nmain()\n"
  },
  {
    "path": "examples/get_last_trade_price.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom dotenv import load_dotenv\nfrom pprint import pprint\n\nfrom py_clob_client.constants import AMOY\n\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    chain_id = AMOY\n    client = ClobClient(host, key=key, chain_id=chain_id)\n\n    resp = client.get_last_trade_price(\n        \"71321045679252212594626385532706912750332728571942532289631379312455583992563\"\n    )\n    pprint(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/get_last_trades_prices.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import BookParams\nfrom dotenv import load_dotenv\nfrom pprint import pprint\n\nfrom py_clob_client.constants import AMOY\n\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    chain_id = AMOY\n    client = ClobClient(host, key=key, chain_id=chain_id)\n\n    resp = client.get_last_trades_prices(\n        params=[\n            BookParams(\n                token_id=\"71321045679252212594626385532706912750332728571942532289631379312455583992563\"\n            ),\n            BookParams(\n                token_id=\"52114319501245915516055106046884209969926127482827954674443846427813813222426\"\n            ),\n        ]\n    )\n    pprint(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/get_market_trades_events.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds\nfrom dotenv import load_dotenv\nfrom py_clob_client.constants import AMOY\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    chain_id = AMOY\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    print(client.get_market_trades_events(\"condition_id\"))\n\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/get_markets.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds\nfrom dotenv import load_dotenv\nfrom py_clob_client.constants import AMOY\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    chain_id = AMOY\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    print(client.get_markets())\n    print(client.get_simplified_markets())\n    print(client.get_sampling_markets())\n    print(client.get_sampling_simplified_markets())\n    print(client.get_market(\"condition_id\"))\n\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/get_mid_market_price.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds\nfrom dotenv import load_dotenv\nfrom py_clob_client.constants import AMOY\n\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    chain_id = AMOY\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    resp = client.get_midpoint(\n        \"71321045679252212594626385532706912750332728571942532289631379312455583992563\"\n    )\n    # {'mid': '0.55'}\n    print(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/get_mid_markets_prices.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds, BookParams\nfrom dotenv import load_dotenv\nfrom py_clob_client.constants import AMOY\n\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    chain_id = AMOY\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    resp = client.get_midpoints(\n        params=[\n            BookParams(\n                token_id=\"71321045679252212594626385532706912750332728571942532289631379312455583992563\"\n            ),\n            BookParams(\n                token_id=\"52114319501245915516055106046884209969926127482827954674443846427813813222426\"\n            ),\n        ]\n    )\n    print(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/get_notifications.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\n\nfrom py_clob_client.clob_types import ApiCreds\nfrom dotenv import load_dotenv\n\nfrom py_clob_client.constants import AMOY\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    chain_id = AMOY\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    print(client.get_notifications())\n\n\nmain()\n"
  },
  {
    "path": "examples/get_ok.py",
    "content": "from py_clob_client.client import ClobClient\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    client = ClobClient(host)\n\n    print(client.get_ok())\n\n    pass\n\n\nmain()\n"
  },
  {
    "path": "examples/get_open_orders_with_readonly_key.py",
    "content": "import os\n\nimport httpx\nfrom dotenv import load_dotenv\n\nfrom py_clob_client.endpoints import ORDERS\n\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n\n    # Replace with your address and readonly API key\n    address = os.getenv(\"POLY_ADDRESS\", \"0xc68576124eC1fF645F81a560E14003C8deF2e8fb\")\n    readonly_api_key = os.getenv(\"CLOB_READONLY_API_KEY\", \"019aee85-4ea1-79cd-a287-8508f21209a2\")\n\n    # Get all open orders for the address\n    response = httpx.get(\n        f\"{host}{ORDERS}\",\n        headers={\n            \"POLY_READONLY_API_KEY\": readonly_api_key,\n            \"POLY_ADDRESS\": address,\n            \"Content-Type\": \"application/json\",\n        },\n        params={\n            \"maker_address\": address,\n        },\n        follow_redirects=True,\n    )\n    if response.status_code == 200:\n        print(response.json())\n    else:\n        print(f\"Error {response.status_code}: {response.text}\")\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/get_order.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds\nfrom dotenv import load_dotenv\nfrom py_clob_client.constants import AMOY\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    chain_id = AMOY\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    resp = client.get_order(\n        \"0xf5667d8509bdc78ac43676fe2c980da1365c471ee92153820c89c488fc15d539\"\n    )\n    print(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/get_orderbook.py",
    "content": "from py_clob_client.client import ClobClient\nimport os\nfrom dotenv import load_dotenv\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    client = ClobClient(host)\n\n    orderbook = client.get_order_book(\n        \"34097058504275310827233323421517291090691602969494795225921954353603704046623\"\n    )\n    print(\"orderbook\", orderbook)\n\n    hash = client.get_order_book_hash(orderbook)\n    print(\"orderbook hash\", hash)\n\n\nmain()\n"
  },
  {
    "path": "examples/get_orderbooks.py",
    "content": "from py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import BookParams\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    client = ClobClient(host)\n\n    resp = client.get_order_books(\n        params=[\n            BookParams(\n                token_id=\"71321045679252212594626385532706912750332728571942532289631379312455583992563\"\n            ),\n            BookParams(\n                token_id=\"52114319501245915516055106046884209969926127482827954674443846427813813222426\"\n            ),\n        ]\n    )\n    print(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/get_orders.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds, OpenOrderParams\nfrom dotenv import load_dotenv\nfrom py_clob_client.constants import AMOY\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    chain_id = AMOY\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    resp = client.get_orders(\n        OpenOrderParams(\n            market=\"0x37a6a2dd9f3469495d9ec2467b0a764c5905371a294ce544bc3b2c944eb3e84a\",\n        )\n    )\n    print(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/get_price.py",
    "content": "from py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import BookParams\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    client = ClobClient(host)\n\n    resp = client.get_price(\n        \"71321045679252212594626385532706912750332728571942532289631379312455583992563\",\n        \"BUY\",\n    )\n    print(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/get_prices.py",
    "content": "from py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import BookParams\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    client = ClobClient(host)\n\n    resp = client.get_prices(\n        params=[\n            BookParams(\n                token_id=\"71321045679252212594626385532706912750332728571942532289631379312455583992563\",\n                side=\"BUY\",\n            ),\n            BookParams(\n                token_id=\"71321045679252212594626385532706912750332728571942532289631379312455583992563\",\n                side=\"SELL\",\n            ),\n            BookParams(\n                token_id=\"52114319501245915516055106046884209969926127482827954674443846427813813222426\",\n                side=\"BUY\",\n            ),\n            BookParams(\n                token_id=\"52114319501245915516055106046884209969926127482827954674443846427813813222426\",\n                side=\"SELL\",\n            ),\n        ]\n    )\n    print(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/get_readonly_api_keys.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds\nfrom dotenv import load_dotenv\n\nfrom py_clob_client.constants import AMOY\n\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    chain_id = AMOY\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    resp = client.get_readonly_api_keys()\n    print(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/get_server_time.py",
    "content": "from py_clob_client.client import ClobClient\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    client = ClobClient(host)\n\n    print(client.get_server_time())\n\n\nmain()\n"
  },
  {
    "path": "examples/get_spread.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds\nfrom dotenv import load_dotenv\nfrom py_clob_client.constants import AMOY\n\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    chain_id = AMOY\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    resp = client.get_spread(\n        \"71321045679252212594626385532706912750332728571942532289631379312455583992563\"\n    )\n    print(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/get_spreads.py",
    "content": "from py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import BookParams\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    client = ClobClient(host)\n\n    resp = client.get_spreads(\n        params=[\n            BookParams(\n                token_id=\"71321045679252212594626385532706912750332728571942532289631379312455583992563\"\n            ),\n            BookParams(\n                token_id=\"52114319501245915516055106046884209969926127482827954674443846427813813222426\"\n            ),\n        ]\n    )\n    print(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/get_trades.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds, TradeParams\nfrom dotenv import load_dotenv\nfrom pprint import pprint\n\nfrom py_clob_client.constants import AMOY\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    chain_id = AMOY\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    resp = client.get_trades(\n        TradeParams(\n            maker_address=client.get_address(),\n            market=\"0x5f65177b394277fd294cd75650044e32ba009a95022d88a0c1d565897d72f8f1\",\n        )\n    )\n    pprint(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/is_order_scoring.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds, OrderScoringParams\nfrom dotenv import load_dotenv\nfrom py_clob_client.constants import AMOY\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    chain_id = AMOY\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    scoring = client.is_order_scoring(\n        OrderScoringParams(\n            orderId=\"0xb816482a5187a3d3db49cbaf6fe3ddf24f53e6c712b5a4bf5e01d0ec7b11dabc\"\n        )\n    )\n    print(scoring)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/market_buy_order.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds, MarketOrderArgs, OrderType\nfrom dotenv import load_dotenv\nfrom py_clob_client.constants import AMOY\nfrom py_clob_client.order_builder.constants import BUY\n\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    chain_id = AMOY\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    # create a market buy order for the equivalent of 100 USDC at the market price\n    order_args = MarketOrderArgs(\n        token_id=\"71321045679252212594626385532706912750332728571942532289631379312455583992563\",\n        amount=100,  # $$$\n        side=BUY,\n    )\n    signed_order = client.create_market_order(order_args)\n    resp = client.post_order(signed_order, orderType=OrderType.FOK)\n    print(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/market_sell_order.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds, MarketOrderArgs, OrderType\nfrom dotenv import load_dotenv\nfrom py_clob_client.constants import AMOY\nfrom py_clob_client.order_builder.constants import SELL\n\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    chain_id = AMOY\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    # create a market buy order for the equivalent of 100 USDC at the market price\n    order_args = MarketOrderArgs(\n        token_id=\"71321045679252212594626385532706912750332728571942532289631379312455583992563\",\n        amount=100,  # SHARES\n        side=SELL,\n    )\n    signed_order = client.create_market_order(order_args)\n    resp = client.post_order(signed_order, orderType=OrderType.FOK)\n    print(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/order.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds, OrderArgs\nfrom dotenv import load_dotenv\nfrom py_clob_client.constants import AMOY\n\nfrom py_clob_client.order_builder.constants import BUY\n\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    chain_id = int(os.getenv(\"CHAIN_ID\", AMOY))\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    # Create and sign a limit order buying 100 YES tokens for 0.0005 each\n    order_args = OrderArgs(\n        price=0.0005,\n        size=20,\n        side=BUY,\n        token_id=\"71321045679252212594626385532706912750332728571942532289631379312455583992563\",\n    )\n    signed_order = client.create_order(order_args)\n    resp = client.post_order(signed_order)\n    print(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/orders.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds, OrderArgs, PostOrdersArgs, OrderType\nfrom dotenv import load_dotenv\nfrom py_clob_client.constants import AMOY\n\nfrom py_clob_client.order_builder.constants import BUY, SELL\n\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    chain_id = AMOY\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    resp = client.post_orders(\n        [\n            PostOrdersArgs(\n                # Create and sign a limit order buying 100 YES tokens for 0.50 each\n                order=client.create_order(\n                    OrderArgs(\n                        price=0.5,\n                        size=100,\n                        side=BUY,\n                        token_id=\"71321045679252212594626385532706912750332728571942532289631379312455583992563\",\n                    )\n                ),\n                orderType=OrderType.GTC,  # Good 'Til Cancelled\n                postOnly=False,\n            ),\n            PostOrdersArgs(\n                # Create and sign a limit order selling 200 NO tokens for 0.25 each\n                order=client.create_order(\n                    OrderArgs(\n                        price=0.25,\n                        size=200,\n                        side=SELL,\n                        token_id=\"52114319501245915516055106046884209969926127482827954674443846427813813222426\",\n                    )\n                ),\n                orderType=OrderType.GTC,  # Good 'Til Cancelled\n                postOnly=False, # Defaults to false, can be set to true to avoid matching on post\n            ),\n        ]\n    )\n    print(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/place_builder_order.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds, OrderArgs\nfrom dotenv import load_dotenv\nfrom py_clob_client.constants import POLYGON\n\nfrom py_clob_client.order_builder.constants import BUY\nfrom py_builder_signing_sdk.config import BuilderConfig, BuilderApiKeyCreds\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    chain_id = POLYGON\n    builder_config = BuilderConfig(\n        local_builder_creds=BuilderApiKeyCreds(\n            key=os.getenv(\"BUILDER_API_KEY\"),\n            secret=os.getenv(\"BUILDER_SECRET\"),\n            passphrase=os.getenv(\"BUILDER_PASS_PHRASE\"),\n        )\n    )\n    client = ClobClient(\n        host, key=key, chain_id=chain_id, creds=creds, builder_config=builder_config\n    )\n\n    order_args = OrderArgs(\n        price=0.06,\n        size=20,\n        side=BUY,\n        token_id=\"104173557214744537570424345347209544585775842950109756851652855913015295701992\",\n    )\n    signed_order = client.create_order(order_args)\n    resp = client.post_order(signed_order)\n    print(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/post_heartbeat.py",
    "content": "import os\nimport time\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds\nfrom dotenv import load_dotenv\n\nfrom py_clob_client.constants import AMOY\n\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    chain_id = AMOY\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    heartbeat_id = None\n    while True:\n        resp = client.post_heartbeat(heartbeat_id)\n        print(resp)\n        heartbeat_id = resp[\"heartbeat_id\"]\n        # Wait 5 seconds before sending the next heartbeat\n        time.sleep(5)\n    # Example output on invalid heartbeat ID once heartbeats started:\n    # PolyApiException[status_code=400, error_message={\"error\":\"Invalid Heartbeat ID\",\"heartbeat_id\":\"7f335bb3-36cb-433d-b8ff-4f9a2233d833\"}\n\n\n\n\nmain()\n"
  },
  {
    "path": "examples/post_only_order.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds, OrderArgs\nfrom dotenv import load_dotenv\nfrom py_clob_client.constants import AMOY\nfrom py_clob_client.clob_types import (OrderType)\nfrom py_clob_client.order_builder.constants import BUY, SELL\n\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    chain_id = AMOY\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n    order_args = OrderArgs(\n        price=0.4,\n        size=5,\n        side=BUY,\n        token_id=\"102200530570339469387764365697342150521708074903735836831685780223982723092914\",\n    )\n    order = client.create_order(order_args)\n    resp = client.post_order(order, orderType=OrderType.GTC, post_only=True)\n    print(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/rfq_accept_quote.py",
    "content": "import os\nimport time\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds\nfrom py_clob_client.rfq import AcceptQuoteParams\nfrom py_clob_client.constants import AMOY\nfrom dotenv import load_dotenv\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob-staging.polymarket.com/\")\n    chain_id = int(os.getenv(\"CHAIN_ID\", AMOY))\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    # Accept a quote (requester side)\n    # Refers to the order expiry, not request expiry. For request expiry, check the server RFQ config.\n    expiration = int(time.time()) + 3600\n\n    accept_params = AcceptQuoteParams(\n        request_id=\"019b04a4-2f4b-73b3-8fa2-2760b2754601\",\n        quote_id=\"019b04a7-5205-7eeb-9a48-227e8d53bd17\",\n        expiration=expiration,\n    )\n\n    resp = client.rfq.accept_rfq_quote(accept_params)\n    print(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/rfq_approve_order.py",
    "content": "import os\nimport time\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds\nfrom py_clob_client.rfq import ApproveOrderParams\nfrom py_clob_client.constants import AMOY\nfrom dotenv import load_dotenv\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob-staging.polymarket.com/\")\n    chain_id = int(os.getenv(\"CHAIN_ID\", AMOY))\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    # Approve an order (quoter side)\n    # Refers to the order expiry, not quote expiry. For quote expiry, check the server RFQ config.\n    expiration = int(time.time()) + 3600\n\n    approve_params = ApproveOrderParams(\n        request_id=\"019b04a4-2f4b-73b3-8fa2-2760b2754601\",\n        quote_id=\"019b04a7-5205-7eeb-9a48-227e8d53bd17\",\n        expiration=expiration,\n    )\n\n    resp = client.rfq.approve_rfq_order(approve_params)\n    print(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/rfq_cancel_quote.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds\nfrom py_clob_client.rfq import CancelRfqQuoteParams\nfrom py_clob_client.constants import AMOY\nfrom dotenv import load_dotenv\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob-staging.polymarket.com/\")\n    chain_id = int(os.getenv(\"CHAIN_ID\", AMOY))\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    resp = client.rfq.cancel_rfq_quote(\n        CancelRfqQuoteParams(quote_id=\"0197656d-56ee-74a4-a06a-3b179121f3bf\")\n    )\n    print(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/rfq_cancel_request.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds\nfrom py_clob_client.rfq import CancelRfqRequestParams\nfrom py_clob_client.constants import AMOY\nfrom dotenv import load_dotenv\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob-staging.polymarket.com/\")\n    chain_id = int(os.getenv(\"CHAIN_ID\", AMOY))\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    resp = client.rfq.cancel_rfq_request(\n        CancelRfqRequestParams(request_id=\"0197656d-56ee-74a4-a06a-3b179121f3bf\")\n    )\n    print(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/rfq_config.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds\nfrom py_clob_client.constants import AMOY\nfrom dotenv import load_dotenv\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob-staging.polymarket.com/\")\n    chain_id = int(os.getenv(\"CHAIN_ID\", AMOY))\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    resp = client.rfq.rfq_config()\n    print(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/rfq_create_quote.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds\nfrom py_clob_client.rfq import RfqUserQuote\nfrom py_clob_client.order_builder.constants import SELL\nfrom py_clob_client.constants import AMOY\nfrom dotenv import load_dotenv\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob-staging.polymarket.com/\")\n    chain_id = int(os.getenv(\"CHAIN_ID\", AMOY))\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    # Create a quote for an RFQ request to SELL 40 tokens at $0.50 each\n    user_quote = RfqUserQuote(\n        request_id=\"019b04a4-2f4b-73b3-8fa2-2760b2754601\",\n        token_id=\"34097058504275310827233323421517291090691602969494795225921954353603704046623\",\n        price=0.50,\n        side=SELL,\n        size=40.0,\n    )\n\n    resp = client.rfq.create_rfq_quote(user_quote)\n    print(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/rfq_create_request.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds, PartialCreateOrderOptions\nfrom py_clob_client.rfq import RfqUserRequest\nfrom py_clob_client.order_builder.constants import BUY\nfrom py_clob_client.constants import AMOY\nfrom dotenv import load_dotenv\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob-staging.polymarket.com/\")\n    chain_id = int(os.getenv(\"CHAIN_ID\", AMOY))\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    # Create an RFQ request to BUY 100 tokens at $0.50 each\n    user_request = RfqUserRequest(\n        token_id=\"34097058504275310827233323421517291090691602969494795225921954353603704046623\",\n        price=0.50,\n        side=BUY,\n        size=40.0,\n    )\n\n    resp = client.rfq.create_rfq_request(user_request, options=PartialCreateOrderOptions(tick_size=0.01))\n    print(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/rfq_full_flow.py",
    "content": "\"\"\"\nRFQ Full Flow Example\n\nThis script demonstrates the complete RFQ (Request for Quote) flow between two parties.\nFor a single manual test, edit the REQUEST_PARAMS and QUOTE_PARAMS at the top.\nThis example assumes two EOA wallets.\nFor using different signature types, you need to set the funder address signature type when initializing the client.\n\nUsage: python rfq_full_flow.py\n\nTROUBLESHOOTING \"invalid request\" errors:\n1. Ensure the tokenID exists in your environment (staging vs production)\n2. Check that the market is active, RFQ-enabled and has liquidity\n3. Verify your quoter has been whitelisted\n4. Run `python examples/get_markets.py` to get valid token IDs\n5. Make sure you're using the correct CLOB_API_URL for your environment\n\n\nENV VARIABLES:\nREQUESTER_PK: Private key of the requester\nREQUESTER_API_KEY: API key of the requester\nREQUESTER_SECRET: Secret of the requester\nREQUESTER_PASS_PHRASE: Passphrase of the requester\nQUOTER_PK: Private key of the quoter\nQUOTER_API_KEY: API key of the quoter\nQUOTER_SECRET: Secret of the quoter\nQUOTER_PASS_PHRASE: Passphrase of the quoter\nCHAIN_ID: Chain ID of the network\nCLOB_API_URL: URL of the CLOB API\n\"\"\"\n\nimport os\nimport time\n\nfrom dotenv import load_dotenv\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds\nfrom py_clob_client.rfq import RfqUserRequest, RfqUserQuote, AcceptQuoteParams, ApproveOrderParams\nfrom py_clob_client.order_builder.constants import BUY, SELL\nfrom py_clob_client.constants import AMOY\n\nload_dotenv()\n\n# ============================================\n# RFQ REQUEST PARAMETERS (REQUESTER) - EDIT THESE\n# ============================================\nTOKEN_ID = \"34097058504275310827233323421517291090691602969494795225921954353603704046623\"\n\nUSER_REQUEST = RfqUserRequest(\n    token_id=TOKEN_ID,\n    price=0.50,       # Price per token (e.g., 0.50 = 50 cents)\n    side=BUY,         # BUY or SELL\n    size=100.0,       # Number of tokens\n)\n\n# ============================================\n# RFQ QUOTE PARAMETERS (QUOTER) - EDIT THESE\n# ============================================\nQUOTE_TOKEN_ID = TOKEN_ID  # Token ID for the quote (defaults to same as request)\nQUOTE_PRICE = 0.50  # Quoted price per token\nQUOTE_SIZE = 100.0  # Number of tokens to quote\nQUOTE_SIDE = SELL   # BUY or SELL\n\n# ============================================\n# EXPIRATION CONFIGURATION\n# ============================================\nEXPIRATION_SECONDS = 3600  # 1 hour\n\n\ndef main():\n    # ============================================\n    # Setup: Initialize both requester and quoter clients\n    # ============================================\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob-staging.polymarket.com/\")\n    chain_id = int(os.getenv(\"CHAIN_ID\", AMOY))\n\n    # Requester (creates the request and accepts the quote)\n    requester_key = os.getenv(\"REQUESTER_PK\")\n    requester_creds = ApiCreds(\n        api_key=os.getenv(\"REQUESTER_API_KEY\"),\n        api_secret=os.getenv(\"REQUESTER_SECRET\"),\n        api_passphrase=os.getenv(\"REQUESTER_PASS_PHRASE\"),\n    )\n    requester_client = ClobClient(host, key=requester_key, chain_id=chain_id, creds=requester_creds)\n\n    # Quoter (creates the quote and approves the order)\n    quoter_key = os.getenv(\"QUOTER_PK\")\n    quoter_creds = ApiCreds(\n        api_key=os.getenv(\"QUOTER_API_KEY\"),\n        api_secret=os.getenv(\"QUOTER_SECRET\"),\n        api_passphrase=os.getenv(\"QUOTER_PASS_PHRASE\"),\n    )\n    quoter_client = ClobClient(host, key=quoter_key, chain_id=chain_id, creds=quoter_creds)\n\n    print(\"=\" * 60)\n    print(\"RFQ Full Flow\")\n    print(\"=\" * 60)\n    print(f\"Host: {host}\")\n    print(f\"Chain ID: {chain_id}\")\n    print(\"=\" * 60)\n    \n    # ============================================\n    # Step 1: Requester creates RFQ request\n    # ============================================\n    print(\"\\n[Step 1] Requester creating RFQ request...\")\n    print(f\"  Token ID: {USER_REQUEST.token_id}\")\n    print(f\"  Side: {USER_REQUEST.side}\")\n    print(f\"  Size: {USER_REQUEST.size}\")\n    print(f\"  Price: {USER_REQUEST.price}\")\n\n    rfq_request_response = requester_client.rfq.create_rfq_request(USER_REQUEST)\n\n    # Check for errors\n    if rfq_request_response.get(\"error\"):\n        print(f\"Failed to create request. Error: {rfq_request_response['error']}\")\n        raise Exception(f\"Request creation failed: {rfq_request_response['error']}\")\n\n    request_id = rfq_request_response.get(\"requestId\")\n    if not request_id:\n        print(f\"Failed to create request. Response: {rfq_request_response}\")\n        raise Exception(\"Request creation failed - no requestId returned\")\n\n    print(\"Request created successfully!\")\n    print(f\"  Request ID: {request_id}\")\n    print(f\"  Full response: {rfq_request_response}\")\n    \n    # ============================================\n    # Step 2: Quoter creates quote for the request\n    # ============================================\n    print(\"\\n[Step 2] Quoter creating quote for request...\")\n    print(f\"  Request ID: {request_id}\")\n    print(f\"  Token ID: {QUOTE_TOKEN_ID}\")\n    print(f\"  Price: {QUOTE_PRICE}\")\n    print(f\"  Side: {QUOTE_SIDE}\")\n    print(f\"  Size: {QUOTE_SIZE}\")\n\n    user_quote = RfqUserQuote(\n        request_id=request_id,\n        token_id=QUOTE_TOKEN_ID,\n        price=QUOTE_PRICE,\n        side=QUOTE_SIDE,\n        size=QUOTE_SIZE,\n    )\n    rfq_quote_response = quoter_client.rfq.create_rfq_quote(user_quote)\n\n    # Check for errors\n    if rfq_quote_response.get(\"error\"):\n        print(f\"Failed to create quote. Error: {rfq_quote_response['error']}\")\n        raise Exception(f\"Quote creation failed: {rfq_quote_response['error']}\")\n\n    quote_id = rfq_quote_response.get(\"quoteId\")\n    if not quote_id:\n        print(f\"Failed to create quote. Response: {rfq_quote_response}\")\n        raise Exception(\"Quote creation failed - no quoteId returned\")\n\n    print(\"Quote created successfully!\")\n    print(f\"  Quote ID: {quote_id}\")\n    print(f\"  Request ID: {request_id}\")\n    print(f\"  Full response: {rfq_quote_response}\")\n    \n    # ============================================\n    # Step 3: Requester accepts the quote\n    # ============================================\n    print(\"\\n[Step 3] Requester accepting quote...\")\n\n    expiration = int(time.time()) + EXPIRATION_SECONDS\n\n    accept_params = AcceptQuoteParams(\n        request_id=request_id,\n        quote_id=quote_id,\n        expiration=expiration,\n    )\n    accept_result = requester_client.rfq.accept_rfq_quote(accept_params)\n\n    print(accept_result)\n    print(\"Quote accepted successfully!\")\n    print(f\"  Request ID: {request_id}\")\n    print(f\"  Quote ID: {quote_id}\")\n    \n    # ============================================\n    # Step 4: Quoter approves the order\n    # ============================================\n    print(\"\\n[Step 4] Quoter approving order...\")\n\n    approve_params = ApproveOrderParams(\n        request_id=request_id,\n        quote_id=quote_id,\n        expiration=expiration,\n    )\n    approve_result = quoter_client.rfq.approve_rfq_order(approve_params)\n\n    print(approve_result)\n    print(\"Order approved successfully!\")\n    print(f\"  Request ID: {request_id}\")\n    print(f\"  Quote ID: {quote_id}\")\n    \n    # ============================================\n    # Summary\n    # ============================================\n    print(\"\\n\" + \"=\" * 60)\n    print(\"RFQ FLOW COMPLETED SUCCESSFULLY!\")\n    print(\"=\" * 60)\n    print(f\"Request ID: {request_id}\")\n    print(f\"Quote ID:   {quote_id}\")\n    print(\"=\" * 60)\n\n\nmain()"
  },
  {
    "path": "examples/rfq_get_best_quote.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds\nfrom py_clob_client.rfq import GetRfqBestQuoteParams\nfrom py_clob_client.constants import AMOY\nfrom dotenv import load_dotenv\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob-staging.polymarket.com/\")\n    chain_id = int(os.getenv(\"CHAIN_ID\", AMOY))\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    params = GetRfqBestQuoteParams(\n        request_id=os.getenv(\"RFQ_REQUEST_ID\", \"019b9f8d-2336-70db-a0dd-071363fb1ff3\")\n    )\n    resp = client.rfq.get_rfq_best_quote(params)\n    print(resp)\n    print(\"Done!\")\n\n\nmain()\n\n\n"
  },
  {
    "path": "examples/rfq_get_quotes.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds\nfrom py_clob_client.rfq import GetRfqQuotesParams\nfrom py_clob_client.constants import AMOY\nfrom dotenv import load_dotenv\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob-staging.polymarket.com/\")\n    chain_id = int(os.getenv(\"CHAIN_ID\", AMOY))\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    params = GetRfqQuotesParams(\n        # quote_ids=[\"0197656d-56ee-74a4-a06a-3b179121f3bf\"],\n        state=\"active\",\n        # markets=[\"0x0000000000000000000000000000000000000000\"],\n        # size_min=5,\n        # size_max=100,\n        # price_min=0.1,\n        # price_max=0.9,\n        # sort_by=\"price\",\n        # sort_dir=\"asc\",\n        limit=10,\n        # offset=\"MA==\",\n    )\n\n    # Get quotes on your requests (requester view)\n    # Returns quotes that others have made on your RFQ requests\n    print(\"Requester quotes (quotes on my requests):\")\n    requester_resp = client.rfq.get_rfq_requester_quotes(params)\n    print(requester_resp)\n\n    # Get quotes you've created (quoter view)\n    # Returns quotes that you have made on others' RFQ requests\n    print(\"\\nQuoter quotes (quotes I've made):\")\n    quoter_resp = client.rfq.get_rfq_quoter_quotes(params)\n    print(quoter_resp)\n\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/rfq_get_requests.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds\nfrom py_clob_client.rfq import GetRfqRequestsParams\nfrom py_clob_client.constants import AMOY\nfrom dotenv import load_dotenv\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob-staging.polymarket.com/\")\n    chain_id = int(os.getenv(\"CHAIN_ID\", AMOY))\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    # Get all active RFQ requests\n    params = GetRfqRequestsParams(\n        # request_ids=[\"0197656d-56ee-74a4-a06a-3b179121f3bf\"],\n        state=\"active\",\n        # markets=[\"0x0000000000000000000000000000000000000000\"],\n        # size_min=5,\n        # size_max=100,\n        # price_min=0.1,\n        # price_max=0.9,\n        # sort_by=\"price\",\n        # sort_dir=\"asc\",\n        limit=10,\n        offset=\"MA==\",\n    )\n    resp = client.rfq.get_rfq_requests(params)\n    print(resp)\n    print(\"Done!\")\n\n\nmain()\n"
  },
  {
    "path": "examples/update_balance_allowance.py",
    "content": "import os\n\nfrom py_clob_client.client import ClobClient\nfrom py_clob_client.clob_types import ApiCreds, BalanceAllowanceParams, AssetType\nfrom dotenv import load_dotenv\nfrom py_clob_client.constants import AMOY\n\nload_dotenv()\n\n\ndef main():\n    host = os.getenv(\"CLOB_API_URL\", \"https://clob.polymarket.com\")\n    key = os.getenv(\"PK\")\n    creds = ApiCreds(\n        api_key=os.getenv(\"CLOB_API_KEY\"),\n        api_secret=os.getenv(\"CLOB_SECRET\"),\n        api_passphrase=os.getenv(\"CLOB_PASS_PHRASE\"),\n    )\n    chain_id = AMOY\n    client = ClobClient(host, key=key, chain_id=chain_id, creds=creds)\n\n    # USDC\n    client.update_balance_allowance(\n        params=BalanceAllowanceParams(asset_type=AssetType.COLLATERAL)\n    )\n\n    # YES\n    client.update_balance_allowance(\n        params=BalanceAllowanceParams(\n            asset_type=AssetType.CONDITIONAL,\n            token_id=\"52114319501245915516055106046884209969926127482827954674443846427813813222426\",\n        )\n    )\n\n    # NO\n    client.update_balance_allowance(\n        params=BalanceAllowanceParams(\n            asset_type=AssetType.CONDITIONAL,\n            token_id=\"71321045679252212594626385532706912750332728571942532289631379312455583992563\",\n        )\n    )\n\n\nmain()\n"
  },
  {
    "path": "py_clob_client/__init__.py",
    "content": "from .client import ClobClient\nfrom .clob_types import (\n    ApiCreds,\n    OrderArgs,\n    MarketOrderArgs,\n    OrderType,\n    TickSize,\n    BookParams,\n    TradeParams,\n    OpenOrderParams,\n    BalanceAllowanceParams,\n    AssetType,\n    PartialCreateOrderOptions,\n    CreateOrderOptions,\n)\n\n# RFQ exports\nfrom .rfq import (\n    RfqClient,\n    RfqUserRequest,\n    RfqUserQuote,\n    CreateRfqRequestParams,\n    CreateRfqQuoteParams,\n    CancelRfqRequestParams,\n    CancelRfqQuoteParams,\n    AcceptQuoteParams,\n    ApproveOrderParams,\n    GetRfqRequestsParams,\n    GetRfqQuotesParams,\n    GetRfqBestQuoteParams,\n    RfqRequest,\n    RfqQuote,\n    RfqRequestResponse,\n    RfqQuoteResponse,\n    RfqPaginatedResponse,\n)\n\n__all__ = [\n    # Main client\n    \"ClobClient\",\n    # Core types\n    \"ApiCreds\",\n    \"OrderArgs\",\n    \"MarketOrderArgs\",\n    \"OrderType\",\n    \"TickSize\",\n    \"BookParams\",\n    \"TradeParams\",\n    \"OpenOrderParams\",\n    \"BalanceAllowanceParams\",\n    \"AssetType\",\n    \"PartialCreateOrderOptions\",\n    \"CreateOrderOptions\",\n    # RFQ client\n    \"RfqClient\",\n    # RFQ input types\n    \"RfqUserRequest\",\n    \"RfqUserQuote\",\n    \"CreateRfqRequestParams\",\n    \"CreateRfqQuoteParams\",\n    \"CancelRfqRequestParams\",\n    \"CancelRfqQuoteParams\",\n    \"AcceptQuoteParams\",\n    \"ApproveOrderParams\",\n    \"GetRfqRequestsParams\",\n    \"GetRfqQuotesParams\",\n    \"GetRfqBestQuoteParams\",\n    # RFQ response types\n    \"RfqRequest\",\n    \"RfqQuote\",\n    \"RfqRequestResponse\",\n    \"RfqQuoteResponse\",\n    \"RfqPaginatedResponse\",\n]\n"
  },
  {
    "path": "py_clob_client/client.py",
    "content": "import logging\nimport json\nimport time\nfrom typing import Optional\n\nfrom py_builder_signing_sdk.config import BuilderConfig\n\nfrom .order_builder.builder import OrderBuilder\nfrom .headers.headers import (\n    create_level_1_headers,\n    create_level_2_headers,\n    enrich_l2_headers_with_builder_headers,\n)\nfrom .signer import Signer\nfrom .config import get_contract_config\n\nfrom .endpoints import (\n    CANCEL,\n    CANCEL_ORDERS,\n    CANCEL_MARKET_ORDERS,\n    CANCEL_ALL,\n    CREATE_API_KEY,\n    DELETE_API_KEY,\n    DERIVE_API_KEY,\n    GET_API_KEYS,\n    CLOSED_ONLY,\n    CREATE_READONLY_API_KEY,\n    GET_READONLY_API_KEYS,\n    DELETE_READONLY_API_KEY,\n    VALIDATE_READONLY_API_KEY,\n    GET_LAST_TRADE_PRICE,\n    GET_ORDER,\n    GET_ORDER_BOOK,\n    MID_POINT,\n    ORDERS,\n    POST_ORDER,\n    POST_ORDERS,\n    PRICE,\n    TIME,\n    TRADES,\n    GET_NOTIFICATIONS,\n    DROP_NOTIFICATIONS,\n    GET_BALANCE_ALLOWANCE,\n    UPDATE_BALANCE_ALLOWANCE,\n    IS_ORDER_SCORING,\n    GET_TICK_SIZE,\n    GET_NEG_RISK,\n    GET_FEE_RATE,\n    ARE_ORDERS_SCORING,\n    GET_SIMPLIFIED_MARKETS,\n    GET_MARKETS,\n    GET_MARKET,\n    GET_SAMPLING_SIMPLIFIED_MARKETS,\n    GET_SAMPLING_MARKETS,\n    GET_MARKET_TRADES_EVENTS,\n    GET_LAST_TRADES_PRICES,\n    MID_POINTS,\n    GET_ORDER_BOOKS,\n    GET_PRICES,\n    GET_SPREAD,\n    GET_SPREADS,\n    GET_BUILDER_TRADES,\n    POST_HEARTBEAT,\n)\nfrom .clob_types import (\n    ApiCreds,\n    ReadonlyApiKeyResponse,\n    TradeParams,\n    OpenOrderParams,\n    OrderArgs,\n    RequestArgs,\n    DropNotificationParams,\n    OrderBookSummary,\n    BalanceAllowanceParams,\n    OrderScoringParams,\n    TickSize,\n    CreateOrderOptions,\n    OrdersScoringParams,\n    OrderType,\n    PartialCreateOrderOptions,\n    BookParams,\n    MarketOrderArgs,\n    PostOrdersArgs,\n)\nfrom .exceptions import PolyException\nfrom .http_helpers.helpers import (\n    add_query_trade_params,\n    add_query_open_orders_params,\n    delete,\n    get,\n    post,\n    drop_notifications_query_params,\n    add_balance_allowance_params_to_url,\n    add_order_scoring_params_to_url,\n)\n\nfrom .constants import (\n    L0,\n    L1,\n    L1_AUTH_UNAVAILABLE,\n    L2,\n    L2_AUTH_UNAVAILABLE,\n    END_CURSOR,\n    BUILDER_AUTH_UNAVAILABLE,\n)\nfrom .utilities import (\n    parse_raw_orderbook_summary,\n    generate_orderbook_summary_hash,\n    order_to_json,\n    is_tick_size_smaller,\n    price_valid,\n)\nfrom .rfq import RfqClient\n\n\nclass ClobClient:\n    def __init__(\n        self,\n        host,\n        chain_id: int = None,\n        key: str = None,\n        creds: ApiCreds = None,\n        signature_type: int = None,\n        funder: str = None,\n        builder_config: BuilderConfig = None,\n        tick_size_ttl: float = 300.0,\n    ):\n        \"\"\"\n        Initializes the clob client\n        The client can be started in 3 modes:\n        1) Level 0: Requires only the clob host url\n                    Allows access to open CLOB endpoints\n\n        2) Level 1: Requires the host, chain_id and a private key.\n                    Allows access to L1 authenticated endpoints + all unauthenticated endpoints\n\n        3) Level 2: Requires the host, chain_id, a private key, and Credentials.\n                    Allows access to all endpoints\n        \"\"\"\n        self.host = host[0:-1] if host.endswith(\"/\") else host\n        self.chain_id = chain_id\n        self.signer = Signer(key, chain_id) if key else None\n        self.creds = creds\n        self.mode = self._get_client_mode()\n\n        if self.signer:\n            self.builder = OrderBuilder(\n                self.signer, sig_type=signature_type, funder=funder\n            )\n\n        self.builder_config = None\n        if builder_config:\n            self.builder_config = builder_config\n\n        # local cache\n        self.__tick_sizes = {}\n        self.__tick_size_timestamps = {}\n        self.__tick_size_ttl = tick_size_ttl\n        self.__neg_risk = {}\n        self.__fee_rates = {}\n\n        # RFQ client\n        self.rfq = RfqClient(self)\n\n        self.logger = logging.getLogger(self.__class__.__name__)\n\n    def get_address(self):\n        \"\"\"\n        Returns the public address of the signer\n        \"\"\"\n        return self.signer.address() if self.signer else None\n\n    def get_collateral_address(self):\n        \"\"\"\n        Returns the collateral token address\n        \"\"\"\n        contract_config = get_contract_config(self.chain_id)\n        if contract_config:\n            return contract_config.collateral\n\n    def get_conditional_address(self):\n        \"\"\"\n        Returns the conditional token address\n        \"\"\"\n        contract_config = get_contract_config(self.chain_id)\n        if contract_config:\n            return contract_config.conditional_tokens\n\n    def get_exchange_address(self, neg_risk=False):\n        \"\"\"\n        Returns the exchange address\n        \"\"\"\n        contract_config = get_contract_config(self.chain_id, neg_risk)\n        if contract_config:\n            return contract_config.exchange\n\n    def get_ok(self):\n        \"\"\"\n        Health check: Confirms that the server is up\n        Does not need authentication\n        \"\"\"\n        return get(\"{}/\".format(self.host))\n\n    def get_server_time(self):\n        \"\"\"\n        Returns the current timestamp on the server\n        Does not need authentication\n        \"\"\"\n        return get(\"{}{}\".format(self.host, TIME))\n\n    def create_api_key(self, nonce: int = None) -> ApiCreds:\n        \"\"\"\n        Creates a new CLOB API key for the given\n        \"\"\"\n        self.assert_level_1_auth()\n\n        endpoint = \"{}{}\".format(self.host, CREATE_API_KEY)\n        headers = create_level_1_headers(self.signer, nonce)\n\n        creds_raw = post(endpoint, headers=headers)\n        try:\n            creds = ApiCreds(\n                api_key=creds_raw[\"apiKey\"],\n                api_secret=creds_raw[\"secret\"],\n                api_passphrase=creds_raw[\"passphrase\"],\n            )\n        except:\n            self.logger.error(\"Couldn't parse created CLOB creds\")\n            return None\n        return creds\n\n    def derive_api_key(self, nonce: int = None) -> ApiCreds:\n        \"\"\"\n        Derives an already existing CLOB API key for the given address and nonce\n        \"\"\"\n        self.assert_level_1_auth()\n\n        endpoint = \"{}{}\".format(self.host, DERIVE_API_KEY)\n        headers = create_level_1_headers(self.signer, nonce)\n\n        creds_raw = get(endpoint, headers=headers)\n        try:\n            creds = ApiCreds(\n                api_key=creds_raw[\"apiKey\"],\n                api_secret=creds_raw[\"secret\"],\n                api_passphrase=creds_raw[\"passphrase\"],\n            )\n        except:\n            self.logger.error(\"Couldn't parse derived CLOB creds\")\n            return None\n        return creds\n\n    def create_or_derive_api_creds(self, nonce: int = None) -> ApiCreds:\n        \"\"\"\n        Creates API creds if not already created for nonce, otherwise derives them\n        \"\"\"\n        try:\n            return self.create_api_key(nonce)\n        except:\n            return self.derive_api_key(nonce)\n\n    def set_api_creds(self, creds: ApiCreds):\n        \"\"\"\n        Sets client api creds\n        \"\"\"\n        self.creds = creds\n        self.mode = self._get_client_mode()\n\n    def get_api_keys(self):\n        \"\"\"\n        Gets the available API keys for this address\n        Level 2 Auth required\n        \"\"\"\n        self.assert_level_2_auth()\n\n        request_args = RequestArgs(method=\"GET\", request_path=GET_API_KEYS)\n        headers = create_level_2_headers(self.signer, self.creds, request_args)\n        return get(\"{}{}\".format(self.host, GET_API_KEYS), headers=headers)\n\n    def get_closed_only_mode(self):\n        \"\"\"\n        Gets the closed only mode flag for thsi address\n        Level 2 Auth required\n        \"\"\"\n        self.assert_level_2_auth()\n\n        request_args = RequestArgs(method=\"GET\", request_path=CLOSED_ONLY)\n        headers = create_level_2_headers(self.signer, self.creds, request_args)\n        return get(\"{}{}\".format(self.host, CLOSED_ONLY), headers=headers)\n\n    def delete_api_key(self):\n        \"\"\"\n        Deletes an API key\n        Level 2 Auth required\n        \"\"\"\n        self.assert_level_2_auth()\n\n        request_args = RequestArgs(method=\"DELETE\", request_path=DELETE_API_KEY)\n        headers = create_level_2_headers(self.signer, self.creds, request_args)\n        return delete(\"{}{}\".format(self.host, DELETE_API_KEY), headers=headers)\n\n    def create_readonly_api_key(self) -> ReadonlyApiKeyResponse:\n        \"\"\"\n        Creates a new readonly API key for a user\n        Level 2 Auth required\n        \"\"\"\n        self.assert_level_2_auth()\n\n        request_args = RequestArgs(method=\"POST\", request_path=CREATE_READONLY_API_KEY)\n        headers = create_level_2_headers(self.signer, self.creds, request_args)\n\n        response = post(\"{}{}\".format(self.host, CREATE_READONLY_API_KEY), headers=headers)\n        try:\n            return ReadonlyApiKeyResponse(api_key=response[\"apiKey\"])\n        except:\n            self.logger.error(\"Couldn't parse readonly API key response\")\n            return None\n\n    def get_readonly_api_keys(self) -> list[str]:\n        \"\"\"\n        Gets the available readonly API keys for this address\n        Level 2 Auth required\n        \"\"\"\n        self.assert_level_2_auth()\n\n        request_args = RequestArgs(method=\"GET\", request_path=GET_READONLY_API_KEYS)\n        headers = create_level_2_headers(self.signer, self.creds, request_args)\n        return get(\"{}{}\".format(self.host, GET_READONLY_API_KEYS), headers=headers)\n\n    def delete_readonly_api_key(self, key: str) -> bool:\n        \"\"\"\n        Deletes a readonly API key for a user\n        Level 2 Auth required\n        \"\"\"\n        self.assert_level_2_auth()\n\n        body = {\"key\": key}\n        serialized = json.dumps(body, separators=(\",\", \":\"), ensure_ascii=False)\n        request_args = RequestArgs(\n            method=\"DELETE\",\n            request_path=DELETE_READONLY_API_KEY,\n            body=body,\n            serialized_body=serialized,\n        )\n        headers = create_level_2_headers(self.signer, self.creds, request_args)\n        return delete(\n            \"{}{}\".format(self.host, DELETE_READONLY_API_KEY),\n            headers=headers,\n            data=serialized,\n        )\n\n    def validate_readonly_api_key(self, address: str, key: str) -> str:\n        \"\"\"\n        Validates a readonly API key for a given address\n        This is a public endpoint, no authentication required\n        \"\"\"\n        return get(\n            \"{}{}?address={}&key={}\".format(\n                self.host, VALIDATE_READONLY_API_KEY, address, key\n            )\n        )\n\n    def get_midpoint(self, token_id):\n        \"\"\"\n        Get the mid market price for the given market\n        \"\"\"\n        return get(\"{}{}?token_id={}\".format(self.host, MID_POINT, token_id))\n\n    def get_midpoints(self, params: list[BookParams]):\n        \"\"\"\n        Get the mid market prices for a set of token ids\n        \"\"\"\n        body = [{\"token_id\": param.token_id} for param in params]\n        return post(\"{}{}\".format(self.host, MID_POINTS), data=body)\n\n    def get_price(self, token_id, side):\n        \"\"\"\n        Get the market price for the given market\n        \"\"\"\n        return get(\"{}{}?token_id={}&side={}\".format(self.host, PRICE, token_id, side))\n\n    def get_prices(self, params: list[BookParams]):\n        \"\"\"\n        Get the market prices for a set\n        \"\"\"\n        body = [{\"token_id\": param.token_id, \"side\": param.side} for param in params]\n        return post(\"{}{}\".format(self.host, GET_PRICES), data=body)\n\n    def get_spread(self, token_id):\n        \"\"\"\n        Get the spread for the given market\n        \"\"\"\n        return get(\"{}{}?token_id={}\".format(self.host, GET_SPREAD, token_id))\n\n    def get_spreads(self, params: list[BookParams]):\n        \"\"\"\n        Get the spreads for a set of token ids\n        \"\"\"\n        body = [{\"token_id\": param.token_id} for param in params]\n        return post(\"{}{}\".format(self.host, GET_SPREADS), data=body)\n\n    def get_tick_size(self, token_id: str) -> TickSize:\n        cached_at = self.__tick_size_timestamps.get(token_id)\n\n        if (\n            token_id in self.__tick_sizes\n            and cached_at is not None\n            and (time.monotonic() - cached_at) < self.__tick_size_ttl\n        ):\n            return self.__tick_sizes[token_id]\n\n        result = get(\"{}{}?token_id={}\".format(self.host, GET_TICK_SIZE, token_id))\n        self.__tick_sizes[token_id] = str(result[\"minimum_tick_size\"])\n        self.__tick_size_timestamps[token_id] = time.monotonic()\n\n        return self.__tick_sizes[token_id]\n\n    def clear_tick_size_cache(self, token_id: str = None):\n        \"\"\"\n        Clears the tick size cache, forcing fresh fetches on the next access.\n\n        Args:\n            token_id: If provided, only clears the cache for this token.\n                      Otherwise clears all cached tick sizes.\n        \"\"\"\n        if token_id is not None:\n            self.__tick_sizes.pop(token_id, None)\n            self.__tick_size_timestamps.pop(token_id, None)\n        else:\n            self.__tick_sizes.clear()\n            self.__tick_size_timestamps.clear()\n\n    def _update_tick_size_from_order_book(self, book: OrderBookSummary):\n        \"\"\"\n        Opportunistically updates the tick size cache from an order book response.\n        \"\"\"\n        if book and book.asset_id and book.tick_size:\n            self.__tick_sizes[book.asset_id] = str(book.tick_size)\n            self.__tick_size_timestamps[book.asset_id] = time.monotonic()\n\n    def get_neg_risk(self, token_id: str) -> bool:\n        if token_id in self.__neg_risk:\n            return self.__neg_risk[token_id]\n\n        result = get(\"{}{}?token_id={}\".format(self.host, GET_NEG_RISK, token_id))\n        self.__neg_risk[token_id] = result[\"neg_risk\"]\n\n        return result[\"neg_risk\"]\n\n    def get_fee_rate_bps(self, token_id: str) -> int:\n        if token_id in self.__fee_rates:\n            return self.__fee_rates[token_id]\n\n        result = get(\"{}{}?token_id={}\".format(self.host, GET_FEE_RATE, token_id))\n        fee_rate = result.get(\"base_fee\") or 0\n        self.__fee_rates[token_id] = fee_rate\n\n        return fee_rate\n\n    def __resolve_tick_size(\n        self, token_id: str, tick_size: TickSize = None\n    ) -> TickSize:\n        min_tick_size = self.get_tick_size(token_id)\n        if tick_size is not None:\n            if is_tick_size_smaller(tick_size, min_tick_size):\n                raise Exception(\n                    \"invalid tick size (\"\n                    + str(tick_size)\n                    + \"), minimum for the market is \"\n                    + str(min_tick_size),\n                )\n        else:\n            tick_size = min_tick_size\n        return tick_size\n\n    def __resolve_fee_rate(self, token_id: str, user_fee_rate: int = None) -> int:\n        market_fee_rate_bps = self.get_fee_rate_bps(token_id)\n        # If both fee rate on the market and the user supplied fee rate are non-zero, validate that they match\n        # else return the market fee rate\n        if (\n            market_fee_rate_bps is not None\n            and market_fee_rate_bps > 0\n            and user_fee_rate is not None\n            and user_fee_rate > 0\n            and user_fee_rate != market_fee_rate_bps\n        ):\n            raise Exception(\n                f\"invalid user provided fee rate: ({user_fee_rate}), fee rate for the market must be {market_fee_rate_bps}\"\n            )\n        return market_fee_rate_bps\n\n    def create_order(\n        self, order_args: OrderArgs, options: Optional[PartialCreateOrderOptions] = None\n    ):\n        \"\"\"\n        Creates and signs an order\n        Level 1 Auth required\n        \"\"\"\n        self.assert_level_1_auth()\n\n        # add resolve_order_options, or similar\n        tick_size = self.__resolve_tick_size(\n            order_args.token_id,\n            options.tick_size if options else None,\n        )\n\n        if not price_valid(order_args.price, tick_size):\n            raise Exception(\n                \"price (\"\n                + str(order_args.price)\n                + \"), min: \"\n                + str(tick_size)\n                + \" - max: \"\n                + str(1 - float(tick_size))\n            )\n\n        neg_risk = (\n            options.neg_risk\n            if options and options.neg_risk\n            else self.get_neg_risk(order_args.token_id)\n        )\n\n        # fee rate\n        fee_rate_bps = self.__resolve_fee_rate(\n            order_args.token_id, order_args.fee_rate_bps\n        )\n        order_args.fee_rate_bps = fee_rate_bps\n\n        return self.builder.create_order(\n            order_args,\n            CreateOrderOptions(\n                tick_size=tick_size,\n                neg_risk=neg_risk,\n            ),\n        )\n\n    def create_market_order(\n        self,\n        order_args: MarketOrderArgs,\n        options: Optional[PartialCreateOrderOptions] = None,\n    ):\n        \"\"\"\n        Creates and signs an order\n        Level 1 Auth required\n        \"\"\"\n        self.assert_level_1_auth()\n\n        # add resolve_order_options, or similar\n        tick_size = self.__resolve_tick_size(\n            order_args.token_id,\n            options.tick_size if options else None,\n        )\n\n        if order_args.price is None or order_args.price <= 0:\n            order_args.price = self.calculate_market_price(\n                order_args.token_id,\n                order_args.side,\n                order_args.amount,\n                order_args.order_type,\n            )\n\n        if not price_valid(order_args.price, tick_size):\n            raise Exception(\n                \"price (\"\n                + str(order_args.price)\n                + \"), min: \"\n                + str(tick_size)\n                + \" - max: \"\n                + str(1 - float(tick_size))\n            )\n\n        neg_risk = (\n            options.neg_risk\n            if options and options.neg_risk\n            else self.get_neg_risk(order_args.token_id)\n        )\n\n        # fee rate\n        fee_rate_bps = self.__resolve_fee_rate(\n            order_args.token_id, order_args.fee_rate_bps\n        )\n        order_args.fee_rate_bps = fee_rate_bps\n\n        return self.builder.create_market_order(\n            order_args,\n            CreateOrderOptions(\n                tick_size=tick_size,\n                neg_risk=neg_risk,\n            ),\n        )\n\n    def post_orders(self, args: list[PostOrdersArgs]):\n        \"\"\"\n        Posts orders\n        \"\"\"\n        self.assert_level_2_auth()\n        body = [\n            order_to_json(arg.order, self.creds.api_key, arg.orderType, arg.postOnly) for arg in args\n        ]\n        request_args = RequestArgs(\n            method=\"POST\",\n            request_path=POST_ORDERS,\n            body=body,\n            serialized_body=json.dumps(body, separators=(\",\", \":\"), ensure_ascii=False),\n        )\n        headers = create_level_2_headers(self.signer, self.creds, request_args)\n        # Builder flow\n        if self.can_builder_auth():\n            builder_headers = self._generate_builder_headers(request_args, headers)\n            if builder_headers is not None:\n                return post(\n                    \"{}{}\".format(self.host, POST_ORDERS),\n                    headers=builder_headers,\n                    data=request_args.serialized_body,\n                )\n        # send exact serialized bytes\n        return post(\n            \"{}{}\".format(self.host, POST_ORDERS),\n            headers=headers,\n            data=request_args.serialized_body,\n        )\n\n    def post_order(self, order, orderType: OrderType = OrderType.GTC, post_only: bool = False):\n        \"\"\"\n        Posts the order\n        \"\"\"\n        if post_only and (orderType != OrderType.GTC and orderType != OrderType.GTD):\n            raise Exception(\"post_only orders can only be of type GTC or GTD\")\n\n        self.assert_level_2_auth()\n        body = order_to_json(order, self.creds.api_key, orderType, post_only)\n        request_args = RequestArgs(\n            method=\"POST\",\n            request_path=POST_ORDER,\n            body=body,\n            serialized_body=json.dumps(body, separators=(\",\", \":\"), ensure_ascii=False),\n        )\n        headers = create_level_2_headers(self.signer, self.creds, request_args)\n        # Builder flow\n        if self.can_builder_auth():\n            builder_headers = self._generate_builder_headers(request_args, headers)\n            if builder_headers is not None:\n                return post(\n                    \"{}{}\".format(self.host, POST_ORDER),\n                    headers=builder_headers,\n                    data=request_args.serialized_body,\n                )\n        return post(\n            \"{}{}\".format(self.host, POST_ORDER),\n            headers=headers,\n            data=request_args.serialized_body,\n        )\n\n    def create_and_post_order(\n        self, order_args: OrderArgs, options: PartialCreateOrderOptions = None\n    ):\n        \"\"\"\n        Utility function to create and publish an order\n        \"\"\"\n        ord = self.create_order(order_args, options)\n        return self.post_order(ord)\n\n    def cancel(self, order_id):\n        \"\"\"\n        Cancels an order\n        Level 2 Auth required\n        \"\"\"\n        self.assert_level_2_auth()\n        body = {\"orderID\": order_id}\n\n        request_args = RequestArgs(\n            method=\"DELETE\",\n            request_path=CANCEL,\n            body=body,\n            serialized_body=json.dumps(body, separators=(\",\", \":\"), ensure_ascii=False),\n        )\n        headers = create_level_2_headers(self.signer, self.creds, request_args)\n        return delete(\n            \"{}{}\".format(self.host, CANCEL),\n            headers=headers,\n            data=request_args.serialized_body,\n        )\n\n    def cancel_orders(self, order_ids):\n        \"\"\"\n        Cancels orders\n        Level 2 Auth required\n        \"\"\"\n        self.assert_level_2_auth()\n        body = order_ids\n        serialized = json.dumps(body, separators=(\",\", \":\"), ensure_ascii=False)\n        request_args = RequestArgs(\n            method=\"DELETE\",\n            request_path=CANCEL_ORDERS,\n            body=body,\n            serialized_body=serialized,\n        )\n        headers = create_level_2_headers(self.signer, self.creds, request_args)\n        return delete(\n            \"{}{}\".format(self.host, CANCEL_ORDERS), headers=headers, data=serialized\n        )\n\n    def cancel_all(self):\n        \"\"\"\n        Cancels all available orders for the user\n        Level 2 Auth required\n        \"\"\"\n        self.assert_level_2_auth()\n        request_args = RequestArgs(method=\"DELETE\", request_path=CANCEL_ALL)\n        headers = create_level_2_headers(self.signer, self.creds, request_args)\n        return delete(\"{}{}\".format(self.host, CANCEL_ALL), headers=headers)\n\n    def post_heartbeat(self, heartbeat_id: Optional[str]):\n        \"\"\"\n        Sends a heartbeat to the server, if heartbeats are started and one isn't sent within 10s, all orders will be cancelled\n        Requires Level 2 authentication\n        \"\"\"\n        self.assert_level_2_auth()\n        body = {\"heartbeat_id\": heartbeat_id}\n        serialized = json.dumps(body, separators=(\",\", \":\"), ensure_ascii=False)\n        request_args = RequestArgs(method=\"POST\", request_path=POST_HEARTBEAT, body=body, serialized_body=serialized)\n        headers = create_level_2_headers(self.signer, self.creds, request_args)\n        return post(\n            \"{}{}\".format(self.host, POST_HEARTBEAT),\n            headers=headers,\n            data=serialized\n        )\n\n    def cancel_market_orders(self, market: str = \"\", asset_id: str = \"\"):\n        \"\"\"\n        Cancels orders\n        Level 2 Auth required\n        \"\"\"\n        self.assert_level_2_auth()\n        body = {\"market\": market, \"asset_id\": asset_id}\n        serialized = json.dumps(body, separators=(\",\", \":\"), ensure_ascii=False)\n        request_args = RequestArgs(\n            method=\"DELETE\",\n            request_path=CANCEL_MARKET_ORDERS,\n            body=body,\n            serialized_body=serialized,\n        )\n        headers = create_level_2_headers(self.signer, self.creds, request_args)\n        return delete(\n            \"{}{}\".format(self.host, CANCEL_MARKET_ORDERS),\n            headers=headers,\n            data=serialized,\n        )\n\n    def get_orders(self, params: OpenOrderParams = None, next_cursor=\"MA==\"):\n        \"\"\"\n        Gets orders for the API key\n        Requires Level 2 authentication\n        \"\"\"\n        self.assert_level_2_auth()\n        request_args = RequestArgs(method=\"GET\", request_path=ORDERS)\n        headers = create_level_2_headers(self.signer, self.creds, request_args)\n\n        results = []\n        next_cursor = next_cursor if next_cursor is not None else \"MA==\"\n        while next_cursor != END_CURSOR:\n            url = add_query_open_orders_params(\n                \"{}{}\".format(self.host, ORDERS), params, next_cursor\n            )\n            response = get(url, headers=headers)\n            next_cursor = response[\"next_cursor\"]\n            results += response[\"data\"]\n\n        return results\n\n    def get_order_book(self, token_id) -> OrderBookSummary:\n        \"\"\"\n        Fetches the orderbook for the token_id\n        \"\"\"\n        raw_obs = get(\"{}{}?token_id={}\".format(self.host, GET_ORDER_BOOK, token_id))\n        result = parse_raw_orderbook_summary(raw_obs)\n        self._update_tick_size_from_order_book(result)\n        return result\n\n    def get_order_books(self, params: list[BookParams]) -> list[OrderBookSummary]:\n        \"\"\"\n        Fetches the orderbook for a set of token ids\n        \"\"\"\n        body = [{\"token_id\": param.token_id} for param in params]\n        raw_obs = post(\"{}{}\".format(self.host, GET_ORDER_BOOKS), data=body)\n        results = [parse_raw_orderbook_summary(r) for r in raw_obs]\n        for book in results:\n            self._update_tick_size_from_order_book(book)\n        return results\n\n    def get_order_book_hash(self, orderbook: OrderBookSummary) -> str:\n        \"\"\"\n        Calculates the hash for the given orderbook\n        \"\"\"\n        return generate_orderbook_summary_hash(orderbook)\n\n    def get_order(self, order_id):\n        \"\"\"\n        Fetches the order corresponding to the order_id\n        Requires Level 2 authentication\n        \"\"\"\n        self.assert_level_2_auth()\n        endpoint = \"{}{}\".format(GET_ORDER, order_id)\n        request_args = RequestArgs(method=\"GET\", request_path=endpoint)\n        headers = create_level_2_headers(self.signer, self.creds, request_args)\n        return get(\"{}{}\".format(self.host, endpoint), headers=headers)\n\n    def get_trades(self, params: TradeParams = None, next_cursor=\"MA==\"):\n        \"\"\"\n        Fetches the trade history for a user\n        Requires Level 2 authentication\n        \"\"\"\n        self.assert_level_2_auth()\n        request_args = RequestArgs(method=\"GET\", request_path=TRADES)\n        headers = create_level_2_headers(self.signer, self.creds, request_args)\n\n        results = []\n        next_cursor = next_cursor if next_cursor is not None else \"MA==\"\n        while next_cursor != END_CURSOR:\n            url = add_query_trade_params(\n                \"{}{}\".format(self.host, TRADES), params, next_cursor\n            )\n            response = get(url, headers=headers)\n            next_cursor = response[\"next_cursor\"]\n            results += response[\"data\"]\n\n        return results\n\n    def get_last_trade_price(self, token_id):\n        \"\"\"\n        Fetches the last trade price token_id\n        \"\"\"\n        return get(\"{}{}?token_id={}\".format(self.host, GET_LAST_TRADE_PRICE, token_id))\n\n    def get_last_trades_prices(self, params: list[BookParams]):\n        \"\"\"\n        Fetches the last trades prices for a set of token ids\n        \"\"\"\n        body = [{\"token_id\": param.token_id} for param in params]\n        return post(\"{}{}\".format(self.host, GET_LAST_TRADES_PRICES), data=body)\n\n    def assert_level_1_auth(self):\n        \"\"\"\n        Level 1 Poly Auth\n        \"\"\"\n        if self.mode < L1:\n            raise PolyException(L1_AUTH_UNAVAILABLE)\n\n    def assert_level_2_auth(self):\n        \"\"\"\n        Level 2 Poly Auth\n        \"\"\"\n        if self.mode < L2:\n            raise PolyException(L2_AUTH_UNAVAILABLE)\n\n    def assert_builder_auth(self):\n        \"\"\"\n        Builder Auth\n        \"\"\"\n        if not self.can_builder_auth():\n            raise PolyException(BUILDER_AUTH_UNAVAILABLE)\n\n    def can_builder_auth(self) -> bool:\n        return self.builder_config is not None and self.builder_config.is_valid()\n\n    def _get_client_mode(self):\n        if self.signer is not None and self.creds is not None:\n            return L2\n        if self.signer is not None:\n            return L1\n        return L0\n\n    def _generate_builder_headers(self, request_args: RequestArgs, headers: dict):\n        \"\"\"\n        Generates builder headers and attaches them to the L2 Header\n        \"\"\"\n        if self.builder_config is not None:\n            builder_headers = self._get_builder_headers(\n                request_args.method,\n                request_args.request_path,\n                request_args.serialized_body,\n            )\n            if builder_headers is None:\n                return None\n            return enrich_l2_headers_with_builder_headers(headers, builder_headers)\n        return None\n\n    def _get_builder_headers(self, method: str, path: str, body: Optional[str] = None):\n        \"\"\"\n        Generates builder headers for the given method, path, and body.\n\n        Args:\n            method (str): HTTP method.\n            path (str): Request path.\n            body (Optional[str]): Pre-serialized JSON string or None.\n\n        Returns:\n            dict or None: Builder headers as a dictionary, or None if not available.\n        \"\"\"\n        headers = self.builder_config.generate_builder_headers(method, path, body)\n        if headers:\n            return headers.to_dict()\n        return None\n\n    def get_notifications(self):\n        \"\"\"\n        Fetches the notifications for a user\n        Requires Level 2 authentication\n        \"\"\"\n        self.assert_level_2_auth()\n        request_args = RequestArgs(method=\"GET\", request_path=GET_NOTIFICATIONS)\n        headers = create_level_2_headers(self.signer, self.creds, request_args)\n        url = \"{}{}?signature_type={}\".format(\n            self.host, GET_NOTIFICATIONS, self.builder.sig_type\n        )\n        return get(url, headers=headers)\n\n    def drop_notifications(self, params: DropNotificationParams = None):\n        \"\"\"\n        Drops the notifications for a user\n        Requires Level 2 authentication\n        \"\"\"\n        self.assert_level_2_auth()\n        request_args = RequestArgs(method=\"DELETE\", request_path=DROP_NOTIFICATIONS)\n        headers = create_level_2_headers(self.signer, self.creds, request_args)\n        url = drop_notifications_query_params(\n            \"{}{}\".format(self.host, DROP_NOTIFICATIONS), params\n        )\n        return delete(url, headers=headers)\n\n    def get_balance_allowance(self, params: BalanceAllowanceParams = None):\n        \"\"\"\n        Fetches the balance & allowance for a user\n        Requires Level 2 authentication\n        \"\"\"\n        self.assert_level_2_auth()\n        request_args = RequestArgs(method=\"GET\", request_path=GET_BALANCE_ALLOWANCE)\n        headers = create_level_2_headers(self.signer, self.creds, request_args)\n        if params.signature_type == -1:\n            params.signature_type = self.builder.sig_type\n        url = add_balance_allowance_params_to_url(\n            \"{}{}\".format(self.host, GET_BALANCE_ALLOWANCE), params\n        )\n        return get(url, headers=headers)\n\n    def update_balance_allowance(self, params: BalanceAllowanceParams = None):\n        \"\"\"\n        Updates the balance & allowance for a user\n        Requires Level 2 authentication\n        \"\"\"\n        self.assert_level_2_auth()\n        request_args = RequestArgs(method=\"GET\", request_path=UPDATE_BALANCE_ALLOWANCE)\n        headers = create_level_2_headers(self.signer, self.creds, request_args)\n        if params.signature_type == -1:\n            params.signature_type = self.builder.sig_type\n        url = add_balance_allowance_params_to_url(\n            \"{}{}\".format(self.host, UPDATE_BALANCE_ALLOWANCE), params\n        )\n        return get(url, headers=headers)\n\n    def is_order_scoring(self, params: OrderScoringParams):\n        \"\"\"\n        Check if the order is currently scoring\n        Requires Level 2 authentication\n        \"\"\"\n        self.assert_level_2_auth()\n        request_args = RequestArgs(method=\"GET\", request_path=IS_ORDER_SCORING)\n        headers = create_level_2_headers(self.signer, self.creds, request_args)\n        url = add_order_scoring_params_to_url(\n            \"{}{}\".format(self.host, IS_ORDER_SCORING), params\n        )\n        return get(url, headers=headers)\n\n    def are_orders_scoring(self, params: OrdersScoringParams):\n        \"\"\"\n        Check if the orders are currently scoring\n        Requires Level 2 authentication\n        \"\"\"\n        self.assert_level_2_auth()\n        body = params.orderIds\n        serialized = json.dumps(body, separators=(\",\", \":\"), ensure_ascii=False)\n        request_args = RequestArgs(\n            method=\"POST\",\n            request_path=ARE_ORDERS_SCORING,\n            body=body,\n            serialized_body=serialized,\n        )\n        headers = create_level_2_headers(self.signer, self.creds, request_args)\n        return post(\n            \"{}{}\".format(self.host, ARE_ORDERS_SCORING),\n            headers=headers,\n            data=serialized,\n        )\n\n    def get_sampling_markets(self, next_cursor=\"MA==\"):\n        \"\"\"\n        Get the current sampling markets\n        \"\"\"\n        return get(\n            \"{}{}?next_cursor={}\".format(self.host, GET_SAMPLING_MARKETS, next_cursor)\n        )\n\n    def get_sampling_simplified_markets(self, next_cursor=\"MA==\"):\n        \"\"\"\n        Get the current sampling simplified markets\n        \"\"\"\n        return get(\n            \"{}{}?next_cursor={}\".format(\n                self.host, GET_SAMPLING_SIMPLIFIED_MARKETS, next_cursor\n            )\n        )\n\n    def get_markets(self, next_cursor=\"MA==\"):\n        \"\"\"\n        Get the current markets\n        \"\"\"\n        return get(\"{}{}?next_cursor={}\".format(self.host, GET_MARKETS, next_cursor))\n\n    def get_simplified_markets(self, next_cursor=\"MA==\"):\n        \"\"\"\n        Get the current simplified markets\n        \"\"\"\n        return get(\n            \"{}{}?next_cursor={}\".format(self.host, GET_SIMPLIFIED_MARKETS, next_cursor)\n        )\n\n    def get_market(self, condition_id):\n        \"\"\"\n        Get a market by condition_id\n        \"\"\"\n        return get(\"{}{}{}\".format(self.host, GET_MARKET, condition_id))\n\n    def get_market_trades_events(self, condition_id):\n        \"\"\"\n        Get the market's trades events by condition id\n        \"\"\"\n        return get(\"{}{}{}\".format(self.host, GET_MARKET_TRADES_EVENTS, condition_id))\n\n    def get_builder_trades(self, params: TradeParams = None, next_cursor=\"MA==\"):\n        \"\"\"\n        Get trades originated by the builder\n        \"\"\"\n        self.assert_builder_auth()\n\n        request_args = RequestArgs(method=\"GET\", request_path=GET_BUILDER_TRADES)\n        headers = self._get_builder_headers(\n            request_args.method, request_args.request_path, request_args.body\n        )\n\n        results = []\n        next_cursor = next_cursor if next_cursor is not None else \"MA==\"\n        while next_cursor != END_CURSOR:\n            url = add_query_trade_params(\n                \"{}{}\".format(self.host, GET_BUILDER_TRADES), params, next_cursor\n            )\n            response = get(url, headers=headers)\n            next_cursor = response[\"next_cursor\"]\n            results += response[\"data\"]\n\n        return results\n\n    def calculate_market_price(\n        self, token_id: str, side: str, amount: float, order_type: OrderType\n    ) -> float:\n        \"\"\"\n        Calculates the matching price considering an amount and the current orderbook\n        \"\"\"\n        book = self.get_order_book(token_id)\n        if book is None:\n            raise Exception(\"no orderbook\")\n        if side == \"BUY\":\n            if book.asks is None:\n                raise Exception(\"no match\")\n            return self.builder.calculate_buy_market_price(\n                book.asks, amount, order_type\n            )\n        else:\n            if book.bids is None:\n                raise Exception(\"no match\")\n            return self.builder.calculate_sell_market_price(\n                book.bids, amount, order_type\n            )\n"
  },
  {
    "path": "py_clob_client/clob_types.py",
    "content": "from typing import Any\nfrom dataclasses import dataclass, asdict\nfrom json import dumps\nfrom typing import Literal, Optional\nfrom py_order_utils.model import (\n    SignedOrder,\n)\n\nfrom .constants import ZERO_ADDRESS\n\n\nclass OrderType(enumerate):\n    GTC = \"GTC\"\n    FOK = \"FOK\"\n    GTD = \"GTD\"\n    FAK = \"FAK\"\n\n\n@dataclass\nclass ApiCreds:\n    api_key: str\n    api_secret: str\n    api_passphrase: str\n\n\n@dataclass\nclass ReadonlyApiKeyResponse:\n    api_key: str\n\n\n@dataclass\nclass RequestArgs:\n    method: str\n    request_path: str\n    body: Any = None\n    serialized_body: Optional[str] = None\n\n\n@dataclass\nclass BookParams:\n    token_id: str\n    side: str = \"\"\n\n\n@dataclass\nclass OrderArgs:\n    token_id: str\n    \"\"\"\n    TokenID of the Conditional token asset being traded\n    \"\"\"\n\n    price: float\n    \"\"\"\n    Price used to create the order\n    \"\"\"\n\n    size: float\n    \"\"\"\n    Size in terms of the ConditionalToken\n    \"\"\"\n\n    side: str\n    \"\"\"\n    Side of the order\n    \"\"\"\n\n    fee_rate_bps: int = 0\n    \"\"\"\n    Fee rate, in basis points, charged to the order maker, charged on proceeds\n    \"\"\"\n\n    nonce: int = 0\n    \"\"\"\n    Nonce used for onchain cancellations\n    \"\"\"\n\n    expiration: int = 0\n    \"\"\"\n    Timestamp after which the order is expired.\n    \"\"\"\n\n    taker: str = ZERO_ADDRESS\n    \"\"\"\n    Address of the order taker. The zero address is used to indicate a public order\n    \"\"\"\n\n\n@dataclass\nclass MarketOrderArgs:\n    token_id: str\n    \"\"\"\n    TokenID of the Conditional token asset being traded\n    \"\"\"\n\n    amount: float\n    \"\"\"\n    BUY orders: $$$ Amount to buy\n    SELL orders: Shares to sell\n    \"\"\"\n\n    side: str\n    \"\"\"\n    Side of the order\n    \"\"\"\n\n    price: float = 0\n    \"\"\"\n    Price used to create the order\n    \"\"\"\n\n    fee_rate_bps: int = 0\n    \"\"\"\n    Fee rate, in basis points, charged to the order maker, charged on proceeds\n    \"\"\"\n\n    nonce: int = 0\n    \"\"\"\n    Nonce used for onchain cancellations\n    \"\"\"\n\n    taker: str = ZERO_ADDRESS\n    \"\"\"\n    Address of the order taker. The zero address is used to indicate a public order\n    \"\"\"\n\n    order_type: OrderType = OrderType.FOK\n\n\n@dataclass\nclass TradeParams:\n    id: str = None\n    maker_address: str = None\n    market: str = None\n    asset_id: str = None\n    before: int = None\n    after: int = None\n\n\n@dataclass\nclass OpenOrderParams:\n    id: str = None\n    market: str = None\n    asset_id: str = None\n\n\n@dataclass\nclass DropNotificationParams:\n    ids: list[str] = None\n\n\n@dataclass\nclass OrderSummary:\n    price: str = None\n    size: str = None\n\n    @property\n    def __dict__(self):\n        return asdict(self)\n\n    @property\n    def json(self):\n        return dumps(self.__dict__)\n\n\n@dataclass\nclass OrderBookSummary:\n    market: str = None\n    asset_id: str = None\n    timestamp: str = None\n    bids: list[OrderSummary] = None\n    asks: list[OrderSummary] = None\n    min_order_size: str = None\n    neg_risk: bool = None\n    tick_size: str = None\n    last_trade_price: str = None\n    hash: str = None\n\n    @property\n    def __dict__(self):\n        return asdict(self)\n\n    @property\n    def json(self):\n        return dumps(self.__dict__, separators=(\",\", \":\"))\n\n\nclass AssetType(enumerate):\n    COLLATERAL = \"COLLATERAL\"\n    CONDITIONAL = \"CONDITIONAL\"\n\n\n@dataclass\nclass BalanceAllowanceParams:\n    asset_type: AssetType = None\n    token_id: str = None\n    signature_type: int = -1\n\n\n@dataclass\nclass OrderScoringParams:\n    orderId: str\n\n\n@dataclass\nclass OrdersScoringParams:\n    orderIds: list[str]\n\n\nTickSize = Literal[\"0.1\", \"0.01\", \"0.001\", \"0.0001\"]\n\n\n@dataclass\nclass CreateOrderOptions:\n    tick_size: TickSize\n    neg_risk: bool\n\n\n@dataclass\nclass PartialCreateOrderOptions:\n    tick_size: Optional[TickSize] = None\n    neg_risk: Optional[bool] = None\n\n\n@dataclass\nclass RoundConfig:\n    price: float\n    size: float\n    amount: float\n\n\n@dataclass\nclass ContractConfig:\n    \"\"\"\n    Contract Configuration\n    \"\"\"\n\n    exchange: str\n    \"\"\"\n    The exchange contract responsible for matching orders\n    \"\"\"\n\n    collateral: str\n    \"\"\"\n    The ERC20 token used as collateral for the exchange's markets\n    \"\"\"\n\n    conditional_tokens: str\n    \"\"\"\n    The ERC1155 conditional tokens contract\n    \"\"\"\n\n\n@dataclass\nclass PostOrdersArgs:\n    order: SignedOrder\n    orderType: OrderType = OrderType.GTC\n    postOnly: bool = False\n"
  },
  {
    "path": "py_clob_client/config.py",
    "content": "from .clob_types import ContractConfig\n\n\ndef get_contract_config(chainID: int, neg_risk: bool = False) -> ContractConfig:\n    \"\"\"\n    Get the contract configuration for the chain\n    \"\"\"\n\n    CONFIG = {\n        137: ContractConfig(\n            exchange=\"0x4bFb41d5B3570DeFd03C39a9A4D8dE6Bd8B8982E\",\n            collateral=\"0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174\",\n            conditional_tokens=\"0x4D97DCd97eC945f40cF65F87097ACe5EA0476045\",\n        ),\n        80002: ContractConfig(\n            exchange=\"0xdFE02Eb6733538f8Ea35D585af8DE5958AD99E40\",\n            collateral=\"0x9c4e1703476e875070ee25b56a58b008cfb8fa78\",\n            conditional_tokens=\"0x69308FB512518e39F9b16112fA8d994F4e2Bf8bB\",\n        ),\n    }\n\n    NEG_RISK_CONFIG = {\n        137: ContractConfig(\n            exchange=\"0xC5d563A36AE78145C45a50134d48A1215220f80a\",\n            collateral=\"0x2791bca1f2de4661ed88a30c99a7a9449aa84174\",\n            conditional_tokens=\"0x4D97DCd97eC945f40cF65F87097ACe5EA0476045\",\n        ),\n        80002: ContractConfig(\n            exchange=\"0xd91E80cF2E7be2e162c6513ceD06f1dD0dA35296\",\n            collateral=\"0x9c4e1703476e875070ee25b56a58b008cfb8fa78\",\n            conditional_tokens=\"0x69308FB512518e39F9b16112fA8d994F4e2Bf8bB\",\n        ),\n    }\n\n    if neg_risk:\n        config = NEG_RISK_CONFIG.get(chainID)\n    else:\n        config = CONFIG.get(chainID)\n    if config is None:\n        raise Exception(\"Invalid chainID: ${}\".format(chainID))\n\n    return config\n"
  },
  {
    "path": "py_clob_client/constants.py",
    "content": "# Access levels\nL0 = 0\nL1 = 1\nL2 = 2\n\n\nCREDENTIAL_CREATION_WARNING = \"\"\"🚨🚨🚨\nYour credentials CANNOT be recovered after they've been created.\nBe sure to store them safely!\n🚨🚨🚨\"\"\"\n\n\nL1_AUTH_UNAVAILABLE = \"A private key is needed to interact with this endpoint!\"\n\nL2_AUTH_UNAVAILABLE = \"API Credentials are needed to interact with this endpoint!\"\n\nBUILDER_AUTH_UNAVAILABLE = (\n    \"Builder API Credentials needed to interact with this endpoint!\"\n)\n\nZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\"\n\nAMOY = 80002\nPOLYGON = 137\n\nEND_CURSOR = \"LTE=\"\n"
  },
  {
    "path": "py_clob_client/endpoints.py",
    "content": "TIME = \"/time\"\nCREATE_API_KEY = \"/auth/api-key\"\nGET_API_KEYS = \"/auth/api-keys\"\nDELETE_API_KEY = \"/auth/api-key\"\nDERIVE_API_KEY = \"/auth/derive-api-key\"\nCLOSED_ONLY = \"/auth/ban-status/closed-only\"\n\n# Readonly API Key endpoints\nCREATE_READONLY_API_KEY = \"/auth/readonly-api-key\"\nGET_READONLY_API_KEYS = \"/auth/readonly-api-keys\"\nDELETE_READONLY_API_KEY = \"/auth/readonly-api-key\"\nVALIDATE_READONLY_API_KEY = \"/auth/validate-readonly-api-key\"\n\nTRADES = \"/data/trades\"\nGET_ORDER_BOOK = \"/book\"\nGET_ORDER_BOOKS = \"/books\"\nGET_ORDER = \"/data/order/\"\nORDERS = \"/data/orders\"\nPOST_ORDER = \"/order\"\nPOST_ORDERS = \"/orders\"\nCANCEL = \"/order\"\nCANCEL_ORDERS = \"/orders\"\nCANCEL_ALL = \"/cancel-all\"\nCANCEL_MARKET_ORDERS = \"/cancel-market-orders\"\nMID_POINT = \"/midpoint\"\nMID_POINTS = \"/midpoints\"\nPRICE = \"/price\"\nGET_PRICES = \"/prices\"\nGET_SPREAD = \"/spread\"\nGET_SPREADS = \"/spreads\"\nGET_LAST_TRADE_PRICE = \"/last-trade-price\"\nGET_LAST_TRADES_PRICES = \"/last-trades-prices\"\nGET_NOTIFICATIONS = \"/notifications\"\nDROP_NOTIFICATIONS = \"/notifications\"\nGET_BALANCE_ALLOWANCE = \"/balance-allowance\"\nUPDATE_BALANCE_ALLOWANCE = \"/balance-allowance/update\"\nIS_ORDER_SCORING = \"/order-scoring\"\nARE_ORDERS_SCORING = \"/orders-scoring\"\nGET_TICK_SIZE = \"/tick-size\"\nGET_NEG_RISK = \"/neg-risk\"\nGET_FEE_RATE = \"/fee-rate\"\nGET_SAMPLING_SIMPLIFIED_MARKETS = \"/sampling-simplified-markets\"\nGET_SAMPLING_MARKETS = \"/sampling-markets\"\nGET_SIMPLIFIED_MARKETS = \"/simplified-markets\"\nGET_MARKETS = \"/markets\"\nGET_MARKET = \"/markets/\"\nGET_MARKET_TRADES_EVENTS = \"/live-activity/events/\"\nPOST_HEARTBEAT = \"/v1/heartbeats\"\nGET_BUILDER_TRADES = \"/builder/trades\"\n\n# RFQ Endpoints\nCREATE_RFQ_REQUEST = \"/rfq/request\"\nCANCEL_RFQ_REQUEST = \"/rfq/request\"\nGET_RFQ_REQUESTS = \"/rfq/data/requests\"\nCREATE_RFQ_QUOTE = \"/rfq/quote\"\nCANCEL_RFQ_QUOTE = \"/rfq/quote\"\nGET_RFQ_REQUESTER_QUOTES = \"/rfq/data/requester/quotes\"\nGET_RFQ_QUOTER_QUOTES = \"/rfq/data/quoter/quotes\"\nGET_RFQ_BEST_QUOTE = \"/rfq/data/best-quote\"\nRFQ_REQUESTS_ACCEPT = \"/rfq/request/accept\"\nRFQ_QUOTE_APPROVE = \"/rfq/quote/approve\"\nRFQ_CONFIG = \"/rfq/config\"\n"
  },
  {
    "path": "py_clob_client/exceptions.py",
    "content": "from typing import Optional\n\nimport httpx\n\n\nclass PolyException(Exception):\n    def __init__(self, msg):\n        self.msg = msg\n\n\nclass PolyApiException(PolyException):\n    def __init__(self, resp: Optional[httpx.Response] = None, error_msg=None):\n        assert resp is not None or error_msg is not None\n\n        if resp is not None:\n            self.status_code = resp.status_code\n            self.error_msg = self._get_message(resp)\n        else:\n            self.status_code = None\n            self.error_msg = error_msg\n\n    def _get_message(self, resp: httpx.Response):\n        try:\n            return resp.json()\n        except Exception:\n            return resp.text\n\n    def __repr__(self):\n        return f\"PolyApiException[status_code={self.status_code}, error_message={self.error_msg}]\"\n\n    def __str__(self):\n        return self.__repr__()\n"
  },
  {
    "path": "py_clob_client/headers/__init__.py",
    "content": ""
  },
  {
    "path": "py_clob_client/headers/headers.py",
    "content": "from ..clob_types import ApiCreds, RequestArgs\nfrom ..signing.hmac import build_hmac_signature\nfrom ..signer import Signer\nfrom ..signing.eip712 import sign_clob_auth_message\n\nfrom datetime import datetime\n\nPOLY_ADDRESS = \"POLY_ADDRESS\"\nPOLY_SIGNATURE = \"POLY_SIGNATURE\"\nPOLY_TIMESTAMP = \"POLY_TIMESTAMP\"\nPOLY_NONCE = \"POLY_NONCE\"\nPOLY_API_KEY = \"POLY_API_KEY\"\nPOLY_PASSPHRASE = \"POLY_PASSPHRASE\"\n\n\ndef create_level_1_headers(signer: Signer, nonce: int = None):\n    \"\"\"\n    Creates Level 1 Poly headers for a request\n    \"\"\"\n    timestamp = int(datetime.now().timestamp())\n\n    n = 0\n    if nonce is not None:\n        n = nonce\n\n    signature = sign_clob_auth_message(signer, timestamp, n)\n    headers = {\n        POLY_ADDRESS: signer.address(),\n        POLY_SIGNATURE: signature,\n        POLY_TIMESTAMP: str(timestamp),\n        POLY_NONCE: str(n),\n    }\n\n    return headers\n\n\ndef create_level_2_headers(signer: Signer, creds: ApiCreds, request_args: RequestArgs):\n    \"\"\"Creates Level 2 Poly headers for a request using pre-serialized body if provided\"\"\"\n    timestamp = int(datetime.now().timestamp())\n\n    # Prefer the pre-serialized body string for deterministic signing if available\n    body_for_sig = (\n        request_args.serialized_body\n        if request_args.serialized_body is not None\n        else request_args.body\n    )\n\n    hmac_sig = build_hmac_signature(\n        creds.api_secret,\n        timestamp,\n        request_args.method,\n        request_args.request_path,\n        body_for_sig,\n    )\n\n    return {\n        POLY_ADDRESS: signer.address(),\n        POLY_SIGNATURE: hmac_sig,\n        POLY_TIMESTAMP: str(timestamp),\n        POLY_API_KEY: creds.api_key,\n        POLY_PASSPHRASE: creds.api_passphrase,\n    }\n\n\ndef enrich_l2_headers_with_builder_headers(\n    headers: dict, builder_headers: dict\n) -> dict:\n    return {**headers, **builder_headers}\n"
  },
  {
    "path": "py_clob_client/http_helpers/__init__.py",
    "content": ""
  },
  {
    "path": "py_clob_client/http_helpers/helpers.py",
    "content": "import httpx\n\nfrom py_clob_client.clob_types import (\n    DropNotificationParams,\n    BalanceAllowanceParams,\n    OrderScoringParams,\n    OrdersScoringParams,\n    TradeParams,\n    OpenOrderParams,\n)\n\nfrom ..exceptions import PolyApiException\n\nGET = \"GET\"\nPOST = \"POST\"\nDELETE = \"DELETE\"\nPUT = \"PUT\"\n\n_http_client = httpx.Client(http2=True)\n\n\ndef overloadHeaders(method: str, headers: dict) -> dict:\n    if headers is None:\n        headers = dict()\n    headers[\"User-Agent\"] = \"py_clob_client\"\n\n    headers[\"Accept\"] = \"*/*\"\n    headers[\"Connection\"] = \"keep-alive\"\n    headers[\"Content-Type\"] = \"application/json\"\n\n    if method == GET:\n        headers[\"Accept-Encoding\"] = \"gzip\"\n\n    return headers\n\n\ndef request(endpoint: str, method: str, headers=None, data=None):\n    try:\n        headers = overloadHeaders(method, headers)\n        if isinstance(data, str):\n            # Pre-serialized body: send exact bytes\n            resp = _http_client.request(\n                method=method,\n                url=endpoint,\n                headers=headers,\n                content=data.encode(\"utf-8\"),\n            )\n        else:\n            resp = _http_client.request(\n                method=method,\n                url=endpoint,\n                headers=headers,\n                json=data,\n            )\n\n        if resp.status_code != 200:\n            raise PolyApiException(resp)\n\n        try:\n            return resp.json()\n        except ValueError:\n            return resp.text\n\n    except httpx.RequestError:\n        raise PolyApiException(error_msg=\"Request exception!\")\n\n\ndef post(endpoint, headers=None, data=None):\n    return request(endpoint, POST, headers, data)\n\n\ndef get(endpoint, headers=None, data=None):\n    return request(endpoint, GET, headers, data)\n\n\ndef delete(endpoint, headers=None, data=None):\n    return request(endpoint, DELETE, headers, data)\n\n\ndef put(endpoint, headers=None, data=None):\n    return request(endpoint, PUT, headers, data)\n\n\ndef build_query_params(url: str, param: str, val: str) -> str:\n    url_with_params = url\n    last = url_with_params[-1]\n    # if last character in url string == \"?\", append the param directly: api.com?param=value\n    if last == \"?\":\n        url_with_params = \"{}{}={}\".format(url_with_params, param, val)\n    else:\n        # else add \"&\", then append the param\n        url_with_params = \"{}&{}={}\".format(url_with_params, param, val)\n    return url_with_params\n\n\ndef add_query_trade_params(\n    base_url: str, params: TradeParams = None, next_cursor=\"MA==\"\n) -> str:\n    \"\"\"\n    Adds query parameters to a url\n    \"\"\"\n    url = base_url\n    # Include `next_cursor` even when `params` is None to advance pagination.\n    has_query = bool(next_cursor) or (\n        bool(params)\n        and any(\n            [\n                params.market,\n                params.asset_id,\n                params.after,\n                params.before,\n                params.maker_address,\n                params.id,\n            ]\n        )\n    )\n    if has_query:\n        url = url + \"?\"\n    if params:\n        if params.market:\n            url = build_query_params(url, \"market\", params.market)\n        if params.asset_id:\n            url = build_query_params(url, \"asset_id\", params.asset_id)\n        if params.after:\n            url = build_query_params(url, \"after\", params.after)\n        if params.before:\n            url = build_query_params(url, \"before\", params.before)\n        if params.maker_address:\n            url = build_query_params(url, \"maker_address\", params.maker_address)\n        if params.id:\n            url = build_query_params(url, \"id\", params.id)\n    if next_cursor:\n        url = build_query_params(url, \"next_cursor\", next_cursor)\n    return url\n\n\ndef add_query_open_orders_params(\n    base_url: str, params: OpenOrderParams = None, next_cursor=\"MA==\"\n) -> str:\n    \"\"\"\n    Adds query parameters to a url\n    \"\"\"\n    url = base_url\n    # Include `next_cursor` even when `params` is None to advance pagination.\n    has_query = bool(next_cursor) or (\n        bool(params) and any([params.market, params.asset_id, params.id])\n    )\n    if has_query:\n        url = url + \"?\"\n    if params:\n        if params.market:\n            url = build_query_params(url, \"market\", params.market)\n        if params.asset_id:\n            url = build_query_params(url, \"asset_id\", params.asset_id)\n        if params.id:\n            url = build_query_params(url, \"id\", params.id)\n    if next_cursor:\n        url = build_query_params(url, \"next_cursor\", next_cursor)\n    return url\n\n\ndef drop_notifications_query_params(\n    base_url: str, params: DropNotificationParams = None\n) -> str:\n    \"\"\"\n    Adds query parameters to a url\n    \"\"\"\n    url = base_url\n    if params:\n        url = url + \"?\"\n        if params.ids:\n            url = build_query_params(url, \"ids\", \",\".join(params.ids))\n    return url\n\n\ndef add_balance_allowance_params_to_url(\n    base_url: str, params: BalanceAllowanceParams = None\n) -> str:\n    \"\"\"\n    Adds query parameters to a url\n    \"\"\"\n    url = base_url\n    if params:\n        url = url + \"?\"\n        if params.asset_type:\n            url = build_query_params(url, \"asset_type\", params.asset_type.__str__())\n        if params.token_id:\n            url = build_query_params(url, \"token_id\", params.token_id)\n        if params.signature_type is not None:\n            url = build_query_params(url, \"signature_type\", params.signature_type)\n    return url\n\n\ndef add_order_scoring_params_to_url(\n    base_url: str, params: OrderScoringParams = None\n) -> str:\n    \"\"\"\n    Adds query parameters to a url\n    \"\"\"\n    url = base_url\n    if params:\n        url = url + \"?\"\n        if params.orderId:\n            url = build_query_params(url, \"order_id\", params.orderId)\n    return url\n\n\ndef add_orders_scoring_params_to_url(\n    base_url: str, params: OrdersScoringParams = None\n) -> str:\n    \"\"\"\n    Adds query parameters to a url\n    \"\"\"\n    url = base_url\n    if params:\n        url = url + \"?\"\n        if params.orderIds:\n            url = build_query_params(url, \"order_ids\", \",\".join(params.orderIds))\n    return url\n"
  },
  {
    "path": "py_clob_client/order_builder/__init__.py",
    "content": ""
  },
  {
    "path": "py_clob_client/order_builder/builder.py",
    "content": "from py_order_utils.builders import OrderBuilder as UtilsOrderBuilder\nfrom py_order_utils.signer import Signer as UtilsSigner\nfrom py_order_utils.model import (\n    EOA,\n    OrderData,\n    SignedOrder,\n    BUY as UtilsBuy,\n    SELL as UtilsSell,\n)\n\nfrom .helpers import (\n    to_token_decimals,\n    round_down,\n    round_normal,\n    decimal_places,\n    round_up,\n)\nfrom .constants import BUY, SELL\nfrom ..config import get_contract_config\nfrom ..signer import Signer\nfrom ..clob_types import (\n    OrderArgs,\n    CreateOrderOptions,\n    TickSize,\n    RoundConfig,\n    MarketOrderArgs,\n    OrderSummary,\n    OrderType,\n)\n\nROUNDING_CONFIG: dict[TickSize, RoundConfig] = {\n    \"0.1\": RoundConfig(price=1, size=2, amount=3),\n    \"0.01\": RoundConfig(price=2, size=2, amount=4),\n    \"0.001\": RoundConfig(price=3, size=2, amount=5),\n    \"0.0001\": RoundConfig(price=4, size=2, amount=6),\n}\n\n\nclass OrderBuilder:\n    def __init__(self, signer: Signer, sig_type=None, funder=None):\n        self.signer = signer\n\n        # Signature type used sign orders, defaults to EOA type\n        self.sig_type = sig_type if sig_type is not None else EOA\n\n        # Address which holds funds to be used.\n        # Used for Polymarket proxy wallets and other smart contract wallets\n        # Defaults to the address of the signer\n        self.funder = funder if funder is not None else self.signer.address()\n\n    def get_order_amounts(\n        self, side: str, size: float, price: float, round_config: RoundConfig\n    ):\n        raw_price = round_normal(price, round_config.price)\n\n        if side == BUY:\n            raw_taker_amt = round_down(size, round_config.size)\n\n            raw_maker_amt = raw_taker_amt * raw_price\n            if decimal_places(raw_maker_amt) > round_config.amount:\n                raw_maker_amt = round_up(raw_maker_amt, round_config.amount + 4)\n                if decimal_places(raw_maker_amt) > round_config.amount:\n                    raw_maker_amt = round_down(raw_maker_amt, round_config.amount)\n\n            maker_amount = to_token_decimals(raw_maker_amt)\n            taker_amount = to_token_decimals(raw_taker_amt)\n\n            return UtilsBuy, maker_amount, taker_amount\n        elif side == SELL:\n            raw_maker_amt = round_down(size, round_config.size)\n\n            raw_taker_amt = raw_maker_amt * raw_price\n            if decimal_places(raw_taker_amt) > round_config.amount:\n                raw_taker_amt = round_up(raw_taker_amt, round_config.amount + 4)\n                if decimal_places(raw_taker_amt) > round_config.amount:\n                    raw_taker_amt = round_down(raw_taker_amt, round_config.amount)\n\n            maker_amount = to_token_decimals(raw_maker_amt)\n            taker_amount = to_token_decimals(raw_taker_amt)\n\n            return UtilsSell, maker_amount, taker_amount\n        else:\n            raise ValueError(f\"order_args.side must be '{BUY}' or '{SELL}'\")\n\n    def get_market_order_amounts(\n        self, side: str, amount: float, price: float, round_config: RoundConfig\n    ):\n        raw_price = round_normal(price, round_config.price)\n\n        if side == BUY:\n            raw_maker_amt = round_down(amount, round_config.size)\n            raw_taker_amt = raw_maker_amt / raw_price\n            if decimal_places(raw_taker_amt) > round_config.amount:\n                raw_taker_amt = round_up(raw_taker_amt, round_config.amount + 4)\n                if decimal_places(raw_taker_amt) > round_config.amount:\n                    raw_taker_amt = round_down(raw_taker_amt, round_config.amount)\n\n            maker_amount = to_token_decimals(raw_maker_amt)\n            taker_amount = to_token_decimals(raw_taker_amt)\n\n            return UtilsBuy, maker_amount, taker_amount\n\n        elif side == SELL:\n            raw_maker_amt = round_down(amount, round_config.size)\n\n            raw_taker_amt = raw_maker_amt * raw_price\n            if decimal_places(raw_taker_amt) > round_config.amount:\n                raw_taker_amt = round_up(raw_taker_amt, round_config.amount + 4)\n                if decimal_places(raw_taker_amt) > round_config.amount:\n                    raw_taker_amt = round_down(raw_taker_amt, round_config.amount)\n\n            maker_amount = to_token_decimals(raw_maker_amt)\n            taker_amount = to_token_decimals(raw_taker_amt)\n\n            return UtilsSell, maker_amount, taker_amount\n        else:\n            raise ValueError(f\"order_args.side must be '{BUY}' or '{SELL}'\")\n\n    def create_order(\n        self, order_args: OrderArgs, options: CreateOrderOptions\n    ) -> SignedOrder:\n        \"\"\"\n        Creates and signs an order\n        \"\"\"\n        side, maker_amount, taker_amount = self.get_order_amounts(\n            order_args.side,\n            order_args.size,\n            order_args.price,\n            ROUNDING_CONFIG[options.tick_size],\n        )\n\n        data = OrderData(\n            maker=self.funder,\n            taker=order_args.taker,\n            tokenId=order_args.token_id,\n            makerAmount=str(maker_amount),\n            takerAmount=str(taker_amount),\n            side=side,\n            feeRateBps=str(order_args.fee_rate_bps),\n            nonce=str(order_args.nonce),\n            signer=self.signer.address(),\n            expiration=str(order_args.expiration),\n            signatureType=self.sig_type,\n        )\n\n        contract_config = get_contract_config(\n            self.signer.get_chain_id(), options.neg_risk\n        )\n\n        order_builder = UtilsOrderBuilder(\n            contract_config.exchange,\n            self.signer.get_chain_id(),\n            UtilsSigner(key=self.signer.private_key),\n        )\n\n        return order_builder.build_signed_order(data)\n\n    def create_market_order(\n        self, order_args: MarketOrderArgs, options: CreateOrderOptions\n    ) -> SignedOrder:\n        \"\"\"\n        Creates and signs a market order\n        \"\"\"\n        side, maker_amount, taker_amount = self.get_market_order_amounts(\n            order_args.side,\n            order_args.amount,\n            order_args.price,\n            ROUNDING_CONFIG[options.tick_size],\n        )\n\n        data = OrderData(\n            maker=self.funder,\n            taker=order_args.taker,\n            tokenId=order_args.token_id,\n            makerAmount=str(maker_amount),\n            takerAmount=str(taker_amount),\n            side=side,\n            feeRateBps=str(order_args.fee_rate_bps),\n            nonce=str(order_args.nonce),\n            signer=self.signer.address(),\n            expiration=\"0\",\n            signatureType=self.sig_type,\n        )\n\n        contract_config = get_contract_config(\n            self.signer.get_chain_id(), options.neg_risk\n        )\n\n        order_builder = UtilsOrderBuilder(\n            contract_config.exchange,\n            self.signer.get_chain_id(),\n            UtilsSigner(key=self.signer.private_key),\n        )\n\n        return order_builder.build_signed_order(data)\n\n    def calculate_buy_market_price(\n        self,\n        positions: list[OrderSummary],\n        amount_to_match: float,\n        order_type: OrderType,\n    ) -> float:\n        if not positions:\n            raise Exception(\"no match\")\n\n        sum = 0\n        for p in reversed(positions):\n            sum += float(p.size) * float(p.price)\n            if sum >= amount_to_match:\n                return float(p.price)\n\n        if order_type == OrderType.FOK:\n            raise Exception(\"no match\")\n\n        return float(positions[0].price)\n\n    def calculate_sell_market_price(\n        self,\n        positions: list[OrderSummary],\n        amount_to_match: float,\n        order_type: OrderType,\n    ) -> float:\n        if not positions:\n            raise Exception(\"no match\")\n\n        sum = 0\n        for p in reversed(positions):\n            sum += float(p.size)\n            if sum >= amount_to_match:\n                return float(p.price)\n\n        if order_type == OrderType.FOK:\n            raise Exception(\"no match\")\n\n        return float(positions[0].price)\n"
  },
  {
    "path": "py_clob_client/order_builder/constants.py",
    "content": "BUY = \"BUY\"\nSELL = \"SELL\"\n"
  },
  {
    "path": "py_clob_client/order_builder/helpers.py",
    "content": "from math import floor, ceil\nfrom decimal import Decimal\n\n\ndef round_down(x: float, sig_digits: int) -> float:\n    return floor(x * (10**sig_digits)) / (10**sig_digits)\n\n\ndef round_normal(x: float, sig_digits: int) -> float:\n    return round(x * (10**sig_digits)) / (10**sig_digits)\n\n\ndef round_up(x: float, sig_digits: int) -> float:\n    return ceil(x * (10**sig_digits)) / (10**sig_digits)\n\n\ndef to_token_decimals(x: float) -> int:\n    f = (10**6) * x\n    if decimal_places(f) > 0:\n        f = round_normal(f, 0)\n    return int(f)\n\n\ndef decimal_places(x: float) -> int:\n    return abs(Decimal(x.__str__()).as_tuple().exponent)\n"
  },
  {
    "path": "py_clob_client/rfq/__init__.py",
    "content": "from .rfq_types import (\n    # Input types\n    RfqUserRequest,\n    RfqUserQuote,\n    CreateRfqRequestParams,\n    CreateRfqQuoteParams,\n    CancelRfqRequestParams,\n    CancelRfqQuoteParams,\n    AcceptQuoteParams,\n    ApproveOrderParams,\n    GetRfqRequestsParams,\n    GetRfqQuotesParams,\n    GetRfqBestQuoteParams,\n    # Response types\n    RfqRequest,\n    RfqQuote,\n    RfqRequestResponse,\n    RfqQuoteResponse,\n    RfqPaginatedResponse,\n)\n\nfrom .rfq_helpers import (\n    parse_units,\n    to_camel_case,\n    parse_rfq_requests_params,\n    parse_rfq_quotes_params,\n    COLLATERAL_TOKEN_DECIMALS,\n    CONDITIONAL_TOKEN_DECIMALS,\n)\n\nfrom .rfq_client import RfqClient\n\n__all__ = [\n    # Client\n    \"RfqClient\",\n    # Input types\n    \"RfqUserRequest\",\n    \"RfqUserQuote\",\n    \"CreateRfqRequestParams\",\n    \"CreateRfqQuoteParams\",\n    \"CancelRfqRequestParams\",\n    \"CancelRfqQuoteParams\",\n    \"AcceptQuoteParams\",\n    \"ApproveOrderParams\",\n    \"GetRfqRequestsParams\",\n    \"GetRfqQuotesParams\",\n    \"GetRfqBestQuoteParams\",\n    # Response types\n    \"RfqRequest\",\n    \"RfqQuote\",\n    \"RfqRequestResponse\",\n    \"RfqQuoteResponse\",\n    \"RfqPaginatedResponse\",\n    # Helpers\n    \"parse_units\",\n    \"to_camel_case\",\n    \"parse_rfq_requests_params\",\n    \"parse_rfq_quotes_params\",\n    \"COLLATERAL_TOKEN_DECIMALS\",\n    \"CONDITIONAL_TOKEN_DECIMALS\",\n]\n"
  },
  {
    "path": "py_clob_client/rfq/rfq_client.py",
    "content": "\"\"\"\nRFQ (Request for Quote) client for the Polymarket CLOB API.\n\nThis module provides the RfqClient class which handles all RFQ operations\nincluding creating requests, quotes, and executing trades.\n\"\"\"\n\nimport logging\nimport json\nfrom urllib.parse import urlencode\nfrom typing import Optional, Any, TYPE_CHECKING\n\nfrom ..clob_types import RequestArgs, OrderArgs, PartialCreateOrderOptions\nfrom ..headers.headers import create_level_2_headers\nfrom ..http_helpers.helpers import get, post, delete\nfrom ..order_builder.builder import ROUNDING_CONFIG\nfrom ..order_builder.helpers import round_normal, round_down\nfrom ..order_builder.constants import BUY, SELL\nfrom ..endpoints import (\n    CREATE_RFQ_REQUEST,\n    CANCEL_RFQ_REQUEST,\n    GET_RFQ_REQUESTS,\n    CREATE_RFQ_QUOTE,\n    CANCEL_RFQ_QUOTE,\n    GET_RFQ_REQUESTER_QUOTES,\n    GET_RFQ_QUOTER_QUOTES,\n    GET_RFQ_BEST_QUOTE,\n    RFQ_REQUESTS_ACCEPT,\n    RFQ_QUOTE_APPROVE,\n    RFQ_CONFIG,\n)\n\nfrom .rfq_types import (\n    RfqUserRequest,\n    RfqUserQuote,\n\n    CancelRfqRequestParams,\n    CancelRfqQuoteParams,\n    AcceptQuoteParams,\n    ApproveOrderParams,\n    GetRfqRequestsParams,\n    GetRfqQuotesParams,\n    GetRfqBestQuoteParams,\n    MatchType,\n)\nfrom .rfq_helpers import (\n    parse_units,\n    parse_rfq_requests_params,\n    parse_rfq_quotes_params,\n    COLLATERAL_TOKEN_DECIMALS,\n)\n\nif TYPE_CHECKING:\n    from ..client import ClobClient\n\n\nclass RfqClient:\n    \"\"\"\n    RFQ client for creating and managing RFQ requests and quotes.\n\n    This client is typically accessed via the parent ClobClient's `rfq` attribute:\n\n        client = ClobClient(host, chain_id, key, creds)\n        response = client.rfq.create_rfq_request(user_request)\n    \"\"\"\n\n    def __init__(self, parent: \"ClobClient\"):\n        \"\"\"\n        Initialize the RFQ client.\n\n        Args:\n            parent: The parent ClobClient instance providing auth and config.\n        \"\"\"\n        self._parent = parent\n        self.logger = logging.getLogger(self.__class__.__name__)\n\n    def _ensure_l2_auth(self) -> None:\n        \"\"\"\n        Verify that L2 authentication is available.\n\n        Raises:\n            PolyException: If signer or creds are not configured.\n        \"\"\"\n        self._parent.assert_level_2_auth()\n\n    def _get_l2_headers(self, method: str, endpoint: str, body: Any = None, serialized_body: Any = None) -> dict:\n        \"\"\"\n        Create L2 authentication headers for a request.\n\n        Args:\n            method: HTTP method (GET, POST, PUT, DELETE)\n            endpoint: API endpoint path\n            body: Optional request body\n\n        Returns:\n            Dictionary of authentication headers.\n        \"\"\"\n        request_args = RequestArgs(method=method, request_path=endpoint, body=body)\n        if serialized_body is not None:\n            request_args.serialized_body = serialized_body\n\n        return create_level_2_headers(\n            self._parent.signer,\n            self._parent.creds,\n            request_args,\n        )\n\n    def _build_url(self, endpoint: str) -> str:\n        \"\"\"Build full URL from endpoint.\"\"\"\n        return f\"{self._parent.host}{endpoint}\"\n\n    # =========================================================================\n    # Request-side methods\n    # =========================================================================\n\n    def create_rfq_request(\n        self,\n        user_request: RfqUserRequest,\n        options: Optional[PartialCreateOrderOptions] = None,\n    ) -> dict:\n        \"\"\"\n        Create and post an RFQ request from a user request.\n\n        This method:\n        1. Resolves the tick size for the token\n        2. Rounds price and size according to tick size rules\n        3. Calculates amount_in and amount_out based on side\n        4. Posts the request to the server\n\n        Args:\n            user_order: Simplified order with token_id, price, side, size\n            options: Optional tick size override\n\n        Returns:\n            Response dict with request_id on success.\n\n        Example:\n            >>> response = client.rfq.create_rfq_request(\n            ...     RfqUserRequest(\n            ...         token_id=\"123...\",\n            ...         price=0.5,\n            ...         side=\"BUY\",\n            ...         size=40,\n            ...     )\n            ... )\n        \"\"\"\n        token_id = user_request.token_id\n        price = user_request.price\n        side = user_request.side\n        size = user_request.size\n\n        # Resolve tick size (from options or fetch from server)\n        tick_size = self._parent._ClobClient__resolve_tick_size(\n            token_id,\n            options.tick_size if options else None,\n        )\n\n        # Get rounding configuration (ensure tick_size is a string for lookup)\n        tick_size_str = str(tick_size) if not isinstance(tick_size, str) else tick_size\n        round_config = ROUNDING_CONFIG[tick_size_str]\n\n        # Round price and size\n        rounded_price = round_normal(price, round_config.price)\n        rounded_size = round_down(size, round_config.size)\n\n        # Format with correct decimal places\n        price_decimals = int(round_config.price)\n        size_decimals = int(round_config.size)\n        amount_decimals = int(round_config.amount)\n\n        rounded_price_str = f\"{rounded_price:.{price_decimals}f}\"\n        rounded_size_str = f\"{rounded_size:.{size_decimals}f}\"\n\n        # Parse back to numbers for calculation\n        size_num = float(rounded_size_str)\n        price_num = float(rounded_price_str)\n\n        # Get signature type from parent's order builder\n        user_type = self._parent.builder.sig_type\n\n        # Calculate amounts based on side\n        if side == BUY:\n            # Buying tokens: pay USDC, receive tokens\n            # asset_in = tokens (what requester receives)\n            # asset_out = USDC (what requester pays)\n            amount_in = parse_units(rounded_size_str, COLLATERAL_TOKEN_DECIMALS)\n\n            usdc_amount = size_num * price_num\n            usdc_amount_str = f\"{usdc_amount:.{amount_decimals}f}\"\n            amount_out = parse_units(usdc_amount_str, COLLATERAL_TOKEN_DECIMALS)\n\n            asset_in = token_id\n            asset_out = \"0\"  # USDC\n        else:\n            # Selling tokens: pay tokens, receive USDC\n            # asset_in = USDC (what requester receives)\n            # asset_out = tokens (what requester pays)\n            usdc_amount = size_num * price_num\n            usdc_amount_str = f\"{usdc_amount:.{amount_decimals}f}\"\n            amount_in = parse_units(usdc_amount_str, COLLATERAL_TOKEN_DECIMALS)\n\n            amount_out = parse_units(rounded_size_str, COLLATERAL_TOKEN_DECIMALS)\n\n            asset_in = \"0\"  # USDC\n            asset_out = token_id\n\n        # Post directly to the server\n        self._ensure_l2_auth()\n\n        body = {\n            \"assetIn\": asset_in,\n            \"assetOut\": asset_out,\n            \"amountIn\": str(amount_in),\n            \"amountOut\": str(amount_out),\n            \"userType\": user_type,\n        }\n        serialized_body = json.dumps(body, separators=(\",\", \":\"), ensure_ascii=False)\n        headers = self._get_l2_headers(\"POST\", CREATE_RFQ_REQUEST, body, serialized_body)\n        return post(self._build_url(CREATE_RFQ_REQUEST), headers=headers, data=serialized_body)\n\n    def cancel_rfq_request(self, params: CancelRfqRequestParams) -> str:\n        \"\"\"\n        Cancel an RFQ request.\n\n        Args:\n            params: Contains request_id to cancel.\n\n        Returns:\n            \"OK\" on success.\n        \"\"\"\n        self._ensure_l2_auth()\n\n        body = {\"requestId\": params.request_id}\n        serialized_body = json.dumps(body, separators=(\",\", \":\"), ensure_ascii=False)\n        headers = self._get_l2_headers(\"DELETE\", CANCEL_RFQ_REQUEST, body, serialized_body)\n        return delete(self._build_url(CANCEL_RFQ_REQUEST), headers=headers, data=serialized_body)\n\n    def get_rfq_requests(\n        self, params: Optional[GetRfqRequestsParams] = None\n    ) -> dict:\n        \"\"\"\n        Get RFQ requests with optional filtering.\n\n        Args:\n            params: Optional filter parameters.\n\n        Returns:\n            Paginated response with RFQ requests.\n        \"\"\"\n        self._ensure_l2_auth()\n\n        headers = self._get_l2_headers(\"GET\", GET_RFQ_REQUESTS)\n        query_params = parse_rfq_requests_params(params)\n\n        # Build URL with query params\n        url = self._build_url(GET_RFQ_REQUESTS)\n        if query_params:\n            # Use doseq=True so list values become repeated query params:\n            # requestIds=id1&requestIds=id2\n            url = f\"{url}?{urlencode(query_params, doseq=True)}\"\n\n        return get(url, headers=headers)\n\n    # =========================================================================\n    # Quote-side methods\n    # =========================================================================\n\n    def create_rfq_quote(\n        self,\n        user_quote: RfqUserQuote,\n        options: Optional[PartialCreateOrderOptions] = None,\n    ) -> dict:\n        \"\"\"\n        Create and post an RFQ quote in response to an RFQ request.\n\n        This method:\n        1. Fetches the RFQ request to get token_id\n        2. Resolves the tick size for the token\n        3. Rounds price and size according to tick size rules\n        4. Calculates amount_in and amount_out based on side\n        5. Posts the quote to the server\n\n        Args:\n            user_quote: Simplified quote with request_id, token_id, price, side, size\n            options: Optional tick size override\n\n        Returns:\n            Response dict with quote_id on success.\n\n        Example:\n            >>> response = client.rfq.create_rfq_quote(\n            ...     RfqUserQuote(\n            ...         request_id=\"019a83a9-f4c7-7c96-9139-2da2b2d934ef\",\n            ...         token_id=\"123...\",\n            ...         price=0.5,\n            ...         side=\"SELL\",\n            ...         size=100.0,\n            ...     )\n            ... )\n        \"\"\"\n\n        request_id = user_quote.request_id\n        token_id = user_quote.token_id\n        price = user_quote.price\n        side = user_quote.side\n        size = user_quote.size\n\n        # Resolve tick size (from options or fetch from server)\n        tick_size = self._parent._ClobClient__resolve_tick_size(\n            token_id,\n            options.tick_size if options else None,\n        )\n\n        # Get rounding configuration (ensure tick_size is a string for lookup)\n        tick_size_str = str(tick_size) if not isinstance(tick_size, str) else tick_size\n        round_config = ROUNDING_CONFIG[tick_size_str]\n\n        # Round price and size\n        rounded_price = round_normal(price, round_config.price)\n        rounded_size = round_down(size, round_config.size)\n\n        # Format with correct decimal places\n        price_decimals = int(round_config.price)\n        size_decimals = int(round_config.size)\n        amount_decimals = int(round_config.amount)\n\n        rounded_price_str = f\"{rounded_price:.{price_decimals}f}\"\n        rounded_size_str = f\"{rounded_size:.{size_decimals}f}\"\n\n        # Parse back to numbers for calculation\n        size_num = float(rounded_size_str)\n        price_num = float(rounded_price_str)\n\n        # Get signature type from parent's order builder\n        user_type = self._parent.builder.sig_type\n\n        # Calculate amounts based on side\n        if side == BUY:\n            # Buying tokens: pay USDC, receive tokens\n            # asset_in = tokens (what quoter receives)\n            # asset_out = USDC (what quoter pays)\n            amount_in = parse_units(rounded_size_str, COLLATERAL_TOKEN_DECIMALS)\n\n            usdc_amount = size_num * price_num\n            usdc_amount_str = f\"{usdc_amount:.{amount_decimals}f}\"\n            amount_out = parse_units(usdc_amount_str, COLLATERAL_TOKEN_DECIMALS)\n\n            asset_in = token_id\n            asset_out = \"0\"  # USDC\n        else:\n            # Selling tokens: pay tokens, receive USDC\n            # asset_in = USDC (what quoter receives)\n            # asset_out = tokens (what quoter pays)\n            usdc_amount = size_num * price_num\n            usdc_amount_str = f\"{usdc_amount:.{amount_decimals}f}\"\n            amount_in = parse_units(usdc_amount_str, COLLATERAL_TOKEN_DECIMALS)\n\n            amount_out = parse_units(rounded_size_str, COLLATERAL_TOKEN_DECIMALS)\n\n            asset_in = \"0\"  # USDC\n            asset_out = token_id\n\n        # Post directly to the server\n        self._ensure_l2_auth()\n\n        body = {\n            \"requestId\": request_id,\n            \"assetIn\": asset_in,\n            \"assetOut\": asset_out,\n            \"amountIn\": str(amount_in),\n            \"amountOut\": str(amount_out),\n            \"userType\": user_type,\n        }\n        serialized_body = json.dumps(body, separators=(\",\", \":\"), ensure_ascii=False)\n        headers = self._get_l2_headers(\"POST\", CREATE_RFQ_QUOTE, body, serialized_body)\n        return post(self._build_url(CREATE_RFQ_QUOTE), headers=headers, data=serialized_body)\n\n    def get_rfq_requester_quotes(self, params: Optional[GetRfqQuotesParams] = None) -> dict:\n        \"\"\"\n        Get quotes on requests created by the authenticated user (requester view).\n\n        Returns quotes that others have made on your RFQ requests.\n\n        Args:\n            params: Optional filter parameters.\n\n        Returns:\n            Paginated response with RFQ quotes.\n        \"\"\"\n        self._ensure_l2_auth()\n\n        headers = self._get_l2_headers(\"GET\", GET_RFQ_REQUESTER_QUOTES)\n        query_params = parse_rfq_quotes_params(params)\n\n        # Build URL with query params\n        url = self._build_url(GET_RFQ_REQUESTER_QUOTES)\n        if query_params:\n            url = f\"{url}?{urlencode(query_params, doseq=True)}\"\n\n        return get(url, headers=headers)\n\n    def get_rfq_quoter_quotes(self, params: Optional[GetRfqQuotesParams] = None) -> dict:\n        \"\"\"\n        Get quotes created by the authenticated user (quoter view).\n\n        Returns quotes that you have made on others' RFQ requests.\n\n        Args:\n            params: Optional filter parameters.\n\n        Returns:\n            Paginated response with RFQ quotes.\n        \"\"\"\n        self._ensure_l2_auth()\n\n        headers = self._get_l2_headers(\"GET\", GET_RFQ_QUOTER_QUOTES)\n        query_params = parse_rfq_quotes_params(params)\n\n        # Build URL with query params\n        url = self._build_url(GET_RFQ_QUOTER_QUOTES)\n        if query_params:\n            url = f\"{url}?{urlencode(query_params, doseq=True)}\"\n\n        return get(url, headers=headers)\n\n    def get_rfq_best_quote(\n        self, params: Optional[GetRfqBestQuoteParams] = None\n    ) -> dict:\n        \"\"\"\n        Get the best quote for an RFQ request.\n\n        Args:\n            params: Contains request_id.\n\n        Returns:\n            Single quote object representing the best quote.\n        \"\"\"\n        self._ensure_l2_auth()\n\n        headers = self._get_l2_headers(\"GET\", GET_RFQ_BEST_QUOTE)\n\n        url = self._build_url(GET_RFQ_BEST_QUOTE)\n        if params and params.request_id:\n            url = f\"{url}?{urlencode({'requestId': params.request_id})}\"\n\n        return get(url, headers=headers)\n\n    def cancel_rfq_quote(self, params: CancelRfqQuoteParams) -> str:\n        \"\"\"\n        Cancel an RFQ quote.\n\n        Args:\n            params: Contains quote_id to cancel.\n\n        Returns:\n            \"OK\" on success.\n        \"\"\"\n        self._ensure_l2_auth()\n\n        body = {\"quoteId\": params.quote_id}\n        serialized_body = json.dumps(body, separators=(\",\", \":\"), ensure_ascii=False)\n        headers = self._get_l2_headers(\"DELETE\", CANCEL_RFQ_QUOTE, body, serialized_body)\n        return delete(self._build_url(CANCEL_RFQ_QUOTE), headers=headers, data=serialized_body)\n\n    # =========================================================================\n    # Trade execution methods\n    # =========================================================================\n\n    def accept_rfq_quote(self, params: AcceptQuoteParams) -> str:\n        \"\"\"\n        Accept an RFQ quote (requester side).\n\n        This method:\n        1. Fetches the RFQ quote details\n        2. Creates a signed order matching the quote\n        3. Submits the acceptance with the order\n\n        Args:\n            params: Contains request_id, quote_id, and expiration.\n\n        Returns:\n            \"OK\" on success.\n        \"\"\"\n        self._ensure_l2_auth()\n\n        resp = self.get_rfq_requester_quotes(\n            GetRfqQuotesParams(quote_ids=[params.quote_id])\n        )\n\n        if not resp.get(\"data\") or len(resp[\"data\"]) == 0:\n            raise Exception(\"RFQ quote not found\")\n\n        rfq_quote = resp[\"data\"][0]\n        order_creation_payload = self._get_request_order_creation_payload(rfq_quote)\n        price = order_creation_payload.get(\"price\")\n        side = order_creation_payload[\"side\"]\n        size = float(order_creation_payload[\"size\"])\n        token = order_creation_payload[\"token\"]\n\n        order_args = OrderArgs(\n            token_id=token,\n            price=price,\n            size=size,\n            side=side,\n            expiration=params.expiration,\n        )\n\n        order = self._parent.create_order(order_args)\n\n        if not order:\n            raise Exception(\"Error creating order\")\n\n        order_dict = order.dict()\n\n        accept_payload = {\n            \"requestId\": params.request_id,\n            \"quoteId\": params.quote_id,\n            \"owner\": self._parent.creds.api_key,\n            # Order fields from dict\n            \"salt\": int(order_dict[\"salt\"]),\n            \"maker\": order_dict[\"maker\"],\n            \"signer\": order_dict[\"signer\"],\n            \"taker\": order_dict[\"taker\"],\n            \"tokenId\": order_dict[\"tokenId\"],\n            \"makerAmount\": order_dict[\"makerAmount\"],\n            \"takerAmount\": order_dict[\"takerAmount\"],\n            \"expiration\": int(order_dict[\"expiration\"]),\n            \"nonce\": order_dict[\"nonce\"],\n            \"feeRateBps\": order_dict[\"feeRateBps\"],\n            \"side\": side,\n            \"signatureType\": int(order_dict[\"signatureType\"]),\n            \"signature\": order_dict[\"signature\"],\n        }\n\n        self.logger.debug(\n            \"Accept payload: requestId=%s, quoteId=%s, tokenId=%s, side=%s\",\n            accept_payload.get(\"requestId\"),\n            accept_payload.get(\"quoteId\"),\n            accept_payload.get(\"tokenId\"),\n            accept_payload.get(\"side\"),\n        )\n        serialized_body = json.dumps(accept_payload, separators=(\",\", \":\"), ensure_ascii=False)\n        headers = self._get_l2_headers(\"POST\", RFQ_REQUESTS_ACCEPT, accept_payload, serialized_body)\n        return post(\n            self._build_url(RFQ_REQUESTS_ACCEPT),\n            headers=headers,\n            data=serialized_body,\n        )\n\n    def approve_rfq_order(self, params: ApproveOrderParams) -> str:\n        \"\"\"\n        Approve an RFQ order (quoter side).\n\n        This method:\n        1. Fetches the RFQ quote details\n        2. Creates a signed order based on quote parameters\n        3. Submits the approval with the order\n\n        Args:\n            params: Contains request_id, quote_id, and expiration.\n\n        Returns:\n            \"OK\" on success.\n        \"\"\"\n        self._ensure_l2_auth()\n\n        # Step 1: Fetch the RFQ quote\n        rfq_quotes = self.get_rfq_quoter_quotes(\n            GetRfqQuotesParams(quote_ids=[params.quote_id])\n        )\n\n        if not rfq_quotes.get(\"data\") or len(rfq_quotes[\"data\"]) == 0:\n            raise Exception(\"RFQ quote not found\")\n\n        rfq_quote = rfq_quotes[\"data\"][0]\n\n        # Step 2: Create an order based on quote details\n        # Quoter uses their own quote's side\n        side = rfq_quote.get(\"side\", BUY)\n\n        # Determine size based on quote side\n        if side == BUY:\n            size = rfq_quote.get(\"sizeIn\")\n        else:\n            size = rfq_quote.get(\"sizeOut\")\n\n        token_id = rfq_quote.get(\"token\")\n        price = rfq_quote.get(\"price\")\n\n        order_args = OrderArgs(\n            token_id=token_id,\n            price=float(price),\n            size=float(size),\n            side=side,\n            expiration=params.expiration,\n        )\n\n        order = self._parent.create_order(order_args)\n\n        if not order:\n            raise Exception(\"Error creating order\")\n\n        # Step 3: Build approve payload\n        order_dict = order.dict()\n\n        approve_payload = {\n            \"requestId\": params.request_id,\n            \"quoteId\": params.quote_id,\n            \"owner\": self._parent.creds.api_key,\n            # Order fields from dict\n            \"salt\": int(order_dict[\"salt\"]),\n            \"maker\": order_dict[\"maker\"],\n            \"signer\": order_dict[\"signer\"],\n            \"taker\": order_dict[\"taker\"],\n            \"tokenId\": order_dict[\"tokenId\"],\n            \"makerAmount\": order_dict[\"makerAmount\"],\n            \"takerAmount\": order_dict[\"takerAmount\"],\n            \"expiration\": int(order_dict[\"expiration\"]),\n            \"nonce\": order_dict[\"nonce\"],\n            \"feeRateBps\": order_dict[\"feeRateBps\"],\n            \"side\": side,\n            \"signatureType\": int(order_dict[\"signatureType\"]),\n            \"signature\": order_dict[\"signature\"],\n        }\n        serialized_body = json.dumps(approve_payload, separators=(\",\", \":\"), ensure_ascii=False)\n        headers = self._get_l2_headers(\"POST\", RFQ_QUOTE_APPROVE, approve_payload, serialized_body)\n        return post(\n            self._build_url(RFQ_QUOTE_APPROVE),\n            headers=headers,\n            data=serialized_body,\n        )\n\n    # =========================================================================\n    # Configuration\n    # =========================================================================\n\n    def rfq_config(self) -> dict:\n        \"\"\"\n        Get RFQ configuration from the server.\n\n        Returns:\n            Configuration object with RFQ system parameters.\n        \"\"\"\n        self._ensure_l2_auth()\n\n        headers = self._get_l2_headers(\"GET\", RFQ_CONFIG)\n        return get(self._build_url(RFQ_CONFIG), headers=headers)\n\n    def _get_request_order_creation_payload(self, quote: dict) -> dict:\n        \"\"\"\n        Build the order creation payload for an RFQ request based on quote details.\n        \"\"\"\n        raw_match_type = quote.get(\"matchType\", MatchType.COMPLEMENTARY)\n        match_type = (\n            raw_match_type\n            if isinstance(raw_match_type, MatchType)\n            else MatchType(str(raw_match_type))\n        )\n\n        side = quote.get(\"side\", BUY)\n\n        if match_type == MatchType.COMPLEMENTARY:\n            # For BUY <> SELL and SELL <> BUY\n            # the order side is opposite the quote side\n            token = quote.get(\"token\")\n            if not token:\n                raise Exception(\"missing token for COMPLEMENTARY match\")\n            side = SELL if side == BUY else BUY\n            size = quote.get(\"sizeOut\") if side == BUY else quote.get(\"sizeIn\")\n            if size is None:\n                raise Exception(\"missing sizeIn/sizeOut for COMPLEMENTARY match\")\n            price = quote.get(\"price\")\n            if price is None:\n                raise Exception(\"missing price for COMPLEMENTARY match\")\n            price = float(price)\n            return {\n                \"token\": token,\n                \"side\": side,\n                \"size\": size,\n                \"price\": price,\n            }\n        elif match_type in (MatchType.MINT, MatchType.MERGE):\n            # BUY<> BUY, SELL <> SELL\n            # the order side is the same as the quote side\n            token = quote.get(\"complement\")\n            if not token:\n                raise Exception(\"missing complement token for MINT/MERGE match\")\n            size = quote.get(\"sizeIn\") if side == BUY else quote.get(\"sizeOut\")\n            if size is None:\n                raise Exception(\"missing sizeIn/sizeOut for MINT/MERGE match\")\n            price = quote.get(\"price\")\n            if price is None:\n                raise Exception(\"missing price for MINT/MERGE match\")\n            price = float(price)\n            # For a MINT or a MERGE, the requester price is the inverse of the quote price\n            # 95c Quote to BUY NO, implies that the Requester is buying YES at 5c\n            # 45c Quote to SELL NO, implies the Requester is selling YES at 55c\n            price = 1 - price\n            return {\n                \"token\": token,\n                \"side\": side,\n                \"size\": size,\n                \"price\": price,\n            }\n        else:\n            raise Exception(f\"invalid match type: {raw_match_type}\")\n\n"
  },
  {
    "path": "py_clob_client/rfq/rfq_helpers.py",
    "content": "\"\"\"\nRFQ helper functions for the Polymarket CLOB API.\n\nThis module provides utility functions for RFQ operations including\nquery parameter parsing and unit conversion.\n\"\"\"\n\nfrom typing import Optional, Dict, Any\n\nfrom .rfq_types import GetRfqRequestsParams, GetRfqQuotesParams\n\n\n# Token decimals constants\nCOLLATERAL_TOKEN_DECIMALS = 6  # USDC has 6 decimals\nCONDITIONAL_TOKEN_DECIMALS = 6\n\n\ndef parse_units(value: str, decimals: int) -> int:\n    \"\"\"\n    Convert a decimal string to smallest units (like wei for ETH).\n\n    Args:\n        value: Decimal string (e.g., \"1.5\")\n        decimals: Number of decimal places (e.g., 6 for USDC)\n\n    Returns:\n        Integer in smallest units (e.g., 1500000 for \"1.5\" with 6 decimals)\n\n    Examples:\n        >>> parse_units(\"1.5\", 6)\n        1500000\n        >>> parse_units(\"100\", 6)\n        100000000\n        >>> parse_units(\"0.000001\", 6)\n        1\n    \"\"\"\n    if \".\" in value:\n        integer_part, decimal_part = value.split(\".\")\n        # Pad or truncate decimal part to match decimals\n        decimal_part = decimal_part[:decimals].ljust(decimals, \"0\")\n        return int(integer_part + decimal_part)\n    else:\n        return int(value) * (10**decimals)\n\n\ndef to_camel_case(snake_str: str) -> str:\n    \"\"\"\n    Convert snake_case string to camelCase.\n\n    Args:\n        snake_str: String in snake_case format\n\n    Returns:\n        String in camelCase format\n\n    Examples:\n        >>> to_camel_case(\"user_address\")\n        'userAddress'\n        >>> to_camel_case(\"request_id\")\n        'requestId'\n        >>> to_camel_case(\"size_usdc_min\")\n        'sizeUsdcMin'\n    \"\"\"\n    components = snake_str.split(\"_\")\n    return components[0] + \"\".join(x.title() for x in components[1:])\n\n\ndef parse_rfq_requests_params(params: Optional[GetRfqRequestsParams] = None) -> Dict[str, Any]:\n    \"\"\"\n    Convert GetRfqRequestsParams to query string parameters.\n\n    Arrays are kept as Python lists so the caller can serialize them with\n    `urllib.parse.urlencode(..., doseq=True)` (repeated query params).\n\n    Args:\n        params: Optional filter parameters\n\n    Returns:\n        Dictionary of query parameters ready for HTTP request\n    \"\"\"\n    if params is None:\n        return {}\n\n    result = {}\n\n    # Single value fields (convert snake_case to camelCase)\n    single_fields = [\n        (\"state\", \"state\"),\n        (\"size_min\", \"sizeMin\"),\n        (\"size_max\", \"sizeMax\"),\n        (\"size_usdc_min\", \"sizeUsdcMin\"),\n        (\"size_usdc_max\", \"sizeUsdcMax\"),\n        (\"price_min\", \"priceMin\"),\n        (\"price_max\", \"priceMax\"),\n        (\"sort_by\", \"sortBy\"),\n        (\"sort_dir\", \"sortDir\"),\n        (\"limit\", \"limit\"),\n        (\"offset\", \"offset\"),\n    ]\n\n    for python_name, api_name in single_fields:\n        value = getattr(params, python_name, None)\n        if value is not None:\n            result[api_name] = value\n\n    # Array fields (keep as lists; let urlencode(doseq=True) expand them)\n    if params.request_ids:\n        result[\"requestIds\"] = params.request_ids\n    if params.markets:\n        result[\"markets\"] = params.markets\n\n    return result\n\n\ndef parse_rfq_quotes_params(params: Optional[GetRfqQuotesParams] = None) -> Dict[str, Any]:\n    \"\"\"\n    Convert GetRfqQuotesParams to query string parameters.\n\n    Arrays are kept as Python lists so the caller can serialize them with\n    `urllib.parse.urlencode(..., doseq=True)` (repeated query params).\n\n    Args:\n        params: Optional filter parameters\n\n    Returns:\n        Dictionary of query parameters ready for HTTP request\n    \"\"\"\n    if params is None:\n        return {}\n\n    result = {}\n\n    # Single value fields (convert snake_case to camelCase)\n    single_fields = [\n        (\"state\", \"state\"),\n        (\"size_min\", \"sizeMin\"),\n        (\"size_max\", \"sizeMax\"),\n        (\"size_usdc_min\", \"sizeUsdcMin\"),\n        (\"size_usdc_max\", \"sizeUsdcMax\"),\n        (\"price_min\", \"priceMin\"),\n        (\"price_max\", \"priceMax\"),\n        (\"sort_by\", \"sortBy\"),\n        (\"sort_dir\", \"sortDir\"),\n        (\"limit\", \"limit\"),\n        (\"offset\", \"offset\"),\n    ]\n\n    for python_name, api_name in single_fields:\n        value = getattr(params, python_name, None)\n        if value is not None:\n            result[api_name] = value\n\n    # Array fields (keep as lists; let urlencode(doseq=True) expand them)\n    if params.quote_ids:\n        result[\"quoteIds\"] = params.quote_ids\n    if params.request_ids:\n        result[\"requestIds\"] = params.request_ids\n    if params.markets:\n        result[\"markets\"] = params.markets\n\n    return result\n"
  },
  {
    "path": "py_clob_client/rfq/rfq_types.py",
    "content": "\"\"\"\nRFQ (Request for Quote) data types for the Polymarket CLOB API.\n\nThis module defines all input and response types used by the RFQ client.\n\"\"\"\n\nfrom dataclasses import dataclass, field\nfrom typing import List, Optional, Any, Literal\nfrom enum import Enum\n\n\n# =============================================================================\n# Input Types\n# =============================================================================\n\n\n@dataclass\nclass RfqUserRequest:\n    \"\"\"\n    Simplified user input for creating an RFQ request.\n\n    This is the user-facing order format that gets converted to\n    CreateRfqRequestParams for the API.\n    \"\"\"\n\n    token_id: str\n    \"\"\"Token ID of the conditional token being traded.\"\"\"\n\n    price: float\n    \"\"\"Price per token (0 < price < 1).\"\"\"\n\n    side: str\n    \"\"\"Order side: \"BUY\" or \"SELL\".\"\"\"\n\n    size: float\n    \"\"\"Size in conditional tokens.\"\"\"\n\n\n@dataclass\nclass RfqUserQuote:\n    \"\"\"\n    Simplified user input for creating an RFQ quote.\n\n    This is the user-facing quote format that gets converted to\n    CreateRfqQuoteParams for the API.\n    \"\"\"\n\n    request_id: str\n    \"\"\"ID of the RFQ request being quoted.\"\"\"\n\n    token_id: str\n    \"\"\"Token ID of the conditional token being traded.\"\"\"\n\n    price: float\n    \"\"\"Price per token (0 < price < 1).\"\"\"\n\n    side: str\n    \"\"\"Quoter's side: \"BUY\" or \"SELL\".\"\"\"\n\n    size: float\n    \"\"\"Size in conditional tokens.\"\"\"\n\n\n@dataclass\nclass CreateRfqRequestParams:\n    \"\"\"\n    Server payload for creating an RFQ request.\n\n    This is the format sent to the API after converting from RfqUserRequest.\n    \"\"\"\n\n    asset_in: str\n    \"\"\"Asset being received (token ID or \"0\" for USDC).\"\"\"\n\n    asset_out: str\n    \"\"\"Asset being paid (token ID or \"0\" for USDC).\"\"\"\n\n    amount_in: str\n    \"\"\"Amount being received (in smallest units, as string).\"\"\"\n\n    amount_out: str\n    \"\"\"Amount being paid (in smallest units, as string).\"\"\"\n\n    user_type: int\n    \"\"\"Signature type (0=EOA, 1=POLY_PROXY, 2=POLY_GNOSIS_SAFE).\"\"\"\n\n\n@dataclass\nclass CreateRfqQuoteParams:\n    \"\"\"\n    Parameters for creating a quote in response to an RFQ request.\n    \"\"\"\n\n    request_id: str\n    \"\"\"ID of the RFQ request being quoted.\"\"\"\n\n    asset_in: str\n    \"\"\"Asset the quoter is paying.\"\"\"\n\n    asset_out: str\n    \"\"\"Asset the quoter is receiving.\"\"\"\n\n    amount_in: str\n    \"\"\"Amount quoter is paying (in smallest units).\"\"\"\n\n    amount_out: str\n    \"\"\"Amount quoter is receiving (in smallest units).\"\"\"\n\n    # Note: user_type is auto-filled by the client\n\n\n@dataclass\nclass CancelRfqRequestParams:\n    \"\"\"\n    Parameters for canceling an RFQ request.\n    \"\"\"\n\n    request_id: str\n    \"\"\"ID of the request to cancel.\"\"\"\n\n\n@dataclass\nclass CancelRfqQuoteParams:\n    \"\"\"\n    Parameters for canceling an RFQ quote.\n    \"\"\"\n\n    quote_id: str\n    \"\"\"ID of the quote to cancel.\"\"\"\n\n\n@dataclass\nclass AcceptQuoteParams:\n    \"\"\"\n    Parameters for accepting a quote (requester side).\n\n    When a requester accepts a quote, they create a signed order\n    and submit it with this payload.\n    \"\"\"\n\n    request_id: str\n    \"\"\"ID of the RFQ request.\"\"\"\n\n    quote_id: str\n    \"\"\"ID of the quote being accepted.\"\"\"\n\n    expiration: int\n    \"\"\"Unix timestamp for order expiration.\"\"\"\n\n\n@dataclass\nclass ApproveOrderParams:\n    \"\"\"\n    Parameters for approving an order (quoter side).\n\n    When a quoter's quote is accepted, they approve by creating\n    a signed order and submitting it with this payload.\n    \"\"\"\n\n    request_id: str\n    \"\"\"ID of the RFQ request.\"\"\"\n\n    quote_id: str\n    \"\"\"ID of the quote being approved.\"\"\"\n\n    expiration: int\n    \"\"\"Unix timestamp for order expiration.\"\"\"\n\n\n@dataclass\nclass GetRfqRequestsParams:\n    \"\"\"\n    Query parameters for fetching RFQ requests.\n\n    All fields are optional filters.\n    \"\"\"\n\n    request_ids: Optional[List[str]] = None\n    \"\"\"Filter by specific request IDs (query param: requestIds; repeatable).\"\"\"\n\n    state: Optional[Literal[\"active\", \"inactive\"]] = None\n    \"\"\"Single state filter (\"active\" or \"inactive\").\"\"\"\n\n    markets: Optional[List[str]] = None\n    \"\"\"Filter by market condition IDs (query param: markets; repeatable).\"\"\"\n\n    size_min: Optional[float] = None\n    \"\"\"Minimum size filter.\"\"\"\n\n    size_max: Optional[float] = None\n    \"\"\"Maximum size filter.\"\"\"\n\n    size_usdc_min: Optional[float] = None\n    \"\"\"Minimum USDC size filter.\"\"\"\n\n    size_usdc_max: Optional[float] = None\n    \"\"\"Maximum USDC size filter.\"\"\"\n\n    price_min: Optional[float] = None\n    \"\"\"Minimum price filter.\"\"\"\n\n    price_max: Optional[float] = None\n    \"\"\"Maximum price filter.\"\"\"\n\n    sort_by: Optional[Literal[\"price\", \"expiry\", \"size\", \"created\"]] = None\n    \"\"\"Field to sort by.\"\"\"\n\n    sort_dir: Optional[Literal[\"asc\", \"desc\"]] = None\n    \"\"\"Sort direction: \"asc\" or \"desc\".\"\"\"\n\n    limit: Optional[int] = None\n    \"\"\"Pagination limit.\"\"\"\n\n    offset: Optional[str] = None\n    \"\"\"Pagination cursor (base64 encoded).\"\"\"\n\n\n@dataclass\nclass GetRfqQuotesParams:\n    \"\"\"\n    Query parameters for fetching RFQ quotes.\n\n    All fields are optional filters.\n    \"\"\"\n\n    quote_ids: Optional[List[str]] = None\n    \"\"\"Filter by specific quote IDs (query param: quoteIds; repeatable).\"\"\"\n\n    request_ids: Optional[List[str]] = None\n    \"\"\"Filter by request IDs (query param: requestIds; repeatable).\"\"\"\n\n    state: Optional[Literal[\"active\", \"inactive\"]] = None\n    \"\"\"Single state filter (\"active\" or \"inactive\").\"\"\"\n\n    markets: Optional[List[str]] = None\n    \"\"\"Filter by market condition IDs (query param: markets; repeatable).\"\"\"\n\n    size_min: Optional[float] = None\n    \"\"\"Minimum size filter.\"\"\"\n\n    size_max: Optional[float] = None\n    \"\"\"Maximum size filter.\"\"\"\n\n    size_usdc_min: Optional[float] = None\n    \"\"\"Minimum USDC size filter.\"\"\"\n\n    size_usdc_max: Optional[float] = None\n    \"\"\"Maximum USDC size filter.\"\"\"\n\n    price_min: Optional[float] = None\n    \"\"\"Minimum price filter.\"\"\"\n\n    price_max: Optional[float] = None\n    \"\"\"Maximum price filter.\"\"\"\n\n    sort_by: Optional[Literal[\"price\", \"expiry\", \"created\"]] = None\n    \"\"\"Field to sort by.\"\"\"\n\n    sort_dir: Optional[Literal[\"asc\", \"desc\"]] = None\n    \"\"\"Sort direction: \"asc\" or \"desc\".\"\"\"\n\n    limit: Optional[int] = None\n    \"\"\"Pagination limit.\"\"\"\n\n    offset: Optional[str] = None\n    \"\"\"Pagination cursor (base64 encoded).\"\"\"\n\n\n@dataclass\nclass GetRfqBestQuoteParams:\n    \"\"\"\n    Parameters for fetching the best quote for a request.\n    \"\"\"\n\n    request_id: Optional[str] = None\n    \"\"\"Request ID to get best quote for.\"\"\"\n\n\n# =============================================================================\n# Response Types\n# =============================================================================\n\n\n@dataclass\nclass RfqRequest:\n    \"\"\"\n    Full RFQ request object returned by the API.\n    \"\"\"\n\n    request_id: str\n    \"\"\"Unique request identifier.\"\"\"\n\n    user_address: str\n    \"\"\"Address of the requester.\"\"\"\n\n    proxy_address: Optional[str] = None\n    \"\"\"Proxy address if applicable.\"\"\"\n\n    token: Optional[str] = None\n    \"\"\"Token ID being traded.\"\"\"\n\n    complement: Optional[str] = None\n    \"\"\"Complement token ID.\"\"\"\n\n    condition: Optional[str] = None\n    \"\"\"Condition ID (market).\"\"\"\n\n    side: Optional[str] = None\n    \"\"\"Order side: \"BUY\" or \"SELL\".\"\"\"\n\n    size_in: Optional[str] = None\n    \"\"\"Size of asset_in.\"\"\"\n\n    size_out: Optional[str] = None\n    \"\"\"Size of asset_out.\"\"\"\n\n    price: Optional[float] = None\n    \"\"\"Price.\"\"\"\n\n    accepted_quote_id: Optional[str] = None\n    \"\"\"ID of accepted quote (if any).\"\"\"\n\n    state: Optional[str] = None\n    \"\"\"Request state.\"\"\"\n\n    expiry: Optional[str] = None\n    \"\"\"Expiration timestamp.\"\"\"\n\n    created_at: Optional[str] = None\n    \"\"\"Creation timestamp.\"\"\"\n\n    updated_at: Optional[str] = None\n    \"\"\"Last update timestamp.\"\"\"\n\n\n@dataclass\nclass RfqQuote:\n    \"\"\"\n    Full RFQ quote object returned by the API.\n    \"\"\"\n\n    quote_id: str\n    \"\"\"Unique quote identifier.\"\"\"\n\n    request_id: str\n    \"\"\"Associated request ID.\"\"\"\n\n    user_address: str\n    \"\"\"Address of the quoter.\"\"\"\n\n    proxy_address: Optional[str] = None\n    \"\"\"Proxy address if applicable.\"\"\"\n\n    complement: Optional[str] = None\n    \"\"\"Complement token ID.\"\"\"\n\n    condition: Optional[str] = None\n    \"\"\"Condition ID (market).\"\"\"\n\n    token: Optional[str] = None\n    \"\"\"Token ID.\"\"\"\n\n    side: Optional[str] = None\n    \"\"\"Quote side: \"BUY\" or \"SELL\".\"\"\"\n\n    size_in: Optional[str] = None\n    \"\"\"Size of asset_in.\"\"\"\n\n    size_out: Optional[str] = None\n    \"\"\"Size of asset_out.\"\"\"\n\n    price: Optional[float] = None\n    \"\"\"Quote price.\"\"\"\n\n    state: Optional[str] = None\n    \"\"\"Quote state.\"\"\"\n\n    expiry: Optional[str] = None\n    \"\"\"Expiration timestamp.\"\"\"\n\n    created_at: Optional[str] = None\n    \"\"\"Creation timestamp.\"\"\"\n\n    updated_at: Optional[str] = None\n    \"\"\"Last update timestamp.\"\"\"\n\n\n@dataclass\nclass RfqRequestResponse:\n    \"\"\"\n    Response from creating an RFQ request.\n    \"\"\"\n\n    request_id: Optional[str] = None\n    \"\"\"Created request ID.\"\"\"\n\n    error: Optional[str] = None\n    \"\"\"Error message if failed.\"\"\"\n\n\n@dataclass\nclass RfqQuoteResponse:\n    \"\"\"\n    Response from creating an RFQ quote.\n    \"\"\"\n\n    quote_id: Optional[str] = None\n    \"\"\"Created quote ID.\"\"\"\n\n    error: Optional[str] = None\n    \"\"\"Error message if failed.\"\"\"\n\n\n@dataclass\nclass RfqPaginatedResponse:\n    \"\"\"\n    Paginated response for list queries.\n    \"\"\"\n\n    data: List[Any] = field(default_factory=list)\n    \"\"\"Array of results (RfqRequest or RfqQuote objects).\"\"\"\n\n    next_cursor: Optional[str] = None\n    \"\"\"Cursor for next page.\"\"\"\n\n    limit: Optional[int] = None\n    \"\"\"Page limit.\"\"\"\n\n    count: Optional[int] = None\n    \"\"\"Number of results in this page.\"\"\"\n\n    total_count: Optional[int] = None\n    \"\"\"Total count (optional).\"\"\"\n\n\nclass MatchType(str, Enum):\n    COMPLEMENTARY = \"COMPLEMENTARY\"\n    MINT = \"MINT\"\n    MERGE = \"MERGE\"\n"
  },
  {
    "path": "py_clob_client/signer.py",
    "content": "from eth_account import Account\n\n\nclass Signer:\n    def __init__(self, private_key: str, chain_id: int):\n        assert private_key is not None and chain_id is not None\n\n        self.private_key = private_key\n        self.account = Account.from_key(private_key)\n        self.chain_id = chain_id\n\n    def address(self):\n        return self.account.address\n\n    def get_chain_id(self):\n        return self.chain_id\n\n    def sign(self, message_hash):\n        \"\"\"\n        Signs a message hash\n        \"\"\"\n        return Account._sign_hash(message_hash, self.private_key).signature.hex()\n"
  },
  {
    "path": "py_clob_client/signing/__init__.py",
    "content": ""
  },
  {
    "path": "py_clob_client/signing/eip712.py",
    "content": "from poly_eip712_structs import make_domain\nfrom eth_utils import keccak\nfrom py_order_utils.utils import prepend_zx\n\nfrom .model import ClobAuth\nfrom ..signer import Signer\n\nCLOB_DOMAIN_NAME = \"ClobAuthDomain\"\nCLOB_VERSION = \"1\"\nMSG_TO_SIGN = \"This message attests that I control the given wallet\"\n\n\ndef get_clob_auth_domain(chain_id: int):\n    return make_domain(name=CLOB_DOMAIN_NAME, version=CLOB_VERSION, chainId=chain_id)\n\n\ndef sign_clob_auth_message(signer: Signer, timestamp: int, nonce: int) -> str:\n    clob_auth_msg = ClobAuth(\n        address=signer.address(),\n        timestamp=str(timestamp),\n        nonce=nonce,\n        message=MSG_TO_SIGN,\n    )\n    chain_id = signer.get_chain_id()\n    auth_struct_hash = prepend_zx(\n        keccak(clob_auth_msg.signable_bytes(get_clob_auth_domain(chain_id))).hex()\n    )\n    return prepend_zx(signer.sign(auth_struct_hash))\n"
  },
  {
    "path": "py_clob_client/signing/hmac.py",
    "content": "import hmac\nimport hashlib\nimport base64\n\n\ndef build_hmac_signature(\n    secret: str, timestamp: str, method: str, requestPath: str, body=None\n):\n    \"\"\"\n    Creates an HMAC signature by signing a payload with the secret\n    \"\"\"\n    base64_secret = base64.urlsafe_b64decode(secret)\n    message = str(timestamp) + str(method) + str(requestPath)\n    if body:\n        # NOTE: Necessary to replace single quotes with double quotes\n        # to generate the same hmac message as go and typescript\n        message += str(body).replace(\"'\", '\"')\n\n    h = hmac.new(base64_secret, bytes(message, \"utf-8\"), hashlib.sha256)\n\n    # ensure base64 encoded\n    return (base64.urlsafe_b64encode(h.digest())).decode(\"utf-8\")\n"
  },
  {
    "path": "py_clob_client/signing/model.py",
    "content": "from poly_eip712_structs import EIP712Struct, Address, String, Uint\n\n\nclass ClobAuth(EIP712Struct):\n    address = Address()\n    timestamp = String()\n    nonce = Uint()\n    message = String()\n"
  },
  {
    "path": "py_clob_client/utilities.py",
    "content": "import hashlib\nimport json\n\nfrom .clob_types import OrderBookSummary, OrderSummary, TickSize\n\n\ndef parse_raw_orderbook_summary(raw_obs: any) -> OrderBookSummary:\n    bids = []\n    for bid in raw_obs[\"bids\"]:\n        bids.append(OrderSummary(size=bid[\"size\"], price=bid[\"price\"]))\n\n    asks = []\n    for ask in raw_obs[\"asks\"]:\n        asks.append(OrderSummary(size=ask[\"size\"], price=ask[\"price\"]))\n\n    orderbookSummary = OrderBookSummary(\n        market=raw_obs[\"market\"],\n        asset_id=raw_obs[\"asset_id\"],\n        timestamp=raw_obs[\"timestamp\"],\n        last_trade_price=raw_obs[\"last_trade_price\"],\n        min_order_size=raw_obs[\"min_order_size\"],\n        neg_risk=raw_obs[\"neg_risk\"],\n        tick_size=raw_obs[\"tick_size\"],\n        bids=bids,\n        asks=asks,\n        hash=raw_obs[\"hash\"],\n    )\n\n    return orderbookSummary\n\n\ndef generate_orderbook_summary_hash(orderbook: OrderBookSummary) -> str:\n    \"\"\"\n    Server-compatible orderbook hash.\n\n    The server computes SHA1 over a compact JSON payload with a specific key order,\n    and with the \"hash\" field set to an empty string while hashing.\n    \"\"\"\n\n    # Go server-side payload field order (struct order):\n    # market, asset_id, timestamp, hash, bids, asks, min_order_size, tick_size, neg_risk, last_trade_price\n    payload = {\n        \"market\": orderbook.market,\n        \"asset_id\": orderbook.asset_id,\n        \"timestamp\": orderbook.timestamp,\n        \"hash\": \"\",\n        \"bids\": [{\"price\": o.price, \"size\": o.size} for o in (orderbook.bids or [])],\n        \"asks\": [{\"price\": o.price, \"size\": o.size} for o in (orderbook.asks or [])],\n        \"min_order_size\": orderbook.min_order_size,\n        \"tick_size\": orderbook.tick_size,\n        \"neg_risk\": orderbook.neg_risk,\n        \"last_trade_price\": orderbook.last_trade_price,\n    }\n\n    serialized = json.dumps(payload, separators=(\",\", \":\"), ensure_ascii=False)\n    h = hashlib.sha1(serialized.encode(\"utf-8\")).hexdigest()\n    orderbook.hash = h\n    return h\n\n\ndef order_to_json(order, owner, orderType, post_only: bool = False) -> dict:\n    return {\"order\": order.dict(), \"owner\": owner, \"orderType\": orderType, \"postOnly\": post_only}\n\n\ndef is_tick_size_smaller(a: TickSize, b: TickSize) -> bool:\n    return float(a) < float(b)\n\n\ndef price_valid(price: float, tick_size: TickSize) -> bool:\n    return price >= float(tick_size) and price <= 1 - float(tick_size)\n"
  },
  {
    "path": "requirements.txt",
    "content": "black==24.4.2\neth-account===0.13.0\neth-utils===4.1.1\npoly_eip712_structs==0.0.1\npy_order_utils==0.3.2\npytest==8.2.2\npython-dotenv==0.19.2\nwebsockets==12.0\npy-builder-signing-sdk==0.0.2\nhttpx[http2]==0.27.0\n"
  },
  {
    "path": "setup.py",
    "content": "import setuptools\n\nwith open(\"README.md\", \"r\", encoding=\"utf-8\") as fh:\n    long_description = fh.read()\n\nsetuptools.setup(\n    name=\"py_clob_client\",\n    version=\"0.34.6\",\n    author=\"Polymarket Engineering\",\n    author_email=\"engineering@polymarket.com\",\n    maintainer=\"Polymarket Engineering\",\n    maintainer_email=\"engineering@polymarket.com\",\n    description=\"Python client for the Polymarket CLOB\",\n    long_description=long_description,\n    long_description_content_type=\"text/markdown\",\n    url=\"https://github.com/Polymarket/py-clob-client\",\n    install_requires=[\n        \"eth-account>=0.13.0\",\n        \"eth-utils>=4.1.1\",\n        \"poly_eip712_structs>=0.0.1\",\n        \"py-order-utils>=0.3.2\",\n        \"python-dotenv\",\n        \"py-builder-signing-sdk>=0.0.2\",\n        \"httpx[http2]>=0.27.0\",\n    ],\n    project_urls={\n        \"Bug Tracker\": \"https://github.com/Polymarket/py-clob-client/issues\",\n    },\n    classifiers=[\n        \"Programming Language :: Python :: 3\",\n        \"License :: OSI Approved :: MIT License\",\n        \"Operating System :: OS Independent\",\n    ],\n    packages=setuptools.find_packages(),\n    python_requires=\">=3.9.10\",\n)\n"
  },
  {
    "path": "tests/__init__.py",
    "content": ""
  },
  {
    "path": "tests/headers/__init__.py",
    "content": ""
  },
  {
    "path": "tests/headers/test_headers.py",
    "content": "from datetime import datetime\nfrom unittest import TestCase\nfrom py_clob_client.clob_types import ApiCreds, RequestArgs\nfrom py_clob_client.constants import AMOY\nfrom py_clob_client.headers.headers import (\n    POLY_ADDRESS,\n    POLY_API_KEY,\n    POLY_NONCE,\n    POLY_PASSPHRASE,\n    POLY_SIGNATURE,\n    POLY_TIMESTAMP,\n    create_level_1_headers,\n    create_level_2_headers,\n)\nfrom py_clob_client.signer import Signer\n\n# publicly known private key\nprivate_key = \"0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80\"\nchain_id = AMOY\nsigner = Signer(private_key=private_key, chain_id=chain_id)\n\ncreds = ApiCreds(\n    api_key=\"000000000-0000-0000-0000-000000000000\",\n    api_passphrase=\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n    api_secret=\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\",\n)\n\n\nclass TestHeaders(TestCase):\n    def test_create_level_1_headers(self):\n        # no nonce\n        l1_headers = create_level_1_headers(signer)\n        self.assertIsNotNone(l1_headers)\n        self.assertEqual(l1_headers[POLY_ADDRESS], signer.address())\n        self.assertIsNotNone(l1_headers[POLY_SIGNATURE])\n        self.assertIsNotNone(l1_headers[POLY_TIMESTAMP])\n        self.assertTrue(\n            int(l1_headers[POLY_TIMESTAMP]) <= int(datetime.now().timestamp())\n        )\n        self.assertEqual(l1_headers[POLY_NONCE], \"0\")\n\n        # nonce\n        l1_headers = create_level_1_headers(signer, nonce=1012)\n        self.assertIsNotNone(l1_headers)\n        self.assertEqual(l1_headers[POLY_ADDRESS], signer.address())\n        self.assertIsNotNone(l1_headers[POLY_SIGNATURE])\n        self.assertIsNotNone(l1_headers[POLY_TIMESTAMP])\n        self.assertTrue(\n            int(l1_headers[POLY_TIMESTAMP]) <= int(datetime.now().timestamp())\n        )\n        self.assertEqual(l1_headers[POLY_NONCE], \"1012\")\n\n    def test_create_level_2_headers(self):\n        # no body\n        l2_headers = create_level_2_headers(\n            signer, creds, request_args=RequestArgs(method=\"get\", request_path=\"/order\")\n        )\n        self.assertIsNotNone(l2_headers)\n        self.assertEqual(l2_headers[POLY_ADDRESS], signer.address())\n        self.assertIsNotNone(l2_headers[POLY_SIGNATURE])\n        self.assertIsNotNone(l2_headers[POLY_TIMESTAMP])\n        self.assertTrue(\n            int(l2_headers[POLY_TIMESTAMP]) <= int(datetime.now().timestamp())\n        )\n        self.assertEqual(l2_headers[POLY_API_KEY], creds.api_key)\n        self.assertEqual(l2_headers[POLY_PASSPHRASE], creds.api_passphrase)\n\n        # body\n        l2_headers = create_level_2_headers(\n            signer,\n            creds,\n            request_args=RequestArgs(\n                method=\"get\", request_path=\"/order\", body='{\"hash\": \"0x123\"}'\n            ),\n        )\n        self.assertIsNotNone(l2_headers)\n        self.assertEqual(l2_headers[POLY_ADDRESS], signer.address())\n        self.assertIsNotNone(l2_headers[POLY_SIGNATURE])\n        self.assertIsNotNone(l2_headers[POLY_TIMESTAMP])\n        self.assertTrue(\n            int(l2_headers[POLY_TIMESTAMP]) <= int(datetime.now().timestamp())\n        )\n        self.assertEqual(l2_headers[POLY_API_KEY], creds.api_key)\n        self.assertEqual(l2_headers[POLY_PASSPHRASE], creds.api_passphrase)\n"
  },
  {
    "path": "tests/http_helpers/__init__.py",
    "content": ""
  },
  {
    "path": "tests/http_helpers/test_helpers.py",
    "content": "from unittest import TestCase\nfrom py_clob_client.clob_types import (\n    TradeParams,\n    OpenOrderParams,\n    DropNotificationParams,\n    BalanceAllowanceParams,\n    AssetType,\n    OrderScoringParams,\n    OrdersScoringParams,\n)\n\nfrom py_clob_client.http_helpers.helpers import (\n    build_query_params,\n    add_query_trade_params,\n    add_query_open_orders_params,\n    drop_notifications_query_params,\n    add_balance_allowance_params_to_url,\n    add_order_scoring_params_to_url,\n    add_orders_scoring_params_to_url,\n)\n\n\nclass TestHelpers(TestCase):\n    def test_build_query_params(self):\n        # last is ?\n        url = build_query_params(\"http://tracker?\", \"q1\", \"a\")\n        self.assertIsNotNone(url)\n        self.assertEqual(url, \"http://tracker?q1=a\")\n\n        # last is not ?\n        url = build_query_params(\"http://tracker?q1=a\", \"q2\", \"b\")\n        self.assertIsNotNone(url)\n        self.assertEqual(url, \"http://tracker?q1=a&q2=b\")\n\n    def test_add_query_trade_params(self):\n        url = add_query_trade_params(\n            \"http://tracker\",\n            TradeParams(\n                market=\"10000\",\n                after=1450000,\n                before=1460000,\n                asset_id=\"100\",\n                maker_address=\"0x0\",\n                id=\"aa-bb\",\n            ),\n            next_cursor=\"AA==\",\n        )\n        self.assertIsNotNone(url)\n        self.assertEqual(\n            url,\n            \"http://tracker?market=10000&asset_id=100&after=1450000&before=1460000&maker_address=0x0&id=aa-bb&next_cursor=AA==\",\n        )\n\n    def test_add_query_trade_params_no_params_includes_next_cursor(self):\n        url = add_query_trade_params(\"http://tracker\", None, next_cursor=\"AA==\")\n        self.assertIsNotNone(url)\n        self.assertEqual(url, \"http://tracker?next_cursor=AA==\")\n\n    def test_add_query_open_orders_params(self):\n        url = add_query_open_orders_params(\n            \"http://tracker\",\n            OpenOrderParams(market=\"10000\", asset_id=\"100\", id=\"aa-bb\"),\n        )\n        self.assertIsNotNone(url)\n        self.assertEqual(\n            url,\n            \"http://tracker?market=10000&asset_id=100&id=aa-bb&next_cursor=MA==\",\n        )\n\n    def test_add_query_open_orders_params_no_params_includes_next_cursor(self):\n        url = add_query_open_orders_params(\"http://tracker\", None, next_cursor=\"AA==\")\n        self.assertIsNotNone(url)\n        self.assertEqual(url, \"http://tracker?next_cursor=AA==\")\n\n    def test_drop_notifications_query_params(self):\n        url = drop_notifications_query_params(\n            \"http://tracker\",\n            DropNotificationParams(ids=[\"1\", \"2\", \"3\"]),\n        )\n        self.assertIsNotNone(url)\n        self.assertEqual(url, \"http://tracker?ids=1,2,3\")\n\n    def test_add_balance_allowance_params_to_url(self):\n        url = add_balance_allowance_params_to_url(\n            \"http://tracker\",\n            BalanceAllowanceParams(asset_type=AssetType.COLLATERAL, signature_type=0),\n        )\n        self.assertIsNotNone(url)\n        self.assertEqual(url, \"http://tracker?asset_type=COLLATERAL&signature_type=0\")\n\n        url = add_balance_allowance_params_to_url(\n            \"http://tracker\",\n            BalanceAllowanceParams(\n                asset_type=AssetType.CONDITIONAL, token_id=\"222\", signature_type=1\n            ),\n        )\n        self.assertIsNotNone(url)\n        self.assertEqual(\n            url, \"http://tracker?asset_type=CONDITIONAL&token_id=222&signature_type=1\"\n        )\n\n    def test_add_order_scoring_params_to_url(self):\n        url = add_order_scoring_params_to_url(\n            \"http://tracker\",\n            OrderScoringParams(orderId=\"0x0123abc\"),\n        )\n        self.assertIsNotNone(url)\n        self.assertEqual(url, \"http://tracker?order_id=0x0123abc\")\n\n    def test_add_orders_scoring_params_to_urll(self):\n        url = add_orders_scoring_params_to_url(\n            \"http://tracker\",\n            OrdersScoringParams(orderIds=[\"0x0\", \"0x1\", \"0x2\"]),\n        )\n        self.assertIsNotNone(url)\n        self.assertEqual(url, \"http://tracker?order_ids=0x0,0x1,0x2\")\n"
  },
  {
    "path": "tests/order_builder/__init__.py",
    "content": ""
  },
  {
    "path": "tests/order_builder/test_builder.py",
    "content": "from unittest import TestCase\n\nfrom py_clob_client.clob_types import (\n    OrderArgs,\n    MarketOrderArgs,\n    CreateOrderOptions,\n    OrderSummary,\n    OrderType,\n)\nfrom py_clob_client.constants import AMOY\nfrom py_clob_client.order_builder.constants import BUY, SELL\n\nfrom py_clob_client.signer import Signer\nfrom py_clob_client.order_builder.builder import OrderBuilder, ROUNDING_CONFIG\nfrom py_clob_client.order_builder.helpers import decimal_places, round_normal\nfrom py_order_utils.model import (\n    POLY_GNOSIS_SAFE,\n    EOA,\n    BUY as UtilsBuy,\n    SELL as UtilsSell,\n)\n\n# publicly known private key\nprivate_key = \"0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80\"\nchain_id = AMOY\nsigner = Signer(private_key=private_key, chain_id=chain_id)\n\n\nclass TestOrderBuilder(TestCase):\n    def test_calculate_buy_market_price_FOK(self):\n        # empty\n        with self.assertRaises(Exception):\n            builder = OrderBuilder(signer)\n            builder.calculate_buy_market_price([], 100, OrderType.FOK)\n\n        # not enough\n        with self.assertRaises(Exception):\n            positions = [\n                OrderSummary(price=\"0.5\", size=\"100\"),\n                OrderSummary(price=\"0.4\", size=\"100\"),\n            ]\n            builder = OrderBuilder(signer)\n            builder.calculate_buy_market_price(positions, 100, OrderType.FOK)\n\n        # OK\n        positions = [\n            OrderSummary(price=\"0.5\", size=\"100\"),\n            OrderSummary(price=\"0.4\", size=\"100\"),\n            OrderSummary(price=\"0.3\", size=\"100\"),\n        ]\n        builder = OrderBuilder(signer)\n        self.assertEqual(\n            builder.calculate_buy_market_price(positions, 100, OrderType.FOK), 0.5\n        )\n\n        positions = [\n            OrderSummary(price=\"0.5\", size=\"100\"),\n            OrderSummary(price=\"0.4\", size=\"200\"),\n            OrderSummary(price=\"0.3\", size=\"100\"),\n        ]\n        builder = OrderBuilder(signer)\n        self.assertEqual(\n            builder.calculate_buy_market_price(positions, 100, OrderType.FOK), 0.4\n        )\n\n        positions = [\n            OrderSummary(price=\"0.5\", size=\"120\"),\n            OrderSummary(price=\"0.4\", size=\"100\"),\n            OrderSummary(price=\"0.3\", size=\"100\"),\n        ]\n        builder = OrderBuilder(signer)\n        self.assertEqual(\n            builder.calculate_buy_market_price(positions, 100, OrderType.FOK), 0.5\n        )\n\n        positions = [\n            OrderSummary(price=\"0.5\", size=\"200\"),\n            OrderSummary(price=\"0.4\", size=\"100\"),\n            OrderSummary(price=\"0.3\", size=\"100\"),\n        ]\n        builder = OrderBuilder(signer)\n        self.assertEqual(\n            builder.calculate_buy_market_price(positions, 100, OrderType.FOK), 0.5\n        )\n\n    def test_calculate_sell_market_price_FOK(self):\n        # empty\n        with self.assertRaises(Exception):\n            builder = OrderBuilder(signer)\n            builder.calculate_sell_market_price([], 100)\n\n        # not enough\n        with self.assertRaises(Exception):\n            positions = [\n                OrderSummary(price=\"0.4\", size=\"10\"),\n                OrderSummary(price=\"0.5\", size=\"10\"),\n            ]\n            builder = OrderBuilder(signer)\n            builder.calculate_sell_market_price(positions, 100, OrderType.FOK)\n\n        # OK\n        positions = [\n            OrderSummary(price=\"0.3\", size=\"100\"),\n            OrderSummary(price=\"0.4\", size=\"100\"),\n            OrderSummary(price=\"0.5\", size=\"100\"),\n        ]\n        builder = OrderBuilder(signer)\n        self.assertEqual(\n            builder.calculate_sell_market_price(positions, 100, OrderType.FOK), 0.5\n        )\n\n        positions = [\n            OrderSummary(price=\"0.3\", size=\"100\"),\n            OrderSummary(price=\"0.4\", size=\"300\"),\n            OrderSummary(price=\"0.5\", size=\"10\"),\n        ]\n        builder = OrderBuilder(signer)\n        self.assertEqual(\n            builder.calculate_sell_market_price(positions, 100, OrderType.FOK), 0.4\n        )\n\n        positions = [\n            OrderSummary(price=\"0.3\", size=\"100\"),\n            OrderSummary(price=\"0.4\", size=\"200\"),\n            OrderSummary(price=\"0.5\", size=\"10\"),\n        ]\n        builder = OrderBuilder(signer)\n        self.assertEqual(\n            builder.calculate_sell_market_price(positions, 100, OrderType.FOK), 0.4\n        )\n\n        positions = [\n            OrderSummary(price=\"0.3\", size=\"300\"),\n            OrderSummary(price=\"0.4\", size=\"100\"),\n            OrderSummary(price=\"0.5\", size=\"100\"),\n        ]\n        builder = OrderBuilder(signer)\n        self.assertEqual(\n            builder.calculate_sell_market_price(positions, 200, OrderType.FOK), 0.4\n        )\n\n        positions = [\n            OrderSummary(price=\"0.3\", size=\"334\"),\n            OrderSummary(price=\"0.4\", size=\"100\"),\n            OrderSummary(price=\"0.5\", size=\"100\"),\n        ]\n        builder = OrderBuilder(signer)\n        self.assertEqual(\n            builder.calculate_sell_market_price(positions, 300, OrderType.FOK), 0.3\n        )\n\n    def test_calculate_buy_market_price_FAK(self):\n        # empty\n        with self.assertRaises(Exception):\n            builder = OrderBuilder(signer)\n            builder.calculate_buy_market_price([], 100, OrderType.FAK)\n\n        # not enough\n        positions = [\n            OrderSummary(price=\"0.5\", size=\"100\"),\n            OrderSummary(price=\"0.4\", size=\"100\"),\n        ]\n        builder = OrderBuilder(signer)\n        self.assertEqual(\n            builder.calculate_buy_market_price(positions, 100, OrderType.FAK), 0.5\n        )\n\n        # OK\n        positions = [\n            OrderSummary(price=\"0.5\", size=\"100\"),\n            OrderSummary(price=\"0.4\", size=\"100\"),\n            OrderSummary(price=\"0.3\", size=\"100\"),\n        ]\n        builder = OrderBuilder(signer)\n        self.assertEqual(\n            builder.calculate_buy_market_price(positions, 100, OrderType.FAK), 0.5\n        )\n\n        positions = [\n            OrderSummary(price=\"0.5\", size=\"100\"),\n            OrderSummary(price=\"0.4\", size=\"200\"),\n            OrderSummary(price=\"0.3\", size=\"100\"),\n        ]\n        builder = OrderBuilder(signer)\n        self.assertEqual(\n            builder.calculate_buy_market_price(positions, 100, OrderType.FAK), 0.4\n        )\n\n        positions = [\n            OrderSummary(price=\"0.5\", size=\"120\"),\n            OrderSummary(price=\"0.4\", size=\"100\"),\n            OrderSummary(price=\"0.3\", size=\"100\"),\n        ]\n        builder = OrderBuilder(signer)\n        self.assertEqual(\n            builder.calculate_buy_market_price(positions, 100, OrderType.FAK), 0.5\n        )\n\n        positions = [\n            OrderSummary(price=\"0.5\", size=\"200\"),\n            OrderSummary(price=\"0.4\", size=\"100\"),\n            OrderSummary(price=\"0.3\", size=\"100\"),\n        ]\n        builder = OrderBuilder(signer)\n        self.assertEqual(\n            builder.calculate_buy_market_price(positions, 100, OrderType.FAK), 0.5\n        )\n\n    def test_calculate_sell_market_price_FAK(self):\n        # empty\n        with self.assertRaises(Exception):\n            builder = OrderBuilder(signer)\n            builder.calculate_sell_market_price([], 100)\n\n        # not enough\n        positions = [\n            OrderSummary(price=\"0.4\", size=\"10\"),\n            OrderSummary(price=\"0.5\", size=\"10\"),\n        ]\n        builder = OrderBuilder(signer)\n        self.assertEqual(\n            builder.calculate_sell_market_price(positions, 100, OrderType.FAK), 0.4\n        )\n\n        # OK\n        positions = [\n            OrderSummary(price=\"0.3\", size=\"100\"),\n            OrderSummary(price=\"0.4\", size=\"100\"),\n            OrderSummary(price=\"0.5\", size=\"100\"),\n        ]\n        builder = OrderBuilder(signer)\n        self.assertEqual(\n            builder.calculate_sell_market_price(positions, 100, OrderType.FAK), 0.5\n        )\n\n        positions = [\n            OrderSummary(price=\"0.3\", size=\"100\"),\n            OrderSummary(price=\"0.4\", size=\"300\"),\n            OrderSummary(price=\"0.5\", size=\"10\"),\n        ]\n        builder = OrderBuilder(signer)\n        self.assertEqual(\n            builder.calculate_sell_market_price(positions, 100, OrderType.FAK), 0.4\n        )\n\n        positions = [\n            OrderSummary(price=\"0.3\", size=\"100\"),\n            OrderSummary(price=\"0.4\", size=\"200\"),\n            OrderSummary(price=\"0.5\", size=\"10\"),\n        ]\n        builder = OrderBuilder(signer)\n        self.assertEqual(\n            builder.calculate_sell_market_price(positions, 100, OrderType.FAK), 0.4\n        )\n\n        positions = [\n            OrderSummary(price=\"0.3\", size=\"300\"),\n            OrderSummary(price=\"0.4\", size=\"100\"),\n            OrderSummary(price=\"0.5\", size=\"100\"),\n        ]\n        builder = OrderBuilder(signer)\n        self.assertEqual(\n            builder.calculate_sell_market_price(positions, 200, OrderType.FAK), 0.4\n        )\n\n        positions = [\n            OrderSummary(price=\"0.3\", size=\"334\"),\n            OrderSummary(price=\"0.4\", size=\"100\"),\n            OrderSummary(price=\"0.5\", size=\"100\"),\n        ]\n        builder = OrderBuilder(signer)\n        self.assertEqual(\n            builder.calculate_sell_market_price(positions, 300, OrderType.FAK), 0.3\n        )\n\n    def test_get_market_order_amounts_buy_0_1(self):\n        builder = OrderBuilder(signer)\n\n        delta_price = 0.1\n        delta_size = 0.01\n        amount = 0.01\n        while amount <= 1000:\n            price = 0.1\n            while price <= 1:\n                side, maker, taker = builder.get_market_order_amounts(\n                    BUY, amount, price, ROUNDING_CONFIG[\"0.1\"]\n                )\n                self.assertEqual(side, UtilsBuy)\n                self.assertEqual(decimal_places(maker), 0)\n                self.assertEqual(decimal_places(taker), 0)\n                self.assertGreaterEqual(\n                    round_normal(maker / taker, 2), round_normal(price, 2)\n                )\n                price = price + delta_price\n\n            amount = amount + delta_size\n\n    def test_get_market_order_amounts_buy_0_01(self):\n        builder = OrderBuilder(signer)\n\n        delta_price = 0.01\n        delta_size = 0.01\n        amount = 0.01\n        while amount <= 100:\n            price = 0.01\n            while price <= 1:\n                side, maker, taker = builder.get_market_order_amounts(\n                    BUY, amount, price, ROUNDING_CONFIG[\"0.01\"]\n                )\n                self.assertEqual(side, UtilsBuy)\n                self.assertEqual(decimal_places(maker), 0)\n                self.assertEqual(decimal_places(taker), 0)\n                self.assertGreaterEqual(\n                    round_normal(maker / taker, 4), round_normal(price, 4)\n                )\n                price = price + delta_price\n\n            amount = amount + delta_size\n\n    def test_get_market_order_amounts_buy_0_001(self):\n        builder = OrderBuilder(signer)\n\n        delta_price = 0.001\n        delta_size = 0.01\n        amount = 0.01\n        while amount <= 10:\n            price = 0.001\n            while price <= 1:\n                side, maker, taker = builder.get_market_order_amounts(\n                    BUY, amount, price, ROUNDING_CONFIG[\"0.001\"]\n                )\n                self.assertEqual(side, UtilsBuy)\n                self.assertEqual(decimal_places(maker), 0)\n                self.assertEqual(decimal_places(taker), 0)\n                self.assertGreaterEqual(\n                    round_normal(maker / taker, 6), round_normal(price, 6)\n                )\n                price = price + delta_price\n\n            amount = amount + delta_size\n\n    def test_get_market_order_amounts_buy_0_0001(self):\n        builder = OrderBuilder(signer)\n\n        delta_price = 0.0001\n        delta_size = 0.01\n        amount = 0.01\n        while amount <= 1:\n            price = 0.0001\n            while price <= 1:\n                side, maker, taker = builder.get_market_order_amounts(\n                    BUY, amount, price, ROUNDING_CONFIG[\"0.0001\"]\n                )\n                self.assertEqual(side, UtilsBuy)\n                self.assertEqual(decimal_places(maker), 0)\n                self.assertEqual(decimal_places(taker), 0)\n                self.assertGreaterEqual(\n                    round_normal(maker / taker, 8), round_normal(price, 8)\n                )\n                price = price + delta_price\n\n            amount = amount + delta_size\n\n    def test_get_market_order_amounts_sell_0_1(self):\n        builder = OrderBuilder(signer)\n\n        delta_price = 0.1\n        delta_size = 0.01\n        amount = 0.01\n        while amount <= 1000:\n            price = 0.1\n            while price <= 1:\n                side, maker, taker = builder.get_market_order_amounts(\n                    SELL, amount, price, ROUNDING_CONFIG[\"0.1\"]\n                )\n                self.assertEqual(side, UtilsSell)\n                self.assertEqual(decimal_places(maker), 0)\n                self.assertEqual(decimal_places(taker), 0)\n                self.assertGreaterEqual(\n                    round_normal(maker / taker, 2), round_normal(price, 2)\n                )\n                price = price + delta_price\n\n            amount = amount + delta_size\n\n    def test_get_market_order_amounts_sell_0_01(self):\n        builder = OrderBuilder(signer)\n\n        delta_price = 0.01\n        delta_size = 0.01\n        amount = 0.01\n        while amount <= 100:\n            price = 0.01\n            while price <= 1:\n                side, maker, taker = builder.get_market_order_amounts(\n                    SELL, amount, price, ROUNDING_CONFIG[\"0.01\"]\n                )\n                self.assertEqual(side, UtilsSell)\n                self.assertEqual(decimal_places(maker), 0)\n                self.assertEqual(decimal_places(taker), 0)\n                self.assertGreaterEqual(\n                    round_normal(maker / taker, 4), round_normal(price, 4)\n                )\n                price = price + delta_price\n\n            amount = amount + delta_size\n\n    def test_get_market_order_amounts_sell_0_001(self):\n        builder = OrderBuilder(signer)\n\n        delta_price = 0.001\n        delta_size = 0.01\n        amount = 0.01\n        while amount <= 10:\n            price = 0.001\n            while price <= 1:\n                side, maker, taker = builder.get_market_order_amounts(\n                    SELL, amount, price, ROUNDING_CONFIG[\"0.001\"]\n                )\n                self.assertEqual(side, UtilsSell)\n                self.assertEqual(decimal_places(maker), 0)\n                self.assertEqual(decimal_places(taker), 0)\n                self.assertGreaterEqual(\n                    round_normal(maker / taker, 6), round_normal(price, 6)\n                )\n                price = price + delta_price\n\n            amount = amount + delta_size\n\n    def test_get_market_order_amounts_sell_0_0001(self):\n        builder = OrderBuilder(signer)\n\n        delta_price = 0.0001\n        delta_size = 0.01\n        amount = 0.01\n        while amount <= 1:\n            price = 0.0001\n            while price <= 1:\n                side, maker, taker = builder.get_market_order_amounts(\n                    SELL, amount, price, ROUNDING_CONFIG[\"0.0001\"]\n                )\n                self.assertEqual(side, UtilsSell)\n                self.assertEqual(decimal_places(maker), 0)\n                self.assertEqual(decimal_places(taker), 0)\n                self.assertGreaterEqual(\n                    round_normal(taker / maker, 8), round_normal(price, 8)\n                )\n                price = price + delta_price\n\n            amount = amount + delta_size\n\n    def test_get_order_amounts_buy_0_1(self):\n        builder = OrderBuilder(signer)\n\n        delta_price = 0.1\n        delta_size = 0.01\n        size = 0.01\n        while size <= 1000:\n            price = 0.1\n            while price <= 1:\n                side, maker, taker = builder.get_order_amounts(\n                    BUY, size, price, ROUNDING_CONFIG[\"0.1\"]\n                )\n                self.assertEqual(side, 0)\n                self.assertEqual(decimal_places(maker), 0)\n                self.assertEqual(decimal_places(taker), 0)\n                self.assertGreaterEqual(\n                    round_normal(maker / taker, 2), round_normal(price, 2)\n                )\n                price = price + delta_price\n\n            size = size + delta_size\n\n    def test_get_order_amounts_buy_0_01(self):\n        builder = OrderBuilder(signer)\n\n        delta_price = 0.01\n        delta_size = 0.01\n        size = 0.01\n        while size <= 100:\n            price = 0.01\n            while price <= 1:\n                side, maker, taker = builder.get_order_amounts(\n                    BUY, size, price, ROUNDING_CONFIG[\"0.01\"]\n                )\n                self.assertEqual(side, 0)\n                self.assertEqual(decimal_places(maker), 0)\n                self.assertEqual(decimal_places(taker), 0)\n                self.assertGreaterEqual(\n                    round_normal(maker / taker, 4), round_normal(price, 4)\n                )\n                price = price + delta_price\n\n            size = size + delta_size\n\n    def test_get_order_amounts_buy_0_001(self):\n        builder = OrderBuilder(signer)\n\n        delta_price = 0.001\n        delta_size = 0.01\n        size = 0.01\n        while size <= 10:\n            price = 0.001\n            while price <= 1:\n                side, maker, taker = builder.get_order_amounts(\n                    BUY, size, price, ROUNDING_CONFIG[\"0.001\"]\n                )\n                self.assertEqual(side, 0)\n                self.assertEqual(decimal_places(maker), 0)\n                self.assertEqual(decimal_places(taker), 0)\n                self.assertGreaterEqual(\n                    round_normal(maker / taker, 6), round_normal(price, 6)\n                )\n                price = price + delta_price\n\n            size = size + delta_size\n\n    def test_get_order_amounts_buy_0_0001(self):\n        builder = OrderBuilder(signer)\n\n        delta_price = 0.0001\n        delta_size = 0.01\n        size = 0.01\n        while size <= 1:\n            price = 0.0001\n            while price <= 1:\n                side, maker, taker = builder.get_order_amounts(\n                    BUY, size, price, ROUNDING_CONFIG[\"0.0001\"]\n                )\n                self.assertEqual(side, 0)\n                self.assertEqual(decimal_places(maker), 0)\n                self.assertEqual(decimal_places(taker), 0)\n                self.assertGreaterEqual(\n                    round_normal(maker / taker, 8), round_normal(price, 8)\n                )\n                price = price + delta_price\n\n            size = size + delta_size\n\n    def test_get_order_amounts_sell_0_1(self):\n        builder = OrderBuilder(signer)\n\n        delta_price = 0.1\n        delta_size = 0.01\n        size = 0.01\n        while size <= 1000:\n            price = 0.1\n            while price <= 1:\n                side, maker, taker = builder.get_order_amounts(\n                    SELL, size, price, ROUNDING_CONFIG[\"0.1\"]\n                )\n                self.assertEqual(side, 1)\n                self.assertEqual(decimal_places(maker), 0)\n                self.assertEqual(decimal_places(taker), 0)\n                self.assertGreaterEqual(\n                    round_normal(taker / maker, 2), round_normal(price, 2)\n                )\n                price = price + delta_price\n\n            size = size + delta_size\n\n    def test_get_order_amounts_sell_0_01(self):\n        builder = OrderBuilder(signer)\n\n        delta_price = 0.01\n        delta_size = 0.01\n        size = 0.01\n        while size <= 100:\n            price = 0.01\n            while price <= 1:\n                side, maker, taker = builder.get_order_amounts(\n                    SELL, size, price, ROUNDING_CONFIG[\"0.01\"]\n                )\n                self.assertEqual(side, 1)\n                self.assertEqual(decimal_places(maker), 0)\n                self.assertEqual(decimal_places(taker), 0)\n                self.assertGreaterEqual(\n                    round_normal(taker / maker, 4), round_normal(price, 4)\n                )\n                price = price + delta_price\n\n            size = size + delta_size\n\n    def test_get_order_amounts_sell_0_001(self):\n        builder = OrderBuilder(signer)\n\n        delta_price = 0.001\n        delta_size = 0.01\n        size = 0.01\n        while size <= 10:\n            price = 0.001\n            while price <= 1:\n                side, maker, taker = builder.get_order_amounts(\n                    SELL, size, price, ROUNDING_CONFIG[\"0.001\"]\n                )\n                self.assertEqual(side, 1)\n                self.assertEqual(decimal_places(maker), 0)\n                self.assertEqual(decimal_places(taker), 0)\n                self.assertGreaterEqual(\n                    round_normal(taker / maker, 6), round_normal(price, 6)\n                )\n                price = price + delta_price\n\n            size = size + delta_size\n\n    def test_get_order_amounts_sell_0_0001(self):\n        builder = OrderBuilder(signer)\n\n        delta_price = 0.0001\n        delta_size = 0.01\n        size = 0.01\n        while size <= 1:\n            price = 0.0001\n            while price <= 1:\n                side, maker, taker = builder.get_order_amounts(\n                    SELL, size, price, ROUNDING_CONFIG[\"0.0001\"]\n                )\n                self.assertEqual(side, 1)\n                self.assertEqual(decimal_places(maker), 0)\n                self.assertEqual(decimal_places(taker), 0)\n                self.assertGreaterEqual(\n                    round_normal(taker / maker, 8), round_normal(price, 8)\n                )\n                price = price + delta_price\n\n            size = size + delta_size\n\n    def test_create_order_decimal_accuracy(self):\n        builder = OrderBuilder(signer)\n\n        # BUY\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.24,\n                size=15,\n                side=BUY,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=False),\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            3600000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            15000000,\n        )\n\n        # SELL\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.24,\n                size=15,\n                side=SELL,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=False),\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            15000000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            3600000,\n        )\n\n        # BUY\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.82,\n                size=101,\n                side=BUY,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=False),\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            82820000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            101000000,\n        )\n\n        # SELL\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.82,\n                size=101,\n                side=SELL,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=False),\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            101000000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            82820000,\n        )\n\n        # BUY\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.78,\n                size=12.8205,\n                side=BUY,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=False),\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            9999600,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            12820000,\n        )\n\n        # SELL\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.78,\n                size=12.8205,\n                side=SELL,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=False),\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            12820000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            9999600,\n        )\n\n        # SELL\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.39,\n                size=2435.89,\n                side=SELL,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=False),\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            2435890000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            949997100,\n        )\n\n        # SELL\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.43,\n                size=19.1,\n                side=SELL,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=False),\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            19100000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            8213000,\n        )\n\n        # BUY\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.58,\n                size=18233.33,\n                side=BUY,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=False),\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            10575331400,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            18233330000,\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"] / signed_order.order[\"takerAmount\"], 0.58\n        )\n\n    def test_create_order_buy_0_1(self):\n        builder = OrderBuilder(signer)\n\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.5,\n                size=21.04,\n                side=BUY,\n                fee_rate_bps=111,\n                nonce=123,\n                expiration=50000,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.1\", neg_risk=False),\n        )\n\n        self.assertTrue(isinstance(signed_order.order[\"salt\"], int))\n        self.assertIsNotNone(signed_order)\n        self.assertEqual(\n            signed_order.order[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order.order[\"tokenId\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            10520000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            21040000,\n        )\n        self.assertEqual(\n            signed_order.order[\"side\"],\n            0,\n        )\n        self.assertEqual(\n            signed_order.order[\"expiration\"],\n            50000,\n        )\n        self.assertEqual(\n            signed_order.order[\"nonce\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"feeRateBps\"],\n            111,\n        )\n        self.assertEqual(\n            signed_order.order[\"signatureType\"],\n            EOA,\n        )\n        self.assertIsNotNone(signed_order.signature)\n        self.assertEqual(\n            float(signed_order.order[\"makerAmount\"])\n            / float(signed_order.order[\"takerAmount\"]),\n            0.5,\n        )\n\n    def test_create_order_buy_0_01(self):\n        builder = OrderBuilder(signer)\n\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.56,\n                size=21.04,\n                side=BUY,\n                fee_rate_bps=111,\n                nonce=123,\n                expiration=50000,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=False),\n        )\n\n        self.assertTrue(isinstance(signed_order.order[\"salt\"], int))\n        self.assertIsNotNone(signed_order)\n        self.assertEqual(\n            signed_order.order[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order.order[\"tokenId\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            11782400,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            21040000,\n        )\n        self.assertEqual(\n            signed_order.order[\"side\"],\n            0,\n        )\n        self.assertEqual(\n            signed_order.order[\"expiration\"],\n            50000,\n        )\n        self.assertEqual(\n            signed_order.order[\"nonce\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"feeRateBps\"],\n            111,\n        )\n        self.assertEqual(\n            signed_order.order[\"signatureType\"],\n            EOA,\n        )\n        self.assertIsNotNone(signed_order.signature)\n        self.assertEqual(\n            float(signed_order.order[\"makerAmount\"])\n            / float(signed_order.order[\"takerAmount\"]),\n            0.56,\n        )\n\n    def test_create_order_buy_0_001(self):\n        builder = OrderBuilder(signer)\n\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.056,\n                size=21.04,\n                side=BUY,\n                fee_rate_bps=111,\n                nonce=123,\n                expiration=50000,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.001\", neg_risk=False),\n        )\n\n        self.assertTrue(isinstance(signed_order.order[\"salt\"], int))\n        self.assertIsNotNone(signed_order)\n        self.assertEqual(\n            signed_order.order[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order.order[\"tokenId\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            1178240,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            21040000,\n        )\n        self.assertEqual(\n            signed_order.order[\"side\"],\n            0,\n        )\n        self.assertEqual(\n            signed_order.order[\"expiration\"],\n            50000,\n        )\n        self.assertEqual(\n            signed_order.order[\"nonce\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"feeRateBps\"],\n            111,\n        )\n        self.assertEqual(\n            signed_order.order[\"signatureType\"],\n            EOA,\n        )\n        self.assertIsNotNone(signed_order.signature)\n        self.assertEqual(\n            float(signed_order.order[\"makerAmount\"])\n            / float(signed_order.order[\"takerAmount\"]),\n            0.056,\n        )\n\n    def test_create_order_buy_0_0001(self):\n        builder = OrderBuilder(signer)\n\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.0056,\n                size=21.04,\n                side=BUY,\n                fee_rate_bps=111,\n                nonce=123,\n                expiration=50000,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.0001\", neg_risk=False),\n        )\n\n        self.assertTrue(isinstance(signed_order.order[\"salt\"], int))\n        self.assertIsNotNone(signed_order)\n        self.assertEqual(\n            signed_order.order[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order.order[\"tokenId\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            117824,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            21040000,\n        )\n        self.assertEqual(\n            signed_order.order[\"side\"],\n            0,\n        )\n        self.assertEqual(\n            signed_order.order[\"expiration\"],\n            50000,\n        )\n        self.assertEqual(\n            signed_order.order[\"nonce\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"feeRateBps\"],\n            111,\n        )\n        self.assertEqual(\n            signed_order.order[\"signatureType\"],\n            EOA,\n        )\n        self.assertIsNotNone(signed_order.signature)\n        self.assertEqual(\n            float(signed_order.order[\"makerAmount\"])\n            / float(signed_order.order[\"takerAmount\"]),\n            0.0056,\n        )\n\n    def test_create_order_sell_0_1(self):\n        builder = OrderBuilder(signer, sig_type=POLY_GNOSIS_SAFE)\n\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.5,\n                size=21.04,\n                side=SELL,\n                fee_rate_bps=111,\n                nonce=123,\n                expiration=50000,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.1\", neg_risk=False),\n        )\n\n        self.assertTrue(isinstance(signed_order.order[\"salt\"], int))\n        self.assertIsNotNone(signed_order)\n        self.assertEqual(\n            signed_order.order[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order.order[\"tokenId\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            21040000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            10520000,\n        )\n        self.assertEqual(\n            signed_order.order[\"side\"],\n            1,\n        )\n        self.assertEqual(\n            signed_order.order[\"expiration\"],\n            50000,\n        )\n        self.assertEqual(\n            signed_order.order[\"nonce\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"feeRateBps\"],\n            111,\n        )\n        self.assertEqual(\n            signed_order.order[\"signatureType\"],\n            POLY_GNOSIS_SAFE,\n        )\n        self.assertIsNotNone(signed_order.signature)\n        self.assertEqual(\n            float(signed_order.order[\"takerAmount\"])\n            / float(signed_order.order[\"makerAmount\"]),\n            0.5,\n        )\n\n    def test_create_order_sell_0_01(self):\n        builder = OrderBuilder(signer, sig_type=POLY_GNOSIS_SAFE)\n\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.56,\n                size=21.04,\n                side=SELL,\n                fee_rate_bps=111,\n                nonce=123,\n                expiration=50000,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=False),\n        )\n\n        self.assertTrue(isinstance(signed_order.order[\"salt\"], int))\n        self.assertIsNotNone(signed_order)\n        self.assertEqual(\n            signed_order.order[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order.order[\"tokenId\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            21040000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            11782400,\n        )\n        self.assertEqual(\n            signed_order.order[\"side\"],\n            1,\n        )\n        self.assertEqual(\n            signed_order.order[\"expiration\"],\n            50000,\n        )\n        self.assertEqual(\n            signed_order.order[\"nonce\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"feeRateBps\"],\n            111,\n        )\n        self.assertEqual(\n            signed_order.order[\"signatureType\"],\n            POLY_GNOSIS_SAFE,\n        )\n        self.assertIsNotNone(signed_order.signature)\n        self.assertEqual(\n            float(signed_order.order[\"takerAmount\"])\n            / float(signed_order.order[\"makerAmount\"]),\n            0.56,\n        )\n\n    def test_create_order_sell_0_001(self):\n        builder = OrderBuilder(signer, sig_type=POLY_GNOSIS_SAFE)\n\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.056,\n                size=21.04,\n                side=SELL,\n                fee_rate_bps=111,\n                nonce=123,\n                expiration=50000,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.001\", neg_risk=False),\n        )\n\n        self.assertTrue(isinstance(signed_order.order[\"salt\"], int))\n        self.assertIsNotNone(signed_order)\n        self.assertEqual(\n            signed_order.order[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order.order[\"tokenId\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            21040000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            1178240,\n        )\n        self.assertEqual(\n            signed_order.order[\"side\"],\n            1,\n        )\n        self.assertEqual(\n            signed_order.order[\"expiration\"],\n            50000,\n        )\n        self.assertEqual(\n            signed_order.order[\"nonce\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"feeRateBps\"],\n            111,\n        )\n        self.assertEqual(\n            signed_order.order[\"signatureType\"],\n            POLY_GNOSIS_SAFE,\n        )\n        self.assertIsNotNone(signed_order.signature)\n        self.assertEqual(\n            float(signed_order.order[\"takerAmount\"])\n            / float(signed_order.order[\"makerAmount\"]),\n            0.056,\n        )\n\n    def test_create_order_sell_0_0001(self):\n        builder = OrderBuilder(signer, sig_type=POLY_GNOSIS_SAFE)\n\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.0056,\n                size=21.04,\n                side=SELL,\n                fee_rate_bps=111,\n                nonce=123,\n                expiration=50000,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.0001\", neg_risk=False),\n        )\n\n        self.assertTrue(isinstance(signed_order.order[\"salt\"], int))\n        self.assertIsNotNone(signed_order)\n        self.assertEqual(\n            signed_order.order[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order.order[\"tokenId\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            21040000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            117824,\n        )\n        self.assertEqual(\n            signed_order.order[\"side\"],\n            1,\n        )\n        self.assertEqual(\n            signed_order.order[\"expiration\"],\n            50000,\n        )\n        self.assertEqual(\n            signed_order.order[\"nonce\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"feeRateBps\"],\n            111,\n        )\n        self.assertEqual(\n            signed_order.order[\"signatureType\"],\n            POLY_GNOSIS_SAFE,\n        )\n        self.assertIsNotNone(signed_order.signature)\n        self.assertEqual(\n            float(signed_order.order[\"takerAmount\"])\n            / float(signed_order.order[\"makerAmount\"]),\n            0.0056,\n        )\n\n    def test_create_order_decimal_accuracy_neg_risk(self):\n        builder = OrderBuilder(signer)\n\n        # BUY\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.24,\n                size=15,\n                side=BUY,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=True),\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            3600000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            15000000,\n        )\n\n        # SELL\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.24,\n                size=15,\n                side=SELL,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=True),\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            15000000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            3600000,\n        )\n\n        # BUY\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.82,\n                size=101,\n                side=BUY,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=True),\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            82820000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            101000000,\n        )\n\n        # SELL\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.82,\n                size=101,\n                side=SELL,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=True),\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            101000000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            82820000,\n        )\n\n        # BUY\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.78,\n                size=12.8205,\n                side=BUY,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=True),\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            9999600,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            12820000,\n        )\n\n        # SELL\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.78,\n                size=12.8205,\n                side=SELL,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=True),\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            12820000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            9999600,\n        )\n\n        # SELL\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.39,\n                size=2435.89,\n                side=SELL,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=True),\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            2435890000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            949997100,\n        )\n\n        # SELL\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.43,\n                size=19.1,\n                side=SELL,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=True),\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            19100000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            8213000,\n        )\n\n        # BUY\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.58,\n                size=18233.33,\n                side=BUY,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=True),\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            10575331400,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            18233330000,\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"] / signed_order.order[\"takerAmount\"], 0.58\n        )\n\n    def test_create_order_buy_0_1_neg_risk(self):\n        builder = OrderBuilder(signer)\n\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.5,\n                size=21.04,\n                side=BUY,\n                fee_rate_bps=111,\n                nonce=123,\n                expiration=50000,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.1\", neg_risk=True),\n        )\n\n        self.assertTrue(isinstance(signed_order.order[\"salt\"], int))\n        self.assertIsNotNone(signed_order)\n        self.assertEqual(\n            signed_order.order[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order.order[\"tokenId\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            10520000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            21040000,\n        )\n        self.assertEqual(\n            signed_order.order[\"side\"],\n            0,\n        )\n        self.assertEqual(\n            signed_order.order[\"expiration\"],\n            50000,\n        )\n        self.assertEqual(\n            signed_order.order[\"nonce\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"feeRateBps\"],\n            111,\n        )\n        self.assertEqual(\n            signed_order.order[\"signatureType\"],\n            EOA,\n        )\n        self.assertIsNotNone(signed_order.signature)\n        self.assertEqual(\n            float(signed_order.order[\"makerAmount\"])\n            / float(signed_order.order[\"takerAmount\"]),\n            0.5,\n        )\n\n    def test_create_order_buy_0_01_neg_risk(self):\n        builder = OrderBuilder(signer)\n\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.56,\n                size=21.04,\n                side=BUY,\n                fee_rate_bps=111,\n                nonce=123,\n                expiration=50000,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=True),\n        )\n\n        self.assertTrue(isinstance(signed_order.order[\"salt\"], int))\n        self.assertIsNotNone(signed_order)\n        self.assertEqual(\n            signed_order.order[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order.order[\"tokenId\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            11782400,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            21040000,\n        )\n        self.assertEqual(\n            signed_order.order[\"side\"],\n            0,\n        )\n        self.assertEqual(\n            signed_order.order[\"expiration\"],\n            50000,\n        )\n        self.assertEqual(\n            signed_order.order[\"nonce\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"feeRateBps\"],\n            111,\n        )\n        self.assertEqual(\n            signed_order.order[\"signatureType\"],\n            EOA,\n        )\n        self.assertIsNotNone(signed_order.signature)\n        self.assertEqual(\n            float(signed_order.order[\"makerAmount\"])\n            / float(signed_order.order[\"takerAmount\"]),\n            0.56,\n        )\n\n    def test_create_order_buy_0_001_neg_risk(self):\n        builder = OrderBuilder(signer)\n\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.056,\n                size=21.04,\n                side=BUY,\n                fee_rate_bps=111,\n                nonce=123,\n                expiration=50000,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.001\", neg_risk=True),\n        )\n\n        self.assertTrue(isinstance(signed_order.order[\"salt\"], int))\n        self.assertIsNotNone(signed_order)\n        self.assertEqual(\n            signed_order.order[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order.order[\"tokenId\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            1178240,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            21040000,\n        )\n        self.assertEqual(\n            signed_order.order[\"side\"],\n            0,\n        )\n        self.assertEqual(\n            signed_order.order[\"expiration\"],\n            50000,\n        )\n        self.assertEqual(\n            signed_order.order[\"nonce\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"feeRateBps\"],\n            111,\n        )\n        self.assertEqual(\n            signed_order.order[\"signatureType\"],\n            EOA,\n        )\n        self.assertIsNotNone(signed_order.signature)\n        self.assertEqual(\n            float(signed_order.order[\"makerAmount\"])\n            / float(signed_order.order[\"takerAmount\"]),\n            0.056,\n        )\n\n    def test_create_order_buy_0_0001_neg_risk(self):\n        builder = OrderBuilder(signer)\n\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.0056,\n                size=21.04,\n                side=BUY,\n                fee_rate_bps=111,\n                nonce=123,\n                expiration=50000,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.0001\", neg_risk=True),\n        )\n\n        self.assertTrue(isinstance(signed_order.order[\"salt\"], int))\n        self.assertIsNotNone(signed_order)\n        self.assertEqual(\n            signed_order.order[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order.order[\"tokenId\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            117824,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            21040000,\n        )\n        self.assertEqual(\n            signed_order.order[\"side\"],\n            0,\n        )\n        self.assertEqual(\n            signed_order.order[\"expiration\"],\n            50000,\n        )\n        self.assertEqual(\n            signed_order.order[\"nonce\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"feeRateBps\"],\n            111,\n        )\n        self.assertEqual(\n            signed_order.order[\"signatureType\"],\n            EOA,\n        )\n        self.assertIsNotNone(signed_order.signature)\n        self.assertEqual(\n            float(signed_order.order[\"makerAmount\"])\n            / float(signed_order.order[\"takerAmount\"]),\n            0.0056,\n        )\n\n    def test_create_order_sell_0_1_neg_risk(self):\n        builder = OrderBuilder(signer, sig_type=POLY_GNOSIS_SAFE)\n\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.5,\n                size=21.04,\n                side=SELL,\n                fee_rate_bps=111,\n                nonce=123,\n                expiration=50000,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.1\", neg_risk=True),\n        )\n\n        self.assertTrue(isinstance(signed_order.order[\"salt\"], int))\n        self.assertIsNotNone(signed_order)\n        self.assertEqual(\n            signed_order.order[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order.order[\"tokenId\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            21040000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            10520000,\n        )\n        self.assertEqual(\n            signed_order.order[\"side\"],\n            1,\n        )\n        self.assertEqual(\n            signed_order.order[\"expiration\"],\n            50000,\n        )\n        self.assertEqual(\n            signed_order.order[\"nonce\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"feeRateBps\"],\n            111,\n        )\n        self.assertEqual(\n            signed_order.order[\"signatureType\"],\n            POLY_GNOSIS_SAFE,\n        )\n        self.assertIsNotNone(signed_order.signature)\n        self.assertEqual(\n            float(signed_order.order[\"takerAmount\"])\n            / float(signed_order.order[\"makerAmount\"]),\n            0.5,\n        )\n\n    def test_create_order_sell_0_01_neg_risk(self):\n        builder = OrderBuilder(signer, sig_type=POLY_GNOSIS_SAFE)\n\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.56,\n                size=21.04,\n                side=SELL,\n                fee_rate_bps=111,\n                nonce=123,\n                expiration=50000,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=True),\n        )\n\n        self.assertTrue(isinstance(signed_order.order[\"salt\"], int))\n        self.assertIsNotNone(signed_order)\n        self.assertEqual(\n            signed_order.order[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order.order[\"tokenId\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            21040000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            11782400,\n        )\n        self.assertEqual(\n            signed_order.order[\"side\"],\n            1,\n        )\n        self.assertEqual(\n            signed_order.order[\"expiration\"],\n            50000,\n        )\n        self.assertEqual(\n            signed_order.order[\"nonce\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"feeRateBps\"],\n            111,\n        )\n        self.assertEqual(\n            signed_order.order[\"signatureType\"],\n            POLY_GNOSIS_SAFE,\n        )\n        self.assertIsNotNone(signed_order.signature)\n        self.assertEqual(\n            float(signed_order.order[\"takerAmount\"])\n            / float(signed_order.order[\"makerAmount\"]),\n            0.56,\n        )\n\n    def test_create_order_sell_0_001_neg_risk(self):\n        builder = OrderBuilder(signer, sig_type=POLY_GNOSIS_SAFE)\n\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.056,\n                size=21.04,\n                side=SELL,\n                fee_rate_bps=111,\n                nonce=123,\n                expiration=50000,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.001\", neg_risk=True),\n        )\n\n        self.assertTrue(isinstance(signed_order.order[\"salt\"], int))\n        self.assertIsNotNone(signed_order)\n        self.assertEqual(\n            signed_order.order[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order.order[\"tokenId\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            21040000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            1178240,\n        )\n        self.assertEqual(\n            signed_order.order[\"side\"],\n            1,\n        )\n        self.assertEqual(\n            signed_order.order[\"expiration\"],\n            50000,\n        )\n        self.assertEqual(\n            signed_order.order[\"nonce\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"feeRateBps\"],\n            111,\n        )\n        self.assertEqual(\n            signed_order.order[\"signatureType\"],\n            POLY_GNOSIS_SAFE,\n        )\n        self.assertIsNotNone(signed_order.signature)\n        self.assertEqual(\n            float(signed_order.order[\"takerAmount\"])\n            / float(signed_order.order[\"makerAmount\"]),\n            0.056,\n        )\n\n    def test_create_order_sell_0_0001_neg_risk(self):\n        builder = OrderBuilder(signer, sig_type=POLY_GNOSIS_SAFE)\n\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.0056,\n                size=21.04,\n                side=SELL,\n                fee_rate_bps=111,\n                nonce=123,\n                expiration=50000,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.0001\", neg_risk=True),\n        )\n\n        self.assertTrue(isinstance(signed_order.order[\"salt\"], int))\n        self.assertIsNotNone(signed_order)\n        self.assertEqual(\n            signed_order.order[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order.order[\"tokenId\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            21040000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            117824,\n        )\n        self.assertEqual(\n            signed_order.order[\"side\"],\n            1,\n        )\n        self.assertEqual(\n            signed_order.order[\"expiration\"],\n            50000,\n        )\n        self.assertEqual(\n            signed_order.order[\"nonce\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"feeRateBps\"],\n            111,\n        )\n        self.assertEqual(\n            signed_order.order[\"signatureType\"],\n            POLY_GNOSIS_SAFE,\n        )\n        self.assertIsNotNone(signed_order.signature)\n        self.assertEqual(\n            float(signed_order.order[\"takerAmount\"])\n            / float(signed_order.order[\"makerAmount\"]),\n            0.0056,\n        )\n\n    def test_dict_order_buy_neg_risk(self):\n        builder = OrderBuilder(signer)\n\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.56,\n                size=21.04,\n                side=BUY,\n                fee_rate_bps=111,\n                nonce=123,\n                expiration=50000,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=True),\n        )\n\n        self.assertIsNotNone(signed_order)\n\n        signed_order_dict = signed_order.dict()\n\n        self.assertIsNotNone(signed_order_dict)\n        self.assertTrue(isinstance(signed_order_dict[\"salt\"], int))\n        self.assertEqual(\n            signed_order_dict[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"tokenId\"],\n            \"123\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"makerAmount\"],\n            \"11782400\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"takerAmount\"],\n            \"21040000\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"side\"],\n            BUY,\n        )\n        self.assertEqual(\n            signed_order_dict[\"expiration\"],\n            \"50000\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"nonce\"],\n            \"123\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"feeRateBps\"],\n            \"111\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"signatureType\"],\n            EOA,\n        )\n        self.assertIsNotNone(signed_order_dict[\"signature\"])\n\n    def test_dict_order_sell_neg_risk(self):\n        builder = OrderBuilder(signer, sig_type=POLY_GNOSIS_SAFE)\n\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.56,\n                size=21.04,\n                side=SELL,\n                fee_rate_bps=111,\n                nonce=123,\n                expiration=50000,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=True),\n        )\n\n        self.assertIsNotNone(signed_order)\n\n        signed_order_dict = signed_order.dict()\n\n        self.assertIsNotNone(signed_order_dict)\n        self.assertTrue(isinstance(signed_order_dict[\"salt\"], int))\n        self.assertEqual(\n            signed_order_dict[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"tokenId\"],\n            \"123\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"makerAmount\"],\n            \"21040000\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"takerAmount\"],\n            \"11782400\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"side\"],\n            SELL,\n        )\n        self.assertEqual(\n            signed_order_dict[\"expiration\"],\n            \"50000\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"nonce\"],\n            \"123\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"feeRateBps\"],\n            \"111\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"signatureType\"],\n            POLY_GNOSIS_SAFE,\n        )\n        self.assertIsNotNone(signed_order_dict[\"signature\"])\n\n    def test_dict_order_buy(self):\n        builder = OrderBuilder(signer)\n\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.56,\n                size=21.04,\n                side=BUY,\n                fee_rate_bps=111,\n                nonce=123,\n                expiration=50000,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=False),\n        )\n\n        self.assertIsNotNone(signed_order)\n\n        signed_order_dict = signed_order.dict()\n\n        self.assertIsNotNone(signed_order_dict)\n        self.assertTrue(isinstance(signed_order_dict[\"salt\"], int))\n        self.assertEqual(\n            signed_order_dict[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"tokenId\"],\n            \"123\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"makerAmount\"],\n            \"11782400\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"takerAmount\"],\n            \"21040000\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"side\"],\n            BUY,\n        )\n        self.assertEqual(\n            signed_order_dict[\"expiration\"],\n            \"50000\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"nonce\"],\n            \"123\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"feeRateBps\"],\n            \"111\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"signatureType\"],\n            EOA,\n        )\n        self.assertIsNotNone(signed_order_dict[\"signature\"])\n\n    def test_dict_order_sell(self):\n        builder = OrderBuilder(signer, sig_type=POLY_GNOSIS_SAFE)\n\n        signed_order = builder.create_order(\n            order_args=OrderArgs(\n                token_id=\"123\",\n                price=0.56,\n                size=21.04,\n                side=SELL,\n                fee_rate_bps=111,\n                nonce=123,\n                expiration=50000,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=False),\n        )\n\n        self.assertIsNotNone(signed_order)\n\n        signed_order_dict = signed_order.dict()\n\n        self.assertIsNotNone(signed_order_dict)\n        self.assertTrue(isinstance(signed_order_dict[\"salt\"], int))\n        self.assertEqual(\n            signed_order_dict[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"tokenId\"],\n            \"123\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"makerAmount\"],\n            \"21040000\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"takerAmount\"],\n            \"11782400\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"side\"],\n            SELL,\n        )\n        self.assertEqual(\n            signed_order_dict[\"expiration\"],\n            \"50000\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"nonce\"],\n            \"123\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"feeRateBps\"],\n            \"111\",\n        )\n        self.assertEqual(\n            signed_order_dict[\"signatureType\"],\n            POLY_GNOSIS_SAFE,\n        )\n        self.assertIsNotNone(signed_order_dict[\"signature\"])\n\n    def test_create_market_order_buy_0_1(self):\n        builder = OrderBuilder(signer)\n\n        signed_order = builder.create_market_order(\n            order_args=MarketOrderArgs(\n                side=BUY,\n                token_id=\"123\",\n                price=0.5,\n                amount=100,\n                fee_rate_bps=111,\n                nonce=123,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.1\", neg_risk=False),\n        )\n\n        self.assertTrue(isinstance(signed_order.order[\"salt\"], int))\n        self.assertIsNotNone(signed_order)\n        self.assertEqual(\n            signed_order.order[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order.order[\"tokenId\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            100000000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            200000000,\n        )\n        self.assertEqual(\n            signed_order.order[\"side\"],\n            0,\n        )\n        self.assertEqual(\n            signed_order.order[\"expiration\"],\n            0,\n        )\n        self.assertEqual(\n            signed_order.order[\"nonce\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"feeRateBps\"],\n            111,\n        )\n        self.assertEqual(\n            signed_order.order[\"signatureType\"],\n            EOA,\n        )\n        self.assertIsNotNone(signed_order.signature)\n        self.assertGreaterEqual(\n            float(signed_order.order[\"makerAmount\"])\n            / float(signed_order.order[\"takerAmount\"]),\n            0.5,\n        )\n\n    def test_create_market_order_buy_0_01(self):\n        builder = OrderBuilder(signer)\n\n        signed_order = builder.create_market_order(\n            order_args=MarketOrderArgs(\n                side=BUY,\n                token_id=\"123\",\n                price=0.56,\n                amount=100,\n                fee_rate_bps=111,\n                nonce=123,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=False),\n        )\n\n        self.assertTrue(isinstance(signed_order.order[\"salt\"], int))\n        self.assertIsNotNone(signed_order)\n        self.assertEqual(\n            signed_order.order[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order.order[\"tokenId\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            100000000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            178571400,\n        )\n        self.assertEqual(\n            signed_order.order[\"side\"],\n            0,\n        )\n        self.assertEqual(\n            signed_order.order[\"expiration\"],\n            0,\n        )\n        self.assertEqual(\n            signed_order.order[\"nonce\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"feeRateBps\"],\n            111,\n        )\n        self.assertEqual(\n            signed_order.order[\"signatureType\"],\n            EOA,\n        )\n        self.assertIsNotNone(signed_order.signature)\n        self.assertGreaterEqual(\n            float(signed_order.order[\"makerAmount\"])\n            / float(signed_order.order[\"takerAmount\"]),\n            0.56,\n        )\n\n    def test_create_market_order_buy_0_001(self):\n        builder = OrderBuilder(signer)\n\n        signed_order = builder.create_market_order(\n            order_args=MarketOrderArgs(\n                side=BUY,\n                token_id=\"123\",\n                price=0.056,\n                amount=100,\n                fee_rate_bps=111,\n                nonce=123,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.001\", neg_risk=False),\n        )\n\n        self.assertTrue(isinstance(signed_order.order[\"salt\"], int))\n        self.assertIsNotNone(signed_order)\n        self.assertEqual(\n            signed_order.order[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order.order[\"tokenId\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            100000000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            1785714280,\n        )\n        self.assertEqual(\n            signed_order.order[\"side\"],\n            0,\n        )\n        self.assertEqual(\n            signed_order.order[\"expiration\"],\n            0,\n        )\n        self.assertEqual(\n            signed_order.order[\"nonce\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"feeRateBps\"],\n            111,\n        )\n        self.assertEqual(\n            signed_order.order[\"signatureType\"],\n            EOA,\n        )\n        self.assertIsNotNone(signed_order.signature)\n        self.assertGreaterEqual(\n            float(signed_order.order[\"makerAmount\"])\n            / float(signed_order.order[\"takerAmount\"]),\n            0.056,\n        )\n\n    def test_create_market_order_buy_0_0001(self):\n        builder = OrderBuilder(signer)\n\n        signed_order = builder.create_market_order(\n            order_args=MarketOrderArgs(\n                side=BUY,\n                token_id=\"123\",\n                price=0.0056,\n                amount=100,\n                fee_rate_bps=111,\n                nonce=123,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.0001\", neg_risk=False),\n        )\n\n        self.assertTrue(isinstance(signed_order.order[\"salt\"], int))\n        self.assertIsNotNone(signed_order)\n        self.assertEqual(\n            signed_order.order[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order.order[\"tokenId\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            100000000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            17857142857,\n        )\n        self.assertEqual(\n            signed_order.order[\"side\"],\n            0,\n        )\n        self.assertEqual(\n            signed_order.order[\"expiration\"],\n            0,\n        )\n        self.assertEqual(\n            signed_order.order[\"nonce\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"feeRateBps\"],\n            111,\n        )\n        self.assertEqual(\n            signed_order.order[\"signatureType\"],\n            EOA,\n        )\n        self.assertIsNotNone(signed_order.signature)\n        self.assertGreaterEqual(\n            float(signed_order.order[\"makerAmount\"])\n            / float(signed_order.order[\"takerAmount\"]),\n            0.0056,\n        )\n\n    def test_create_market_order_buy_0_1_neg_risk(self):\n        builder = OrderBuilder(signer)\n\n        signed_order = builder.create_market_order(\n            order_args=MarketOrderArgs(\n                side=BUY,\n                token_id=\"123\",\n                price=0.5,\n                amount=100,\n                fee_rate_bps=111,\n                nonce=123,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.1\", neg_risk=True),\n        )\n\n        self.assertTrue(isinstance(signed_order.order[\"salt\"], int))\n        self.assertIsNotNone(signed_order)\n        self.assertEqual(\n            signed_order.order[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order.order[\"tokenId\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            100000000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            200000000,\n        )\n        self.assertEqual(\n            signed_order.order[\"side\"],\n            0,\n        )\n        self.assertEqual(\n            signed_order.order[\"expiration\"],\n            0,\n        )\n        self.assertEqual(\n            signed_order.order[\"nonce\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"feeRateBps\"],\n            111,\n        )\n        self.assertEqual(\n            signed_order.order[\"signatureType\"],\n            EOA,\n        )\n        self.assertIsNotNone(signed_order.signature)\n        self.assertGreaterEqual(\n            float(signed_order.order[\"makerAmount\"])\n            / float(signed_order.order[\"takerAmount\"]),\n            0.5,\n        )\n\n    def test_create_market_order_buy_0_01_neg_risk(self):\n        builder = OrderBuilder(signer)\n\n        signed_order = builder.create_market_order(\n            order_args=MarketOrderArgs(\n                side=BUY,\n                token_id=\"123\",\n                price=0.56,\n                amount=100,\n                fee_rate_bps=111,\n                nonce=123,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=True),\n        )\n\n        self.assertTrue(isinstance(signed_order.order[\"salt\"], int))\n        self.assertIsNotNone(signed_order)\n        self.assertEqual(\n            signed_order.order[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order.order[\"tokenId\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            100000000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            178571400,\n        )\n        self.assertEqual(\n            signed_order.order[\"side\"],\n            0,\n        )\n        self.assertEqual(\n            signed_order.order[\"expiration\"],\n            0,\n        )\n        self.assertEqual(\n            signed_order.order[\"nonce\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"feeRateBps\"],\n            111,\n        )\n        self.assertEqual(\n            signed_order.order[\"signatureType\"],\n            EOA,\n        )\n        self.assertIsNotNone(signed_order.signature)\n        self.assertGreaterEqual(\n            float(signed_order.order[\"makerAmount\"])\n            / float(signed_order.order[\"takerAmount\"]),\n            0.56,\n        )\n\n    def test_create_market_order_buy_0_001_neg_risk(self):\n        builder = OrderBuilder(signer)\n\n        signed_order = builder.create_market_order(\n            order_args=MarketOrderArgs(\n                side=BUY,\n                token_id=\"123\",\n                price=0.056,\n                amount=100,\n                fee_rate_bps=111,\n                nonce=123,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.001\", neg_risk=True),\n        )\n\n        self.assertTrue(isinstance(signed_order.order[\"salt\"], int))\n        self.assertIsNotNone(signed_order)\n        self.assertEqual(\n            signed_order.order[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order.order[\"tokenId\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            100000000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            1785714280,\n        )\n        self.assertEqual(\n            signed_order.order[\"side\"],\n            0,\n        )\n        self.assertEqual(\n            signed_order.order[\"expiration\"],\n            0,\n        )\n        self.assertEqual(\n            signed_order.order[\"nonce\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"feeRateBps\"],\n            111,\n        )\n        self.assertEqual(\n            signed_order.order[\"signatureType\"],\n            EOA,\n        )\n        self.assertIsNotNone(signed_order.signature)\n        self.assertGreaterEqual(\n            float(signed_order.order[\"makerAmount\"])\n            / float(signed_order.order[\"takerAmount\"]),\n            0.056,\n        )\n\n    def test_create_market_order_buy_0_0001_neg_risk(self):\n        builder = OrderBuilder(signer)\n\n        signed_order = builder.create_market_order(\n            order_args=MarketOrderArgs(\n                side=BUY,\n                token_id=\"123\",\n                price=0.0056,\n                amount=100,\n                fee_rate_bps=111,\n                nonce=123,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.0001\", neg_risk=True),\n        )\n\n        self.assertTrue(isinstance(signed_order.order[\"salt\"], int))\n        self.assertIsNotNone(signed_order)\n        self.assertEqual(\n            signed_order.order[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order.order[\"tokenId\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            100000000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            17857142857,\n        )\n        self.assertEqual(\n            signed_order.order[\"side\"],\n            0,\n        )\n        self.assertEqual(\n            signed_order.order[\"expiration\"],\n            0,\n        )\n        self.assertEqual(\n            signed_order.order[\"nonce\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"feeRateBps\"],\n            111,\n        )\n        self.assertEqual(\n            signed_order.order[\"signatureType\"],\n            EOA,\n        )\n        self.assertIsNotNone(signed_order.signature)\n        self.assertGreaterEqual(\n            float(signed_order.order[\"makerAmount\"])\n            / float(signed_order.order[\"takerAmount\"]),\n            0.0056,\n        )\n\n    def test_create_market_order_sell_0_1(self):\n        builder = OrderBuilder(signer)\n\n        signed_order = builder.create_market_order(\n            order_args=MarketOrderArgs(\n                side=SELL,\n                token_id=\"123\",\n                price=0.5,\n                amount=100,\n                fee_rate_bps=111,\n                nonce=123,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.1\", neg_risk=False),\n        )\n\n        self.assertTrue(isinstance(signed_order.order[\"salt\"], int))\n        self.assertIsNotNone(signed_order)\n        self.assertEqual(\n            signed_order.order[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order.order[\"tokenId\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            100000000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            50000000,\n        )\n        self.assertEqual(\n            signed_order.order[\"side\"],\n            1,\n        )\n        self.assertEqual(\n            signed_order.order[\"expiration\"],\n            0,\n        )\n        self.assertEqual(\n            signed_order.order[\"nonce\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"feeRateBps\"],\n            111,\n        )\n        self.assertEqual(\n            signed_order.order[\"signatureType\"],\n            EOA,\n        )\n        self.assertIsNotNone(signed_order.signature)\n        self.assertGreaterEqual(\n            float(signed_order.order[\"takerAmount\"])\n            / float(signed_order.order[\"makerAmount\"]),\n            0.5,\n        )\n\n    def test_create_market_order_sell_0_01(self):\n        builder = OrderBuilder(signer)\n\n        signed_order = builder.create_market_order(\n            order_args=MarketOrderArgs(\n                side=SELL,\n                token_id=\"123\",\n                price=0.56,\n                amount=100,\n                fee_rate_bps=111,\n                nonce=123,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=False),\n        )\n\n        self.assertTrue(isinstance(signed_order.order[\"salt\"], int))\n        self.assertIsNotNone(signed_order)\n        self.assertEqual(\n            signed_order.order[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order.order[\"tokenId\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            100000000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            56000000,\n        )\n        self.assertEqual(\n            signed_order.order[\"side\"],\n            1,\n        )\n        self.assertEqual(\n            signed_order.order[\"expiration\"],\n            0,\n        )\n        self.assertEqual(\n            signed_order.order[\"nonce\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"feeRateBps\"],\n            111,\n        )\n        self.assertEqual(\n            signed_order.order[\"signatureType\"],\n            EOA,\n        )\n        self.assertIsNotNone(signed_order.signature)\n        self.assertGreaterEqual(\n            float(signed_order.order[\"takerAmount\"])\n            / float(signed_order.order[\"makerAmount\"]),\n            0.56,\n        )\n\n    def test_create_market_order_sell_0_001(self):\n        builder = OrderBuilder(signer)\n\n        signed_order = builder.create_market_order(\n            order_args=MarketOrderArgs(\n                side=SELL,\n                token_id=\"123\",\n                price=0.056,\n                amount=100,\n                fee_rate_bps=111,\n                nonce=123,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.001\", neg_risk=False),\n        )\n\n        self.assertTrue(isinstance(signed_order.order[\"salt\"], int))\n        self.assertIsNotNone(signed_order)\n        self.assertEqual(\n            signed_order.order[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order.order[\"tokenId\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            100000000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            5600000,\n        )\n        self.assertEqual(\n            signed_order.order[\"side\"],\n            1,\n        )\n        self.assertEqual(\n            signed_order.order[\"expiration\"],\n            0,\n        )\n        self.assertEqual(\n            signed_order.order[\"nonce\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"feeRateBps\"],\n            111,\n        )\n        self.assertEqual(\n            signed_order.order[\"signatureType\"],\n            EOA,\n        )\n        self.assertIsNotNone(signed_order.signature)\n        self.assertGreaterEqual(\n            float(signed_order.order[\"takerAmount\"])\n            / float(signed_order.order[\"makerAmount\"]),\n            0.056,\n        )\n\n    def test_create_market_order_sell_0_0001(self):\n        builder = OrderBuilder(signer)\n\n        signed_order = builder.create_market_order(\n            order_args=MarketOrderArgs(\n                side=SELL,\n                token_id=\"123\",\n                price=0.0056,\n                amount=100,\n                fee_rate_bps=111,\n                nonce=123,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.0001\", neg_risk=False),\n        )\n\n        self.assertTrue(isinstance(signed_order.order[\"salt\"], int))\n        self.assertIsNotNone(signed_order)\n        self.assertEqual(\n            signed_order.order[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order.order[\"tokenId\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            100000000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            560000,\n        )\n        self.assertEqual(\n            signed_order.order[\"side\"],\n            1,\n        )\n        self.assertEqual(\n            signed_order.order[\"expiration\"],\n            0,\n        )\n        self.assertEqual(\n            signed_order.order[\"nonce\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"feeRateBps\"],\n            111,\n        )\n        self.assertEqual(\n            signed_order.order[\"signatureType\"],\n            EOA,\n        )\n        self.assertIsNotNone(signed_order.signature)\n        self.assertGreaterEqual(\n            float(signed_order.order[\"takerAmount\"])\n            / float(signed_order.order[\"makerAmount\"]),\n            0.0056,\n        )\n\n    def test_create_market_order_sell_0_1_neg_risk(self):\n        builder = OrderBuilder(signer)\n\n        signed_order = builder.create_market_order(\n            order_args=MarketOrderArgs(\n                side=SELL,\n                token_id=\"123\",\n                price=0.5,\n                amount=100,\n                fee_rate_bps=111,\n                nonce=123,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.1\", neg_risk=True),\n        )\n\n        self.assertTrue(isinstance(signed_order.order[\"salt\"], int))\n        self.assertIsNotNone(signed_order)\n        self.assertEqual(\n            signed_order.order[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order.order[\"tokenId\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            100000000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            50000000,\n        )\n        self.assertEqual(\n            signed_order.order[\"side\"],\n            1,\n        )\n        self.assertEqual(\n            signed_order.order[\"expiration\"],\n            0,\n        )\n        self.assertEqual(\n            signed_order.order[\"nonce\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"feeRateBps\"],\n            111,\n        )\n        self.assertEqual(\n            signed_order.order[\"signatureType\"],\n            EOA,\n        )\n        self.assertIsNotNone(signed_order.signature)\n        self.assertGreaterEqual(\n            float(signed_order.order[\"takerAmount\"])\n            / float(signed_order.order[\"makerAmount\"]),\n            0.5,\n        )\n\n    def test_create_market_order_sell_0_01_neg_risk(self):\n        builder = OrderBuilder(signer)\n\n        signed_order = builder.create_market_order(\n            order_args=MarketOrderArgs(\n                side=SELL,\n                token_id=\"123\",\n                price=0.56,\n                amount=100,\n                fee_rate_bps=111,\n                nonce=123,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=True),\n        )\n\n        self.assertTrue(isinstance(signed_order.order[\"salt\"], int))\n        self.assertIsNotNone(signed_order)\n        self.assertEqual(\n            signed_order.order[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order.order[\"tokenId\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            100000000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            56000000,\n        )\n        self.assertEqual(\n            signed_order.order[\"side\"],\n            1,\n        )\n        self.assertEqual(\n            signed_order.order[\"expiration\"],\n            0,\n        )\n        self.assertEqual(\n            signed_order.order[\"nonce\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"feeRateBps\"],\n            111,\n        )\n        self.assertEqual(\n            signed_order.order[\"signatureType\"],\n            EOA,\n        )\n        self.assertIsNotNone(signed_order.signature)\n        self.assertGreaterEqual(\n            float(signed_order.order[\"takerAmount\"])\n            / float(signed_order.order[\"makerAmount\"]),\n            0.56,\n        )\n\n    def test_create_market_order_sell_0_001_neg_risk(self):\n        builder = OrderBuilder(signer)\n\n        signed_order = builder.create_market_order(\n            order_args=MarketOrderArgs(\n                side=SELL,\n                token_id=\"123\",\n                price=0.056,\n                amount=100,\n                fee_rate_bps=111,\n                nonce=123,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.001\", neg_risk=True),\n        )\n\n        self.assertTrue(isinstance(signed_order.order[\"salt\"], int))\n        self.assertIsNotNone(signed_order)\n        self.assertEqual(\n            signed_order.order[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order.order[\"tokenId\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            100000000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            5600000,\n        )\n        self.assertEqual(\n            signed_order.order[\"side\"],\n            1,\n        )\n        self.assertEqual(\n            signed_order.order[\"expiration\"],\n            0,\n        )\n        self.assertEqual(\n            signed_order.order[\"nonce\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"feeRateBps\"],\n            111,\n        )\n        self.assertEqual(\n            signed_order.order[\"signatureType\"],\n            EOA,\n        )\n        self.assertIsNotNone(signed_order.signature)\n        self.assertGreaterEqual(\n            float(signed_order.order[\"takerAmount\"])\n            / float(signed_order.order[\"makerAmount\"]),\n            0.056,\n        )\n\n    def test_create_market_order_sell_0_0001_neg_risk(self):\n        builder = OrderBuilder(signer)\n\n        signed_order = builder.create_market_order(\n            order_args=MarketOrderArgs(\n                side=SELL,\n                token_id=\"123\",\n                price=0.0056,\n                amount=100,\n                fee_rate_bps=111,\n                nonce=123,\n            ),\n            options=CreateOrderOptions(tick_size=\"0.0001\", neg_risk=True),\n        )\n\n        self.assertTrue(isinstance(signed_order.order[\"salt\"], int))\n        self.assertIsNotNone(signed_order)\n        self.assertEqual(\n            signed_order.order[\"maker\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"signer\"],\n            \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        )\n        self.assertEqual(\n            signed_order.order[\"taker\"],\n            \"0x0000000000000000000000000000000000000000\",\n        )\n        self.assertEqual(\n            signed_order.order[\"tokenId\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"makerAmount\"],\n            100000000,\n        )\n        self.assertEqual(\n            signed_order.order[\"takerAmount\"],\n            560000,\n        )\n        self.assertEqual(\n            signed_order.order[\"side\"],\n            1,\n        )\n        self.assertEqual(\n            signed_order.order[\"expiration\"],\n            0,\n        )\n        self.assertEqual(\n            signed_order.order[\"nonce\"],\n            123,\n        )\n        self.assertEqual(\n            signed_order.order[\"feeRateBps\"],\n            111,\n        )\n        self.assertEqual(\n            signed_order.order[\"signatureType\"],\n            EOA,\n        )\n        self.assertIsNotNone(signed_order.signature)\n        self.assertGreaterEqual(\n            float(signed_order.order[\"takerAmount\"])\n            / float(signed_order.order[\"makerAmount\"]),\n            0.0056,\n        )\n"
  },
  {
    "path": "tests/order_builder/test_helpers.py",
    "content": "from unittest import TestCase\n\nfrom py_clob_client.order_builder.helpers import decimal_places\n\n\nclass TestHelpers(TestCase):\n    def test_decimal_places(self):\n        self.assertEqual(decimal_places(949.9970999999999), 13)\n        self.assertEqual(decimal_places(949), 0)\n"
  },
  {
    "path": "tests/rfq/test_rfq_payload.py",
    "content": "from unittest import TestCase\n\nfrom py_clob_client.rfq.rfq_client import RfqClient\nfrom py_clob_client.rfq.rfq_types import MatchType\nfrom py_clob_client.order_builder.constants import BUY, SELL\n\nclass TestCreateAcceptQuotePayload(TestCase):\n    \n    def test_complementary(self):\n        client = RfqClient(parent=None)\n        quote = {\n            \"matchType\": \"COMPLEMENTARY\",\n            \"side\": BUY,\n            \"token\": \"tokenA\",\n            \"sizeIn\": \"100\", \n            \"sizeOut\": \"50\",\n            \"price\": \"0.5\",\n        }\n\n        payload = client._get_request_order_creation_payload(quote)\n        self.assertEqual(payload[\"token\"], \"tokenA\")\n        self.assertEqual(payload[\"side\"], SELL)\n        self.assertEqual(payload[\"size\"], \"100\")\n        self.assertEqual(payload[\"price\"], 0.5)\n\n        quote = {\n            \"matchType\": \"COMPLEMENTARY\",\n            \"side\": SELL,\n            \"token\": \"tokenB\",\n            \"sizeIn\": \"200\",\n            \"sizeOut\": \"75\",\n            \"price\": \"0.60\"\n        }\n\n        payload = client._get_request_order_creation_payload(quote)\n        self.assertEqual(payload[\"token\"], \"tokenB\")\n        self.assertEqual(payload[\"side\"], BUY)\n        self.assertEqual(payload[\"size\"], \"75\")\n        self.assertEqual(payload[\"price\"], 0.60)\n\n\n    def test_mint_merge(self):\n        client = RfqClient(parent=None)\n        quote = {\n            \"matchType\": \"MERGE\",\n            \"side\": BUY,\n            \"complement\": \"tokenC\",\n            \"sizeIn\": \"30\",\n            \"sizeOut\": \"15\",\n            \"price\": \"0.35\",\n        }\n\n        payload = client._get_request_order_creation_payload(quote)\n        self.assertEqual(payload[\"token\"], \"tokenC\")\n        self.assertEqual(payload[\"side\"], BUY)\n        self.assertEqual(payload[\"size\"], \"30\")\n        self.assertEqual(payload[\"price\"], 0.65)\n\n        quote = {\n            \"matchType\": \"MINT\",\n            \"side\": BUY,\n            \"complement\": \"tokenC\",\n            \"sizeIn\": \"30\",    # tokens bought\n            \"sizeOut\": \"15\",\n            \"price\": \"0.40\",\n        }\n        payload = client._get_request_order_creation_payload(quote)\n        self.assertEqual(payload[\"token\"], \"tokenC\")\n        self.assertEqual(payload[\"side\"], BUY)\n        self.assertEqual(payload[\"size\"], \"30\")\n        self.assertEqual(payload[\"price\"], 0.60)\n"
  },
  {
    "path": "tests/rfq/test_rfq_query_params.py",
    "content": "from unittest import TestCase\nfrom urllib.parse import urlencode\n\nfrom py_clob_client.rfq import GetRfqRequestsParams, GetRfqQuotesParams\nfrom py_clob_client.rfq.rfq_helpers import (\n    parse_rfq_requests_params,\n    parse_rfq_quotes_params,\n)\n\n\nclass TestRfqQueryParams(TestCase):\n    def test_get_rfq_requests_request_ids_are_repeated_query_params(self):\n        id1 = \"019b69d4-2eb6-7ef9-8595-d149c97de10b\"\n        id2 = \"019b69c3-d49e-7abf-88d0-cb3fd79fb721\"\n        params = GetRfqRequestsParams(request_ids=[id1, id2])\n\n        parsed = parse_rfq_requests_params(params)\n        qs = urlencode(parsed, doseq=True)\n\n        self.assertEqual(qs, f\"requestIds={id1}&requestIds={id2}\")\n\n    def test_get_rfq_quotes_quote_ids_are_repeated_query_params(self):\n        q1 = \"019b69d4-2eb6-7ef9-8595-d149c97de10b\"\n        q2 = \"019b69c3-d49e-7abf-88d0-cb3fd79fb721\"\n        params = GetRfqQuotesParams(quote_ids=[q1, q2])\n\n        parsed = parse_rfq_quotes_params(params)\n        qs = urlencode(parsed, doseq=True)\n\n        self.assertEqual(qs, f\"quoteIds={q1}&quoteIds={q2}\")\n"
  },
  {
    "path": "tests/signing/__init__.py",
    "content": ""
  },
  {
    "path": "tests/signing/test_eip712.py",
    "content": "from unittest import TestCase\nfrom py_clob_client.constants import AMOY\n\nfrom py_clob_client.signer import Signer\nfrom py_clob_client.signing.eip712 import sign_clob_auth_message\n\n# publicly known private key\nprivate_key = \"0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80\"\nchain_id = AMOY\nsigner = Signer(private_key=private_key, chain_id=chain_id)\n\n\nclass TestEIP712(TestCase):\n    def test_sign_clob_auth_message(self):\n        signature = sign_clob_auth_message(signer, 10000000, 23)\n        self.assertIsNotNone(signature)\n        self.assertEqual(\n            signature,\n            \"0xf62319a987514da40e57e2f4d7529f7bac38f0355bd88bb5adbb3768d80de6c1682518e0af677d5260366425f4361e7b70c25ae232aff0ab2331e2b164a1aedc1b\",\n        )\n"
  },
  {
    "path": "tests/signing/test_hmac.py",
    "content": "from unittest import TestCase\nimport binascii\n\nfrom py_clob_client.signing.hmac import build_hmac_signature\n\n\nclass TestHMAC(TestCase):\n    def setUp(self):\n        # Baseline inputs used across variation tests\n        self.secret = \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"\n        self.timestamp = \"1000000\"\n        self.method = \"test-sign\"\n        self.path = \"/orders\"\n        self.string_body = '{\"hash\": \"0x123\"}'\n        self.baseline_signature = build_hmac_signature(\n            self.secret, self.timestamp, self.method, self.path, self.string_body\n        )\n\n    def test_build_hmac_signature_matches_expected(self):\n        signature = build_hmac_signature(\n            self.secret, self.timestamp, self.method, self.path, self.string_body\n        )\n        self.assertIsNotNone(signature)\n        # Expected signature for current implementation (no method mutation, verbatim string body)\n        self.assertEqual(\"ZwAdJKvoYRlEKDkNMwd5BuwNNtg93kNaR_oU2HrfVvc=\", signature)\n\n    def test_dict_body_same_as_equivalent_string_body(self):\n        # Current hmac implementation converts dict to python str() then swaps single to double quotes.\n        # For a simple dict this matches the provided JSON string exactly, so signatures should be equal.\n        dict_body_sig = build_hmac_signature(\n            self.secret, self.timestamp, self.method, self.path, {\"hash\": \"0x123\"}\n        )\n        self.assertEqual(self.baseline_signature, dict_body_sig)\n\n    def test_different_method_changes_signature(self):\n        get_sig = build_hmac_signature(\n            self.secret, self.timestamp, \"GET\", self.path, {\"hash\": \"0x123\"}\n        )\n        post_sig = build_hmac_signature(\n            self.secret, self.timestamp, \"POST\", self.path, {\"hash\": \"0x123\"}\n        )\n        self.assertNotEqual(get_sig, post_sig)\n        self.assertNotEqual(get_sig, self.baseline_signature)\n\n    def test_different_timestamp_changes_signature(self):\n        sig_new_time = build_hmac_signature(\n            self.secret, \"1000001\", self.method, self.path, {\"hash\": \"0x123\"}\n        )\n        self.assertNotEqual(sig_new_time, self.baseline_signature)\n\n    def test_different_path_changes_signature(self):\n        sig_path = build_hmac_signature(\n            self.secret,\n            self.timestamp,\n            self.method,\n            \"/api/v1/orders\",\n            {\"hash\": \"0x123\"},\n        )\n        self.assertNotEqual(sig_path, self.baseline_signature)\n\n    def test_extra_key_and_ordering_affect_signature(self):\n        sig_order1 = build_hmac_signature(\n            self.secret,\n            self.timestamp,\n            self.method,\n            self.path,\n            {\"hash\": \"0x123\", \"foo\": \"bar\"},\n        )\n        sig_order2 = build_hmac_signature(\n            self.secret,\n            self.timestamp,\n            self.method,\n            self.path,\n            {\"foo\": \"bar\", \"hash\": \"0x123\"},\n        )\n        self.assertNotEqual(sig_order1, sig_order2)\n        self.assertNotEqual(sig_order1, self.baseline_signature)\n\n    def test_array_body_signature(self):\n        sig_array = build_hmac_signature(\n            self.secret, self.timestamp, self.method, self.path, [1, 2, 3]\n        )\n        self.assertIsNotNone(sig_array)\n        self.assertNotEqual(sig_array, self.baseline_signature)\n\n    def test_unicode_body_signature(self):\n        sig_unicode = build_hmac_signature(\n            self.secret, self.timestamp, self.method, self.path, {\"emoji\": \"😃\"}\n        )\n        self.assertIsNotNone(sig_unicode)\n        self.assertNotEqual(sig_unicode, self.baseline_signature)\n\n    def test_none_body_omitted_from_message(self):\n        sig_none = build_hmac_signature(\n            self.secret, self.timestamp, self.method, self.path, None\n        )\n        self.assertNotEqual(sig_none, self.baseline_signature)\n\n    def test_empty_string_body_omitted(self):\n        sig_empty = build_hmac_signature(\n            self.secret, self.timestamp, self.method, self.path, \"\"\n        )\n        self.assertNotEqual(sig_empty, self.baseline_signature)\n\n    def test_none_and_empty_body_same_signature(self):\n        sig_none = build_hmac_signature(\n            self.secret, self.timestamp, self.method, self.path, None\n        )\n        sig_empty = build_hmac_signature(\n            self.secret, self.timestamp, self.method, self.path, \"\"\n        )\n        self.assertEqual(sig_none, sig_empty)\n\n    def test_idempotent_same_inputs(self):\n        sig1 = build_hmac_signature(\n            self.secret, self.timestamp, self.method, self.path, {\"hash\": \"0x123\"}\n        )\n        sig2 = build_hmac_signature(\n            self.secret, self.timestamp, self.method, self.path, {\"hash\": \"0x123\"}\n        )\n        self.assertEqual(sig1, sig2)\n\n    def test_different_secret_changes_signature(self):\n        other_secret = \"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB=\"\n        sig_other = build_hmac_signature(\n            other_secret, self.timestamp, self.method, self.path, {\"hash\": \"0x123\"}\n        )\n        sig_original = build_hmac_signature(\n            self.secret, self.timestamp, self.method, self.path, {\"hash\": \"0x123\"}\n        )\n        self.assertNotEqual(sig_other, sig_original)\n\n    def test_invalid_secret_raises(self):\n        with self.assertRaises(binascii.Error):\n            build_hmac_signature(\n                \"!!!notbase64!!!\",\n                self.timestamp,\n                self.method,\n                self.path,\n                {\"hash\": \"0x123\"},\n            )\n\n    def test_boolean_body_signature(self):\n        sig_true = build_hmac_signature(\n            self.secret, self.timestamp, self.method, self.path, True\n        )\n        sig_false = build_hmac_signature(\n            self.secret, self.timestamp, self.method, self.path, False\n        )\n        self.assertIsNotNone(sig_true)\n        self.assertIsNotNone(sig_false)\n        self.assertNotEqual(sig_true, sig_false)\n\n    def test_numeric_body_signature(self):\n        sig_int = build_hmac_signature(\n            self.secret, self.timestamp, self.method, self.path, 42\n        )\n        sig_float = build_hmac_signature(\n            self.secret, self.timestamp, self.method, self.path, 3.14159\n        )\n        self.assertIsNotNone(sig_int)\n        self.assertIsNotNone(sig_float)\n        self.assertNotEqual(sig_int, sig_float)\n\n    def test_nested_object_no_sorting_means_signatures_can_differ(self):\n        body_a = {\"a\": {\"z\": 1, \"b\": 2}, \"c\": [3, 2, 1]}\n        body_b = {\"c\": [3, 2, 1], \"a\": {\"b\": 2, \"z\": 1}}\n        sig_a = build_hmac_signature(\n            self.secret, self.timestamp, self.method, self.path, body_a\n        )\n        sig_b = build_hmac_signature(\n            self.secret, self.timestamp, self.method, self.path, body_b\n        )\n        self.assertNotEqual(sig_a, sig_b)\n\n    def test_list_of_dicts_key_order_affects_signature(self):\n        body1 = [{\"b\": 2, \"a\": 1}, {\"d\": 4, \"c\": 3}]\n        body2 = [{\"a\": 1, \"b\": 2}, {\"c\": 3, \"d\": 4}]\n        sig1 = build_hmac_signature(\n            self.secret, self.timestamp, self.method, self.path, body1\n        )\n        sig2 = build_hmac_signature(\n            self.secret, self.timestamp, self.method, self.path, body2\n        )\n        self.assertNotEqual(sig1, sig2)\n\n    def test_string_body_preserved_verbatim(self):\n        string_a = '{\"x\":1, \"y\":2}'\n        string_b = '{\"x\":1,\"y\":2}'\n        sig_a = build_hmac_signature(\n            self.secret, self.timestamp, self.method, self.path, string_a\n        )\n        sig_b = build_hmac_signature(\n            self.secret, self.timestamp, self.method, self.path, string_b\n        )\n        self.assertNotEqual(sig_a, sig_b)\n"
  },
  {
    "path": "tests/test_utilities.py",
    "content": "from unittest import TestCase\n\nfrom py_clob_client.clob_types import (\n    OrderArgs,\n    OrderType,\n    CreateOrderOptions,\n)\nfrom py_clob_client.constants import AMOY\nfrom py_clob_client.order_builder.constants import BUY, SELL\nfrom py_clob_client.signer import Signer\nfrom py_clob_client.order_builder.builder import OrderBuilder\nfrom py_clob_client.utilities import (\n    parse_raw_orderbook_summary,\n    generate_orderbook_summary_hash,\n    order_to_json,\n    is_tick_size_smaller,\n    price_valid,\n)\n\n\nclass TestUtilities(TestCase):\n    def test_parse_raw_orderbook_summary(self):\n        raw_obs = {\n            \"market\": \"0xbd31dc8a20211944f6b70f31557f1001557b59905b7738480ca09bd4532f84af\",\n            \"asset_id\": \"52114319501245915516055106046884209969926127482827954674443846427813813222426\",\n            \"bids\": [\n                {\"price\": \"0.15\", \"size\": \"100\"},\n                {\"price\": \"0.31\", \"size\": \"148.56\"},\n                {\"price\": \"0.33\", \"size\": \"58\"},\n                {\"price\": \"0.5\", \"size\": \"100\"},\n            ],\n            \"asks\": [],\n            \"hash\": \"9d6d9e8831a150ac4cd878f99f7b2c6d419b875f\",\n            \"min_order_size\": \"100\",\n            \"neg_risk\": False,\n            \"tick_size\": \"0.01\",\n            \"timestamp\": \"123456789\",\n            \"last_trade_price\": \"\",\n        }\n\n        orderbook_summary = parse_raw_orderbook_summary(raw_obs)\n\n        self.assertEqual(\n            orderbook_summary.market,\n            \"0xbd31dc8a20211944f6b70f31557f1001557b59905b7738480ca09bd4532f84af\",\n        )\n        self.assertEqual(\n            orderbook_summary.asset_id,\n            \"52114319501245915516055106046884209969926127482827954674443846427813813222426\",\n        )\n        self.assertEqual(\n            orderbook_summary.hash, \"9d6d9e8831a150ac4cd878f99f7b2c6d419b875f\"\n        )\n        self.assertEqual(orderbook_summary.timestamp, \"123456789\")\n\n        self.assertEqual(orderbook_summary.min_order_size, \"100\")\n        self.assertEqual(orderbook_summary.neg_risk, False)\n        self.assertEqual(orderbook_summary.tick_size, \"0.01\")\n\n        self.assertIsNotNone(orderbook_summary.asks)\n        self.assertIsNotNone(orderbook_summary.bids)\n\n        self.assertEqual(len(orderbook_summary.asks), 0)\n        self.assertEqual(len(orderbook_summary.bids), 4)\n\n        self.assertEqual(orderbook_summary.bids[0].price, \"0.15\")\n        self.assertEqual(orderbook_summary.bids[0].size, \"100\")\n        self.assertEqual(orderbook_summary.bids[1].price, \"0.31\")\n        self.assertEqual(orderbook_summary.bids[1].size, \"148.56\")\n        self.assertEqual(orderbook_summary.bids[2].price, \"0.33\")\n        self.assertEqual(orderbook_summary.bids[2].size, \"58\")\n        self.assertEqual(orderbook_summary.bids[3].price, \"0.5\")\n        self.assertEqual(orderbook_summary.bids[3].size, \"100\")\n\n        raw_obs = {\n            \"market\": \"0xaabbcc\",\n            \"asset_id\": \"100\",\n            \"bids\": [],\n            \"asks\": [],\n            \"hash\": \"7f81a35a09e1933a96b05edb51ac4be4a6163146\",\n            \"timestamp\": \"123456789\",\n            \"min_order_size\": \"100\",\n            \"neg_risk\": False,\n            \"tick_size\": \"0.01\",\n            \"last_trade_price\": \"\",\n        }\n\n        orderbook_summary = parse_raw_orderbook_summary(raw_obs)\n\n        self.assertEqual(\n            orderbook_summary.market,\n            \"0xaabbcc\",\n        )\n        self.assertEqual(\n            orderbook_summary.asset_id,\n            \"100\",\n        )\n\n        self.assertEqual(orderbook_summary.min_order_size, \"100\")\n        self.assertEqual(orderbook_summary.neg_risk, False)\n        self.assertEqual(orderbook_summary.tick_size, \"0.01\")\n\n        self.assertEqual(\n            orderbook_summary.hash, \"7f81a35a09e1933a96b05edb51ac4be4a6163146\"\n        )\n        self.assertEqual(orderbook_summary.timestamp, \"123456789\")\n\n        self.assertIsNotNone(orderbook_summary.asks)\n        self.assertIsNotNone(orderbook_summary.bids)\n\n        self.assertEqual(len(orderbook_summary.asks), 0)\n        self.assertEqual(len(orderbook_summary.bids), 0)\n\n    def test_generate_orderbook_summary_hash(self):\n        raw_obs = {\n            \"market\": \"0xaabbcc\",\n            \"asset_id\": \"100\",\n            \"bids\": [\n                {\"price\": \"0.3\", \"size\": \"100\"},\n                {\"price\": \"0.4\", \"size\": \"100\"},\n            ],\n            \"asks\": [\n                {\"price\": \"0.6\", \"size\": \"100\"},\n                {\"price\": \"0.7\", \"size\": \"100\"},\n            ],\n            \"hash\": \"\",\n            \"timestamp\": \"123456789\",\n            \"min_order_size\": \"100\",\n            \"neg_risk\": False,\n            \"tick_size\": \"0.01\",\n            \"last_trade_price\": \"0.5\",\n        }\n\n        orderbook_summary = parse_raw_orderbook_summary(raw_obs)\n        self.assertEqual(\n            generate_orderbook_summary_hash(orderbook_summary),\n            \"0458ea5755c9f73d64a14636fa5c36ed460ec394\",\n        )\n        self.assertEqual(\n            orderbook_summary.hash,\n            \"0458ea5755c9f73d64a14636fa5c36ed460ec394\",\n        )\n\n        raw_obs = {\n            \"market\": \"0xaabbcc\",\n            \"asset_id\": \"100\",\n            \"timestamp\": \"123456789\",\n            \"bids\": [\n                {\"price\": \"0.3\", \"size\": \"100\"},\n                {\"price\": \"0.4\", \"size\": \"100\"},\n            ],\n            \"asks\": [\n                {\"price\": \"0.6\", \"size\": \"100\"},\n                {\"price\": \"0.7\", \"size\": \"100\"},\n            ],\n            \"min_order_size\": \"100\",\n            \"neg_risk\": False,\n            \"tick_size\": \"0.01\",\n            \"last_trade_price\": \"0.5\",\n            \"hash\": \"\",\n        }\n\n        orderbook_summary = parse_raw_orderbook_summary(raw_obs)\n        self.assertEqual(\n            generate_orderbook_summary_hash(orderbook_summary),\n            \"0458ea5755c9f73d64a14636fa5c36ed460ec394\",\n        )\n        self.assertEqual(\n            orderbook_summary.hash,\n            \"0458ea5755c9f73d64a14636fa5c36ed460ec394\",\n        )\n\n        raw_obs = {\n            \"market\": \"0xaabbcc\",\n            \"asset_id\": \"100\",\n            \"timestamp\": \"\",\n            \"bids\": [],\n            \"asks\": [],\n            \"hash\": \"\",\n            \"min_order_size\": \"100\",\n            \"neg_risk\": False,\n            \"tick_size\": \"0.01\",\n            \"last_trade_price\": \"0.5\",\n        }\n\n        orderbook_summary = parse_raw_orderbook_summary(raw_obs)\n        self.assertEqual(\n            generate_orderbook_summary_hash(orderbook_summary),\n            \"74c6a7c81c1d572f1c877b7d3e25b80c336d8a6e\",\n        )\n        self.assertEqual(\n            orderbook_summary.hash,\n            \"74c6a7c81c1d572f1c877b7d3e25b80c336d8a6e\",\n        )\n\n    def test_order_to_json_0_1(self):\n        # publicly known private key\n        private_key = (\n            \"0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80\"\n        )\n        chain_id = AMOY\n        signer = Signer(private_key=private_key, chain_id=chain_id)\n        owner = \"aaa-bbb-ccc\"\n        builder = OrderBuilder(signer)\n\n        # GTC BUY\n        json_order = order_to_json(\n            order=builder.create_order(\n                order_args=OrderArgs(\n                    token_id=\"100\",\n                    price=0.5,\n                    size=100,\n                    side=BUY,\n                ),\n                options=CreateOrderOptions(tick_size=\"0.1\", neg_risk=False),\n            ),\n            owner=owner,\n            orderType=OrderType.GTC,\n        )\n\n        self.assertIsNotNone(json_order)\n        self.assertEqual(json_order[\"orderType\"], \"GTC\")\n        self.assertEqual(json_order[\"owner\"], owner)\n        self.assertIsNotNone(json_order[\"order\"])\n        self.assertIsNotNone(json_order[\"order\"][\"salt\"])\n        self.assertEqual(\n            json_order[\"order\"][\"maker\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"signer\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"taker\"], \"0x0000000000000000000000000000000000000000\"\n        )\n        self.assertEqual(json_order[\"order\"][\"tokenId\"], \"100\")\n        self.assertEqual(json_order[\"order\"][\"makerAmount\"], \"50000000\")\n        self.assertEqual(json_order[\"order\"][\"takerAmount\"], \"100000000\")\n        self.assertEqual(json_order[\"order\"][\"expiration\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"nonce\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"feeRateBps\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"side\"], \"BUY\")\n        self.assertEqual(json_order[\"order\"][\"signatureType\"], 0)\n        self.assertIsNotNone(json_order[\"order\"][\"signature\"])\n\n        # GTC SELL\n        json_order = order_to_json(\n            order=builder.create_order(\n                order_args=OrderArgs(\n                    token_id=\"100\",\n                    price=0.5,\n                    size=100,\n                    side=SELL,\n                ),\n                options=CreateOrderOptions(tick_size=\"0.1\", neg_risk=False),\n            ),\n            owner=owner,\n            orderType=OrderType.GTC,\n        )\n\n        self.assertIsNotNone(json_order)\n        self.assertEqual(json_order[\"orderType\"], \"GTC\")\n        self.assertEqual(json_order[\"owner\"], owner)\n        self.assertIsNotNone(json_order[\"order\"])\n        self.assertIsNotNone(json_order[\"order\"][\"salt\"])\n        self.assertEqual(\n            json_order[\"order\"][\"maker\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"signer\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"taker\"], \"0x0000000000000000000000000000000000000000\"\n        )\n        self.assertEqual(json_order[\"order\"][\"tokenId\"], \"100\")\n        self.assertEqual(json_order[\"order\"][\"makerAmount\"], \"100000000\")\n        self.assertEqual(json_order[\"order\"][\"takerAmount\"], \"50000000\")\n        self.assertEqual(json_order[\"order\"][\"expiration\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"nonce\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"feeRateBps\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"side\"], \"SELL\")\n        self.assertEqual(json_order[\"order\"][\"signatureType\"], 0)\n        self.assertIsNotNone(json_order[\"order\"][\"signature\"])\n\n        # GTD BUY\n        json_order = order_to_json(\n            order=builder.create_order(\n                order_args=OrderArgs(\n                    token_id=\"100\",\n                    price=0.5,\n                    size=100,\n                    side=BUY,\n                ),\n                options=CreateOrderOptions(tick_size=\"0.1\", neg_risk=False),\n            ),\n            owner=owner,\n            orderType=OrderType.GTD,\n            post_only=True,\n        )\n\n        self.assertIsNotNone(json_order)\n        self.assertEqual(json_order[\"postOnly\"], True)\n        self.assertEqual(json_order[\"orderType\"], \"GTD\")\n        self.assertEqual(json_order[\"owner\"], owner)\n        self.assertIsNotNone(json_order[\"order\"])\n        self.assertIsNotNone(json_order[\"order\"][\"salt\"])\n        self.assertEqual(\n            json_order[\"order\"][\"maker\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"signer\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"taker\"], \"0x0000000000000000000000000000000000000000\"\n        )\n        self.assertEqual(json_order[\"order\"][\"tokenId\"], \"100\")\n        self.assertEqual(json_order[\"order\"][\"makerAmount\"], \"50000000\")\n        self.assertEqual(json_order[\"order\"][\"takerAmount\"], \"100000000\")\n        self.assertEqual(json_order[\"order\"][\"expiration\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"nonce\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"feeRateBps\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"side\"], \"BUY\")\n        self.assertEqual(json_order[\"order\"][\"signatureType\"], 0)\n        self.assertIsNotNone(json_order[\"order\"][\"signature\"])\n\n        # GTD SELL\n        json_order = order_to_json(\n            order=builder.create_order(\n                order_args=OrderArgs(\n                    token_id=\"100\",\n                    price=0.5,\n                    size=100,\n                    side=SELL,\n                ),\n                options=CreateOrderOptions(tick_size=\"0.1\", neg_risk=False),\n            ),\n            owner=owner,\n            orderType=OrderType.GTD,\n        )\n\n        self.assertIsNotNone(json_order)\n        self.assertEqual(json_order[\"orderType\"], \"GTD\")\n        self.assertEqual(json_order[\"owner\"], owner)\n        self.assertIsNotNone(json_order[\"order\"])\n        self.assertIsNotNone(json_order[\"order\"][\"salt\"])\n        self.assertEqual(\n            json_order[\"order\"][\"maker\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"signer\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"taker\"], \"0x0000000000000000000000000000000000000000\"\n        )\n        self.assertEqual(json_order[\"order\"][\"tokenId\"], \"100\")\n        self.assertEqual(json_order[\"order\"][\"makerAmount\"], \"100000000\")\n        self.assertEqual(json_order[\"order\"][\"takerAmount\"], \"50000000\")\n        self.assertEqual(json_order[\"order\"][\"expiration\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"nonce\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"feeRateBps\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"side\"], \"SELL\")\n        self.assertEqual(json_order[\"order\"][\"signatureType\"], 0)\n        self.assertIsNotNone(json_order[\"order\"][\"signature\"])\n\n    def test_order_to_json_0_01(self):\n        # publicly known private key\n        private_key = (\n            \"0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80\"\n        )\n        chain_id = AMOY\n        signer = Signer(private_key=private_key, chain_id=chain_id)\n        owner = \"aaa-bbb-ccc\"\n        builder = OrderBuilder(signer)\n\n        # GTC BUY\n        json_order = order_to_json(\n            order=builder.create_order(\n                order_args=OrderArgs(\n                    token_id=\"100\",\n                    price=0.05,\n                    size=100,\n                    side=BUY,\n                ),\n                options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=False),\n            ),\n            owner=owner,\n            orderType=OrderType.GTC,\n        )\n\n        self.assertIsNotNone(json_order)\n        self.assertEqual(json_order[\"orderType\"], \"GTC\")\n        self.assertEqual(json_order[\"owner\"], owner)\n        self.assertIsNotNone(json_order[\"order\"])\n        self.assertIsNotNone(json_order[\"order\"][\"salt\"])\n        self.assertEqual(\n            json_order[\"order\"][\"maker\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"signer\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"taker\"], \"0x0000000000000000000000000000000000000000\"\n        )\n        self.assertEqual(json_order[\"order\"][\"tokenId\"], \"100\")\n        self.assertEqual(json_order[\"order\"][\"makerAmount\"], \"5000000\")\n        self.assertEqual(json_order[\"order\"][\"takerAmount\"], \"100000000\")\n        self.assertEqual(json_order[\"order\"][\"expiration\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"nonce\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"feeRateBps\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"side\"], \"BUY\")\n        self.assertEqual(json_order[\"order\"][\"signatureType\"], 0)\n        self.assertIsNotNone(json_order[\"order\"][\"signature\"])\n\n        # GTC SELL\n        json_order = order_to_json(\n            order=builder.create_order(\n                order_args=OrderArgs(\n                    token_id=\"100\",\n                    price=0.05,\n                    size=100,\n                    side=SELL,\n                ),\n                options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=False),\n            ),\n            owner=owner,\n            orderType=OrderType.GTC,\n        )\n\n        self.assertIsNotNone(json_order)\n        self.assertEqual(json_order[\"orderType\"], \"GTC\")\n        self.assertEqual(json_order[\"owner\"], owner)\n        self.assertIsNotNone(json_order[\"order\"])\n        self.assertIsNotNone(json_order[\"order\"][\"salt\"])\n        self.assertEqual(\n            json_order[\"order\"][\"maker\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"signer\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"taker\"], \"0x0000000000000000000000000000000000000000\"\n        )\n        self.assertEqual(json_order[\"order\"][\"tokenId\"], \"100\")\n        self.assertEqual(json_order[\"order\"][\"makerAmount\"], \"100000000\")\n        self.assertEqual(json_order[\"order\"][\"takerAmount\"], \"5000000\")\n        self.assertEqual(json_order[\"order\"][\"expiration\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"nonce\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"feeRateBps\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"side\"], \"SELL\")\n        self.assertEqual(json_order[\"order\"][\"signatureType\"], 0)\n        self.assertIsNotNone(json_order[\"order\"][\"signature\"])\n\n        # GTD BUY\n        json_order = order_to_json(\n            order=builder.create_order(\n                order_args=OrderArgs(\n                    token_id=\"100\",\n                    price=0.05,\n                    size=100,\n                    side=BUY,\n                ),\n                options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=False),\n            ),\n            owner=owner,\n            orderType=OrderType.GTD,\n        )\n\n        self.assertIsNotNone(json_order)\n        self.assertEqual(json_order[\"orderType\"], \"GTD\")\n        self.assertEqual(json_order[\"owner\"], owner)\n        self.assertIsNotNone(json_order[\"order\"])\n        self.assertIsNotNone(json_order[\"order\"][\"salt\"])\n        self.assertEqual(\n            json_order[\"order\"][\"maker\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"signer\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"taker\"], \"0x0000000000000000000000000000000000000000\"\n        )\n        self.assertEqual(json_order[\"order\"][\"tokenId\"], \"100\")\n        self.assertEqual(json_order[\"order\"][\"makerAmount\"], \"5000000\")\n        self.assertEqual(json_order[\"order\"][\"takerAmount\"], \"100000000\")\n        self.assertEqual(json_order[\"order\"][\"expiration\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"nonce\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"feeRateBps\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"side\"], \"BUY\")\n        self.assertEqual(json_order[\"order\"][\"signatureType\"], 0)\n        self.assertIsNotNone(json_order[\"order\"][\"signature\"])\n\n        # GTD SELL\n        json_order = order_to_json(\n            order=builder.create_order(\n                order_args=OrderArgs(\n                    token_id=\"100\",\n                    price=0.05,\n                    size=100,\n                    side=SELL,\n                ),\n                options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=False),\n            ),\n            owner=owner,\n            orderType=OrderType.GTD,\n        )\n\n        self.assertIsNotNone(json_order)\n        self.assertEqual(json_order[\"orderType\"], \"GTD\")\n        self.assertEqual(json_order[\"owner\"], owner)\n        self.assertIsNotNone(json_order[\"order\"])\n        self.assertIsNotNone(json_order[\"order\"][\"salt\"])\n        self.assertEqual(\n            json_order[\"order\"][\"maker\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"signer\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"taker\"], \"0x0000000000000000000000000000000000000000\"\n        )\n        self.assertEqual(json_order[\"order\"][\"tokenId\"], \"100\")\n        self.assertEqual(json_order[\"order\"][\"makerAmount\"], \"100000000\")\n        self.assertEqual(json_order[\"order\"][\"takerAmount\"], \"5000000\")\n        self.assertEqual(json_order[\"order\"][\"expiration\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"nonce\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"feeRateBps\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"side\"], \"SELL\")\n        self.assertEqual(json_order[\"order\"][\"signatureType\"], 0)\n        self.assertIsNotNone(json_order[\"order\"][\"signature\"])\n\n    def test_order_to_json_0_001(self):\n        # publicly known private key\n        private_key = (\n            \"0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80\"\n        )\n        chain_id = AMOY\n        signer = Signer(private_key=private_key, chain_id=chain_id)\n        owner = \"aaa-bbb-ccc\"\n        builder = OrderBuilder(signer)\n\n        # GTC BUY\n        json_order = order_to_json(\n            order=builder.create_order(\n                order_args=OrderArgs(\n                    token_id=\"100\",\n                    price=0.005,\n                    size=100,\n                    side=BUY,\n                ),\n                options=CreateOrderOptions(tick_size=\"0.001\", neg_risk=False),\n            ),\n            owner=owner,\n            orderType=OrderType.GTC,\n        )\n\n        self.assertIsNotNone(json_order)\n        self.assertEqual(json_order[\"orderType\"], \"GTC\")\n        self.assertEqual(json_order[\"owner\"], owner)\n        self.assertIsNotNone(json_order[\"order\"])\n        self.assertIsNotNone(json_order[\"order\"][\"salt\"])\n        self.assertEqual(\n            json_order[\"order\"][\"maker\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"signer\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"taker\"], \"0x0000000000000000000000000000000000000000\"\n        )\n        self.assertEqual(json_order[\"order\"][\"tokenId\"], \"100\")\n        self.assertEqual(json_order[\"order\"][\"makerAmount\"], \"500000\")\n        self.assertEqual(json_order[\"order\"][\"takerAmount\"], \"100000000\")\n        self.assertEqual(json_order[\"order\"][\"expiration\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"nonce\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"feeRateBps\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"side\"], \"BUY\")\n        self.assertEqual(json_order[\"order\"][\"signatureType\"], 0)\n        self.assertIsNotNone(json_order[\"order\"][\"signature\"])\n\n        # GTC SELL\n        json_order = order_to_json(\n            order=builder.create_order(\n                order_args=OrderArgs(\n                    token_id=\"100\",\n                    price=0.005,\n                    size=100,\n                    side=SELL,\n                ),\n                options=CreateOrderOptions(tick_size=\"0.001\", neg_risk=False),\n            ),\n            owner=owner,\n            orderType=OrderType.GTC,\n        )\n\n        self.assertIsNotNone(json_order)\n        self.assertEqual(json_order[\"orderType\"], \"GTC\")\n        self.assertEqual(json_order[\"owner\"], owner)\n        self.assertIsNotNone(json_order[\"order\"])\n        self.assertIsNotNone(json_order[\"order\"][\"salt\"])\n        self.assertEqual(\n            json_order[\"order\"][\"maker\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"signer\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"taker\"], \"0x0000000000000000000000000000000000000000\"\n        )\n        self.assertEqual(json_order[\"order\"][\"tokenId\"], \"100\")\n        self.assertEqual(json_order[\"order\"][\"makerAmount\"], \"100000000\")\n        self.assertEqual(json_order[\"order\"][\"takerAmount\"], \"500000\")\n        self.assertEqual(json_order[\"order\"][\"expiration\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"nonce\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"feeRateBps\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"side\"], \"SELL\")\n        self.assertEqual(json_order[\"order\"][\"signatureType\"], 0)\n        self.assertIsNotNone(json_order[\"order\"][\"signature\"])\n\n        # GTD BUY\n        json_order = order_to_json(\n            order=builder.create_order(\n                order_args=OrderArgs(\n                    token_id=\"100\",\n                    price=0.005,\n                    size=100,\n                    side=BUY,\n                ),\n                options=CreateOrderOptions(tick_size=\"0.001\", neg_risk=False),\n            ),\n            owner=owner,\n            orderType=OrderType.GTD,\n        )\n\n        self.assertIsNotNone(json_order)\n        self.assertEqual(json_order[\"orderType\"], \"GTD\")\n        self.assertEqual(json_order[\"owner\"], owner)\n        self.assertIsNotNone(json_order[\"order\"])\n        self.assertIsNotNone(json_order[\"order\"][\"salt\"])\n        self.assertEqual(\n            json_order[\"order\"][\"maker\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"signer\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"taker\"], \"0x0000000000000000000000000000000000000000\"\n        )\n        self.assertEqual(json_order[\"order\"][\"tokenId\"], \"100\")\n        self.assertEqual(json_order[\"order\"][\"makerAmount\"], \"500000\")\n        self.assertEqual(json_order[\"order\"][\"takerAmount\"], \"100000000\")\n        self.assertEqual(json_order[\"order\"][\"expiration\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"nonce\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"feeRateBps\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"side\"], \"BUY\")\n        self.assertEqual(json_order[\"order\"][\"signatureType\"], 0)\n        self.assertIsNotNone(json_order[\"order\"][\"signature\"])\n\n        # GTD SELL\n        json_order = order_to_json(\n            order=builder.create_order(\n                order_args=OrderArgs(\n                    token_id=\"100\",\n                    price=0.005,\n                    size=100,\n                    side=SELL,\n                ),\n                options=CreateOrderOptions(tick_size=\"0.001\", neg_risk=False),\n            ),\n            owner=owner,\n            orderType=OrderType.GTD,\n        )\n\n        self.assertIsNotNone(json_order)\n        self.assertEqual(json_order[\"orderType\"], \"GTD\")\n        self.assertEqual(json_order[\"owner\"], owner)\n        self.assertIsNotNone(json_order[\"order\"])\n        self.assertIsNotNone(json_order[\"order\"][\"salt\"])\n        self.assertEqual(\n            json_order[\"order\"][\"maker\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"signer\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"taker\"], \"0x0000000000000000000000000000000000000000\"\n        )\n        self.assertEqual(json_order[\"order\"][\"tokenId\"], \"100\")\n        self.assertEqual(json_order[\"order\"][\"makerAmount\"], \"100000000\")\n        self.assertEqual(json_order[\"order\"][\"takerAmount\"], \"500000\")\n        self.assertEqual(json_order[\"order\"][\"expiration\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"nonce\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"feeRateBps\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"side\"], \"SELL\")\n        self.assertEqual(json_order[\"order\"][\"signatureType\"], 0)\n        self.assertIsNotNone(json_order[\"order\"][\"signature\"])\n\n    def test_order_to_json_0_0001(self):\n        # publicly known private key\n        private_key = (\n            \"0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80\"\n        )\n        chain_id = AMOY\n        signer = Signer(private_key=private_key, chain_id=chain_id)\n        owner = \"aaa-bbb-ccc\"\n        builder = OrderBuilder(signer)\n\n        # GTC BUY\n        json_order = order_to_json(\n            order=builder.create_order(\n                order_args=OrderArgs(\n                    token_id=\"100\",\n                    price=0.0005,\n                    size=100,\n                    side=BUY,\n                ),\n                options=CreateOrderOptions(tick_size=\"0.0001\", neg_risk=False),\n            ),\n            owner=owner,\n            orderType=OrderType.GTC,\n        )\n\n        self.assertIsNotNone(json_order)\n        self.assertEqual(json_order[\"orderType\"], \"GTC\")\n        self.assertEqual(json_order[\"owner\"], owner)\n        self.assertIsNotNone(json_order[\"order\"])\n        self.assertIsNotNone(json_order[\"order\"][\"salt\"])\n        self.assertEqual(\n            json_order[\"order\"][\"maker\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"signer\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"taker\"], \"0x0000000000000000000000000000000000000000\"\n        )\n        self.assertEqual(json_order[\"order\"][\"tokenId\"], \"100\")\n        self.assertEqual(json_order[\"order\"][\"makerAmount\"], \"50000\")\n        self.assertEqual(json_order[\"order\"][\"takerAmount\"], \"100000000\")\n        self.assertEqual(json_order[\"order\"][\"expiration\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"nonce\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"feeRateBps\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"side\"], \"BUY\")\n        self.assertEqual(json_order[\"order\"][\"signatureType\"], 0)\n        self.assertIsNotNone(json_order[\"order\"][\"signature\"])\n\n        # GTC SELL\n        json_order = order_to_json(\n            order=builder.create_order(\n                order_args=OrderArgs(\n                    token_id=\"100\",\n                    price=0.0005,\n                    size=100,\n                    side=SELL,\n                ),\n                options=CreateOrderOptions(tick_size=\"0.0001\", neg_risk=False),\n            ),\n            owner=owner,\n            orderType=OrderType.GTC,\n        )\n\n        self.assertIsNotNone(json_order)\n        self.assertEqual(json_order[\"orderType\"], \"GTC\")\n        self.assertEqual(json_order[\"owner\"], owner)\n        self.assertIsNotNone(json_order[\"order\"])\n        self.assertIsNotNone(json_order[\"order\"][\"salt\"])\n        self.assertEqual(\n            json_order[\"order\"][\"maker\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"signer\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"taker\"], \"0x0000000000000000000000000000000000000000\"\n        )\n        self.assertEqual(json_order[\"order\"][\"tokenId\"], \"100\")\n        self.assertEqual(json_order[\"order\"][\"makerAmount\"], \"100000000\")\n        self.assertEqual(json_order[\"order\"][\"takerAmount\"], \"50000\")\n        self.assertEqual(json_order[\"order\"][\"expiration\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"nonce\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"feeRateBps\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"side\"], \"SELL\")\n        self.assertEqual(json_order[\"order\"][\"signatureType\"], 0)\n        self.assertIsNotNone(json_order[\"order\"][\"signature\"])\n\n        # GTD BUY\n        json_order = order_to_json(\n            order=builder.create_order(\n                order_args=OrderArgs(\n                    token_id=\"100\",\n                    price=0.0005,\n                    size=100,\n                    side=BUY,\n                ),\n                options=CreateOrderOptions(tick_size=\"0.0001\", neg_risk=False),\n            ),\n            owner=owner,\n            orderType=OrderType.GTD,\n        )\n\n        self.assertIsNotNone(json_order)\n        self.assertEqual(json_order[\"orderType\"], \"GTD\")\n        self.assertEqual(json_order[\"owner\"], owner)\n        self.assertIsNotNone(json_order[\"order\"])\n        self.assertIsNotNone(json_order[\"order\"][\"salt\"])\n        self.assertEqual(\n            json_order[\"order\"][\"maker\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"signer\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"taker\"], \"0x0000000000000000000000000000000000000000\"\n        )\n        self.assertEqual(json_order[\"order\"][\"tokenId\"], \"100\")\n        self.assertEqual(json_order[\"order\"][\"makerAmount\"], \"50000\")\n        self.assertEqual(json_order[\"order\"][\"takerAmount\"], \"100000000\")\n        self.assertEqual(json_order[\"order\"][\"expiration\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"nonce\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"feeRateBps\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"side\"], \"BUY\")\n        self.assertEqual(json_order[\"order\"][\"signatureType\"], 0)\n        self.assertIsNotNone(json_order[\"order\"][\"signature\"])\n\n        # GTD SELL\n        json_order = order_to_json(\n            order=builder.create_order(\n                order_args=OrderArgs(\n                    token_id=\"100\",\n                    price=0.0005,\n                    size=100,\n                    side=SELL,\n                ),\n                options=CreateOrderOptions(tick_size=\"0.0001\", neg_risk=False),\n            ),\n            owner=owner,\n            orderType=OrderType.GTD,\n        )\n\n        self.assertIsNotNone(json_order)\n        self.assertEqual(json_order[\"orderType\"], \"GTD\")\n        self.assertEqual(json_order[\"owner\"], owner)\n        self.assertIsNotNone(json_order[\"order\"])\n        self.assertIsNotNone(json_order[\"order\"][\"salt\"])\n        self.assertEqual(\n            json_order[\"order\"][\"maker\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"signer\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"taker\"], \"0x0000000000000000000000000000000000000000\"\n        )\n        self.assertEqual(json_order[\"order\"][\"tokenId\"], \"100\")\n        self.assertEqual(json_order[\"order\"][\"makerAmount\"], \"100000000\")\n        self.assertEqual(json_order[\"order\"][\"takerAmount\"], \"50000\")\n        self.assertEqual(json_order[\"order\"][\"expiration\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"nonce\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"feeRateBps\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"side\"], \"SELL\")\n        self.assertEqual(json_order[\"order\"][\"signatureType\"], 0)\n        self.assertIsNotNone(json_order[\"order\"][\"signature\"])\n\n    def test_order_to_json_0_1_neg_risk(self):\n        # publicly known private key\n        private_key = (\n            \"0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80\"\n        )\n        chain_id = AMOY\n        signer = Signer(private_key=private_key, chain_id=chain_id)\n        owner = \"aaa-bbb-ccc\"\n        builder = OrderBuilder(signer)\n\n        # GTC BUY\n        json_order = order_to_json(\n            order=builder.create_order(\n                order_args=OrderArgs(\n                    token_id=\"100\",\n                    price=0.5,\n                    size=100,\n                    side=BUY,\n                ),\n                options=CreateOrderOptions(tick_size=\"0.1\", neg_risk=True),\n            ),\n            owner=owner,\n            orderType=OrderType.GTC,\n        )\n\n        self.assertIsNotNone(json_order)\n        self.assertEqual(json_order[\"orderType\"], \"GTC\")\n        self.assertEqual(json_order[\"owner\"], owner)\n        self.assertIsNotNone(json_order[\"order\"])\n        self.assertIsNotNone(json_order[\"order\"][\"salt\"])\n        self.assertEqual(\n            json_order[\"order\"][\"maker\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"signer\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"taker\"], \"0x0000000000000000000000000000000000000000\"\n        )\n        self.assertEqual(json_order[\"order\"][\"tokenId\"], \"100\")\n        self.assertEqual(json_order[\"order\"][\"makerAmount\"], \"50000000\")\n        self.assertEqual(json_order[\"order\"][\"takerAmount\"], \"100000000\")\n        self.assertEqual(json_order[\"order\"][\"expiration\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"nonce\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"feeRateBps\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"side\"], \"BUY\")\n        self.assertEqual(json_order[\"order\"][\"signatureType\"], 0)\n        self.assertIsNotNone(json_order[\"order\"][\"signature\"])\n\n        # GTC SELL\n        json_order = order_to_json(\n            order=builder.create_order(\n                order_args=OrderArgs(\n                    token_id=\"100\",\n                    price=0.5,\n                    size=100,\n                    side=SELL,\n                ),\n                options=CreateOrderOptions(tick_size=\"0.1\", neg_risk=True),\n            ),\n            owner=owner,\n            orderType=OrderType.GTC,\n        )\n\n        self.assertIsNotNone(json_order)\n        self.assertEqual(json_order[\"orderType\"], \"GTC\")\n        self.assertEqual(json_order[\"owner\"], owner)\n        self.assertIsNotNone(json_order[\"order\"])\n        self.assertIsNotNone(json_order[\"order\"][\"salt\"])\n        self.assertEqual(\n            json_order[\"order\"][\"maker\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"signer\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"taker\"], \"0x0000000000000000000000000000000000000000\"\n        )\n        self.assertEqual(json_order[\"order\"][\"tokenId\"], \"100\")\n        self.assertEqual(json_order[\"order\"][\"makerAmount\"], \"100000000\")\n        self.assertEqual(json_order[\"order\"][\"takerAmount\"], \"50000000\")\n        self.assertEqual(json_order[\"order\"][\"expiration\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"nonce\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"feeRateBps\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"side\"], \"SELL\")\n        self.assertEqual(json_order[\"order\"][\"signatureType\"], 0)\n        self.assertIsNotNone(json_order[\"order\"][\"signature\"])\n\n        # GTD BUY\n        json_order = order_to_json(\n            order=builder.create_order(\n                order_args=OrderArgs(\n                    token_id=\"100\",\n                    price=0.5,\n                    size=100,\n                    side=BUY,\n                ),\n                options=CreateOrderOptions(tick_size=\"0.1\", neg_risk=True),\n            ),\n            owner=owner,\n            orderType=OrderType.GTD,\n        )\n\n        self.assertIsNotNone(json_order)\n        self.assertEqual(json_order[\"orderType\"], \"GTD\")\n        self.assertEqual(json_order[\"owner\"], owner)\n        self.assertIsNotNone(json_order[\"order\"])\n        self.assertIsNotNone(json_order[\"order\"][\"salt\"])\n        self.assertEqual(\n            json_order[\"order\"][\"maker\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"signer\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"taker\"], \"0x0000000000000000000000000000000000000000\"\n        )\n        self.assertEqual(json_order[\"order\"][\"tokenId\"], \"100\")\n        self.assertEqual(json_order[\"order\"][\"makerAmount\"], \"50000000\")\n        self.assertEqual(json_order[\"order\"][\"takerAmount\"], \"100000000\")\n        self.assertEqual(json_order[\"order\"][\"expiration\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"nonce\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"feeRateBps\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"side\"], \"BUY\")\n        self.assertEqual(json_order[\"order\"][\"signatureType\"], 0)\n        self.assertIsNotNone(json_order[\"order\"][\"signature\"])\n\n        # GTD SELL\n        json_order = order_to_json(\n            order=builder.create_order(\n                order_args=OrderArgs(\n                    token_id=\"100\",\n                    price=0.5,\n                    size=100,\n                    side=SELL,\n                ),\n                options=CreateOrderOptions(tick_size=\"0.1\", neg_risk=True),\n            ),\n            owner=owner,\n            orderType=OrderType.GTD,\n        )\n\n        self.assertIsNotNone(json_order)\n        self.assertEqual(json_order[\"orderType\"], \"GTD\")\n        self.assertEqual(json_order[\"owner\"], owner)\n        self.assertIsNotNone(json_order[\"order\"])\n        self.assertIsNotNone(json_order[\"order\"][\"salt\"])\n        self.assertEqual(\n            json_order[\"order\"][\"maker\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"signer\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"taker\"], \"0x0000000000000000000000000000000000000000\"\n        )\n        self.assertEqual(json_order[\"order\"][\"tokenId\"], \"100\")\n        self.assertEqual(json_order[\"order\"][\"makerAmount\"], \"100000000\")\n        self.assertEqual(json_order[\"order\"][\"takerAmount\"], \"50000000\")\n        self.assertEqual(json_order[\"order\"][\"expiration\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"nonce\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"feeRateBps\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"side\"], \"SELL\")\n        self.assertEqual(json_order[\"order\"][\"signatureType\"], 0)\n        self.assertIsNotNone(json_order[\"order\"][\"signature\"])\n\n    def test_order_to_json_0_01_neg_risk(self):\n        # publicly known private key\n        private_key = (\n            \"0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80\"\n        )\n        chain_id = AMOY\n        signer = Signer(private_key=private_key, chain_id=chain_id)\n        owner = \"aaa-bbb-ccc\"\n        builder = OrderBuilder(signer)\n\n        # GTC BUY\n        json_order = order_to_json(\n            order=builder.create_order(\n                order_args=OrderArgs(\n                    token_id=\"100\",\n                    price=0.05,\n                    size=100,\n                    side=BUY,\n                ),\n                options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=True),\n            ),\n            owner=owner,\n            orderType=OrderType.GTC,\n        )\n\n        self.assertIsNotNone(json_order)\n        self.assertEqual(json_order[\"orderType\"], \"GTC\")\n        self.assertEqual(json_order[\"owner\"], owner)\n        self.assertIsNotNone(json_order[\"order\"])\n        self.assertIsNotNone(json_order[\"order\"][\"salt\"])\n        self.assertEqual(\n            json_order[\"order\"][\"maker\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"signer\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"taker\"], \"0x0000000000000000000000000000000000000000\"\n        )\n        self.assertEqual(json_order[\"order\"][\"tokenId\"], \"100\")\n        self.assertEqual(json_order[\"order\"][\"makerAmount\"], \"5000000\")\n        self.assertEqual(json_order[\"order\"][\"takerAmount\"], \"100000000\")\n        self.assertEqual(json_order[\"order\"][\"expiration\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"nonce\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"feeRateBps\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"side\"], \"BUY\")\n        self.assertEqual(json_order[\"order\"][\"signatureType\"], 0)\n        self.assertIsNotNone(json_order[\"order\"][\"signature\"])\n\n        # GTC SELL\n        json_order = order_to_json(\n            order=builder.create_order(\n                order_args=OrderArgs(\n                    token_id=\"100\",\n                    price=0.05,\n                    size=100,\n                    side=SELL,\n                ),\n                options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=True),\n            ),\n            owner=owner,\n            orderType=OrderType.GTC,\n        )\n\n        self.assertIsNotNone(json_order)\n        self.assertEqual(json_order[\"orderType\"], \"GTC\")\n        self.assertEqual(json_order[\"owner\"], owner)\n        self.assertIsNotNone(json_order[\"order\"])\n        self.assertIsNotNone(json_order[\"order\"][\"salt\"])\n        self.assertEqual(\n            json_order[\"order\"][\"maker\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"signer\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"taker\"], \"0x0000000000000000000000000000000000000000\"\n        )\n        self.assertEqual(json_order[\"order\"][\"tokenId\"], \"100\")\n        self.assertEqual(json_order[\"order\"][\"makerAmount\"], \"100000000\")\n        self.assertEqual(json_order[\"order\"][\"takerAmount\"], \"5000000\")\n        self.assertEqual(json_order[\"order\"][\"expiration\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"nonce\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"feeRateBps\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"side\"], \"SELL\")\n        self.assertEqual(json_order[\"order\"][\"signatureType\"], 0)\n        self.assertIsNotNone(json_order[\"order\"][\"signature\"])\n\n        # GTD BUY\n        json_order = order_to_json(\n            order=builder.create_order(\n                order_args=OrderArgs(\n                    token_id=\"100\",\n                    price=0.05,\n                    size=100,\n                    side=BUY,\n                ),\n                options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=True),\n            ),\n            owner=owner,\n            orderType=OrderType.GTD,\n        )\n\n        self.assertIsNotNone(json_order)\n        self.assertEqual(json_order[\"orderType\"], \"GTD\")\n        self.assertEqual(json_order[\"owner\"], owner)\n        self.assertIsNotNone(json_order[\"order\"])\n        self.assertIsNotNone(json_order[\"order\"][\"salt\"])\n        self.assertEqual(\n            json_order[\"order\"][\"maker\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"signer\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"taker\"], \"0x0000000000000000000000000000000000000000\"\n        )\n        self.assertEqual(json_order[\"order\"][\"tokenId\"], \"100\")\n        self.assertEqual(json_order[\"order\"][\"makerAmount\"], \"5000000\")\n        self.assertEqual(json_order[\"order\"][\"takerAmount\"], \"100000000\")\n        self.assertEqual(json_order[\"order\"][\"expiration\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"nonce\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"feeRateBps\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"side\"], \"BUY\")\n        self.assertEqual(json_order[\"order\"][\"signatureType\"], 0)\n        self.assertIsNotNone(json_order[\"order\"][\"signature\"])\n\n        # GTD SELL\n        json_order = order_to_json(\n            order=builder.create_order(\n                order_args=OrderArgs(\n                    token_id=\"100\",\n                    price=0.05,\n                    size=100,\n                    side=SELL,\n                ),\n                options=CreateOrderOptions(tick_size=\"0.01\", neg_risk=True),\n            ),\n            owner=owner,\n            orderType=OrderType.GTD,\n        )\n\n        self.assertIsNotNone(json_order)\n        self.assertEqual(json_order[\"orderType\"], \"GTD\")\n        self.assertEqual(json_order[\"owner\"], owner)\n        self.assertIsNotNone(json_order[\"order\"])\n        self.assertIsNotNone(json_order[\"order\"][\"salt\"])\n        self.assertEqual(\n            json_order[\"order\"][\"maker\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"signer\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"taker\"], \"0x0000000000000000000000000000000000000000\"\n        )\n        self.assertEqual(json_order[\"order\"][\"tokenId\"], \"100\")\n        self.assertEqual(json_order[\"order\"][\"makerAmount\"], \"100000000\")\n        self.assertEqual(json_order[\"order\"][\"takerAmount\"], \"5000000\")\n        self.assertEqual(json_order[\"order\"][\"expiration\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"nonce\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"feeRateBps\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"side\"], \"SELL\")\n        self.assertEqual(json_order[\"order\"][\"signatureType\"], 0)\n        self.assertIsNotNone(json_order[\"order\"][\"signature\"])\n\n    def test_order_to_json_0_001_neg_risk(self):\n        # publicly known private key\n        private_key = (\n            \"0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80\"\n        )\n        chain_id = AMOY\n        signer = Signer(private_key=private_key, chain_id=chain_id)\n        owner = \"aaa-bbb-ccc\"\n        builder = OrderBuilder(signer)\n\n        # GTC BUY\n        json_order = order_to_json(\n            order=builder.create_order(\n                order_args=OrderArgs(\n                    token_id=\"100\",\n                    price=0.005,\n                    size=100,\n                    side=BUY,\n                ),\n                options=CreateOrderOptions(tick_size=\"0.001\", neg_risk=True),\n            ),\n            owner=owner,\n            orderType=OrderType.GTC,\n        )\n\n        self.assertIsNotNone(json_order)\n        self.assertEqual(json_order[\"orderType\"], \"GTC\")\n        self.assertEqual(json_order[\"owner\"], owner)\n        self.assertIsNotNone(json_order[\"order\"])\n        self.assertIsNotNone(json_order[\"order\"][\"salt\"])\n        self.assertEqual(\n            json_order[\"order\"][\"maker\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"signer\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"taker\"], \"0x0000000000000000000000000000000000000000\"\n        )\n        self.assertEqual(json_order[\"order\"][\"tokenId\"], \"100\")\n        self.assertEqual(json_order[\"order\"][\"makerAmount\"], \"500000\")\n        self.assertEqual(json_order[\"order\"][\"takerAmount\"], \"100000000\")\n        self.assertEqual(json_order[\"order\"][\"expiration\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"nonce\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"feeRateBps\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"side\"], \"BUY\")\n        self.assertEqual(json_order[\"order\"][\"signatureType\"], 0)\n        self.assertIsNotNone(json_order[\"order\"][\"signature\"])\n\n        # GTC SELL\n        json_order = order_to_json(\n            order=builder.create_order(\n                order_args=OrderArgs(\n                    token_id=\"100\",\n                    price=0.005,\n                    size=100,\n                    side=SELL,\n                ),\n                options=CreateOrderOptions(tick_size=\"0.001\", neg_risk=True),\n            ),\n            owner=owner,\n            orderType=OrderType.GTC,\n        )\n\n        self.assertIsNotNone(json_order)\n        self.assertEqual(json_order[\"orderType\"], \"GTC\")\n        self.assertEqual(json_order[\"owner\"], owner)\n        self.assertIsNotNone(json_order[\"order\"])\n        self.assertIsNotNone(json_order[\"order\"][\"salt\"])\n        self.assertEqual(\n            json_order[\"order\"][\"maker\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"signer\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"taker\"], \"0x0000000000000000000000000000000000000000\"\n        )\n        self.assertEqual(json_order[\"order\"][\"tokenId\"], \"100\")\n        self.assertEqual(json_order[\"order\"][\"makerAmount\"], \"100000000\")\n        self.assertEqual(json_order[\"order\"][\"takerAmount\"], \"500000\")\n        self.assertEqual(json_order[\"order\"][\"expiration\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"nonce\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"feeRateBps\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"side\"], \"SELL\")\n        self.assertEqual(json_order[\"order\"][\"signatureType\"], 0)\n        self.assertIsNotNone(json_order[\"order\"][\"signature\"])\n\n        # GTD BUY\n        json_order = order_to_json(\n            order=builder.create_order(\n                order_args=OrderArgs(\n                    token_id=\"100\",\n                    price=0.005,\n                    size=100,\n                    side=BUY,\n                ),\n                options=CreateOrderOptions(tick_size=\"0.001\", neg_risk=True),\n            ),\n            owner=owner,\n            orderType=OrderType.GTD,\n        )\n\n        self.assertIsNotNone(json_order)\n        self.assertEqual(json_order[\"orderType\"], \"GTD\")\n        self.assertEqual(json_order[\"owner\"], owner)\n        self.assertIsNotNone(json_order[\"order\"])\n        self.assertIsNotNone(json_order[\"order\"][\"salt\"])\n        self.assertEqual(\n            json_order[\"order\"][\"maker\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"signer\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"taker\"], \"0x0000000000000000000000000000000000000000\"\n        )\n        self.assertEqual(json_order[\"order\"][\"tokenId\"], \"100\")\n        self.assertEqual(json_order[\"order\"][\"makerAmount\"], \"500000\")\n        self.assertEqual(json_order[\"order\"][\"takerAmount\"], \"100000000\")\n        self.assertEqual(json_order[\"order\"][\"expiration\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"nonce\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"feeRateBps\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"side\"], \"BUY\")\n        self.assertEqual(json_order[\"order\"][\"signatureType\"], 0)\n        self.assertIsNotNone(json_order[\"order\"][\"signature\"])\n\n        # GTD SELL\n        json_order = order_to_json(\n            order=builder.create_order(\n                order_args=OrderArgs(\n                    token_id=\"100\",\n                    price=0.005,\n                    size=100,\n                    side=SELL,\n                ),\n                options=CreateOrderOptions(tick_size=\"0.001\", neg_risk=True),\n            ),\n            owner=owner,\n            orderType=OrderType.GTD,\n        )\n\n        self.assertIsNotNone(json_order)\n        self.assertEqual(json_order[\"orderType\"], \"GTD\")\n        self.assertEqual(json_order[\"owner\"], owner)\n        self.assertIsNotNone(json_order[\"order\"])\n        self.assertIsNotNone(json_order[\"order\"][\"salt\"])\n        self.assertEqual(\n            json_order[\"order\"][\"maker\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"signer\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"taker\"], \"0x0000000000000000000000000000000000000000\"\n        )\n        self.assertEqual(json_order[\"order\"][\"tokenId\"], \"100\")\n        self.assertEqual(json_order[\"order\"][\"makerAmount\"], \"100000000\")\n        self.assertEqual(json_order[\"order\"][\"takerAmount\"], \"500000\")\n        self.assertEqual(json_order[\"order\"][\"expiration\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"nonce\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"feeRateBps\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"side\"], \"SELL\")\n        self.assertEqual(json_order[\"order\"][\"signatureType\"], 0)\n        self.assertIsNotNone(json_order[\"order\"][\"signature\"])\n\n    def test_order_to_json_0_0001_neg_risk(self):\n        # publicly known private key\n        private_key = (\n            \"0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80\"\n        )\n        chain_id = AMOY\n        signer = Signer(private_key=private_key, chain_id=chain_id)\n        owner = \"aaa-bbb-ccc\"\n        builder = OrderBuilder(signer)\n\n        # GTC BUY\n        json_order = order_to_json(\n            order=builder.create_order(\n                order_args=OrderArgs(\n                    token_id=\"100\",\n                    price=0.0005,\n                    size=100,\n                    side=BUY,\n                ),\n                options=CreateOrderOptions(tick_size=\"0.0001\", neg_risk=True),\n            ),\n            owner=owner,\n            orderType=OrderType.GTC,\n        )\n\n        self.assertIsNotNone(json_order)\n        self.assertEqual(json_order[\"orderType\"], \"GTC\")\n        self.assertEqual(json_order[\"owner\"], owner)\n        self.assertIsNotNone(json_order[\"order\"])\n        self.assertIsNotNone(json_order[\"order\"][\"salt\"])\n        self.assertEqual(\n            json_order[\"order\"][\"maker\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"signer\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"taker\"], \"0x0000000000000000000000000000000000000000\"\n        )\n        self.assertEqual(json_order[\"order\"][\"tokenId\"], \"100\")\n        self.assertEqual(json_order[\"order\"][\"makerAmount\"], \"50000\")\n        self.assertEqual(json_order[\"order\"][\"takerAmount\"], \"100000000\")\n        self.assertEqual(json_order[\"order\"][\"expiration\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"nonce\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"feeRateBps\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"side\"], \"BUY\")\n        self.assertEqual(json_order[\"order\"][\"signatureType\"], 0)\n        self.assertIsNotNone(json_order[\"order\"][\"signature\"])\n\n        # GTC SELL\n        json_order = order_to_json(\n            order=builder.create_order(\n                order_args=OrderArgs(\n                    token_id=\"100\",\n                    price=0.0005,\n                    size=100,\n                    side=SELL,\n                ),\n                options=CreateOrderOptions(tick_size=\"0.0001\", neg_risk=True),\n            ),\n            owner=owner,\n            orderType=OrderType.GTC,\n        )\n\n        self.assertIsNotNone(json_order)\n        self.assertEqual(json_order[\"orderType\"], \"GTC\")\n        self.assertEqual(json_order[\"owner\"], owner)\n        self.assertIsNotNone(json_order[\"order\"])\n        self.assertIsNotNone(json_order[\"order\"][\"salt\"])\n        self.assertEqual(\n            json_order[\"order\"][\"maker\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"signer\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"taker\"], \"0x0000000000000000000000000000000000000000\"\n        )\n        self.assertEqual(json_order[\"order\"][\"tokenId\"], \"100\")\n        self.assertEqual(json_order[\"order\"][\"makerAmount\"], \"100000000\")\n        self.assertEqual(json_order[\"order\"][\"takerAmount\"], \"50000\")\n        self.assertEqual(json_order[\"order\"][\"expiration\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"nonce\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"feeRateBps\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"side\"], \"SELL\")\n        self.assertEqual(json_order[\"order\"][\"signatureType\"], 0)\n        self.assertIsNotNone(json_order[\"order\"][\"signature\"])\n\n        # GTD BUY\n        json_order = order_to_json(\n            order=builder.create_order(\n                order_args=OrderArgs(\n                    token_id=\"100\",\n                    price=0.0005,\n                    size=100,\n                    side=BUY,\n                ),\n                options=CreateOrderOptions(tick_size=\"0.0001\", neg_risk=True),\n            ),\n            owner=owner,\n            orderType=OrderType.GTD,\n        )\n\n        self.assertIsNotNone(json_order)\n        self.assertEqual(json_order[\"orderType\"], \"GTD\")\n        self.assertEqual(json_order[\"owner\"], owner)\n        self.assertIsNotNone(json_order[\"order\"])\n        self.assertIsNotNone(json_order[\"order\"][\"salt\"])\n        self.assertEqual(\n            json_order[\"order\"][\"maker\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"signer\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"taker\"], \"0x0000000000000000000000000000000000000000\"\n        )\n        self.assertEqual(json_order[\"order\"][\"tokenId\"], \"100\")\n        self.assertEqual(json_order[\"order\"][\"makerAmount\"], \"50000\")\n        self.assertEqual(json_order[\"order\"][\"takerAmount\"], \"100000000\")\n        self.assertEqual(json_order[\"order\"][\"expiration\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"nonce\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"feeRateBps\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"side\"], \"BUY\")\n        self.assertEqual(json_order[\"order\"][\"signatureType\"], 0)\n        self.assertIsNotNone(json_order[\"order\"][\"signature\"])\n\n        # GTD SELL\n        json_order = order_to_json(\n            order=builder.create_order(\n                order_args=OrderArgs(\n                    token_id=\"100\",\n                    price=0.0005,\n                    size=100,\n                    side=SELL,\n                ),\n                options=CreateOrderOptions(tick_size=\"0.0001\", neg_risk=True),\n            ),\n            owner=owner,\n            orderType=OrderType.GTD,\n        )\n\n        self.assertIsNotNone(json_order)\n        self.assertEqual(json_order[\"orderType\"], \"GTD\")\n        self.assertEqual(json_order[\"owner\"], owner)\n        self.assertIsNotNone(json_order[\"order\"])\n        self.assertIsNotNone(json_order[\"order\"][\"salt\"])\n        self.assertEqual(\n            json_order[\"order\"][\"maker\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"signer\"], \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\"\n        )\n        self.assertEqual(\n            json_order[\"order\"][\"taker\"], \"0x0000000000000000000000000000000000000000\"\n        )\n        self.assertEqual(json_order[\"order\"][\"tokenId\"], \"100\")\n        self.assertEqual(json_order[\"order\"][\"makerAmount\"], \"100000000\")\n        self.assertEqual(json_order[\"order\"][\"takerAmount\"], \"50000\")\n        self.assertEqual(json_order[\"order\"][\"expiration\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"nonce\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"feeRateBps\"], \"0\")\n        self.assertEqual(json_order[\"order\"][\"side\"], \"SELL\")\n        self.assertEqual(json_order[\"order\"][\"signatureType\"], 0)\n        self.assertIsNotNone(json_order[\"order\"][\"signature\"])\n\n    def test_is_tick_size_smaller(self):\n        # 0.1\n        self.assertFalse(is_tick_size_smaller(\"0.1\", \"0.1\"))\n        self.assertFalse(is_tick_size_smaller(\"0.1\", \"0.01\"))\n        self.assertFalse(is_tick_size_smaller(\"0.1\", \"0.001\"))\n        self.assertFalse(is_tick_size_smaller(\"0.1\", \"0.0001\"))\n\n        # 0.01\n        self.assertTrue(is_tick_size_smaller(\"0.01\", \"0.1\"))\n        self.assertFalse(is_tick_size_smaller(\"0.01\", \"0.01\"))\n        self.assertFalse(is_tick_size_smaller(\"0.01\", \"0.001\"))\n        self.assertFalse(is_tick_size_smaller(\"0.01\", \"0.0001\"))\n\n        # 0.001\n        self.assertTrue(is_tick_size_smaller(\"0.001\", \"0.1\"))\n        self.assertTrue(is_tick_size_smaller(\"0.001\", \"0.01\"))\n        self.assertFalse(is_tick_size_smaller(\"0.001\", \"0.001\"))\n        self.assertFalse(is_tick_size_smaller(\"0.001\", \"0.0001\"))\n\n        # 0.0001\n        self.assertTrue(is_tick_size_smaller(\"0.0001\", \"0.1\"))\n        self.assertTrue(is_tick_size_smaller(\"0.0001\", \"0.01\"))\n        self.assertTrue(is_tick_size_smaller(\"0.0001\", \"0.001\"))\n        self.assertFalse(is_tick_size_smaller(\"0.0001\", \"0.0001\"))\n\n    def test_price_valid(self):\n        self.assertFalse(price_valid(0.00001, \"0.0001\"))\n        self.assertTrue(price_valid(0.0001, \"0.0001\"))\n        self.assertTrue(price_valid(0.001, \"0.0001\"))\n        self.assertTrue(price_valid(0.01, \"0.0001\"))\n        self.assertTrue(price_valid(0.1, \"0.0001\"))\n        self.assertTrue(price_valid(0.9, \"0.0001\"))\n        self.assertTrue(price_valid(0.99, \"0.0001\"))\n        self.assertTrue(price_valid(0.999, \"0.0001\"))\n        self.assertTrue(price_valid(0.9999, \"0.0001\"))\n        self.assertFalse(price_valid(0.99999, \"0.0001\"))\n\n        self.assertFalse(price_valid(0.00001, \"0.001\"))\n        self.assertFalse(price_valid(0.0001, \"0.001\"))\n        self.assertTrue(price_valid(0.001, \"0.001\"))\n        self.assertTrue(price_valid(0.01, \"0.001\"))\n        self.assertTrue(price_valid(0.1, \"0.001\"))\n        self.assertTrue(price_valid(0.9, \"0.001\"))\n        self.assertTrue(price_valid(0.99, \"0.001\"))\n        self.assertTrue(price_valid(0.999, \"0.001\"))\n        self.assertFalse(price_valid(0.9999, \"0.001\"))\n        self.assertFalse(price_valid(0.99999, \"0.001\"))\n\n        self.assertFalse(price_valid(0.00001, \"0.01\"))\n        self.assertFalse(price_valid(0.0001, \"0.01\"))\n        self.assertFalse(price_valid(0.001, \"0.01\"))\n        self.assertTrue(price_valid(0.01, \"0.01\"))\n        self.assertTrue(price_valid(0.1, \"0.01\"))\n        self.assertTrue(price_valid(0.9, \"0.01\"))\n        self.assertTrue(price_valid(0.99, \"0.01\"))\n        self.assertFalse(price_valid(0.999, \"0.01\"))\n        self.assertFalse(price_valid(0.9999, \"0.01\"))\n        self.assertFalse(price_valid(0.99999, \"0.01\"))\n\n        self.assertFalse(price_valid(0.00001, \"0.1\"))\n        self.assertFalse(price_valid(0.0001, \"0.1\"))\n        self.assertFalse(price_valid(0.001, \"0.1\"))\n        self.assertFalse(price_valid(0.01, \"0.1\"))\n        self.assertTrue(price_valid(0.1, \"0.1\"))\n        self.assertTrue(price_valid(0.9, \"0.1\"))\n        self.assertFalse(price_valid(0.99, \"0.1\"))\n        self.assertFalse(price_valid(0.999, \"0.1\"))\n        self.assertFalse(price_valid(0.9999, \"0.1\"))\n        self.assertFalse(price_valid(0.99999, \"0.1\"))\n"
  }
]