diff --git a/.github/actions/install-packages/action.yml b/.github/actions/install-packages/action.yml new file mode 100644 index 0000000..e845bf2 --- /dev/null +++ b/.github/actions/install-packages/action.yml @@ -0,0 +1,15 @@ +name: install packages +description: set up uv & install packages + +runs: + using: composite + steps: + - uses: astral-sh/setup-uv@v6 + with: + version: "0.7.6" + - uses: actions/setup-python@v5 + with: + python-version-file: "pyproject.toml" + - name: Install packages + shell: bash + run: uv sync --locked --all-extras --dev diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml new file mode 100644 index 0000000..ad4bc32 --- /dev/null +++ b/.github/workflows/check.yml @@ -0,0 +1,48 @@ +name: check + +on: + push: + branches: + - main + - develop + pull_request: + branches: + - main + - develop + +jobs: + detect-changes: + runs-on: ubuntu-latest + timeout-minutes: 3 + permissions: + pull-requests: read + outputs: + core: ${{ steps.filter.outputs.core }} + steps: + - uses: actions/checkout@v4 + - uses: dorny/paths-filter@v3 + id: filter + with: + filters: | + core: + - 'packages/core/**' + + check-core: + needs: detect-changes + if: ${{ needs.detect-changes.outputs.core == 'true' }} + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./packages/core + timeout-minutes: 5 + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/install-packages + - name: Lint + run: uv run ruff check . + - name: Format + run: uv run ruff format --check . + - name: Run mypy + run: uv run mypy . + - name: Run tests + run: uv run pytest -v --cov -W ignore::DeprecationWarning diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..671d221 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,85 @@ +name: publish + +on: + push: + branches: + - main + paths: + - 'packages/**' + +jobs: + detect-changes: + runs-on: ubuntu-latest + timeout-minutes: 3 + permissions: + pull-requests: read + outputs: + core: ${{ steps.filter.outputs.core }} + steps: + - uses: actions/checkout@v4 + - uses: dorny/paths-filter@v3 + id: filter + with: + filters: | + core: + - 'packages/core/**' + + push-git-tag: + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./ + timeout-minutes: 3 + outputs: + tag-name: ${{ 'v' }}${{ env.GIT_TAG_VERSION }} + tag-version: ${{ env.GIT_TAG_VERSION }} + tag-exists: ${{ steps.create-tag.outputs.tag_exists }} + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/install-packages + - name: get version from `pyproject.toml` + run: | + package_version=($(uv version)) + echo "GIT_TAG_VERSION=$package_version[2]" >> $GITHUB_ENV + - uses: rickstaa/action-create-tag@v1 + id: create-tag + with: + tag: ${{ 'v' }}${{ env.GIT_TAG_VERSION }} + + publish-release-note: + needs: push-git-tag + if: ${{ needs.push-git-tag.outputs.tag-exists == 'false' }} + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./ + timeout-minutes: 5 + permissions: + contents: write + pull-requests: read + steps: + - uses: actions/checkout@v4 + - uses: release-drafter/release-drafter@v6 + with: + name: ${{ needs.push-git-tag.outputs.tag-name }} + tag: ${{ needs.push-git-tag.outputs.tag-name }} + version: ${{ needs.push-git-tag.outputs.tag-version }} + publish: 'true' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + publish-core: + needs: [detect-changes, publish-release-note] + if: ${{ needs.detect-changes.outputs.core == 'true' }} + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./packages/core + timeout-minutes: 5 + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/install-packages + - name: Build package + run: uv build --no-cache + - name: Publish package to PyPI + run: uv publish --no-cache diff --git a/.gitignore b/.gitignore index 228a386..3652ddf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,20 @@ +# python +.venv +.python-version +dist +*.egg-info +__pycache__ + +# mypy +.mypy_cache + +# ruff +.ruff_cache + +# pytest +.pytest_cache +.coverage + # misc +*_cache cspell.json diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..ff212d0 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,16 @@ +repos: + - repo: https://github.com/astral-sh/uv-pre-commit + rev: 0.7.6 + hooks: + - id: uv-lock + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.11.10 + hooks: + - id: ruff-check + args: [ --fix ] + - id: ruff-format + - repo: https://github.com/pre-commit/mirrors-mypy + rev: v1.15.0 + hooks: + - id: mypy + files: ^packages/core/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..fee89c2 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,31 @@ +# Contributing Guidelines + +We appreciate your interest to contribute to this project! Please read the following to see how you could contribute. + +## 📝 Create an Issue + +The first thing to do is to create a new issue. Feel free to create new issues from [here](https://github.com/jcam1/python-sdk/issues/new/choose) to propose/request new features or report any bugs you found. + +## ⬇️ Clone This Repo + +Next, clone this repository. Our default branch is set to `develop`. + +```sh +git clone https://github.com/jcam1/python-sdk.git +``` + +## ⚡ Checkout to a New Branch + +You then need to `checkout` to a new branch (name whatever you would like) from the cloned `develop` branch. + +```sh +git checkout -b ${your_branch_name} +``` + +## 🛠 Write Code + +Now, write code to implement the proposed features and/or to fix bugs. Please refer to `README`s of respective SDKs for more details. + +## 🌟 Open a Pull Request + +Finally, open a new PR from your branch to `develop` branch, and describe what you'll have done following [our PR template](./.github/pull_request_template.md). diff --git a/README-ja.md b/README-ja.md deleted file mode 100644 index bbbb123..0000000 --- a/README-ja.md +++ /dev/null @@ -1,4 +0,0 @@ -# JPYC Python SDK - -> [!IMPORTANT] -> TODO: README in Japanese diff --git a/README.md b/README.md index 95953c4..478138d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,43 @@ # JPYC Python SDK -> [!IMPORTANT] -> TODO: README in English +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE) +[![contributions welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://github.com/jcam1/python-sdk/issues/new/choose) + +Monorepo for JPYC Python SDKs. + +## 💫 Available SDKs + +Please refer to `README`s of respective SDKs for more details. + +| name | `README` | +| -----: | :----------------------------------------- | +| `core` | [packages/core](./packages/core/README.md) | + +## ⬇️ Installation + +### 1. Clone Repository + +```sh +# clone this repo +$ git clone https://github.com/jcam1/python-sdk.git +# cd into the repo +$ cd python-sdk +``` + +### 2. Install `uv` + +This repo uses `uv` for package management purposes. If not installed, please read & follow [uv's official instructions](https://docs.astral.sh/uv/getting-started/installation/) to install any necessary software for development. For example, the following command installs `uv` on MacOS. + +```sh +curl -LsSf https://astral.sh/uv/install.sh | sh +``` + +### 3. Install packages + +```sh +uv sync +``` + +## 💪🏻 Contributing + +Please refer to [CONTRIBUTING.md](./CONTRIBUTING.md). diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..46c7d60 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,25 @@ +# Docs + +> [!IMPORTANT] +> This `README` is mainly for the advanced users (e.g., contributors of this repo). + +This directory contains the auto-generated documentation for the SDK. + +## 📄 Build + +Run the following commands that generate a collection of documents under [`./docs`](./) directory. + +```sh +# cd into the root directory +$ cd python-sdk +# generate documentation from the google-styled docstrings +$ uv run pdoc ./packages/core/src -o ./docs/core -d google +``` + +## 🔍 UI + +Type the following into your browser to see the contents. + +```sh +{absolute_path_of_any_parent_directories}/python-sdk/docs/core/index.html +``` diff --git a/docs/core/index.html b/docs/core/index.html new file mode 100644 index 0000000..0ef869b --- /dev/null +++ b/docs/core/index.html @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/core/search.js b/docs/core/search.js new file mode 100644 index 0000000..a11c391 --- /dev/null +++ b/docs/core/search.js @@ -0,0 +1,46 @@ +window.pdocSearch = (function(){ +/** elasticlunr - http://weixsong.github.io * Copyright (C) 2017 Oliver Nightingale * Copyright (C) 2017 Wei Song * MIT Licensed */!function(){function e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),t.utils.toString=function(e){return void 0===e||null===e?"":e.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop(),n=e;if("function"!=typeof t)throw new TypeError("last argument must be a function");n.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},t.EventEmitter.prototype.removeListener=function(e,t){if(this.hasHandler(e)){var n=this.events[e].indexOf(t);-1!==n&&(this.events[e].splice(n,1),0==this.events[e].length&&delete this.events[e])}},t.EventEmitter.prototype.emit=function(e){if(this.hasHandler(e)){var t=Array.prototype.slice.call(arguments,1);this.events[e].forEach(function(e){e.apply(void 0,t)},this)}},t.EventEmitter.prototype.hasHandler=function(e){return e in this.events},t.tokenizer=function(e){if(!arguments.length||null===e||void 0===e)return[];if(Array.isArray(e)){var n=e.filter(function(e){return null===e||void 0===e?!1:!0});n=n.map(function(e){return t.utils.toString(e).toLowerCase()});var i=[];return n.forEach(function(e){var n=e.split(t.tokenizer.seperator);i=i.concat(n)},this),i}return e.toString().trim().toLowerCase().split(t.tokenizer.seperator)},t.tokenizer.defaultSeperator=/[\s\-]+/,t.tokenizer.seperator=t.tokenizer.defaultSeperator,t.tokenizer.setSeperator=function(e){null!==e&&void 0!==e&&"object"==typeof e&&(t.tokenizer.seperator=e)},t.tokenizer.resetSeperator=function(){t.tokenizer.seperator=t.tokenizer.defaultSeperator},t.tokenizer.getSeperator=function(){return t.tokenizer.seperator},t.Pipeline=function(){this._queue=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in t.Pipeline.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[n]=e},t.Pipeline.getRegisteredFunction=function(e){return e in t.Pipeline.registeredFunctions!=!0?null:t.Pipeline.registeredFunctions[e]},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.getRegisteredFunction(e);if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i+1,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i,0,n)},t.Pipeline.prototype.remove=function(e){var t=this._queue.indexOf(e);-1!==t&&this._queue.splice(t,1)},t.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,i=this._queue.length,o=0;n>o;o++){for(var r=e[o],s=0;i>s&&(r=this._queue[s](r,o,e),void 0!==r&&null!==r);s++);void 0!==r&&null!==r&&t.push(r)}return t},t.Pipeline.prototype.reset=function(){this._queue=[]},t.Pipeline.prototype.get=function(){return this._queue},t.Pipeline.prototype.toJSON=function(){return this._queue.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.DocumentStore,this.index={},this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var e=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,e)},t.Index.prototype.off=function(e,t){return this.eventEmitter.removeListener(e,t)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;n._fields=e.fields,n._ref=e.ref,n.documentStore=t.DocumentStore.load(e.documentStore),n.pipeline=t.Pipeline.load(e.pipeline),n.index={};for(var i in e.index)n.index[i]=t.InvertedIndex.load(e.index[i]);return n},t.Index.prototype.addField=function(e){return this._fields.push(e),this.index[e]=new t.InvertedIndex,this},t.Index.prototype.setRef=function(e){return this._ref=e,this},t.Index.prototype.saveDocument=function(e){return this.documentStore=new t.DocumentStore(e),this},t.Index.prototype.addDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.addDoc(i,e),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));this.documentStore.addFieldLength(i,n,o.length);var r={};o.forEach(function(e){e in r?r[e]+=1:r[e]=1},this);for(var s in r){var u=r[s];u=Math.sqrt(u),this.index[n].addToken(s,{ref:i,tf:u})}},this),n&&this.eventEmitter.emit("add",e,this)}},t.Index.prototype.removeDocByRef=function(e){if(e&&this.documentStore.isDocStored()!==!1&&this.documentStore.hasDoc(e)){var t=this.documentStore.getDoc(e);this.removeDoc(t,!1)}},t.Index.prototype.removeDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.hasDoc(i)&&(this.documentStore.removeDoc(i),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));o.forEach(function(e){this.index[n].removeToken(e,i)},this)},this),n&&this.eventEmitter.emit("remove",e,this))}},t.Index.prototype.updateDoc=function(e,t){var t=void 0===t?!0:t;this.removeDocByRef(e[this._ref],!1),this.addDoc(e,!1),t&&this.eventEmitter.emit("update",e,this)},t.Index.prototype.idf=function(e,t){var n="@"+t+"/"+e;if(Object.prototype.hasOwnProperty.call(this._idfCache,n))return this._idfCache[n];var i=this.index[t].getDocFreq(e),o=1+Math.log(this.documentStore.length/(i+1));return this._idfCache[n]=o,o},t.Index.prototype.getFields=function(){return this._fields.slice()},t.Index.prototype.search=function(e,n){if(!e)return[];e="string"==typeof e?{any:e}:JSON.parse(JSON.stringify(e));var i=null;null!=n&&(i=JSON.stringify(n));for(var o=new t.Configuration(i,this.getFields()).get(),r={},s=Object.keys(e),u=0;u0&&t.push(e);for(var i in n)"docs"!==i&&"df"!==i&&this.expandToken(e+i,t,n[i]);return t},t.InvertedIndex.prototype.toJSON=function(){return{root:this.root}},t.Configuration=function(e,n){var e=e||"";if(void 0==n||null==n)throw new Error("fields should not be null");this.config={};var i;try{i=JSON.parse(e),this.buildUserConfig(i,n)}catch(o){t.utils.warn("user configuration parse failed, will use default configuration"),this.buildDefaultConfig(n)}},t.Configuration.prototype.buildDefaultConfig=function(e){this.reset(),e.forEach(function(e){this.config[e]={boost:1,bool:"OR",expand:!1}},this)},t.Configuration.prototype.buildUserConfig=function(e,n){var i="OR",o=!1;if(this.reset(),"bool"in e&&(i=e.bool||i),"expand"in e&&(o=e.expand||o),"fields"in e)for(var r in e.fields)if(n.indexOf(r)>-1){var s=e.fields[r],u=o;void 0!=s.expand&&(u=s.expand),this.config[r]={boost:s.boost||0===s.boost?s.boost:1,bool:s.bool||i,expand:u}}else t.utils.warn("field name in user configuration not found in index instance fields");else this.addAllFields2UserConfig(i,o,n)},t.Configuration.prototype.addAllFields2UserConfig=function(e,t,n){n.forEach(function(n){this.config[n]={boost:1,bool:e,expand:t}},this)},t.Configuration.prototype.get=function(){return this.config},t.Configuration.prototype.reset=function(){this.config={}},lunr.SortedSet=function(){this.length=0,this.elements=[]},lunr.SortedSet.load=function(e){var t=new this;return t.elements=e,t.length=e.length,t},lunr.SortedSet.prototype.add=function(){var e,t;for(e=0;e1;){if(r===e)return o;e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o]}return r===e?o:-1},lunr.SortedSet.prototype.locationFor=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;)e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o];return r>e?o:e>r?o+1:void 0},lunr.SortedSet.prototype.intersect=function(e){for(var t=new lunr.SortedSet,n=0,i=0,o=this.length,r=e.length,s=this.elements,u=e.elements;;){if(n>o-1||i>r-1)break;s[n]!==u[i]?s[n]u[i]&&i++:(t.add(s[n]),n++,i++)}return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){var t,n,i;this.length>=e.length?(t=this,n=e):(t=e,n=this),i=t.clone();for(var o=0,r=n.toArray();o

\n"}, "src.SdkClient": {"fullname": "src.SdkClient", "modulename": "src", "qualname": "SdkClient", "kind": "class", "doc": "

SDK client.

\n", "bases": "src.interfaces.client.ISdkClient"}, "src.SdkClient.__init__": {"fullname": "src.SdkClient.__init__", "modulename": "src", "qualname": "SdkClient.__init__", "kind": "function", "doc": "

Constructor that initializes SDK client.

\n\n
Notes:
\n\n
\n
    \n
  • Either chain_name & network_name parameters or rpc_endpoint parameter are required.
  • \n
  • This constructor prioritizes rpc_endpoint parameter over chain_name & network_name parameters when configuring rpc_endpoint.
  • \n
\n
\n\n
Arguments:
\n\n
    \n
  • chain_name (str, optional): Chain name
  • \n
  • network_name (str, optional): Network name
  • \n
  • rpc_endpoint (RpcEndpoint, optional): RPC endpoint
  • \n
  • private_key (Bytes32, optional): private key of EOA
  • \n
\n\n
Raises:
\n\n
    \n
  • InvalidBytes32: If the supplied private_key is not in a valid form
  • \n
  • InvalidRpcEndpoint: If the supplied rpc_endpoint is not in a valid form
  • \n
  • NetworkNotSupported: If the specified network is not supported by the SDK
  • \n
  • ValidationError: If pydantic validation fails
  • \n
\n", "signature": "(\tchain_name: ChainName | None = None,\tnetwork_name: str | None = None,\trpc_endpoint: Optional[Annotated[str, AfterValidator(func=<function validate_rpc_endpoint>)]] = None,\tprivate_key: Optional[Annotated[str, AfterValidator(func=<function validate_bytes32>)]] = None)"}, "src.SdkClient.w3": {"fullname": "src.SdkClient.w3", "modulename": "src", "qualname": "SdkClient.w3", "kind": "variable", "doc": "

Web3: Configured web3 instance

\n"}, "src.SdkClient.rpc_endpoint": {"fullname": "src.SdkClient.rpc_endpoint", "modulename": "src", "qualname": "SdkClient.rpc_endpoint", "kind": "variable", "doc": "

str: RPC endpoint

\n"}, "src.SdkClient.account": {"fullname": "src.SdkClient.account", "modulename": "src", "qualname": "SdkClient.account", "kind": "variable", "doc": "

LocalAccount | None: Account instance

\n"}, "src.SdkClient.set_default_provider": {"fullname": "src.SdkClient.set_default_provider", "modulename": "src", "qualname": "SdkClient.set_default_provider", "kind": "function", "doc": "

Set provider using one of the default RPC endpoints.

\n\n
Arguments:
\n\n
    \n
  • chain_name (str): Chain name
  • \n
  • network_name (str): Network name
  • \n
\n\n
Returns:
\n\n
\n

Web3: Configured web3 instance

\n
\n\n
Raises:
\n\n
    \n
  • NetworkNotSupported: If the specified network is not supported by the SDK
  • \n
  • ValidationError: If pydantic validation fails
  • \n
\n", "signature": "(self, chain_name: ChainName, network_name: str) -> web3.main.Web3:", "funcdef": "def"}, "src.SdkClient.set_custom_provider": {"fullname": "src.SdkClient.set_custom_provider", "modulename": "src", "qualname": "SdkClient.set_custom_provider", "kind": "function", "doc": "

Set provider using a custom RPC endpoint.

\n\n
Arguments:
\n\n
    \n
  • rpc_endpoint (RpcEndpoint): Custom RPC endpoint
  • \n
\n\n
Returns:
\n\n
\n

Web3: Configured web3 instance

\n
\n\n
Raises:
\n\n
    \n
  • InvalidRpcEndpoint: If the supplied rpc_endpoint is not in a valid form
  • \n
\n", "signature": "(\tself,\trpc_endpoint: Annotated[str, AfterValidator(func=<function validate_rpc_endpoint>)]) -> web3.main.Web3:", "funcdef": "def"}, "src.SdkClient.set_account": {"fullname": "src.SdkClient.set_account", "modulename": "src", "qualname": "SdkClient.set_account", "kind": "function", "doc": "

Set account with a private key.

\n\n
Notes:
\n\n
\n

If private_key parameter is set to None, this method removes account from the configured web3 instance.

\n
\n\n
Arguments:
\n\n
    \n
  • private_key (Bytes32, optional): Private key of account
  • \n
\n\n
Returns:
\n\n
\n

LocalAccount | None: Configured account instance

\n
\n\n
Raises:
\n\n
    \n
  • InvalidBytes32: If the supplied private_key is not in a valid form
  • \n
\n", "signature": "(\tself,\tprivate_key: Optional[Annotated[str, AfterValidator(func=<function validate_bytes32>)]]) -> eth_account.signers.local.LocalAccount | None:", "funcdef": "def"}, "src.SdkClient.get_account_address": {"fullname": "src.SdkClient.get_account_address", "modulename": "src", "qualname": "SdkClient.get_account_address", "kind": "function", "doc": "

Get address of the configured account.

\n\n
Returns:
\n\n
\n

ChecksumAddress: Public address of account

\n
\n\n
Raises:
\n\n
    \n
  • AccountNotInitialized: If account is not initialized
  • \n
\n", "signature": "(\tself) -> Annotated[str, AfterValidator(func=<function validate_checksum_address at 0x1086211c0>)]:", "funcdef": "def"}, "src.JPYC": {"fullname": "src.JPYC", "modulename": "src", "qualname": "JPYC", "kind": "class", "doc": "

Implementation of IJPYC.

\n", "bases": "src.interfaces.jpyc.IJPYC"}, "src.JPYC.__init__": {"fullname": "src.JPYC.__init__", "modulename": "src", "qualname": "JPYC.__init__", "kind": "function", "doc": "

Constructor that initializes JPYC client.

\n\n
Notes:
\n\n
\n
    \n
  • If client parameter is configured to use localhost network, this deploys JPYC contracts to localhost network, initializes it, and sets its address to address attribute.
  • \n
  • If contract_address is supplied, this configures contract instance with that address.
  • \n
\n
\n\n
Arguments:
\n\n
    \n
  • client (SdkClient): Configured SDK client
  • \n
  • contract_version (ContractVersion): Contract version
  • \n
  • contract_address (EthChecksumAddress, optional): Contract address
  • \n
\n", "signature": "(\tclient: src.client.SdkClient,\tcontract_version: ContractVersion = '2',\tcontract_address: Optional[eth_typing.evm.ChecksumAddress] = None)"}, "src.JPYC.client": {"fullname": "src.JPYC.client", "modulename": "src", "qualname": "JPYC.client", "kind": "variable", "doc": "

ISdkClient: Configured SDK client

\n"}, "src.JPYC.contract": {"fullname": "src.JPYC.contract", "modulename": "src", "qualname": "JPYC.contract", "kind": "variable", "doc": "

Contract: Configured contract instance

\n"}, "src.JPYC.is_minter": {"fullname": "src.JPYC.is_minter", "modulename": "src", "qualname": "JPYC.is_minter", "kind": "function", "doc": "

Call isMinter function.

\n\n
Arguments:
\n\n
    \n
  • account (ChecksumAddress): Account address
  • \n
\n\n
Returns:
\n\n
\n

bool: True if account is a minter, false otherwise

\n
\n\n
Raises:
\n\n
    \n
  • InvalidChecksumAddress: If supplied account is not in a valid form
  • \n
\n", "signature": "(\tself,\taccount: Annotated[str, AfterValidator(func=<function validate_checksum_address>)]) -> bool:", "funcdef": "def"}, "src.JPYC.minter_allowance": {"fullname": "src.JPYC.minter_allowance", "modulename": "src", "qualname": "JPYC.minter_allowance", "kind": "function", "doc": "

The type of the None singleton.

\n", "signature": "(*args, **kwargs):", "funcdef": "def"}, "src.JPYC.total_supply": {"fullname": "src.JPYC.total_supply", "modulename": "src", "qualname": "JPYC.total_supply", "kind": "function", "doc": "

The type of the None singleton.

\n", "signature": "(*args, **kwargs):", "funcdef": "def"}, "src.JPYC.balance_of": {"fullname": "src.JPYC.balance_of", "modulename": "src", "qualname": "JPYC.balance_of", "kind": "function", "doc": "

The type of the None singleton.

\n", "signature": "(*args, **kwargs):", "funcdef": "def"}, "src.JPYC.allowance": {"fullname": "src.JPYC.allowance", "modulename": "src", "qualname": "JPYC.allowance", "kind": "function", "doc": "

The type of the None singleton.

\n", "signature": "(*args, **kwargs):", "funcdef": "def"}, "src.JPYC.nonces": {"fullname": "src.JPYC.nonces", "modulename": "src", "qualname": "JPYC.nonces", "kind": "function", "doc": "

Call nonces function.

\n\n
Arguments:
\n\n
    \n
  • owner (ChecksumAddress): Owner address
  • \n
\n\n
Returns:
\n\n
\n

Uint256: Nonce for EIP2612's permit.

\n
\n\n
Raises:
\n\n
    \n
  • InvalidChecksumAddress: If supplied owner is not in a valid form
  • \n
\n", "signature": "(\tself,\towner: Annotated[str, AfterValidator(func=<function validate_checksum_address>)]) -> Annotated[int, AfterValidator(func=<function validate_uint256 at 0x1086214e0>)]:", "funcdef": "def"}, "src.JPYC.configure_minter": {"fullname": "src.JPYC.configure_minter", "modulename": "src", "qualname": "JPYC.configure_minter", "kind": "function", "doc": "

Call configureMinter function.

\n\n
Arguments:
\n\n
    \n
  • minter (ChecksumAddress): Minter address
  • \n
  • minter_allowed_amount (Uint256): Minter allowance
  • \n
\n\n
Returns:
\n\n
\n

Bytes32: Transaction hash

\n
\n\n
Raises:
\n\n
    \n
  • AccountNotInitialized: If account is not initialized
  • \n
  • InvalidChecksumAddress: If supplied minter is not in a valid form
  • \n
  • InvalidUint256: If supplied minter_allowed_amount is not in a valid form
  • \n
  • TransactionFailed: If transaction fails
  • \n
  • TransactionSimulationFailed: If transaction simulation fails
  • \n
\n", "signature": "(\tself,\tminter: Annotated[str, AfterValidator(func=<function validate_checksum_address>)],\tminter_allowed_amount: Annotated[int, AfterValidator(func=<function validate_uint256>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]:", "funcdef": "def"}, "src.JPYC.mint": {"fullname": "src.JPYC.mint", "modulename": "src", "qualname": "JPYC.mint", "kind": "function", "doc": "

Call mint function.

\n\n
Arguments:
\n\n
    \n
  • to (ChecksumAddress): Receiver address
  • \n
  • amount (Uint256): Amount of tokens to mint
  • \n
\n\n
Returns:
\n\n
\n

Bytes32: Transaction hash

\n
\n\n
Raises:
\n\n
    \n
  • AccountNotInitialized: If account is not initialized
  • \n
  • InvalidChecksumAddress: If supplied to is not in a valid form
  • \n
  • InvalidUint256: If supplied amount is not in a valid form
  • \n
  • TransactionFailed: If transaction fails
  • \n
  • TransactionSimulationFailed: If transaction simulation fails
  • \n
\n", "signature": "(\tself,\tto: Annotated[str, AfterValidator(func=<function validate_checksum_address>)],\tamount: Annotated[int, AfterValidator(func=<function validate_uint256>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]:", "funcdef": "def"}, "src.JPYC.transfer": {"fullname": "src.JPYC.transfer", "modulename": "src", "qualname": "JPYC.transfer", "kind": "function", "doc": "

Call transfer function.

\n\n
Arguments:
\n\n
    \n
  • to (ChecksumAddress): Receiver address
  • \n
  • value (Uint256): Amount of tokens to transfer
  • \n
\n\n
Returns:
\n\n
\n

Bytes32: Transaction hash

\n
\n\n
Raises:
\n\n
    \n
  • AccountNotInitialized: If account is not initialized
  • \n
  • InvalidChecksumAddress: If supplied to is not in a valid form
  • \n
  • InvalidUint256: If supplied value is not in a valid form
  • \n
  • TransactionFailed: If transaction fails
  • \n
  • TransactionSimulationFailed: If transaction simulation fails
  • \n
\n", "signature": "(\tself,\tto: Annotated[str, AfterValidator(func=<function validate_checksum_address>)],\tvalue: Annotated[int, AfterValidator(func=<function validate_uint256>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]:", "funcdef": "def"}, "src.JPYC.transfer_from": {"fullname": "src.JPYC.transfer_from", "modulename": "src", "qualname": "JPYC.transfer_from", "kind": "function", "doc": "

Call transferFrom function.

\n\n
Arguments:
\n\n
    \n
  • from_ (ChecksumAddress): Owner address
  • \n
  • to (ChecksumAddress): Receiver address
  • \n
  • value (Uint256): Amount of tokens to transfer
  • \n
\n\n
Returns:
\n\n
\n

Bytes32: Transaction hash

\n
\n\n
Raises:
\n\n
    \n
  • AccountNotInitialized: If account is not initialized
  • \n
  • InvalidChecksumAddress: If supplied from_ or to is not in a valid form
  • \n
  • InvalidUint256: If supplied value is not in a valid form
  • \n
  • TransactionFailed: If transaction fails
  • \n
  • TransactionSimulationFailed: If transaction simulation fails
  • \n
\n", "signature": "(\tself,\tfrom_: Annotated[str, AfterValidator(func=<function validate_checksum_address>)],\tto: Annotated[str, AfterValidator(func=<function validate_checksum_address>)],\tvalue: Annotated[int, AfterValidator(func=<function validate_uint256>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]:", "funcdef": "def"}, "src.JPYC.transfer_with_authorization": {"fullname": "src.JPYC.transfer_with_authorization", "modulename": "src", "qualname": "JPYC.transfer_with_authorization", "kind": "function", "doc": "

Call transferWithAuthorization function.

\n\n
Arguments:
\n\n
    \n
  • from_ (ChecksumAddress): Owner address
  • \n
  • to (ChecksumAddress): Receiver allowance
  • \n
  • value (Uint256): Amount of tokens to transfer
  • \n
  • valid_after (Uint256): Unix time when transaction becomes valid
  • \n
  • valid_before (Uint256): Unix time when transaction becomes invalid
  • \n
  • nonce (Bytes32): Unique nonce
  • \n
  • v (Uint8): v of ECDSA
  • \n
  • r (Bytes32): r of ECDSA
  • \n
  • s (Bytes32): s of ECDSA
  • \n
\n\n
Returns:
\n\n
\n

Bytes32: Transaction hash

\n
\n\n
Raises:
\n\n
    \n
  • AccountNotInitialized: If account is not initialized
  • \n
  • InvalidBytes32: If supplied nonce or r or s is not in a valid form
  • \n
  • InvalidChecksumAddress: If supplied from_ or to is not in a valid form
  • \n
  • InvalidUint256: If supplied value or valid_after or valid_before is not in a valid form
  • \n
  • InvalidUint8: If supplied v is not in a valid form
  • \n
  • TransactionFailed: If transaction fails
  • \n
  • TransactionSimulationFailed: If transaction simulation fails
  • \n
\n", "signature": "(\tself,\tfrom_: Annotated[str, AfterValidator(func=<function validate_checksum_address>)],\tto: Annotated[str, AfterValidator(func=<function validate_checksum_address>)],\tvalue: Annotated[int, AfterValidator(func=<function validate_uint256>)],\tvalid_after: Annotated[int, AfterValidator(func=<function validate_uint256>)],\tvalid_before: Annotated[int, AfterValidator(func=<function validate_uint256>)],\tnonce: Annotated[str, AfterValidator(func=<function validate_bytes32>)],\tv: Annotated[int, AfterValidator(func=<function validate_uint8>)],\tr: Annotated[str, AfterValidator(func=<function validate_bytes32>)],\ts: Annotated[str, AfterValidator(func=<function validate_bytes32>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]:", "funcdef": "def"}, "src.JPYC.receive_with_authorization": {"fullname": "src.JPYC.receive_with_authorization", "modulename": "src", "qualname": "JPYC.receive_with_authorization", "kind": "function", "doc": "

Call receiveWithAuthorization function.

\n\n
Arguments:
\n\n
    \n
  • from_ (ChecksumAddress): Owner address
  • \n
  • to (ChecksumAddress): Receiver allowance
  • \n
  • value (Uint256): Amount of tokens to transfer
  • \n
  • valid_after (Uint256): Unix time when transaction becomes valid
  • \n
  • valid_before (Uint256): Unix time when transaction becomes invalid
  • \n
  • nonce (Bytes32): Unique nonce
  • \n
  • v (Uint8): v of ECDSA
  • \n
  • r (Bytes32): r of ECDSA
  • \n
  • s (Bytes32): s of ECDSA
  • \n
\n\n
Returns:
\n\n
\n

Bytes32: Transaction hash

\n
\n\n
Raises:
\n\n
    \n
  • AccountNotInitialized: If account is not initialized
  • \n
  • InvalidBytes32: If supplied nonce or r or s is not in a valid form
  • \n
  • InvalidChecksumAddress: If supplied from_ or to is not in a valid form
  • \n
  • InvalidUint256: If supplied value or valid_after or valid_before is not in a valid form
  • \n
  • InvalidUint8: If supplied v is not in a valid form
  • \n
  • TransactionFailed: If transaction fails
  • \n
  • TransactionSimulationFailed: If transaction simulation fails
  • \n
\n", "signature": "(\tself,\tfrom_: Annotated[str, AfterValidator(func=<function validate_checksum_address>)],\tto: Annotated[str, AfterValidator(func=<function validate_checksum_address>)],\tvalue: Annotated[int, AfterValidator(func=<function validate_uint256>)],\tvalid_after: Annotated[int, AfterValidator(func=<function validate_uint256>)],\tvalid_before: Annotated[int, AfterValidator(func=<function validate_uint256>)],\tnonce: Annotated[str, AfterValidator(func=<function validate_bytes32>)],\tv: Annotated[int, AfterValidator(func=<function validate_uint8>)],\tr: Annotated[str, AfterValidator(func=<function validate_bytes32>)],\ts: Annotated[str, AfterValidator(func=<function validate_bytes32>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]:", "funcdef": "def"}, "src.JPYC.cancel_authorization": {"fullname": "src.JPYC.cancel_authorization", "modulename": "src", "qualname": "JPYC.cancel_authorization", "kind": "function", "doc": "

Call cancelAuthorization function.

\n\n
Arguments:
\n\n
    \n
  • authorizer (ChecksumAddress): Owner address
  • \n
  • nonce (Bytes32): Unique nonce
  • \n
  • v (Uint8): v of ECDSA
  • \n
  • r (Bytes32): r of ECDSA
  • \n
  • s (Bytes32): s of ECDSA
  • \n
\n\n
Returns:
\n\n
\n

Bytes32: Transaction hash

\n
\n\n
Raises:
\n\n
    \n
  • AccountNotInitialized: If account is not initialized
  • \n
  • InvalidBytes32: If supplied nonce or r or s is not in a valid form
  • \n
  • InvalidChecksumAddress: If supplied authorizer is not in a valid form
  • \n
  • InvalidUint8: If supplied v is not in a valid form
  • \n
  • TransactionFailed: If transaction fails
  • \n
  • TransactionSimulationFailed: If transaction simulation fails
  • \n
\n", "signature": "(\tself,\tauthorizer: Annotated[str, AfterValidator(func=<function validate_checksum_address>)],\tnonce: Annotated[str, AfterValidator(func=<function validate_bytes32>)],\tv: Annotated[int, AfterValidator(func=<function validate_uint8>)],\tr: Annotated[str, AfterValidator(func=<function validate_bytes32>)],\ts: Annotated[str, AfterValidator(func=<function validate_bytes32>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]:", "funcdef": "def"}, "src.JPYC.approve": {"fullname": "src.JPYC.approve", "modulename": "src", "qualname": "JPYC.approve", "kind": "function", "doc": "

Call approve function.

\n\n
Arguments:
\n\n
    \n
  • spender (ChecksumAddress): Spender address
  • \n
  • value (Uint256): Amount of allowance
  • \n
\n\n
Returns:
\n\n
\n

Bytes32: Transaction hash

\n
\n\n
Raises:
\n\n
    \n
  • AccountNotInitialized: If account is not initialized
  • \n
  • InvalidChecksumAddress: If supplied spender is not in a valid form
  • \n
  • InvalidUint256: If supplied value is not in a valid form
  • \n
  • TransactionFailed: If transaction fails
  • \n
  • TransactionSimulationFailed: If transaction simulation fails
  • \n
\n", "signature": "(\tself,\tspender: Annotated[str, AfterValidator(func=<function validate_checksum_address>)],\tvalue: Annotated[int, AfterValidator(func=<function validate_uint256>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]:", "funcdef": "def"}, "src.JPYC.increase_allowance": {"fullname": "src.JPYC.increase_allowance", "modulename": "src", "qualname": "JPYC.increase_allowance", "kind": "function", "doc": "

Call increaseAllowance function.

\n\n
Arguments:
\n\n
    \n
  • spender (ChecksumAddress): Spender address
  • \n
  • increment (Uint256): Amount of allowance to increase
  • \n
\n\n
Returns:
\n\n
\n

Bytes32: Transaction hash

\n
\n\n
Raises:
\n\n
    \n
  • AccountNotInitialized: If account is not initialized
  • \n
  • InvalidChecksumAddress: If supplied spender is not in a valid form
  • \n
  • InvalidUint256: If supplied increment is not in a valid form
  • \n
  • TransactionFailed: If transaction fails
  • \n
  • TransactionSimulationFailed: If transaction simulation fails
  • \n
\n", "signature": "(\tself,\tspender: Annotated[str, AfterValidator(func=<function validate_checksum_address>)],\tincrement: Annotated[int, AfterValidator(func=<function validate_uint256>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]:", "funcdef": "def"}, "src.JPYC.decrease_allowance": {"fullname": "src.JPYC.decrease_allowance", "modulename": "src", "qualname": "JPYC.decrease_allowance", "kind": "function", "doc": "

Call decreaseAllowance function.

\n\n
Arguments:
\n\n
    \n
  • spender (ChecksumAddress): Spender address
  • \n
  • decrement (Uint256): Amount of allowance to decrease
  • \n
\n\n
Returns:
\n\n
\n

Bytes32: Transaction hash

\n
\n\n
Raises:
\n\n
    \n
  • AccountNotInitialized: If account is not initialized
  • \n
  • InvalidChecksumAddress: If supplied spender is not in a valid form
  • \n
  • InvalidUint256: If supplied decrement is not in a valid form
  • \n
  • TransactionFailed: If transaction fails
  • \n
  • TransactionSimulationFailed: If transaction simulation fails
  • \n
\n", "signature": "(\tself,\tspender: Annotated[str, AfterValidator(func=<function validate_checksum_address>)],\tdecrement: Annotated[int, AfterValidator(func=<function validate_uint256>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]:", "funcdef": "def"}, "src.JPYC.permit": {"fullname": "src.JPYC.permit", "modulename": "src", "qualname": "JPYC.permit", "kind": "function", "doc": "

Call permit function.

\n\n
Arguments:
\n\n
    \n
  • owner (ChecksumAddress): Owner address
  • \n
  • spender (ChecksumAddress): Spender address
  • \n
  • value (Uint256): Amount of allowance
  • \n
  • deadline (Uint256): Unix time when transaction becomes invalid
  • \n
  • v (Uint8): v of ECDSA
  • \n
  • r (Bytes32): r of ECDSA
  • \n
  • s (Bytes32): s of ECDSA
  • \n
\n\n
Returns:
\n\n
\n

Bytes32: Transaction hash

\n
\n\n
Raises:
\n\n
    \n
  • AccountNotInitialized: If account is not initialized
  • \n
  • InvalidBytes32: If supplied r or s is not in a valid form
  • \n
  • InvalidChecksumAddress: If supplied owner or spender is not in a valid form
  • \n
  • InvalidUint256: If supplied value or deadline is not in a valid form
  • \n
  • InvalidUint8: If supplied v is not in a valid form
  • \n
  • TransactionFailed: If transaction fails
  • \n
  • TransactionSimulationFailed: If transaction simulation fails
  • \n
\n", "signature": "(\tself,\towner: Annotated[str, AfterValidator(func=<function validate_checksum_address>)],\tspender: Annotated[str, AfterValidator(func=<function validate_checksum_address>)],\tvalue: Annotated[int, AfterValidator(func=<function validate_uint256>)],\tdeadline: Annotated[int, AfterValidator(func=<function validate_uint256>)],\tv: Annotated[int, AfterValidator(func=<function validate_uint8>)],\tr: Annotated[str, AfterValidator(func=<function validate_bytes32>)],\ts: Annotated[str, AfterValidator(func=<function validate_bytes32>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]:", "funcdef": "def"}, "src.utils": {"fullname": "src.utils", "modulename": "src.utils", "kind": "module", "doc": "

\n"}, "src.utils.get_proxy_address": {"fullname": "src.utils.get_proxy_address", "modulename": "src.utils", "qualname": "get_proxy_address", "kind": "function", "doc": "

Get proxy address from the specified version.

\n\n
Note:
\n\n
\n

Default address should be the address of the latest version (e.g., v2 as of May 2025).

\n
\n\n
Arguments:
\n\n
    \n
  • contract_version (ContractVersion): Contract version
  • \n
\n\n
Returns:
\n\n
\n

ChecksumAddress: Checksum address of proxy contract

\n
\n", "signature": "(contract_version: ContractVersion) -> eth_typing.evm.ChecksumAddress:", "funcdef": "def"}, "src.utils.get_artifacts": {"fullname": "src.utils.get_artifacts", "modulename": "src.utils", "qualname": "get_artifacts", "kind": "function", "doc": "

Get contract artifacts from the specified file path.

\n\n
Arguments:
\n\n
    \n
  • file_path (Path): absolute path of artifacts file
  • \n
  • artifact_type (ArtifactType): type of artifacts
  • \n
\n\n
Returns:
\n\n
\n

Any: Artifacts of contracts

\n
\n", "signature": "(file_path: pathlib._local.Path, artifact_type: ArtifactType) -> Any:", "funcdef": "def"}, "src.utils.resolve_artifacts_file_path": {"fullname": "src.utils.resolve_artifacts_file_path", "modulename": "src.utils", "qualname": "resolve_artifacts_file_path", "kind": "function", "doc": "

Resolve the path of artifacts file from the specified contract version.

\n\n
Arguments:
\n\n
    \n
  • contract_version (ContractVersion): Contract version
  • \n
\n\n
Returns:
\n\n
\n

Path: Absolute path of artifacts file

\n
\n", "signature": "(contract_version: ContractVersion) -> pathlib._local.Path:", "funcdef": "def"}, "src.utils.enumerate_supported_networks": {"fullname": "src.utils.enumerate_supported_networks", "modulename": "src.utils", "qualname": "enumerate_supported_networks", "kind": "function", "doc": "

Enumerate all the supported networks.

\n\n
Returns:
\n\n
\n

str: supported networks

\n
\n", "signature": "() -> str:", "funcdef": "def"}, "src.utils.get_default_rpc_endpoint": {"fullname": "src.utils.get_default_rpc_endpoint", "modulename": "src.utils", "qualname": "get_default_rpc_endpoint", "kind": "function", "doc": "

Get the default RPC endpoint for the specified network.

\n\n
Arguments:
\n\n
    \n
  • chain_name (ChainName, optional): Chain name
  • \n
  • network_name (str, optional): Network name
  • \n
\n\n
Returns:
\n\n
\n

RpcEndpoint: RPC endpoint

\n
\n\n
Raises:
\n\n
    \n
  • NetworkNotSupported: If the specified network is not supported by the SDK
  • \n
\n", "signature": "(\tchain_name: ChainName | None,\tnetwork_name: str | None) -> Annotated[str, AfterValidator(func=<function validate_rpc_endpoint at 0x108621620>)]:", "funcdef": "def"}, "src.utils.SUPPORTED_CHAINS": {"fullname": "src.utils.SUPPORTED_CHAINS", "modulename": "src.utils", "qualname": "SUPPORTED_CHAINS", "kind": "variable", "doc": "

\n", "default_value": "{'ethereum': {'mainnet': {'id': 1, 'name': 'Ethereum Mainnet', 'rpc_endpoints': ['https://ethereum-rpc.publicnode.com']}, 'sepolia': {'id': 11155111, 'name': 'Ethereum Sepolia Testnet', 'rpc_endpoints': ['https://ethereum-sepolia-rpc.publicnode.com']}}, 'polygon': {'mainnet': {'id': 137, 'name': 'Polygon Mainnet', 'rpc_endpoints': ['https://polygon-rpc.com']}, 'amoy': {'id': 80002, 'name': 'Polygon Amoy Testnet', 'rpc_endpoints': ['https://rpc-amoy.polygon.technology']}}, 'gnosis': {'mainnet': {'id': 100, 'name': 'Gnosis Chain', 'rpc_endpoints': ['https://rpc.gnosischain.com']}, 'chiado': {'id': 10200, 'name': 'Gnosis Chiado Testnet', 'rpc_endpoints': ['https://rpc.chiadochain.net']}}, 'avalanche': {'mainnet': {'id': 43114, 'name': 'Avalanche C-Chain', 'rpc_endpoints': ['https://api.avax.network/ext/bc/C/rpc']}, 'fuji': {'id': 43113, 'name': 'Avalanche Fuji Testnet', 'rpc_endpoints': ['https://api.avax-test.network/ext/bc/C/rpc']}}, 'astar': {'mainnet': {'id': 592, 'name': 'Astar Network', 'rpc_endpoints': ['https://astar.public.blastapi.io']}}, 'shiden': {'mainnet': {'id': 336, 'name': 'Shiden Network', 'rpc_endpoints': ['https://shiden.public.blastapi.io']}}, 'localhost': {'devnet': {'id': 31337, 'name': 'Localhost Network', 'rpc_endpoints': ['http://127.0.0.1:8545/']}}}"}, "src.utils.POA_MIDDLEWARE": {"fullname": "src.utils.POA_MIDDLEWARE", "modulename": "src.utils", "qualname": "POA_MIDDLEWARE", "kind": "variable", "doc": "

\n", "default_value": "'poa_middleware'"}, "src.utils.SIGN_MIDDLEWARE": {"fullname": "src.utils.SIGN_MIDDLEWARE", "modulename": "src.utils", "qualname": "SIGN_MIDDLEWARE", "kind": "variable", "doc": "

\n", "default_value": "'sign_middleware'"}, "src.utils.UINT_MIN": {"fullname": "src.utils.UINT_MIN", "modulename": "src.utils", "qualname": "UINT_MIN", "kind": "variable", "doc": "

\n", "default_value": "0"}, "src.utils.UINT256_MAX": {"fullname": "src.utils.UINT256_MAX", "modulename": "src.utils", "qualname": "UINT256_MAX", "kind": "variable", "doc": "

\n", "default_value": "115792089237316195423570985008687907853269984665640564039457584007913129639935"}, "src.utils.UINT8_MAX": {"fullname": "src.utils.UINT8_MAX", "modulename": "src.utils", "qualname": "UINT8_MAX", "kind": "variable", "doc": "

\n", "default_value": "255"}, "src.utils.remove_decimals": {"fullname": "src.utils.remove_decimals", "modulename": "src.utils", "qualname": "remove_decimals", "kind": "function", "doc": "

Remove decimals.

\n\n
Arguments:
\n\n
    \n
  • value (Uint256 | Decimal): Value in ether
  • \n
\n\n
Returns:
\n\n
\n

Uint256: Value in wei

\n
\n", "signature": "(\tvalue: Union[Annotated[int, AfterValidator(func=<function validate_uint256>)], decimal.Decimal]) -> Annotated[int, AfterValidator(func=<function validate_uint256 at 0x1086214e0>)]:", "funcdef": "def"}, "src.utils.restore_decimals": {"fullname": "src.utils.restore_decimals", "modulename": "src.utils", "qualname": "restore_decimals", "kind": "function", "doc": "

Decorator to restore decimals.

\n", "signature": "(func):", "funcdef": "def"}, "src.utils.AccountNotInitialized": {"fullname": "src.utils.AccountNotInitialized", "modulename": "src.utils", "qualname": "AccountNotInitialized", "kind": "class", "doc": "

Raised when account is not initialized or hoisted to web3 instance.

\n", "bases": "src.utils.errors.JpycSdkError"}, "src.utils.AccountNotInitialized.code": {"fullname": "src.utils.AccountNotInitialized.code", "modulename": "src.utils", "qualname": "AccountNotInitialized.code", "kind": "variable", "doc": "

int: Custom error code

\n", "default_value": "101"}, "src.utils.InvalidBytes32": {"fullname": "src.utils.InvalidBytes32", "modulename": "src.utils", "qualname": "InvalidBytes32", "kind": "class", "doc": "

Raised when the given byte string is not a valid bytes32.

\n", "bases": "src.utils.errors.JpycSdkError, builtins.TypeError"}, "src.utils.InvalidBytes32.__init__": {"fullname": "src.utils.InvalidBytes32.__init__", "modulename": "src.utils", "qualname": "InvalidBytes32.__init__", "kind": "function", "doc": "

\n", "signature": "(message_: str)"}, "src.utils.InvalidBytes32.code": {"fullname": "src.utils.InvalidBytes32.code", "modulename": "src.utils", "qualname": "InvalidBytes32.code", "kind": "variable", "doc": "

int: Custom error code

\n", "default_value": "203"}, "src.utils.InvalidChecksumAddress": {"fullname": "src.utils.InvalidChecksumAddress", "modulename": "src.utils", "qualname": "InvalidChecksumAddress", "kind": "class", "doc": "

Raised when the given address is not a valid checksum address.

\n", "bases": "src.utils.errors.JpycSdkError, builtins.TypeError"}, "src.utils.InvalidChecksumAddress.__init__": {"fullname": "src.utils.InvalidChecksumAddress.__init__", "modulename": "src.utils", "qualname": "InvalidChecksumAddress.__init__", "kind": "function", "doc": "

\n", "signature": "(message_: str)"}, "src.utils.InvalidChecksumAddress.code": {"fullname": "src.utils.InvalidChecksumAddress.code", "modulename": "src.utils", "qualname": "InvalidChecksumAddress.code", "kind": "variable", "doc": "

int: Custom error code

\n", "default_value": "200"}, "src.utils.InvalidUint8": {"fullname": "src.utils.InvalidUint8", "modulename": "src.utils", "qualname": "InvalidUint8", "kind": "class", "doc": "

Raised when the given integer is not a valid uint8.

\n", "bases": "src.utils.errors.JpycSdkError, builtins.TypeError"}, "src.utils.InvalidUint8.__init__": {"fullname": "src.utils.InvalidUint8.__init__", "modulename": "src.utils", "qualname": "InvalidUint8.__init__", "kind": "function", "doc": "

\n", "signature": "(message_: str)"}, "src.utils.InvalidUint8.code": {"fullname": "src.utils.InvalidUint8.code", "modulename": "src.utils", "qualname": "InvalidUint8.code", "kind": "variable", "doc": "

int: Custom error code

\n", "default_value": "201"}, "src.utils.InvalidUint256": {"fullname": "src.utils.InvalidUint256", "modulename": "src.utils", "qualname": "InvalidUint256", "kind": "class", "doc": "

Raised when the given integer is not a valid uint256.

\n", "bases": "src.utils.errors.JpycSdkError, builtins.TypeError"}, "src.utils.InvalidUint256.__init__": {"fullname": "src.utils.InvalidUint256.__init__", "modulename": "src.utils", "qualname": "InvalidUint256.__init__", "kind": "function", "doc": "

\n", "signature": "(message_: str)"}, "src.utils.InvalidUint256.code": {"fullname": "src.utils.InvalidUint256.code", "modulename": "src.utils", "qualname": "InvalidUint256.code", "kind": "variable", "doc": "

int: Custom error code

\n", "default_value": "202"}, "src.utils.NetworkNotSupported": {"fullname": "src.utils.NetworkNotSupported", "modulename": "src.utils", "qualname": "NetworkNotSupported", "kind": "class", "doc": "

Raised when the specified network is not supported by the SDK.

\n\n
Attributes:
\n\n
    \n
  • chain_name (str): Chain name
  • \n
  • network_name (str): Network name
  • \n
\n", "bases": "src.utils.errors.JpycSdkError"}, "src.utils.NetworkNotSupported.__init__": {"fullname": "src.utils.NetworkNotSupported.__init__", "modulename": "src.utils", "qualname": "NetworkNotSupported.__init__", "kind": "function", "doc": "

\n", "signature": "(chain_name: ChainName, network_name: str)"}, "src.utils.NetworkNotSupported.code": {"fullname": "src.utils.NetworkNotSupported.code", "modulename": "src.utils", "qualname": "NetworkNotSupported.code", "kind": "variable", "doc": "

int: Custom error code

\n", "default_value": "100"}, "src.utils.TransactionFailed": {"fullname": "src.utils.TransactionFailed", "modulename": "src.utils", "qualname": "TransactionFailed", "kind": "class", "doc": "

Raised when transaction fails.

\n\n
Attributes:
\n\n
    \n
  • message (str): Error message
  • \n
\n", "bases": "src.utils.errors.JpycSdkError"}, "src.utils.TransactionFailed.__init__": {"fullname": "src.utils.TransactionFailed.__init__", "modulename": "src.utils", "qualname": "TransactionFailed.__init__", "kind": "function", "doc": "

\n", "signature": "(message_: str)"}, "src.utils.TransactionFailed.code": {"fullname": "src.utils.TransactionFailed.code", "modulename": "src.utils", "qualname": "TransactionFailed.code", "kind": "variable", "doc": "

int: Custom error code

\n", "default_value": "301"}, "src.utils.TransactionSimulationFailed": {"fullname": "src.utils.TransactionSimulationFailed", "modulename": "src.utils", "qualname": "TransactionSimulationFailed", "kind": "class", "doc": "

Raised when transaction simulation fails.

\n\n
Attributes:
\n\n
    \n
  • message (str): Error message
  • \n
\n", "bases": "src.utils.errors.JpycSdkError"}, "src.utils.TransactionSimulationFailed.__init__": {"fullname": "src.utils.TransactionSimulationFailed.__init__", "modulename": "src.utils", "qualname": "TransactionSimulationFailed.__init__", "kind": "function", "doc": "

\n", "signature": "(message_: str)"}, "src.utils.TransactionSimulationFailed.code": {"fullname": "src.utils.TransactionSimulationFailed.code", "modulename": "src.utils", "qualname": "TransactionSimulationFailed.code", "kind": "variable", "doc": "

int: Custom error code

\n", "default_value": "300"}, "src.utils.ArtifactType": {"fullname": "src.utils.ArtifactType", "modulename": "src.utils", "qualname": "ArtifactType", "kind": "variable", "doc": "

\n", "default_value": "Literal['abi', 'bytecode']"}, "src.utils.ChainMetadata": {"fullname": "src.utils.ChainMetadata", "modulename": "src.utils", "qualname": "ChainMetadata", "kind": "variable", "doc": "

\n", "default_value": "dict[ChainName, dict[str, src.utils.types.NetworkMetadata]]"}, "src.utils.ChainName": {"fullname": "src.utils.ChainName", "modulename": "src.utils", "qualname": "ChainName", "kind": "variable", "doc": "

\n", "default_value": "Literal['ethereum', 'polygon', 'gnosis', 'avalanche', 'astar', 'shiden', 'localhost']"}, "src.utils.ContractVersion": {"fullname": "src.utils.ContractVersion", "modulename": "src.utils", "qualname": "ContractVersion", "kind": "variable", "doc": "

\n", "default_value": "Literal['2']"}, "src.utils.Bytes32": {"fullname": "src.utils.Bytes32", "modulename": "src.utils", "qualname": "Bytes32", "kind": "variable", "doc": "

\n", "default_value": "typing.Annotated[str, AfterValidator(func=<function validate_bytes32>)]"}, "src.utils.ChecksumAddress": {"fullname": "src.utils.ChecksumAddress", "modulename": "src.utils", "qualname": "ChecksumAddress", "kind": "variable", "doc": "

\n", "default_value": "typing.Annotated[str, AfterValidator(func=<function validate_checksum_address>)]"}, "src.utils.RpcEndpoint": {"fullname": "src.utils.RpcEndpoint", "modulename": "src.utils", "qualname": "RpcEndpoint", "kind": "variable", "doc": "

\n", "default_value": "typing.Annotated[str, AfterValidator(func=<function validate_rpc_endpoint>)]"}, "src.utils.Uint256": {"fullname": "src.utils.Uint256", "modulename": "src.utils", "qualname": "Uint256", "kind": "variable", "doc": "

\n", "default_value": "typing.Annotated[int, AfterValidator(func=<function validate_uint256>)]"}, "src.utils.Uint8": {"fullname": "src.utils.Uint8", "modulename": "src.utils", "qualname": "Uint8", "kind": "variable", "doc": "

\n", "default_value": "typing.Annotated[int, AfterValidator(func=<function validate_uint8>)]"}}, "docInfo": {"src": {"qualname": 0, "fullname": 1, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "src.SdkClient": {"qualname": 1, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 4, "doc": 5}, "src.SdkClient.__init__": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 165, "bases": 0, "doc": 189}, "src.SdkClient.w3": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 6}, "src.SdkClient.rpc_endpoint": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 5}, "src.SdkClient.account": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 7}, "src.SdkClient.set_default_provider": {"qualname": 4, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 46, "bases": 0, "doc": 83}, "src.SdkClient.set_custom_provider": {"qualname": 4, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 70, "bases": 0, "doc": 66}, "src.SdkClient.set_account": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 85, "bases": 0, "doc": 102}, "src.SdkClient.get_account_address": {"qualname": 4, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 54, "bases": 0, "doc": 40}, "src.JPYC": {"qualname": 1, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 4, "doc": 6}, "src.JPYC.__init__": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 84, "bases": 0, "doc": 106}, "src.JPYC.client": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 6}, "src.JPYC.contract": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 6}, "src.JPYC.is_minter": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 59, "bases": 0, "doc": 67}, "src.JPYC.minter_allowance": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 20, "bases": 0, "doc": 9}, "src.JPYC.total_supply": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 20, "bases": 0, "doc": 9}, "src.JPYC.balance_of": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 20, "bases": 0, "doc": 9}, "src.JPYC.allowance": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 20, "bases": 0, "doc": 9}, "src.JPYC.nonces": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 97, "bases": 0, "doc": 65}, "src.JPYC.configure_minter": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 142, "bases": 0, "doc": 115}, "src.JPYC.mint": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 140, "bases": 0, "doc": 114}, "src.JPYC.transfer": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 140, "bases": 0, "doc": 114}, "src.JPYC.transfer_from": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 185, "bases": 0, "doc": 128}, "src.JPYC.transfer_with_authorization": {"qualname": 4, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 445, "bases": 0, "doc": 245}, "src.JPYC.receive_with_authorization": {"qualname": 4, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 445, "bases": 0, "doc": 245}, "src.JPYC.cancel_authorization": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 269, "bases": 0, "doc": 165}, "src.JPYC.approve": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 140, "bases": 0, "doc": 112}, "src.JPYC.increase_allowance": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 140, "bases": 0, "doc": 114}, "src.JPYC.decrease_allowance": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 140, "bases": 0, "doc": 114}, "src.JPYC.permit": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 356, "bases": 0, "doc": 208}, "src.utils": {"qualname": 0, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "src.utils.get_proxy_address": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 31, "bases": 0, "doc": 69}, "src.utils.get_artifacts": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 42, "bases": 0, "doc": 55}, "src.utils.resolve_artifacts_file_path": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 31, "bases": 0, "doc": 46}, "src.utils.enumerate_supported_networks": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 10, "bases": 0, "doc": 20}, "src.utils.get_default_rpc_endpoint": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 84, "bases": 0, "doc": 75}, "src.utils.SUPPORTED_CHAINS": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 379, "signature": 0, "bases": 0, "doc": 3}, "src.utils.POA_MIDDLEWARE": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 6, "signature": 0, "bases": 0, "doc": 3}, "src.utils.SIGN_MIDDLEWARE": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 6, "signature": 0, "bases": 0, "doc": 3}, "src.utils.UINT_MIN": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "src.utils.UINT256_MAX": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "src.utils.UINT8_MAX": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "src.utils.remove_decimals": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 105, "bases": 0, "doc": 37}, "src.utils.restore_decimals": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 7}, "src.utils.AccountNotInitialized": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 4, "doc": 14}, "src.utils.AccountNotInitialized.code": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 6}, "src.utils.InvalidBytes32": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 6, "doc": 14}, "src.utils.InvalidBytes32.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 15, "bases": 0, "doc": 3}, "src.utils.InvalidBytes32.code": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 6}, "src.utils.InvalidChecksumAddress": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 6, "doc": 14}, "src.utils.InvalidChecksumAddress.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 15, "bases": 0, "doc": 3}, "src.utils.InvalidChecksumAddress.code": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 6}, "src.utils.InvalidUint8": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 6, "doc": 13}, "src.utils.InvalidUint8.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 15, "bases": 0, "doc": 3}, "src.utils.InvalidUint8.code": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 6}, "src.utils.InvalidUint256": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 6, "doc": 13}, "src.utils.InvalidUint256.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 15, "bases": 0, "doc": 3}, "src.utils.InvalidUint256.code": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 6}, "src.utils.NetworkNotSupported": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 4, "doc": 41}, "src.utils.NetworkNotSupported.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 26, "bases": 0, "doc": 3}, "src.utils.NetworkNotSupported.code": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 6}, "src.utils.TransactionFailed": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 4, "doc": 23}, "src.utils.TransactionFailed.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 15, "bases": 0, "doc": 3}, "src.utils.TransactionFailed.code": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 6}, "src.utils.TransactionSimulationFailed": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 4, "doc": 24}, "src.utils.TransactionSimulationFailed.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 15, "bases": 0, "doc": 3}, "src.utils.TransactionSimulationFailed.code": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 6}, "src.utils.ArtifactType": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 8, "signature": 0, "bases": 0, "doc": 3}, "src.utils.ChainMetadata": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 6, "signature": 0, "bases": 0, "doc": 3}, "src.utils.ChainName": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 23, "signature": 0, "bases": 0, "doc": 3}, "src.utils.ContractVersion": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 5, "signature": 0, "bases": 0, "doc": 3}, "src.utils.Bytes32": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 10, "signature": 0, "bases": 0, "doc": 3}, "src.utils.ChecksumAddress": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 11, "signature": 0, "bases": 0, "doc": 3}, "src.utils.RpcEndpoint": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 11, "signature": 0, "bases": 0, "doc": 3}, "src.utils.Uint256": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 10, "signature": 0, "bases": 0, "doc": 3}, "src.utils.Uint8": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 10, "signature": 0, "bases": 0, "doc": 3}}, "length": 77, "save": true}, "index": {"qualname": {"root": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}, "src.utils.InvalidBytes32.__init__": {"tf": 1}, "src.utils.InvalidChecksumAddress.__init__": {"tf": 1}, "src.utils.InvalidUint8.__init__": {"tf": 1}, "src.utils.InvalidUint256.__init__": {"tf": 1}, "src.utils.NetworkNotSupported.__init__": {"tf": 1}, "src.utils.TransactionFailed.__init__": {"tf": 1}, "src.utils.TransactionSimulationFailed.__init__": {"tf": 1}}, "df": 9, "s": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient": {"tf": 1}, "src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.w3": {"tf": 1}, "src.SdkClient.rpc_endpoint": {"tf": 1}, "src.SdkClient.account": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1}}, "df": 9}}}}}}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}}, "df": 3}}, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"src.JPYC.total_supply": {"tf": 1}}, "df": 1}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.utils.enumerate_supported_networks": {"tf": 1}, "src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 2}}}}}}}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "n": {"docs": {"src.utils.SIGN_MIDDLEWARE": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}, "src.utils.InvalidBytes32.__init__": {"tf": 1}, "src.utils.InvalidChecksumAddress.__init__": {"tf": 1}, "src.utils.InvalidUint8.__init__": {"tf": 1}, "src.utils.InvalidUint256.__init__": {"tf": 1}, "src.utils.NetworkNotSupported.__init__": {"tf": 1}, "src.utils.TransactionFailed.__init__": {"tf": 1}, "src.utils.TransactionSimulationFailed.__init__": {"tf": 1}}, "df": 9}}, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.increase_allowance": {"tf": 1}}, "df": 1}}}}}}, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"3": {"2": {"docs": {"src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidBytes32.__init__": {"tf": 1}, "src.utils.InvalidBytes32.code": {"tf": 1}}, "df": 3}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidChecksumAddress.__init__": {"tf": 1}, "src.utils.InvalidChecksumAddress.code": {"tf": 1}}, "df": 3}}}}}}}}}}}}}}}, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"2": {"5": {"6": {"docs": {"src.utils.InvalidUint256": {"tf": 1}, "src.utils.InvalidUint256.__init__": {"tf": 1}, "src.utils.InvalidUint256.code": {"tf": 1}}, "df": 3}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "8": {"docs": {"src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint8.__init__": {"tf": 1}, "src.utils.InvalidUint8.code": {"tf": 1}}, "df": 3}, "docs": {}, "df": 0}}}}}}}}}}, "s": {"docs": {"src.JPYC.is_minter": {"tf": 1}}, "df": 1}}, "w": {"3": {"docs": {"src.SdkClient.w3": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}}, "df": 2}}}}, "r": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "c": {"docs": {"src.SdkClient.rpc_endpoint": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 2, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.utils.RpcEndpoint": {"tf": 1}}, "df": 1}}}}}}}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.receive_with_authorization": {"tf": 1}}, "df": 1}}}}}, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.restore_decimals": {"tf": 1}}, "df": 1}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.remove_decimals": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.rpc_endpoint": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 2}}}}}}, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.enumerate_supported_networks": {"tf": 1}}, "df": 1}}}}}}}}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.account": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1}}, "df": 3, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.utils.AccountNotInitialized": {"tf": 1}, "src.utils.AccountNotInitialized.code": {"tf": 1}}, "df": 2}}}}}}}}}}}}}}}}}}}}, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"src.SdkClient.get_account_address": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}}, "df": 2}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.minter_allowance": {"tf": 1}, "src.JPYC.allowance": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}}, "df": 4}}}}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}}, "df": 3}}}}}}}}}}}}, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.approve": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.get_artifacts": {"tf": 1}, "src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 2}, "t": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.ArtifactType": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.set_default_provider": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 2}}}}}, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.decrease_allowance": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.remove_decimals": {"tf": 1}, "src.utils.restore_decimals": {"tf": 1}}, "df": 2}}}}}}}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}}, "df": 2}}}}}, "x": {"docs": {}, "df": 0, "y": {"docs": {"src.utils.get_proxy_address": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.permit": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "a": {"docs": {"src.utils.POA_MIDDLEWARE": {"tf": 1}}, "df": 1}}}, "c": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"src.SdkClient.set_custom_provider": {"tf": 1}}, "df": 1}}}}}, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.client": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.contract": {"tf": 1}}, "df": 1, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.utils.ContractVersion": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.configure_minter": {"tf": 1}}, "df": 1}}}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.AccountNotInitialized.code": {"tf": 1}, "src.utils.InvalidBytes32.code": {"tf": 1}, "src.utils.InvalidChecksumAddress.code": {"tf": 1}, "src.utils.InvalidUint8.code": {"tf": 1}, "src.utils.InvalidUint256.code": {"tf": 1}, "src.utils.NetworkNotSupported.code": {"tf": 1}, "src.utils.TransactionFailed.code": {"tf": 1}, "src.utils.TransactionSimulationFailed.code": {"tf": 1}}, "df": 8}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"src.JPYC.cancel_authorization": {"tf": 1}}, "df": 1}}}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {"src.utils.ChainMetadata": {"tf": 1}}, "df": 1}}}}}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.ChainName": {"tf": 1}}, "df": 1}}}}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.ChecksumAddress": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.get_account_address": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}, "src.utils.get_artifacts": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 4}}}, "j": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "c": {"docs": {"src.JPYC": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}, "src.JPYC.client": {"tf": 1}, "src.JPYC.contract": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.minter_allowance": {"tf": 1}, "src.JPYC.total_supply": {"tf": 1}, "src.JPYC.balance_of": {"tf": 1}, "src.JPYC.allowance": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 21}}}}, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"src.utils.UINT_MIN": {"tf": 1}}, "df": 1, "t": {"docs": {"src.JPYC.mint": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.is_minter": {"tf": 1}, "src.JPYC.minter_allowance": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}}, "df": 3}}}}, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.POA_MIDDLEWARE": {"tf": 1}, "src.utils.SIGN_MIDDLEWARE": {"tf": 1}}, "df": 2}}}}}}}}}, "a": {"docs": {}, "df": 0, "x": {"docs": {"src.utils.UINT256_MAX": {"tf": 1}, "src.utils.UINT8_MAX": {"tf": 1}}, "df": 2}}}, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"src.JPYC.total_supply": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}}, "df": 3}}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.utils.TransactionFailed": {"tf": 1}, "src.utils.TransactionFailed.__init__": {"tf": 1}, "src.utils.TransactionFailed.code": {"tf": 1}}, "df": 3}}}}}}, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.utils.TransactionSimulationFailed": {"tf": 1}, "src.utils.TransactionSimulationFailed.__init__": {"tf": 1}, "src.utils.TransactionSimulationFailed.code": {"tf": 1}}, "df": 3}}}}}}}}}}}}}}}}}}}}}}}}}}}, "b": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.balance_of": {"tf": 1}}, "df": 1}}}}}}, "y": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"3": {"2": {"docs": {"src.utils.Bytes32": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}}}}, "o": {"docs": {}, "df": 0, "f": {"docs": {"src.JPYC.balance_of": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"src.JPYC.nonces": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.enumerate_supported_networks": {"tf": 1}}, "df": 1}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.utils.NetworkNotSupported": {"tf": 1}, "src.utils.NetworkNotSupported.__init__": {"tf": 1}, "src.utils.NetworkNotSupported.code": {"tf": 1}}, "df": 3}}}}}}}}}}}}}}}}}}}, "f": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"src.JPYC.transfer_from": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"2": {"5": {"6": {"docs": {"src.utils.UINT256_MAX": {"tf": 1}, "src.utils.Uint256": {"tf": 1}}, "df": 2}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "8": {"docs": {"src.utils.UINT8_MAX": {"tf": 1}, "src.utils.Uint8": {"tf": 1}}, "df": 2}, "docs": {"src.utils.UINT_MIN": {"tf": 1}}, "df": 1}}}}}}, "fullname": {"root": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}, "src.utils.InvalidBytes32.__init__": {"tf": 1}, "src.utils.InvalidChecksumAddress.__init__": {"tf": 1}, "src.utils.InvalidUint8.__init__": {"tf": 1}, "src.utils.InvalidUint256.__init__": {"tf": 1}, "src.utils.NetworkNotSupported.__init__": {"tf": 1}, "src.utils.TransactionFailed.__init__": {"tf": 1}, "src.utils.TransactionSimulationFailed.__init__": {"tf": 1}}, "df": 9, "s": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {"src": {"tf": 1}, "src.SdkClient": {"tf": 1}, "src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.w3": {"tf": 1}, "src.SdkClient.rpc_endpoint": {"tf": 1}, "src.SdkClient.account": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}, "src.JPYC.client": {"tf": 1}, "src.JPYC.contract": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.minter_allowance": {"tf": 1}, "src.JPYC.total_supply": {"tf": 1}, "src.JPYC.balance_of": {"tf": 1}, "src.JPYC.allowance": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}, "src.utils": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}, "src.utils.get_artifacts": {"tf": 1}, "src.utils.resolve_artifacts_file_path": {"tf": 1}, "src.utils.enumerate_supported_networks": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.SUPPORTED_CHAINS": {"tf": 1}, "src.utils.POA_MIDDLEWARE": {"tf": 1}, "src.utils.SIGN_MIDDLEWARE": {"tf": 1}, "src.utils.UINT_MIN": {"tf": 1}, "src.utils.UINT256_MAX": {"tf": 1}, "src.utils.UINT8_MAX": {"tf": 1}, "src.utils.remove_decimals": {"tf": 1}, "src.utils.restore_decimals": {"tf": 1}, "src.utils.AccountNotInitialized": {"tf": 1}, "src.utils.AccountNotInitialized.code": {"tf": 1}, "src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidBytes32.__init__": {"tf": 1}, "src.utils.InvalidBytes32.code": {"tf": 1}, "src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidChecksumAddress.__init__": {"tf": 1}, "src.utils.InvalidChecksumAddress.code": {"tf": 1}, "src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint8.__init__": {"tf": 1}, "src.utils.InvalidUint8.code": {"tf": 1}, "src.utils.InvalidUint256": {"tf": 1}, "src.utils.InvalidUint256.__init__": {"tf": 1}, "src.utils.InvalidUint256.code": {"tf": 1}, "src.utils.NetworkNotSupported": {"tf": 1}, "src.utils.NetworkNotSupported.__init__": {"tf": 1}, "src.utils.NetworkNotSupported.code": {"tf": 1}, "src.utils.TransactionFailed": {"tf": 1}, "src.utils.TransactionFailed.__init__": {"tf": 1}, "src.utils.TransactionFailed.code": {"tf": 1}, "src.utils.TransactionSimulationFailed": {"tf": 1}, "src.utils.TransactionSimulationFailed.__init__": {"tf": 1}, "src.utils.TransactionSimulationFailed.code": {"tf": 1}, "src.utils.ArtifactType": {"tf": 1}, "src.utils.ChainMetadata": {"tf": 1}, "src.utils.ChainName": {"tf": 1}, "src.utils.ContractVersion": {"tf": 1}, "src.utils.Bytes32": {"tf": 1}, "src.utils.ChecksumAddress": {"tf": 1}, "src.utils.RpcEndpoint": {"tf": 1}, "src.utils.Uint256": {"tf": 1}, "src.utils.Uint8": {"tf": 1}}, "df": 77}}, "d": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient": {"tf": 1}, "src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.w3": {"tf": 1}, "src.SdkClient.rpc_endpoint": {"tf": 1}, "src.SdkClient.account": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1}}, "df": 9}}}}}}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}}, "df": 3}}, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"src.JPYC.total_supply": {"tf": 1}}, "df": 1}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.utils.enumerate_supported_networks": {"tf": 1}, "src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 2}}}}}}}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "n": {"docs": {"src.utils.SIGN_MIDDLEWARE": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}, "src.utils.InvalidBytes32.__init__": {"tf": 1}, "src.utils.InvalidChecksumAddress.__init__": {"tf": 1}, "src.utils.InvalidUint8.__init__": {"tf": 1}, "src.utils.InvalidUint256.__init__": {"tf": 1}, "src.utils.NetworkNotSupported.__init__": {"tf": 1}, "src.utils.TransactionFailed.__init__": {"tf": 1}, "src.utils.TransactionSimulationFailed.__init__": {"tf": 1}}, "df": 9}}, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.increase_allowance": {"tf": 1}}, "df": 1}}}}}}, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"3": {"2": {"docs": {"src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidBytes32.__init__": {"tf": 1}, "src.utils.InvalidBytes32.code": {"tf": 1}}, "df": 3}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidChecksumAddress.__init__": {"tf": 1}, "src.utils.InvalidChecksumAddress.code": {"tf": 1}}, "df": 3}}}}}}}}}}}}}}}, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"2": {"5": {"6": {"docs": {"src.utils.InvalidUint256": {"tf": 1}, "src.utils.InvalidUint256.__init__": {"tf": 1}, "src.utils.InvalidUint256.code": {"tf": 1}}, "df": 3}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "8": {"docs": {"src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint8.__init__": {"tf": 1}, "src.utils.InvalidUint8.code": {"tf": 1}}, "df": 3}, "docs": {}, "df": 0}}}}}}}}}}, "s": {"docs": {"src.JPYC.is_minter": {"tf": 1}}, "df": 1}}, "w": {"3": {"docs": {"src.SdkClient.w3": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}}, "df": 2}}}}, "r": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "c": {"docs": {"src.SdkClient.rpc_endpoint": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 2, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.utils.RpcEndpoint": {"tf": 1}}, "df": 1}}}}}}}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.receive_with_authorization": {"tf": 1}}, "df": 1}}}}}, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.restore_decimals": {"tf": 1}}, "df": 1}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.remove_decimals": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.rpc_endpoint": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 2}}}}}}, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.enumerate_supported_networks": {"tf": 1}}, "df": 1}}}}}}}}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.account": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1}}, "df": 3, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.utils.AccountNotInitialized": {"tf": 1}, "src.utils.AccountNotInitialized.code": {"tf": 1}}, "df": 2}}}}}}}}}}}}}}}}}}}}, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"src.SdkClient.get_account_address": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}}, "df": 2}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.minter_allowance": {"tf": 1}, "src.JPYC.allowance": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}}, "df": 4}}}}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}}, "df": 3}}}}}}}}}}}}, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.approve": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.get_artifacts": {"tf": 1}, "src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 2}, "t": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.ArtifactType": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.set_default_provider": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 2}}}}}, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.decrease_allowance": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.remove_decimals": {"tf": 1}, "src.utils.restore_decimals": {"tf": 1}}, "df": 2}}}}}}}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}}, "df": 2}}}}}, "x": {"docs": {}, "df": 0, "y": {"docs": {"src.utils.get_proxy_address": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.permit": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "a": {"docs": {"src.utils.POA_MIDDLEWARE": {"tf": 1}}, "df": 1}}}, "c": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"src.SdkClient.set_custom_provider": {"tf": 1}}, "df": 1}}}}}, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.client": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.contract": {"tf": 1}}, "df": 1, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.utils.ContractVersion": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.configure_minter": {"tf": 1}}, "df": 1}}}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.AccountNotInitialized.code": {"tf": 1}, "src.utils.InvalidBytes32.code": {"tf": 1}, "src.utils.InvalidChecksumAddress.code": {"tf": 1}, "src.utils.InvalidUint8.code": {"tf": 1}, "src.utils.InvalidUint256.code": {"tf": 1}, "src.utils.NetworkNotSupported.code": {"tf": 1}, "src.utils.TransactionFailed.code": {"tf": 1}, "src.utils.TransactionSimulationFailed.code": {"tf": 1}}, "df": 8}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"src.JPYC.cancel_authorization": {"tf": 1}}, "df": 1}}}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {"src.utils.ChainMetadata": {"tf": 1}}, "df": 1}}}}}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.ChainName": {"tf": 1}}, "df": 1}}}}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.ChecksumAddress": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.get_account_address": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}, "src.utils.get_artifacts": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 4}}}, "j": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "c": {"docs": {"src.JPYC": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}, "src.JPYC.client": {"tf": 1}, "src.JPYC.contract": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.minter_allowance": {"tf": 1}, "src.JPYC.total_supply": {"tf": 1}, "src.JPYC.balance_of": {"tf": 1}, "src.JPYC.allowance": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 21}}}}, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"src.utils.UINT_MIN": {"tf": 1}}, "df": 1, "t": {"docs": {"src.JPYC.mint": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.is_minter": {"tf": 1}, "src.JPYC.minter_allowance": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}}, "df": 3}}}}, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.POA_MIDDLEWARE": {"tf": 1}, "src.utils.SIGN_MIDDLEWARE": {"tf": 1}}, "df": 2}}}}}}}}}, "a": {"docs": {}, "df": 0, "x": {"docs": {"src.utils.UINT256_MAX": {"tf": 1}, "src.utils.UINT8_MAX": {"tf": 1}}, "df": 2}}}, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"src.JPYC.total_supply": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}}, "df": 3}}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.utils.TransactionFailed": {"tf": 1}, "src.utils.TransactionFailed.__init__": {"tf": 1}, "src.utils.TransactionFailed.code": {"tf": 1}}, "df": 3}}}}}}, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.utils.TransactionSimulationFailed": {"tf": 1}, "src.utils.TransactionSimulationFailed.__init__": {"tf": 1}, "src.utils.TransactionSimulationFailed.code": {"tf": 1}}, "df": 3}}}}}}}}}}}}}}}}}}}}}}}}}}}, "b": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.balance_of": {"tf": 1}}, "df": 1}}}}}}, "y": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"3": {"2": {"docs": {"src.utils.Bytes32": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}}}}, "o": {"docs": {}, "df": 0, "f": {"docs": {"src.JPYC.balance_of": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"src.JPYC.nonces": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.enumerate_supported_networks": {"tf": 1}}, "df": 1}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.utils.NetworkNotSupported": {"tf": 1}, "src.utils.NetworkNotSupported.__init__": {"tf": 1}, "src.utils.NetworkNotSupported.code": {"tf": 1}}, "df": 3}}}}}}}}}}}}}}}}}}}, "f": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"src.JPYC.transfer_from": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"src.utils": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}, "src.utils.get_artifacts": {"tf": 1}, "src.utils.resolve_artifacts_file_path": {"tf": 1}, "src.utils.enumerate_supported_networks": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.SUPPORTED_CHAINS": {"tf": 1}, "src.utils.POA_MIDDLEWARE": {"tf": 1}, "src.utils.SIGN_MIDDLEWARE": {"tf": 1}, "src.utils.UINT_MIN": {"tf": 1}, "src.utils.UINT256_MAX": {"tf": 1}, "src.utils.UINT8_MAX": {"tf": 1}, "src.utils.remove_decimals": {"tf": 1}, "src.utils.restore_decimals": {"tf": 1}, "src.utils.AccountNotInitialized": {"tf": 1}, "src.utils.AccountNotInitialized.code": {"tf": 1}, "src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidBytes32.__init__": {"tf": 1}, "src.utils.InvalidBytes32.code": {"tf": 1}, "src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidChecksumAddress.__init__": {"tf": 1}, "src.utils.InvalidChecksumAddress.code": {"tf": 1}, "src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint8.__init__": {"tf": 1}, "src.utils.InvalidUint8.code": {"tf": 1}, "src.utils.InvalidUint256": {"tf": 1}, "src.utils.InvalidUint256.__init__": {"tf": 1}, "src.utils.InvalidUint256.code": {"tf": 1}, "src.utils.NetworkNotSupported": {"tf": 1}, "src.utils.NetworkNotSupported.__init__": {"tf": 1}, "src.utils.NetworkNotSupported.code": {"tf": 1}, "src.utils.TransactionFailed": {"tf": 1}, "src.utils.TransactionFailed.__init__": {"tf": 1}, "src.utils.TransactionFailed.code": {"tf": 1}, "src.utils.TransactionSimulationFailed": {"tf": 1}, "src.utils.TransactionSimulationFailed.__init__": {"tf": 1}, "src.utils.TransactionSimulationFailed.code": {"tf": 1}, "src.utils.ArtifactType": {"tf": 1}, "src.utils.ChainMetadata": {"tf": 1}, "src.utils.ChainName": {"tf": 1}, "src.utils.ContractVersion": {"tf": 1}, "src.utils.Bytes32": {"tf": 1}, "src.utils.ChecksumAddress": {"tf": 1}, "src.utils.RpcEndpoint": {"tf": 1}, "src.utils.Uint256": {"tf": 1}, "src.utils.Uint8": {"tf": 1}}, "df": 46}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"2": {"5": {"6": {"docs": {"src.utils.UINT256_MAX": {"tf": 1}, "src.utils.Uint256": {"tf": 1}}, "df": 2}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "8": {"docs": {"src.utils.UINT8_MAX": {"tf": 1}, "src.utils.Uint8": {"tf": 1}}, "df": 2}, "docs": {"src.utils.UINT_MIN": {"tf": 1}}, "df": 1}}}}}}, "annotation": {"root": {"docs": {}, "df": 0}}, "default_value": {"root": {"0": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.4142135623730951}, "src.utils.UINT_MIN": {"tf": 1}}, "df": 2}, "1": {"0": {"0": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}, "src.utils.NetworkNotSupported.code": {"tf": 1}}, "df": 2}, "1": {"docs": {"src.utils.AccountNotInitialized.code": {"tf": 1}}, "df": 1}, "2": {"0": {"0": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "1": {"1": {"5": {"5": {"1": {"1": {"1": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "5": {"7": {"9": {"2": {"0": {"8": {"9": {"2": {"3": {"7": {"3": {"1": {"6": {"1": {"9": {"5": {"4": {"2": {"3": {"5": {"7": {"0": {"9": {"8": {"5": {"0": {"0": {"8": {"6": {"8": {"7": {"9": {"0": {"7": {"8": {"5": {"3": {"2": {"6": {"9": {"9": {"8": {"4": {"6": {"6": {"5": {"6": {"4": {"0": {"5": {"6": {"4": {"0": {"3": {"9": {"4": {"5": {"7": {"5": {"8": {"4": {"0": {"0": {"7": {"9": {"1": {"3": {"1": {"2": {"9": {"6": {"3": {"9": {"9": {"3": {"5": {"docs": {"src.utils.UINT256_MAX": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "3": {"7": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1, ":": {"8": {"5": {"4": {"5": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}, "2": {"0": {"0": {"docs": {"src.utils.InvalidChecksumAddress.code": {"tf": 1}}, "df": 1}, "1": {"docs": {"src.utils.InvalidUint8.code": {"tf": 1}}, "df": 1}, "2": {"docs": {"src.utils.InvalidUint256.code": {"tf": 1}}, "df": 1}, "3": {"docs": {"src.utils.InvalidBytes32.code": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "5": {"5": {"docs": {"src.utils.UINT8_MAX": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {"src.utils.ContractVersion": {"tf": 1}}, "df": 1}, "3": {"0": {"0": {"docs": {"src.utils.TransactionSimulationFailed.code": {"tf": 1}}, "df": 1}, "1": {"docs": {"src.utils.TransactionFailed.code": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "1": {"3": {"3": {"7": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "3": {"6": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "4": {"3": {"1": {"1": {"3": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}, "4": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "5": {"9": {"2": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "8": {"0": {"0": {"0": {"2": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 9.591663046625438}, "src.utils.POA_MIDDLEWARE": {"tf": 1.4142135623730951}, "src.utils.SIGN_MIDDLEWARE": {"tf": 1.4142135623730951}, "src.utils.ArtifactType": {"tf": 1}, "src.utils.ChainName": {"tf": 1}, "src.utils.ContractVersion": {"tf": 1}, "src.utils.Bytes32": {"tf": 1}, "src.utils.ChecksumAddress": {"tf": 1}, "src.utils.RpcEndpoint": {"tf": 1}, "src.utils.Uint256": {"tf": 1}, "src.utils.Uint8": {"tf": 1}}, "df": 11, "x": {"2": {"7": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 12.083045973594572}, "src.utils.POA_MIDDLEWARE": {"tf": 1.4142135623730951}, "src.utils.SIGN_MIDDLEWARE": {"tf": 1.4142135623730951}, "src.utils.ArtifactType": {"tf": 2}, "src.utils.ChainName": {"tf": 3.7416573867739413}, "src.utils.ContractVersion": {"tf": 1.4142135623730951}}, "df": 6}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.7320508075688772}, "src.utils.ChainName": {"tf": 1}}, "df": 2}}}}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.utils.RpcEndpoint": {"tf": 1}}, "df": 1, "s": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 3.3166247903554}}, "df": 1}}}}}}}}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 2.8284271247461903}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.POA_MIDDLEWARE": {"tf": 1}, "src.utils.SIGN_MIDDLEWARE": {"tf": 1}}, "df": 2}}}}}}}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 3.3166247903554}}, "df": 1}, "o": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.4142135623730951}}, "df": 1}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 3.3166247903554}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "k": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.7320508075688772}}, "df": 1, "/": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "c": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {"src.utils.ChainMetadata": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}, "r": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "c": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 3.7416573867739413}, "src.utils.RpcEndpoint": {"tf": 1}}, "df": 2}}}, "h": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, ":": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}}}}}}}, "r": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "c": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.7320508075688772}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "i": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.4142135623730951}}, "df": 1}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}}}}}, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}}}}}}}}}}, ":": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "/": {"1": {"2": {"7": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}}}}}}, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.4142135623730951}}, "df": 1, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}}, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 2}, "src.utils.ChainName": {"tf": 1}}, "df": 2}}}}}, "a": {"docs": {"src.utils.POA_MIDDLEWARE": {"tf": 1}}, "df": 1}}}, "c": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1, "o": {"docs": {}, "df": 0, "m": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 2}}, "df": 1}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.4142135623730951}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "o": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.4142135623730951}}, "df": 1, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}}}}}}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {"src.utils.ChecksumAddress": {"tf": 1}}, "df": 1}}}}}}}}, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.7320508075688772}}, "df": 1}}}}}}, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.4142135623730951}, "src.utils.ChainName": {"tf": 1}}, "df": 2}}}}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "n": {"docs": {"src.utils.SIGN_MIDDLEWARE": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "c": {"docs": {"src.utils.ChainMetadata": {"tf": 1}}, "df": 1}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 2}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "y": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}}}}}}}}}, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.ChainMetadata": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"src.utils.Bytes32": {"tf": 1}, "src.utils.ChecksumAddress": {"tf": 1}, "src.utils.RpcEndpoint": {"tf": 1}, "src.utils.Uint256": {"tf": 1}, "src.utils.Uint8": {"tf": 1}}, "df": 5}}}}}}, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "y": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.7320508075688772}}, "df": 1}}}, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.7320508075688772}, "src.utils.ChainName": {"tf": 1}}, "df": 2}}}}}}, "x": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.4142135623730951}}, "df": 1}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.4142135623730951}, "src.utils.ChainName": {"tf": 1}}, "df": 2}}}}, "b": {"docs": {}, "df": 0, "i": {"docs": {"src.utils.ArtifactType": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "[": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {"src.utils.Bytes32": {"tf": 1}, "src.utils.ChecksumAddress": {"tf": 1}, "src.utils.RpcEndpoint": {"tf": 1}}, "df": 3}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.utils.Uint256": {"tf": 1}, "src.utils.Uint8": {"tf": 1}}, "df": 2}}}}}}}}}}}}, "f": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"src.utils.Bytes32": {"tf": 1}, "src.utils.ChecksumAddress": {"tf": 1}, "src.utils.RpcEndpoint": {"tf": 1}, "src.utils.Uint256": {"tf": 1}, "src.utils.Uint8": {"tf": 1}}, "df": 5}}}}}}}}}}}}}, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.ChecksumAddress": {"tf": 1}}, "df": 1}}}}}}}, "g": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.7320508075688772}, "src.utils.ChainName": {"tf": 1}}, "df": 2, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}}}}}}}}}}, "t": {"docs": {"src.utils.Bytes32": {"tf": 1}, "src.utils.ChecksumAddress": {"tf": 1}, "src.utils.RpcEndpoint": {"tf": 1}, "src.utils.Uint256": {"tf": 1}, "src.utils.Uint8": {"tf": 1}}, "df": 5}}, "f": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "j": {"docs": {}, "df": 0, "i": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.4142135623730951}}, "df": 1}}, "n": {"docs": {}, "df": 0, "c": {"docs": {"src.utils.Bytes32": {"tf": 1}, "src.utils.ChecksumAddress": {"tf": 1}, "src.utils.RpcEndpoint": {"tf": 1}, "src.utils.Uint256": {"tf": 1}, "src.utils.Uint8": {"tf": 1}}, "df": 5, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.utils.Bytes32": {"tf": 1}, "src.utils.ChecksumAddress": {"tf": 1}, "src.utils.RpcEndpoint": {"tf": 1}, "src.utils.Uint256": {"tf": 1}, "src.utils.Uint8": {"tf": 1}}, "df": 5}}}}}}}}, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "i": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}, "y": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.ArtifactType": {"tf": 1}}, "df": 1}}}}, "s": {"3": {"2": {"docs": {"src.utils.Bytes32": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1.4142135623730951}, "src.utils.ChainName": {"tf": 1}}, "df": 2}}}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"src.utils.ArtifactType": {"tf": 1}, "src.utils.ChainName": {"tf": 1}, "src.utils.ContractVersion": {"tf": 1}}, "df": 3}}}}}}, "t": {"docs": {"src.utils.Bytes32": {"tf": 1}, "src.utils.ChecksumAddress": {"tf": 1}, "src.utils.RpcEndpoint": {"tf": 1}, "src.utils.Uint256": {"tf": 1}, "src.utils.Uint8": {"tf": 1}}, "df": 5}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"src.utils.SUPPORTED_CHAINS": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "[": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.ChainMetadata": {"tf": 1}}, "df": 1}}}}}}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {"src.utils.ChainMetadata": {"tf": 1}}, "df": 1}}}}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.ChainMetadata": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"2": {"5": {"6": {"docs": {"src.utils.Uint256": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "8": {"docs": {"src.utils.Uint8": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}}}}, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.Bytes32": {"tf": 1}, "src.utils.ChecksumAddress": {"tf": 1}, "src.utils.RpcEndpoint": {"tf": 1}, "src.utils.Uint256": {"tf": 1}, "src.utils.Uint8": {"tf": 1}}, "df": 5}}}}}}}}}}, "signature": {"root": {"0": {"docs": {}, "df": 0, "x": {"1": {"0": {"8": {"6": {"2": {"1": {"1": {"docs": {}, "df": 0, "c": {"0": {"docs": {"src.SdkClient.get_account_address": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}}, "4": {"docs": {}, "df": 0, "e": {"0": {"docs": {"src.JPYC.nonces": {"tf": 1}, "src.utils.remove_decimals": {"tf": 1}}, "df": 2}, "docs": {}, "df": 0}}, "5": {"8": {"0": {"docs": {"src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 11}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "6": {"2": {"0": {"docs": {"src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}, "2": {"docs": {"src.JPYC.__init__": {"tf": 1}}, "df": 1}, "3": {"9": {"docs": {"src.JPYC.__init__": {"tf": 1.4142135623730951}}, "df": 1}, "docs": {}, "df": 0}, "docs": {"src.SdkClient.__init__": {"tf": 11.313708498984761}, "src.SdkClient.set_default_provider": {"tf": 6}, "src.SdkClient.set_custom_provider": {"tf": 7.3484692283495345}, "src.SdkClient.set_account": {"tf": 8.12403840463596}, "src.SdkClient.get_account_address": {"tf": 6.4031242374328485}, "src.JPYC.__init__": {"tf": 8.12403840463596}, "src.JPYC.is_minter": {"tf": 6.782329983125268}, "src.JPYC.minter_allowance": {"tf": 4.242640687119285}, "src.JPYC.total_supply": {"tf": 4.242640687119285}, "src.JPYC.balance_of": {"tf": 4.242640687119285}, "src.JPYC.allowance": {"tf": 4.242640687119285}, "src.JPYC.nonces": {"tf": 8.602325267042627}, "src.JPYC.configure_minter": {"tf": 10.344080432788601}, "src.JPYC.mint": {"tf": 10.344080432788601}, "src.JPYC.transfer": {"tf": 10.344080432788601}, "src.JPYC.transfer_from": {"tf": 11.874342087037917}, "src.JPYC.transfer_with_authorization": {"tf": 18.411952639521967}, "src.JPYC.receive_with_authorization": {"tf": 18.411952639521967}, "src.JPYC.cancel_authorization": {"tf": 14.352700094407323}, "src.JPYC.approve": {"tf": 10.344080432788601}, "src.JPYC.increase_allowance": {"tf": 10.344080432788601}, "src.JPYC.decrease_allowance": {"tf": 10.344080432788601}, "src.JPYC.permit": {"tf": 16.492422502470642}, "src.utils.get_proxy_address": {"tf": 4.898979485566356}, "src.utils.get_artifacts": {"tf": 5.744562646538029}, "src.utils.resolve_artifacts_file_path": {"tf": 5}, "src.utils.enumerate_supported_networks": {"tf": 3}, "src.utils.get_default_rpc_endpoint": {"tf": 8}, "src.utils.remove_decimals": {"tf": 9}, "src.utils.restore_decimals": {"tf": 3.1622776601683795}, "src.utils.InvalidBytes32.__init__": {"tf": 3.605551275463989}, "src.utils.InvalidChecksumAddress.__init__": {"tf": 3.605551275463989}, "src.utils.InvalidUint8.__init__": {"tf": 3.605551275463989}, "src.utils.InvalidUint256.__init__": {"tf": 3.605551275463989}, "src.utils.NetworkNotSupported.__init__": {"tf": 4.47213595499958}, "src.utils.TransactionFailed.__init__": {"tf": 3.605551275463989}, "src.utils.TransactionSimulationFailed.__init__": {"tf": 3.605551275463989}}, "df": 37, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.NetworkNotSupported.__init__": {"tf": 1}}, "df": 4, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.NetworkNotSupported.__init__": {"tf": 1}}, "df": 4}}}}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {"src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1.4142135623730951}, "src.JPYC.transfer_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.receive_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1.4142135623730951}}, "df": 14, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"src.JPYC.__init__": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}}, "df": 2}}}}}}}}}}}}}}, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.__init__": {"tf": 1.4142135623730951}, "src.utils.get_proxy_address": {"tf": 1}, "src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 3, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.JPYC.__init__": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}, "src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 3}}}}}}}}}}}}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_default_provider": {"tf": 1.4142135623730951}, "src.utils.get_default_rpc_endpoint": {"tf": 1.4142135623730951}, "src.utils.NetworkNotSupported.__init__": {"tf": 1.4142135623730951}}, "df": 4}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"src.SdkClient.__init__": {"tf": 2.449489742783178}, "src.SdkClient.set_account": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1.4142135623730951}}, "df": 4}, "c": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}}, "df": 3}}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "k": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.NetworkNotSupported.__init__": {"tf": 1}}, "df": 4}}}}}}}, "s": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 4, "t": {"docs": {}, "df": 0, "r": {"docs": {"src.SdkClient.__init__": {"tf": 1.7320508075688772}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1.4142135623730951}, "src.JPYC.mint": {"tf": 1.4142135623730951}, "src.JPYC.transfer": {"tf": 1.4142135623730951}, "src.JPYC.transfer_from": {"tf": 1.7320508075688772}, "src.JPYC.transfer_with_authorization": {"tf": 2.449489742783178}, "src.JPYC.receive_with_authorization": {"tf": 2.449489742783178}, "src.JPYC.cancel_authorization": {"tf": 2.23606797749979}, "src.JPYC.approve": {"tf": 1.4142135623730951}, "src.JPYC.increase_allowance": {"tf": 1.4142135623730951}, "src.JPYC.decrease_allowance": {"tf": 1.4142135623730951}, "src.JPYC.permit": {"tf": 2.23606797749979}, "src.utils.enumerate_supported_networks": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1.4142135623730951}, "src.utils.InvalidBytes32.__init__": {"tf": 1}, "src.utils.InvalidChecksumAddress.__init__": {"tf": 1}, "src.utils.InvalidUint8.__init__": {"tf": 1}, "src.utils.InvalidUint256.__init__": {"tf": 1}, "src.utils.NetworkNotSupported.__init__": {"tf": 1}, "src.utils.TransactionFailed.__init__": {"tf": 1}, "src.utils.TransactionSimulationFailed.__init__": {"tf": 1}}, "df": 27}}, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "f": {"docs": {"src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 17}}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"src.SdkClient.set_account": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "c": {"docs": {"src.JPYC.__init__": {"tf": 1}}, "df": 1}}, "d": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.__init__": {"tf": 1}}, "df": 1}}}}}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 4}}}}}}}, "r": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 4, "p": {"docs": {}, "df": 0, "c": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_custom_provider": {"tf": 1.4142135623730951}, "src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 3}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_custom_provider": {"tf": 1.4142135623730951}, "src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 3}}}}}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {"src.SdkClient.set_account": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}}, "df": 3}}, "v": {"docs": {}, "df": 0, "m": {"docs": {"src.JPYC.__init__": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}}, "df": 2}}}, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_account": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}}, "df": 3}}}}}}}, "w": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.nonces": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 2}}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1.4142135623730951}, "src.JPYC.configure_minter": {"tf": 1.7320508075688772}, "src.JPYC.mint": {"tf": 1.7320508075688772}, "src.JPYC.transfer": {"tf": 1.7320508075688772}, "src.JPYC.transfer_from": {"tf": 2}, "src.JPYC.transfer_with_authorization": {"tf": 3.1622776601683795}, "src.JPYC.receive_with_authorization": {"tf": 3.1622776601683795}, "src.JPYC.cancel_authorization": {"tf": 2.449489742783178}, "src.JPYC.approve": {"tf": 1.7320508075688772}, "src.JPYC.increase_allowance": {"tf": 1.7320508075688772}, "src.JPYC.decrease_allowance": {"tf": 1.7320508075688772}, "src.JPYC.permit": {"tf": 2.8284271247461903}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.remove_decimals": {"tf": 1.4142135623730951}}, "df": 19}}}}}}}, "y": {"docs": {"src.utils.get_artifacts": {"tf": 1}}, "df": 1}}, "f": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}}, "df": 2, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1.4142135623730951}, "src.JPYC.configure_minter": {"tf": 1.7320508075688772}, "src.JPYC.mint": {"tf": 1.7320508075688772}, "src.JPYC.transfer": {"tf": 1.7320508075688772}, "src.JPYC.transfer_from": {"tf": 2}, "src.JPYC.transfer_with_authorization": {"tf": 3.1622776601683795}, "src.JPYC.receive_with_authorization": {"tf": 3.1622776601683795}, "src.JPYC.cancel_authorization": {"tf": 2.449489742783178}, "src.JPYC.approve": {"tf": 1.7320508075688772}, "src.JPYC.increase_allowance": {"tf": 1.7320508075688772}, "src.JPYC.decrease_allowance": {"tf": 1.7320508075688772}, "src.JPYC.permit": {"tf": 2.8284271247461903}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.remove_decimals": {"tf": 1.4142135623730951}}, "df": 19}}}}}}}}}}}}}, "c": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.set_account": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}}, "df": 2}}}}}}, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1.4142135623730951}, "src.JPYC.transfer_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.receive_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1.4142135623730951}}, "df": 15}}}}}}, "t": {"docs": {"src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.remove_decimals": {"tf": 1}}, "df": 15}, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"src.JPYC.minter_allowance": {"tf": 1}, "src.JPYC.total_supply": {"tf": 1}, "src.JPYC.balance_of": {"tf": 1}, "src.JPYC.allowance": {"tf": 1}}, "df": 4}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"src.utils.get_artifacts": {"tf": 1}}, "df": 1, "t": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.get_artifacts": {"tf": 1}}, "df": 1}}}}}}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.JPYC.configure_minter": {"tf": 1}}, "df": 1}}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}}, "df": 2}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.cancel_authorization": {"tf": 1}}, "df": 1}}}}}}}}}}, "f": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1.4142135623730951}, "src.JPYC.configure_minter": {"tf": 1.7320508075688772}, "src.JPYC.mint": {"tf": 1.7320508075688772}, "src.JPYC.transfer": {"tf": 1.7320508075688772}, "src.JPYC.transfer_from": {"tf": 2}, "src.JPYC.transfer_with_authorization": {"tf": 3.1622776601683795}, "src.JPYC.receive_with_authorization": {"tf": 3.1622776601683795}, "src.JPYC.cancel_authorization": {"tf": 2.449489742783178}, "src.JPYC.approve": {"tf": 1.7320508075688772}, "src.JPYC.increase_allowance": {"tf": 1.7320508075688772}, "src.JPYC.decrease_allowance": {"tf": 1.7320508075688772}, "src.JPYC.permit": {"tf": 2.8284271247461903}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.remove_decimals": {"tf": 1.4142135623730951}, "src.utils.restore_decimals": {"tf": 1}}, "df": 20, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1.4142135623730951}, "src.JPYC.configure_minter": {"tf": 1.7320508075688772}, "src.JPYC.mint": {"tf": 1.7320508075688772}, "src.JPYC.transfer": {"tf": 1.7320508075688772}, "src.JPYC.transfer_from": {"tf": 2}, "src.JPYC.transfer_with_authorization": {"tf": 3.1622776601683795}, "src.JPYC.receive_with_authorization": {"tf": 3.1622776601683795}, "src.JPYC.cancel_authorization": {"tf": 2.449489742783178}, "src.JPYC.approve": {"tf": 1.7320508075688772}, "src.JPYC.increase_allowance": {"tf": 1.7320508075688772}, "src.JPYC.decrease_allowance": {"tf": 1.7320508075688772}, "src.JPYC.permit": {"tf": 2.8284271247461903}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.remove_decimals": {"tf": 1.4142135623730951}}, "df": 19}}}}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}}, "df": 3}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.get_artifacts": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1.4142135623730951}, "src.JPYC.configure_minter": {"tf": 1.7320508075688772}, "src.JPYC.mint": {"tf": 1.7320508075688772}, "src.JPYC.transfer": {"tf": 1.7320508075688772}, "src.JPYC.transfer_from": {"tf": 2}, "src.JPYC.transfer_with_authorization": {"tf": 3.1622776601683795}, "src.JPYC.receive_with_authorization": {"tf": 3.1622776601683795}, "src.JPYC.cancel_authorization": {"tf": 2.449489742783178}, "src.JPYC.approve": {"tf": 1.7320508075688772}, "src.JPYC.increase_allowance": {"tf": 1.7320508075688772}, "src.JPYC.decrease_allowance": {"tf": 1.7320508075688772}, "src.JPYC.permit": {"tf": 2.8284271247461903}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.remove_decimals": {"tf": 1.4142135623730951}}, "df": 19}, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"src.SdkClient.set_account": {"tf": 1}, "src.utils.get_artifacts": {"tf": 1}, "src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 3, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.set_account": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "v": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 4, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.receive_with_authorization": {"tf": 1.4142135623730951}}, "df": 2, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1.4142135623730951}, "src.JPYC.configure_minter": {"tf": 1.7320508075688772}, "src.JPYC.mint": {"tf": 1.7320508075688772}, "src.JPYC.transfer": {"tf": 1.7320508075688772}, "src.JPYC.transfer_from": {"tf": 2}, "src.JPYC.transfer_with_authorization": {"tf": 3.1622776601683795}, "src.JPYC.receive_with_authorization": {"tf": 3.1622776601683795}, "src.JPYC.cancel_authorization": {"tf": 2.449489742783178}, "src.JPYC.approve": {"tf": 1.7320508075688772}, "src.JPYC.increase_allowance": {"tf": 1.7320508075688772}, "src.JPYC.decrease_allowance": {"tf": 1.7320508075688772}, "src.JPYC.permit": {"tf": 2.8284271247461903}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.remove_decimals": {"tf": 1.4142135623730951}}, "df": 19}}}}}, "u": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.permit": {"tf": 1}, "src.utils.remove_decimals": {"tf": 1}}, "df": 7}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.JPYC.__init__": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}, "src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 3}}}}}}}, "g": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1.4142135623730951}, "src.JPYC.configure_minter": {"tf": 1.7320508075688772}, "src.JPYC.mint": {"tf": 1.7320508075688772}, "src.JPYC.transfer": {"tf": 1.7320508075688772}, "src.JPYC.transfer_from": {"tf": 2}, "src.JPYC.transfer_with_authorization": {"tf": 3.1622776601683795}, "src.JPYC.receive_with_authorization": {"tf": 3.1622776601683795}, "src.JPYC.cancel_authorization": {"tf": 2.449489742783178}, "src.JPYC.approve": {"tf": 1.7320508075688772}, "src.JPYC.increase_allowance": {"tf": 1.7320508075688772}, "src.JPYC.decrease_allowance": {"tf": 1.7320508075688772}, "src.JPYC.permit": {"tf": 2.8284271247461903}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.remove_decimals": {"tf": 1.4142135623730951}}, "df": 19}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}}, "df": 2}}}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"src.utils.get_artifacts": {"tf": 1.4142135623730951}, "src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 2, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "b": {"docs": {"src.utils.get_artifacts": {"tf": 1}, "src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 2}}}}}}}, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "y": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}}, "df": 2}}, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"src.JPYC.minter_allowance": {"tf": 1}, "src.JPYC.total_supply": {"tf": 1}, "src.JPYC.balance_of": {"tf": 1}, "src.JPYC.allowance": {"tf": 1}}, "df": 4}}}}}}, "b": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"3": {"2": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 2}, "src.JPYC.receive_with_authorization": {"tf": 2}, "src.JPYC.cancel_authorization": {"tf": 2}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1.7320508075688772}}, "df": 13}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}}}, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {"src.JPYC.is_minter": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}}, "df": 2}}}}}}, "w": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "b": {"3": {"docs": {"src.SdkClient.set_default_provider": {"tf": 1.4142135623730951}, "src.SdkClient.set_custom_provider": {"tf": 1.4142135623730951}}, "df": 2}, "docs": {}, "df": 0}}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}}, "df": 2}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.configure_minter": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.InvalidBytes32.__init__": {"tf": 1}, "src.utils.InvalidChecksumAddress.__init__": {"tf": 1}, "src.utils.InvalidUint8.__init__": {"tf": 1}, "src.utils.InvalidUint256.__init__": {"tf": 1}, "src.utils.TransactionFailed.__init__": {"tf": 1}, "src.utils.TransactionSimulationFailed.__init__": {"tf": 1}}, "df": 6}}}}}}}, "t": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"src.JPYC.__init__": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}}, "df": 2}}}, "e": {"docs": {"src.utils.get_artifacts": {"tf": 1}}, "df": 1}}}, "o": {"docs": {"src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}}, "df": 5}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 2}, "src.JPYC.receive_with_authorization": {"tf": 2}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1.7320508075688772}, "src.utils.remove_decimals": {"tf": 1.4142135623730951}}, "df": 13}, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.increase_allowance": {"tf": 1}}, "df": 1}}}}}}}}}, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"2": {"5": {"6": {"docs": {"src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1.7320508075688772}, "src.JPYC.receive_with_authorization": {"tf": 1.7320508075688772}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1.4142135623730951}, "src.utils.remove_decimals": {"tf": 1.4142135623730951}}, "df": 12}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "8": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 4}, "docs": {}, "df": 0}}}, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.utils.remove_decimals": {"tf": 1}}, "df": 1}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.decrease_allowance": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"src.utils.remove_decimals": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.permit": {"tf": 1}}, "df": 1}}}}}}}}}}, "bases": {"root": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {"src.SdkClient": {"tf": 1}, "src.JPYC": {"tf": 1}, "src.utils.AccountNotInitialized": {"tf": 1}, "src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint256": {"tf": 1}, "src.utils.NetworkNotSupported": {"tf": 1}, "src.utils.TransactionFailed": {"tf": 1}, "src.utils.TransactionSimulationFailed": {"tf": 1}}, "df": 10}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"src.SdkClient": {"tf": 1}, "src.JPYC": {"tf": 1}}, "df": 2}}}}}}}}}, "s": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient": {"tf": 1}}, "df": 1}}}}}}}}}, "j": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "c": {"docs": {"src.JPYC": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient": {"tf": 1}}, "df": 1}}}}}}, "j": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "c": {"docs": {"src.JPYC": {"tf": 1}}, "df": 1, "s": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"src.utils.AccountNotInitialized": {"tf": 1}, "src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint256": {"tf": 1}, "src.utils.NetworkNotSupported": {"tf": 1}, "src.utils.TransactionFailed": {"tf": 1}, "src.utils.TransactionSimulationFailed": {"tf": 1}}, "df": 8}}}}}}}}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.AccountNotInitialized": {"tf": 1}, "src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint256": {"tf": 1}, "src.utils.NetworkNotSupported": {"tf": 1}, "src.utils.TransactionFailed": {"tf": 1}, "src.utils.TransactionSimulationFailed": {"tf": 1}}, "df": 8}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.AccountNotInitialized": {"tf": 1}, "src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint256": {"tf": 1}, "src.utils.NetworkNotSupported": {"tf": 1}, "src.utils.TransactionFailed": {"tf": 1}, "src.utils.TransactionSimulationFailed": {"tf": 1}}, "df": 8}}}}}}, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint256": {"tf": 1}}, "df": 4}}}}}}}}, "t": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint256": {"tf": 1}}, "df": 4}}}}}}}}}}}, "doc": {"root": {"2": {"0": {"2": {"5": {"docs": {"src.utils.get_proxy_address": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {"src": {"tf": 1.7320508075688772}, "src.SdkClient": {"tf": 1.7320508075688772}, "src.SdkClient.__init__": {"tf": 9.219544457292887}, "src.SdkClient.w3": {"tf": 1.4142135623730951}, "src.SdkClient.rpc_endpoint": {"tf": 1.4142135623730951}, "src.SdkClient.account": {"tf": 1.7320508075688772}, "src.SdkClient.set_default_provider": {"tf": 6.4031242374328485}, "src.SdkClient.set_custom_provider": {"tf": 5.830951894845301}, "src.SdkClient.set_account": {"tf": 7.0710678118654755}, "src.SdkClient.get_account_address": {"tf": 4.58257569495584}, "src.JPYC": {"tf": 1.7320508075688772}, "src.JPYC.__init__": {"tf": 6.782329983125268}, "src.JPYC.client": {"tf": 1.4142135623730951}, "src.JPYC.contract": {"tf": 1.4142135623730951}, "src.JPYC.is_minter": {"tf": 6.164414002968976}, "src.JPYC.minter_allowance": {"tf": 1.7320508075688772}, "src.JPYC.total_supply": {"tf": 1.7320508075688772}, "src.JPYC.balance_of": {"tf": 1.7320508075688772}, "src.JPYC.allowance": {"tf": 1.7320508075688772}, "src.JPYC.nonces": {"tf": 6.244997998398398}, "src.JPYC.configure_minter": {"tf": 7.681145747868608}, "src.JPYC.mint": {"tf": 7.681145747868608}, "src.JPYC.transfer": {"tf": 7.681145747868608}, "src.JPYC.transfer_from": {"tf": 8.18535277187245}, "src.JPYC.transfer_with_authorization": {"tf": 10.816653826391969}, "src.JPYC.receive_with_authorization": {"tf": 10.816653826391969}, "src.JPYC.cancel_authorization": {"tf": 9.16515138991168}, "src.JPYC.approve": {"tf": 7.681145747868608}, "src.JPYC.increase_allowance": {"tf": 7.681145747868608}, "src.JPYC.decrease_allowance": {"tf": 7.681145747868608}, "src.JPYC.permit": {"tf": 10.099504938362077}, "src.utils": {"tf": 1.7320508075688772}, "src.utils.get_proxy_address": {"tf": 5.5677643628300215}, "src.utils.get_artifacts": {"tf": 5.196152422706632}, "src.utils.resolve_artifacts_file_path": {"tf": 4.69041575982343}, "src.utils.enumerate_supported_networks": {"tf": 3.3166247903554}, "src.utils.get_default_rpc_endpoint": {"tf": 6.082762530298219}, "src.utils.SUPPORTED_CHAINS": {"tf": 1.7320508075688772}, "src.utils.POA_MIDDLEWARE": {"tf": 1.7320508075688772}, "src.utils.SIGN_MIDDLEWARE": {"tf": 1.7320508075688772}, "src.utils.UINT_MIN": {"tf": 1.7320508075688772}, "src.utils.UINT256_MAX": {"tf": 1.7320508075688772}, "src.utils.UINT8_MAX": {"tf": 1.7320508075688772}, "src.utils.remove_decimals": {"tf": 4.795831523312719}, "src.utils.restore_decimals": {"tf": 1.7320508075688772}, "src.utils.AccountNotInitialized": {"tf": 1.7320508075688772}, "src.utils.AccountNotInitialized.code": {"tf": 1.4142135623730951}, "src.utils.InvalidBytes32": {"tf": 1.7320508075688772}, "src.utils.InvalidBytes32.__init__": {"tf": 1.7320508075688772}, "src.utils.InvalidBytes32.code": {"tf": 1.4142135623730951}, "src.utils.InvalidChecksumAddress": {"tf": 1.7320508075688772}, "src.utils.InvalidChecksumAddress.__init__": {"tf": 1.7320508075688772}, "src.utils.InvalidChecksumAddress.code": {"tf": 1.4142135623730951}, "src.utils.InvalidUint8": {"tf": 1.7320508075688772}, "src.utils.InvalidUint8.__init__": {"tf": 1.7320508075688772}, "src.utils.InvalidUint8.code": {"tf": 1.4142135623730951}, "src.utils.InvalidUint256": {"tf": 1.7320508075688772}, "src.utils.InvalidUint256.__init__": {"tf": 1.7320508075688772}, "src.utils.InvalidUint256.code": {"tf": 1.4142135623730951}, "src.utils.NetworkNotSupported": {"tf": 4.358898943540674}, "src.utils.NetworkNotSupported.__init__": {"tf": 1.7320508075688772}, "src.utils.NetworkNotSupported.code": {"tf": 1.4142135623730951}, "src.utils.TransactionFailed": {"tf": 3.7416573867739413}, "src.utils.TransactionFailed.__init__": {"tf": 1.7320508075688772}, "src.utils.TransactionFailed.code": {"tf": 1.4142135623730951}, "src.utils.TransactionSimulationFailed": {"tf": 3.7416573867739413}, "src.utils.TransactionSimulationFailed.__init__": {"tf": 1.7320508075688772}, "src.utils.TransactionSimulationFailed.code": {"tf": 1.4142135623730951}, "src.utils.ArtifactType": {"tf": 1.7320508075688772}, "src.utils.ChainMetadata": {"tf": 1.7320508075688772}, "src.utils.ChainName": {"tf": 1.7320508075688772}, "src.utils.ContractVersion": {"tf": 1.7320508075688772}, "src.utils.Bytes32": {"tf": 1.7320508075688772}, "src.utils.ChecksumAddress": {"tf": 1.7320508075688772}, "src.utils.RpcEndpoint": {"tf": 1.7320508075688772}, "src.utils.Uint256": {"tf": 1.7320508075688772}, "src.utils.Uint8": {"tf": 1.7320508075688772}}, "df": 77, "s": {"docs": {"src.JPYC.nonces": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1.7320508075688772}, "src.JPYC.receive_with_authorization": {"tf": 1.7320508075688772}, "src.JPYC.cancel_authorization": {"tf": 1.7320508075688772}, "src.JPYC.permit": {"tf": 1.7320508075688772}}, "df": 5, "d": {"docs": {}, "df": 0, "k": {"docs": {"src.SdkClient": {"tf": 1}, "src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}, "src.JPYC.client": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.NetworkNotSupported": {"tf": 1}}, "df": 7, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.__init__": {"tf": 1}}, "df": 1}}}}}}}}, "t": {"docs": {}, "df": 0, "r": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.rpc_endpoint": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1.4142135623730951}, "src.utils.enumerate_supported_networks": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.NetworkNotSupported": {"tf": 1.4142135623730951}, "src.utils.TransactionFailed": {"tf": 1}, "src.utils.TransactionSimulationFailed": {"tf": 1}}, "df": 8, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"src.utils.InvalidBytes32": {"tf": 1}}, "df": 1}}}}}, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1.4142135623730951}, "src.JPYC.mint": {"tf": 1.4142135623730951}, "src.JPYC.transfer": {"tf": 1.4142135623730951}, "src.JPYC.transfer_from": {"tf": 1.4142135623730951}, "src.JPYC.transfer_with_authorization": {"tf": 2}, "src.JPYC.receive_with_authorization": {"tf": 2}, "src.JPYC.cancel_authorization": {"tf": 1.7320508075688772}, "src.JPYC.approve": {"tf": 1.4142135623730951}, "src.JPYC.increase_allowance": {"tf": 1.4142135623730951}, "src.JPYC.decrease_allowance": {"tf": 1.4142135623730951}, "src.JPYC.permit": {"tf": 2}}, "df": 17}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.utils.enumerate_supported_networks": {"tf": 1.4142135623730951}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.NetworkNotSupported": {"tf": 1}}, "df": 5}}}}}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}, "src.utils.get_artifacts": {"tf": 1}, "src.utils.resolve_artifacts_file_path": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1.4142135623730951}, "src.utils.NetworkNotSupported": {"tf": 1}}, "df": 7}}}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.approve": {"tf": 1.7320508075688772}, "src.JPYC.increase_allowance": {"tf": 1.7320508075688772}, "src.JPYC.decrease_allowance": {"tf": 1.7320508075688772}, "src.JPYC.permit": {"tf": 1.7320508075688772}}, "df": 4}}}}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1.4142135623730951}}, "df": 3, "s": {"docs": {"src.JPYC.__init__": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.JPYC.minter_allowance": {"tf": 1}, "src.JPYC.total_supply": {"tf": 1}, "src.JPYC.balance_of": {"tf": 1}, "src.JPYC.allowance": {"tf": 1}}, "df": 4}}}}}}}, "m": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}, "src.utils.TransactionSimulationFailed": {"tf": 1}}, "df": 12}}}}}}}}}, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"src.utils.get_proxy_address": {"tf": 1}}, "df": 1}}}}}}, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient": {"tf": 1}, "src.SdkClient.__init__": {"tf": 1}, "src.JPYC.__init__": {"tf": 2}, "src.JPYC.client": {"tf": 1}}, "df": 4}}}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"src.SdkClient.__init__": {"tf": null}, "src.JPYC.__init__": {"tf": null}}, "df": 2}}}}}}}}, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"src.SdkClient.__init__": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.SdkClient.w3": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1.4142135623730951}, "src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.__init__": {"tf": 1.4142135623730951}, "src.JPYC.client": {"tf": 1}, "src.JPYC.contract": {"tf": 1}}, "df": 8}, "s": {"docs": {"src.JPYC.__init__": {"tf": 1}}, "df": 1}, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.configure_minter": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.__init__": {"tf": 2.449489742783178}, "src.JPYC.contract": {"tf": 1.4142135623730951}, "src.utils.get_proxy_address": {"tf": 1.7320508075688772}, "src.utils.get_artifacts": {"tf": 1}, "src.utils.resolve_artifacts_file_path": {"tf": 1.7320508075688772}}, "df": 5, "s": {"docs": {"src.JPYC.__init__": {"tf": 1}, "src.utils.get_artifacts": {"tf": 1}}, "df": 2}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.JPYC.__init__": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}, "src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 3}}}}}}}}}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.AccountNotInitialized.code": {"tf": 1}, "src.utils.InvalidBytes32.code": {"tf": 1}, "src.utils.InvalidChecksumAddress.code": {"tf": 1}, "src.utils.InvalidUint8.code": {"tf": 1}, "src.utils.InvalidUint256.code": {"tf": 1}, "src.utils.NetworkNotSupported.code": {"tf": 1}, "src.utils.TransactionFailed.code": {"tf": 1}, "src.utils.TransactionSimulationFailed.code": {"tf": 1}}, "df": 8}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"src.SdkClient.__init__": {"tf": 2}, "src.SdkClient.set_default_provider": {"tf": 1.4142135623730951}, "src.utils.get_default_rpc_endpoint": {"tf": 1.4142135623730951}, "src.utils.NetworkNotSupported": {"tf": 1.4142135623730951}}, "df": 4, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 1}}}}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {"src.utils.get_proxy_address": {"tf": 1}, "src.utils.InvalidChecksumAddress": {"tf": 1}}, "df": 2, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1.4142135623730951}, "src.JPYC.transfer_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.receive_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1.4142135623730951}, "src.utils.get_proxy_address": {"tf": 1}}, "df": 15}}}}}}}}}}}}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"src.SdkClient.set_custom_provider": {"tf": 1.4142135623730951}, "src.utils.AccountNotInitialized.code": {"tf": 1}, "src.utils.InvalidBytes32.code": {"tf": 1}, "src.utils.InvalidChecksumAddress.code": {"tf": 1}, "src.utils.InvalidUint8.code": {"tf": 1}, "src.utils.InvalidUint256.code": {"tf": 1}, "src.utils.NetworkNotSupported.code": {"tf": 1}, "src.utils.TransactionFailed.code": {"tf": 1}, "src.utils.TransactionSimulationFailed.code": {"tf": 1}}, "df": 9}}}}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 13}}, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.JPYC.cancel_authorization": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.JPYC.__init__": {"tf": 1.4142135623730951}}, "df": 2}}, "i": {"docs": {}, "df": 0, "s": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.JPYC.__init__": {"tf": 1.4142135623730951}}, "df": 3}}, "e": {"docs": {"src.SdkClient.__init__": {"tf": 2}, "src.SdkClient.set_default_provider": {"tf": 1.7320508075688772}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1.4142135623730951}, "src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.minter_allowance": {"tf": 1.4142135623730951}, "src.JPYC.total_supply": {"tf": 1.4142135623730951}, "src.JPYC.balance_of": {"tf": 1.4142135623730951}, "src.JPYC.allowance": {"tf": 1.4142135623730951}, "src.utils.get_proxy_address": {"tf": 1.7320508075688772}, "src.utils.get_artifacts": {"tf": 1}, "src.utils.resolve_artifacts_file_path": {"tf": 1.4142135623730951}, "src.utils.enumerate_supported_networks": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 2}, "src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint256": {"tf": 1}, "src.utils.NetworkNotSupported": {"tf": 1.4142135623730951}}, "df": 19}}, "o": {"docs": {"src.SdkClient.set_account": {"tf": 1}, "src.JPYC.__init__": {"tf": 1.7320508075688772}, "src.JPYC.mint": {"tf": 1.7320508075688772}, "src.JPYC.transfer": {"tf": 1.7320508075688772}, "src.JPYC.transfer_from": {"tf": 1.7320508075688772}, "src.JPYC.transfer_with_authorization": {"tf": 1.7320508075688772}, "src.JPYC.receive_with_authorization": {"tf": 1.7320508075688772}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.utils.restore_decimals": {"tf": 1}, "src.utils.AccountNotInitialized": {"tf": 1}}, "df": 11, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}}, "df": 5}}}}}, "r": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.is_minter": {"tf": 1}}, "df": 1}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.JPYC.configure_minter": {"tf": 1.7320508075688772}, "src.JPYC.mint": {"tf": 1.7320508075688772}, "src.JPYC.transfer": {"tf": 1.7320508075688772}, "src.JPYC.transfer_from": {"tf": 1.7320508075688772}, "src.JPYC.transfer_with_authorization": {"tf": 2.23606797749979}, "src.JPYC.receive_with_authorization": {"tf": 2.23606797749979}, "src.JPYC.cancel_authorization": {"tf": 1.7320508075688772}, "src.JPYC.approve": {"tf": 1.7320508075688772}, "src.JPYC.increase_allowance": {"tf": 1.7320508075688772}, "src.JPYC.decrease_allowance": {"tf": 1.7320508075688772}, "src.JPYC.permit": {"tf": 2}, "src.utils.TransactionFailed": {"tf": 1}, "src.utils.TransactionSimulationFailed": {"tf": 1}}, "df": 13, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 11}}}}}}, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 11}}}}}}}}}}}}}}}}}}}}}}, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.transfer": {"tf": 1.4142135623730951}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}}, "df": 4, "f": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"src.JPYC.transfer_from": {"tf": 1}}, "df": 1}}}}, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}}}}}}, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.minter_allowance": {"tf": 1}, "src.JPYC.total_supply": {"tf": 1}, "src.JPYC.balance_of": {"tf": 1}, "src.JPYC.allowance": {"tf": 1}, "src.utils.get_artifacts": {"tf": 1.4142135623730951}}, "df": 5}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.receive_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.permit": {"tf": 1}}, "df": 3}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1.4142135623730951}, "src.JPYC.mint": {"tf": 1.4142135623730951}, "src.JPYC.transfer": {"tf": 1.4142135623730951}, "src.JPYC.transfer_from": {"tf": 1.4142135623730951}, "src.JPYC.transfer_with_authorization": {"tf": 2}, "src.JPYC.receive_with_authorization": {"tf": 2}, "src.JPYC.cancel_authorization": {"tf": 1.7320508075688772}, "src.JPYC.approve": {"tf": 1.4142135623730951}, "src.JPYC.increase_allowance": {"tf": 1.4142135623730951}, "src.JPYC.decrease_allowance": {"tf": 1.4142135623730951}, "src.JPYC.permit": {"tf": 2}, "src.utils.remove_decimals": {"tf": 1.4142135623730951}}, "df": 17, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.JPYC.__init__": {"tf": 1.4142135623730951}}, "df": 2}, "d": {"docs": {"src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}, "src.utils.AccountNotInitialized": {"tf": 1}}, "df": 13}}}}}}}}}, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 3, "b": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"3": {"2": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 6}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}}}}, "r": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}}, "df": 2}}}}}}}}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 13}}}}}}}}}}}}}}}, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"2": {"5": {"6": {"docs": {"src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 10}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "8": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 4}, "docs": {}, "df": 0}}}}}}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"src.SdkClient.w3": {"tf": 1}, "src.SdkClient.account": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1.4142135623730951}, "src.JPYC.__init__": {"tf": 1}, "src.JPYC.contract": {"tf": 1}, "src.utils.AccountNotInitialized": {"tf": 1}}, "df": 8}}}}}}, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.increase_allowance": {"tf": 1}}, "df": 1, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.increase_allowance": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.increase_allowance": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}, "t": {"docs": {"src.utils.AccountNotInitialized.code": {"tf": 1}, "src.utils.InvalidBytes32.code": {"tf": 1}, "src.utils.InvalidChecksumAddress.code": {"tf": 1}, "src.utils.InvalidUint8.code": {"tf": 1}, "src.utils.InvalidUint256.code": {"tf": 1}, "src.utils.NetworkNotSupported.code": {"tf": 1}, "src.utils.TransactionFailed.code": {"tf": 1}, "src.utils.TransactionSimulationFailed.code": {"tf": 1}}, "df": 8, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint256": {"tf": 1}}, "df": 2}}}}}}, "f": {"docs": {"src.SdkClient.__init__": {"tf": 2}, "src.SdkClient.set_default_provider": {"tf": 1.4142135623730951}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1.4142135623730951}, "src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.__init__": {"tf": 1.4142135623730951}, "src.JPYC.is_minter": {"tf": 1.4142135623730951}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 2.23606797749979}, "src.JPYC.mint": {"tf": 2.23606797749979}, "src.JPYC.transfer": {"tf": 2.23606797749979}, "src.JPYC.transfer_from": {"tf": 2.23606797749979}, "src.JPYC.transfer_with_authorization": {"tf": 2.6457513110645907}, "src.JPYC.receive_with_authorization": {"tf": 2.6457513110645907}, "src.JPYC.cancel_authorization": {"tf": 2.449489742783178}, "src.JPYC.approve": {"tf": 2.23606797749979}, "src.JPYC.increase_allowance": {"tf": 2.23606797749979}, "src.JPYC.decrease_allowance": {"tf": 2.23606797749979}, "src.JPYC.permit": {"tf": 2.6457513110645907}, "src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 20}, "s": {"docs": {"src.SdkClient.__init__": {"tf": 1.7320508075688772}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1.4142135623730951}, "src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.__init__": {"tf": 1.4142135623730951}, "src.JPYC.is_minter": {"tf": 1.4142135623730951}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1.7320508075688772}, "src.JPYC.mint": {"tf": 1.7320508075688772}, "src.JPYC.transfer": {"tf": 1.7320508075688772}, "src.JPYC.transfer_from": {"tf": 1.7320508075688772}, "src.JPYC.transfer_with_authorization": {"tf": 2.23606797749979}, "src.JPYC.receive_with_authorization": {"tf": 2.23606797749979}, "src.JPYC.cancel_authorization": {"tf": 2}, "src.JPYC.approve": {"tf": 1.7320508075688772}, "src.JPYC.increase_allowance": {"tf": 1.7320508075688772}, "src.JPYC.decrease_allowance": {"tf": 1.7320508075688772}, "src.JPYC.permit": {"tf": 2.23606797749979}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.AccountNotInitialized": {"tf": 1}, "src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint256": {"tf": 1}, "src.utils.NetworkNotSupported": {"tf": 1}}, "df": 26, "d": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.client": {"tf": 1}}, "df": 1}}}}}}}}, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.is_minter": {"tf": 1}}, "df": 1}}}}}}}, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.JPYC": {"tf": 1}}, "df": 1}}}}}}}}}}}}}, "j": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "c": {"docs": {"src.JPYC": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {"src.JPYC.__init__": {"tf": 1}}, "df": 1, "s": {"docs": {"src.JPYC.__init__": {"tf": 1}}, "df": 1}}}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.__init__": {"tf": 1.7320508075688772}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1.7320508075688772}, "src.JPYC.mint": {"tf": 1.7320508075688772}, "src.JPYC.transfer": {"tf": 1.7320508075688772}, "src.JPYC.transfer_from": {"tf": 1.7320508075688772}, "src.JPYC.transfer_with_authorization": {"tf": 2.23606797749979}, "src.JPYC.receive_with_authorization": {"tf": 2.23606797749979}, "src.JPYC.cancel_authorization": {"tf": 2}, "src.JPYC.approve": {"tf": 1.7320508075688772}, "src.JPYC.increase_allowance": {"tf": 1.7320508075688772}, "src.JPYC.decrease_allowance": {"tf": 1.7320508075688772}, "src.JPYC.permit": {"tf": 2.23606797749979}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.AccountNotInitialized": {"tf": 1}, "src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint256": {"tf": 1}, "src.utils.NetworkNotSupported": {"tf": 1}}, "df": 25, "e": {"docs": {"src.utils.get_proxy_address": {"tf": 1}}, "df": 1, "s": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}}, "df": 3}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {"src.SdkClient.account": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1.4142135623730951}, "src.JPYC.minter_allowance": {"tf": 1}, "src.JPYC.total_supply": {"tf": 1}, "src.JPYC.balance_of": {"tf": 1}, "src.JPYC.allowance": {"tf": 1}}, "df": 6}, "c": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.nonces": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1.7320508075688772}, "src.JPYC.receive_with_authorization": {"tf": 1.7320508075688772}, "src.JPYC.cancel_authorization": {"tf": 1.7320508075688772}}, "df": 4, "s": {"docs": {"src.JPYC.nonces": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"src.SdkClient.__init__": {"tf": 2.8284271247461903}, "src.SdkClient.set_default_provider": {"tf": 2}, "src.utils.get_default_rpc_endpoint": {"tf": 2}, "src.utils.NetworkNotSupported": {"tf": 2}}, "df": 4}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "k": {"docs": {"src.SdkClient.__init__": {"tf": 2.23606797749979}, "src.SdkClient.set_default_provider": {"tf": 1.7320508075688772}, "src.JPYC.__init__": {"tf": 1.4142135623730951}, "src.utils.get_default_rpc_endpoint": {"tf": 2}, "src.utils.NetworkNotSupported": {"tf": 1.7320508075688772}}, "df": 5, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 3}}}}}}}}}}}}, "s": {"docs": {"src.utils.enumerate_supported_networks": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}, "e": {"docs": {"src.utils.get_proxy_address": {"tf": 1}}, "df": 1, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.SdkClient.__init__": {"tf": 1}}, "df": 1}}}}, "p": {"2": {"6": {"1": {"2": {"docs": {"src.JPYC.nonces": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.__init__": {"tf": 2.449489742783178}, "src.SdkClient.rpc_endpoint": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 2}, "src.utils.get_default_rpc_endpoint": {"tf": 1.4142135623730951}}, "df": 4, "s": {"docs": {"src.SdkClient.set_default_provider": {"tf": 1}}, "df": 1}}}}}}}, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.enumerate_supported_networks": {"tf": 1}}, "df": 1}}}}}}}}, "o": {"docs": {}, "df": 0, "a": {"docs": {"src.SdkClient.__init__": {"tf": 1}}, "df": 1}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"src.JPYC.__init__": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.utils.remove_decimals": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1.7320508075688772}, "src.JPYC.receive_with_authorization": {"tf": 1.7320508075688772}, "src.JPYC.cancel_authorization": {"tf": 1.7320508075688772}, "src.JPYC.permit": {"tf": 1.7320508075688772}}, "df": 4}}}}, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"src.utils.AccountNotInitialized.code": {"tf": 1}, "src.utils.InvalidBytes32.code": {"tf": 1}, "src.utils.InvalidChecksumAddress.code": {"tf": 1}, "src.utils.InvalidUint8.code": {"tf": 1}, "src.utils.InvalidUint256.code": {"tf": 1}, "src.utils.NetworkNotSupported.code": {"tf": 1}, "src.utils.TransactionFailed": {"tf": 1}, "src.utils.TransactionFailed.code": {"tf": 1}, "src.utils.TransactionSimulationFailed": {"tf": 1}, "src.utils.TransactionSimulationFailed.code": {"tf": 1}}, "df": 10}}}}}, "a": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_custom_provider": {"tf": 1.4142135623730951}, "src.SdkClient.set_account": {"tf": 1.4142135623730951}, "src.JPYC.is_minter": {"tf": 1.4142135623730951}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1.4142135623730951}, "src.JPYC.mint": {"tf": 1.4142135623730951}, "src.JPYC.transfer": {"tf": 1.4142135623730951}, "src.JPYC.transfer_from": {"tf": 1.4142135623730951}, "src.JPYC.transfer_with_authorization": {"tf": 2}, "src.JPYC.receive_with_authorization": {"tf": 2}, "src.JPYC.cancel_authorization": {"tf": 1.7320508075688772}, "src.JPYC.approve": {"tf": 1.4142135623730951}, "src.JPYC.increase_allowance": {"tf": 1.4142135623730951}, "src.JPYC.decrease_allowance": {"tf": 1.4142135623730951}, "src.JPYC.permit": {"tf": 2}, "src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint256": {"tf": 1}}, "df": 20, "m": {"docs": {}, "df": 0, "p": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}}, "df": 1}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.configure_minter": {"tf": 1.4142135623730951}, "src.JPYC.mint": {"tf": 1.7320508075688772}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 10}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {"src.SdkClient.__init__": {"tf": 1}}, "df": 1}, "g": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}, "src.utils.get_artifacts": {"tf": 1}, "src.utils.resolve_artifacts_file_path": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.remove_decimals": {"tf": 1}}, "df": 23}}}}}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"src.utils.get_artifacts": {"tf": 1}}, "df": 1, "s": {"docs": {"src.utils.get_artifacts": {"tf": 2}, "src.utils.resolve_artifacts_file_path": {"tf": 1.4142135623730951}}, "df": 2}, "t": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.get_artifacts": {"tf": 1}}, "df": 1}}}}}}}}}}}, "c": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.account": {"tf": 1}, "src.SdkClient.set_account": {"tf": 2}, "src.SdkClient.get_account_address": {"tf": 1.7320508075688772}, "src.JPYC.is_minter": {"tf": 2}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}, "src.utils.AccountNotInitialized": {"tf": 1}}, "df": 16, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 12}}}}}}}}}}}}}}}}}}}}, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"src.SdkClient.get_account_address": {"tf": 1.4142135623730951}, "src.JPYC.__init__": {"tf": 2.449489742783178}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1.4142135623730951}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1.4142135623730951}, "src.utils.get_proxy_address": {"tf": 2}, "src.utils.InvalidChecksumAddress": {"tf": 1.4142135623730951}}, "df": 17}}}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {"src.JPYC.__init__": {"tf": 1}}, "df": 1}, "y": {"docs": {"src.utils.get_artifacts": {"tf": 1}}, "df": 1}}, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.__init__": {"tf": 1}}, "df": 1, "s": {"docs": {"src.utils.NetworkNotSupported": {"tf": 1}, "src.utils.TransactionFailed": {"tf": 1}, "src.utils.TransactionSimulationFailed": {"tf": 1}}, "df": 3}}}}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {"src.utils.enumerate_supported_networks": {"tf": 1}}, "df": 1, "o": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.JPYC.configure_minter": {"tf": 1.4142135623730951}}, "df": 1}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 7}}}}}}}}, "f": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.receive_with_authorization": {"tf": 1.4142135623730951}}, "df": 2}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.cancel_authorization": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}}, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.approve": {"tf": 1}}, "df": 1}}}}}}, "s": {"docs": {"src.utils.get_proxy_address": {"tf": 1}}, "df": 1}, "b": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.get_artifacts": {"tf": 1}, "src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 2}}}}}}}}, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_account": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}}, "df": 3, "s": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {"src.utils.get_artifacts": {"tf": 2}, "src.utils.resolve_artifacts_file_path": {"tf": 1.7320508075688772}}, "df": 2}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"src.SdkClient.__init__": {"tf": 1}}, "df": 1}}}}}}}}, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"src.SdkClient.__init__": {"tf": 1.7320508075688772}, "src.SdkClient.set_account": {"tf": 2.23606797749979}}, "df": 2}}}}}, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}}, "df": 2}}}}}, "x": {"docs": {}, "df": 0, "y": {"docs": {"src.utils.get_proxy_address": {"tf": 1.4142135623730951}}, "df": 1}}}}, "y": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}}, "df": 2}}}}}}}, "u": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {"src.SdkClient.get_account_address": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.nonces": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 2}}}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 2.23606797749979}, "src.JPYC.receive_with_authorization": {"tf": 2.23606797749979}, "src.JPYC.cancel_authorization": {"tf": 1.4142135623730951}, "src.JPYC.permit": {"tf": 1.7320508075688772}, "src.utils.AccountNotInitialized": {"tf": 1}}, "df": 7}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.SdkClient.__init__": {"tf": 1}}, "df": 1}}}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"src.SdkClient.__init__": {"tf": 2}, "src.SdkClient.set_account": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1.4142135623730951}}, "df": 4}}}}}}}, "f": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1.4142135623730951}, "src.JPYC": {"tf": 1}, "src.JPYC.minter_allowance": {"tf": 1}, "src.JPYC.total_supply": {"tf": 1}, "src.JPYC.balance_of": {"tf": 1}, "src.JPYC.allowance": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 2}, "src.JPYC.receive_with_authorization": {"tf": 2}, "src.JPYC.cancel_authorization": {"tf": 1.7320508075688772}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 2}, "src.utils.get_proxy_address": {"tf": 1.7320508075688772}, "src.utils.get_artifacts": {"tf": 1.7320508075688772}, "src.utils.resolve_artifacts_file_path": {"tf": 1.4142135623730951}}, "df": 22}, "n": {"docs": {}, "df": 0, "e": {"docs": {"src.SdkClient.set_default_provider": {"tf": 1}}, "df": 1}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.is_minter": {"tf": 1}}, "df": 1}}}}}}}}, "w": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.nonces": {"tf": 1.7320508075688772}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.permit": {"tf": 1.7320508075688772}}, "df": 6}}}}}, "r": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1.7320508075688772}, "src.JPYC.receive_with_authorization": {"tf": 1.7320508075688772}, "src.JPYC.cancel_authorization": {"tf": 1.7320508075688772}, "src.JPYC.permit": {"tf": 1.7320508075688772}}, "df": 4, "p": {"docs": {}, "df": 0, "c": {"docs": {"src.SdkClient.__init__": {"tf": 2.449489742783178}, "src.SdkClient.rpc_endpoint": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 2}, "src.utils.get_default_rpc_endpoint": {"tf": 1.4142135623730951}}, "df": 5, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 3}}}}}}}}}}, "e": {"docs": {}, "df": 0, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.SdkClient.__init__": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}, "src.utils.get_artifacts": {"tf": 1}, "src.utils.resolve_artifacts_file_path": {"tf": 1}, "src.utils.enumerate_supported_networks": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.remove_decimals": {"tf": 1}}, "df": 23}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.remove_decimals": {"tf": 1}}, "df": 1, "s": {"docs": {"src.SdkClient.set_account": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}}, "df": 5}, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.JPYC.receive_with_authorization": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}}}}, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.restore_decimals": {"tf": 1}}, "df": 1}}}}}}, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.SdkClient.get_account_address": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 19}, "d": {"docs": {"src.utils.AccountNotInitialized": {"tf": 1}, "src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint256": {"tf": 1}, "src.utils.NetworkNotSupported": {"tf": 1}, "src.utils.TransactionFailed": {"tf": 1}, "src.utils.TransactionSimulationFailed": {"tf": 1}}, "df": 8}}}}}}, "w": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.receive_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.permit": {"tf": 1}, "src.utils.AccountNotInitialized": {"tf": 1}, "src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint256": {"tf": 1}, "src.utils.NetworkNotSupported": {"tf": 1}, "src.utils.TransactionFailed": {"tf": 1}, "src.utils.TransactionSimulationFailed": {"tf": 1}}, "df": 12}}}, "e": {"docs": {}, "df": 0, "b": {"3": {"docs": {"src.SdkClient.w3": {"tf": 1.4142135623730951}, "src.SdkClient.set_default_provider": {"tf": 1.4142135623730951}, "src.SdkClient.set_custom_provider": {"tf": 1.4142135623730951}, "src.SdkClient.set_account": {"tf": 1}, "src.utils.AccountNotInitialized": {"tf": 1}}, "df": 5}, "docs": {}, "df": 0}, "i": {"docs": {"src.utils.remove_decimals": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"src.SdkClient.set_account": {"tf": 1}, "src.JPYC.__init__": {"tf": 1}}, "df": 2}}}}, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "y": {"docs": {"src.SdkClient.__init__": {"tf": 1.7320508075688772}, "src.SdkClient.set_account": {"tf": 2.23606797749979}}, "df": 2}}}, "b": {"docs": {}, "df": 0, "y": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}, "src.utils.NetworkNotSupported": {"tf": 1}}, "df": 4, "t": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.InvalidBytes32": {"tf": 1}}, "df": 1, "s": {"3": {"2": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 2}, "src.JPYC.receive_with_authorization": {"tf": 2}, "src.JPYC.cancel_authorization": {"tf": 2}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1.7320508075688772}, "src.utils.InvalidBytes32": {"tf": 1}}, "df": 14}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}}}, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {"src.JPYC.is_minter": {"tf": 1}}, "df": 1}}}, "e": {"docs": {"src.utils.get_proxy_address": {"tf": 1}}, "df": 1, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.receive_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.permit": {"tf": 1}}, "df": 3}}}}}, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.receive_with_authorization": {"tf": 1.4142135623730951}}, "df": 2}}}}}}, "v": {"2": {"docs": {"src.utils.get_proxy_address": {"tf": 1}}, "df": 1}, "docs": {"src.JPYC.transfer_with_authorization": {"tf": 1.7320508075688772}, "src.JPYC.receive_with_authorization": {"tf": 1.7320508075688772}, "src.JPYC.cancel_authorization": {"tf": 1.7320508075688772}, "src.JPYC.permit": {"tf": 1.7320508075688772}}, "df": 4, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1.4142135623730951}, "src.JPYC.mint": {"tf": 1.4142135623730951}, "src.JPYC.transfer": {"tf": 1.4142135623730951}, "src.JPYC.transfer_from": {"tf": 1.4142135623730951}, "src.JPYC.transfer_with_authorization": {"tf": 3}, "src.JPYC.receive_with_authorization": {"tf": 3}, "src.JPYC.cancel_authorization": {"tf": 1.7320508075688772}, "src.JPYC.approve": {"tf": 1.4142135623730951}, "src.JPYC.increase_allowance": {"tf": 1.4142135623730951}, "src.JPYC.decrease_allowance": {"tf": 1.4142135623730951}, "src.JPYC.permit": {"tf": 2}, "src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint256": {"tf": 1}}, "df": 20, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}}, "df": 2, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}}, "df": 2}}}}}}}}}}}}, "u": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.transfer": {"tf": 1.4142135623730951}, "src.JPYC.transfer_from": {"tf": 1.4142135623730951}, "src.JPYC.transfer_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.receive_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.approve": {"tf": 1.4142135623730951}, "src.JPYC.permit": {"tf": 1.4142135623730951}, "src.utils.remove_decimals": {"tf": 1.7320508075688772}}, "df": 7}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.JPYC.__init__": {"tf": 1.4142135623730951}, "src.utils.get_proxy_address": {"tf": 2}, "src.utils.resolve_artifacts_file_path": {"tf": 1.7320508075688772}}, "df": 3}}}}}}}, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.nonces": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 2, "m": {"docs": {"src.SdkClient.__init__": {"tf": 1.4142135623730951}, "src.SdkClient.set_custom_provider": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}, "src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1.4142135623730951}, "src.JPYC.mint": {"tf": 1.4142135623730951}, "src.JPYC.transfer": {"tf": 1.4142135623730951}, "src.JPYC.transfer_from": {"tf": 1.4142135623730951}, "src.JPYC.transfer_with_authorization": {"tf": 2}, "src.JPYC.receive_with_authorization": {"tf": 2}, "src.JPYC.cancel_authorization": {"tf": 1.7320508075688772}, "src.JPYC.approve": {"tf": 1.4142135623730951}, "src.JPYC.increase_allowance": {"tf": 1.4142135623730951}, "src.JPYC.decrease_allowance": {"tf": 1.4142135623730951}, "src.JPYC.permit": {"tf": 2}}, "df": 16}}}, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"src.SdkClient.__init__": {"tf": 1}, "src.SdkClient.set_default_provider": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1.4142135623730951}, "src.JPYC.mint": {"tf": 1.4142135623730951}, "src.JPYC.transfer": {"tf": 1.4142135623730951}, "src.JPYC.transfer_from": {"tf": 1.4142135623730951}, "src.JPYC.transfer_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.receive_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.cancel_authorization": {"tf": 1.4142135623730951}, "src.JPYC.approve": {"tf": 1.4142135623730951}, "src.JPYC.increase_allowance": {"tf": 1.4142135623730951}, "src.JPYC.decrease_allowance": {"tf": 1.4142135623730951}, "src.JPYC.permit": {"tf": 1.4142135623730951}, "src.utils.TransactionFailed": {"tf": 1}, "src.utils.TransactionSimulationFailed": {"tf": 1}}, "df": 15}}}, "l": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.is_minter": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"src.SdkClient.set_account": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1.4142135623730951}, "src.JPYC.transfer_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.receive_with_authorization": {"tf": 1.4142135623730951}, "src.utils.get_proxy_address": {"tf": 1}, "src.utils.get_artifacts": {"tf": 1}, "src.utils.resolve_artifacts_file_path": {"tf": 1}}, "df": 7}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"src.JPYC.is_minter": {"tf": 1}, "src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 13}}}}}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.get_artifacts": {"tf": 1.7320508075688772}, "src.utils.resolve_artifacts_file_path": {"tf": 1.4142135623730951}}, "df": 2}}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.account": {"tf": 1}, "src.SdkClient.set_account": {"tf": 1}}, "df": 2}}}}}}}, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"src.utils.get_proxy_address": {"tf": 1}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"src.SdkClient.set_default_provider": {"tf": 1}, "src.SdkClient.set_custom_provider": {"tf": 1}}, "df": 2}}}, "e": {"docs": {"src.JPYC.__init__": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"2": {"5": {"6": {"docs": {"src.JPYC.nonces": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1.7320508075688772}, "src.JPYC.receive_with_authorization": {"tf": 1.7320508075688772}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1.4142135623730951}, "src.utils.remove_decimals": {"tf": 1.4142135623730951}, "src.utils.InvalidUint256": {"tf": 1}}, "df": 13}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "8": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.permit": {"tf": 1}, "src.utils.InvalidUint8": {"tf": 1}}, "df": 5}, "docs": {}, "df": 0}}}, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "x": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.receive_with_authorization": {"tf": 1.4142135623730951}, "src.JPYC.permit": {"tf": 1}}, "df": 3}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}}, "df": 3}}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.set_default_provider": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 3}}}}}, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {"src.JPYC.__init__": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.decrease_allowance": {"tf": 1}}, "df": 1, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.decrease_allowance": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.decrease_allowance": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"src.utils.remove_decimals": {"tf": 1}}, "df": 1, "s": {"docs": {"src.utils.remove_decimals": {"tf": 1}, "src.utils.restore_decimals": {"tf": 1}}, "df": 2}}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"src.utils.restore_decimals": {"tf": 1}}, "df": 1}}}}}}}, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"src.JPYC.permit": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {"src.SdkClient.set_account": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"src.utils.TransactionFailed": {"tf": 1.4142135623730951}, "src.utils.TransactionSimulationFailed": {"tf": 1.4142135623730951}}, "df": 2}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"src.JPYC.mint": {"tf": 1.4142135623730951}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {"src.JPYC.is_minter": {"tf": 1}, "src.JPYC.configure_minter": {"tf": 2.449489742783178}}, "df": 2}}}}}, "a": {"docs": {}, "df": 0, "y": {"docs": {"src.utils.get_proxy_address": {"tf": 1}}, "df": 1}}}, "g": {"docs": {"src.utils.get_proxy_address": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "t": {"docs": {"src.SdkClient.get_account_address": {"tf": 1}, "src.utils.get_proxy_address": {"tf": 1}, "src.utils.get_artifacts": {"tf": 1}, "src.utils.get_default_rpc_endpoint": {"tf": 1}}, "df": 4}}, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"src.utils.InvalidBytes32": {"tf": 1}, "src.utils.InvalidChecksumAddress": {"tf": 1}, "src.utils.InvalidUint8": {"tf": 1}, "src.utils.InvalidUint256": {"tf": 1}}, "df": 4}}}}}, "j": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "c": {"docs": {"src.JPYC.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"src.JPYC.configure_minter": {"tf": 1}, "src.JPYC.mint": {"tf": 1}, "src.JPYC.transfer": {"tf": 1}, "src.JPYC.transfer_from": {"tf": 1}, "src.JPYC.transfer_with_authorization": {"tf": 1}, "src.JPYC.receive_with_authorization": {"tf": 1}, "src.JPYC.cancel_authorization": {"tf": 1}, "src.JPYC.approve": {"tf": 1}, "src.JPYC.increase_allowance": {"tf": 1}, "src.JPYC.decrease_allowance": {"tf": 1}, "src.JPYC.permit": {"tf": 1}}, "df": 11}}}, "o": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"src.utils.AccountNotInitialized": {"tf": 1}}, "df": 1}}}}}}}}}}, "pipeline": ["trimmer"], "_isPrebuiltIndex": true}; + + // mirrored in build-search-index.js (part 1) + // Also split on html tags. this is a cheap heuristic, but good enough. + elasticlunr.tokenizer.setSeperator(/[\s\-.;&_'"=,()]+|<[^>]*>/); + + let searchIndex; + if (docs._isPrebuiltIndex) { + console.info("using precompiled search index"); + searchIndex = elasticlunr.Index.load(docs); + } else { + console.time("building search index"); + // mirrored in build-search-index.js (part 2) + searchIndex = elasticlunr(function () { + this.pipeline.remove(elasticlunr.stemmer); + this.pipeline.remove(elasticlunr.stopWordFilter); + this.addField("qualname"); + this.addField("fullname"); + this.addField("annotation"); + this.addField("default_value"); + this.addField("signature"); + this.addField("bases"); + this.addField("doc"); + this.setRef("fullname"); + }); + for (let doc of docs) { + searchIndex.addDoc(doc); + } + console.timeEnd("building search index"); + } + + return (term) => searchIndex.search(term, { + fields: { + qualname: {boost: 4}, + fullname: {boost: 2}, + annotation: {boost: 2}, + default_value: {boost: 2}, + signature: {boost: 2}, + bases: {boost: 2}, + doc: {boost: 1}, + }, + expand: true + }); +})(); \ No newline at end of file diff --git a/docs/core/src.html b/docs/core/src.html new file mode 100644 index 0000000..4cf8845 --- /dev/null +++ b/docs/core/src.html @@ -0,0 +1,2254 @@ + + + + + + + src API documentation + + + + + + + + + +
+
+

+src

+ + + + + + +
 1# from importlib.metadata import version
+ 2
+ 3from .client import SdkClient
+ 4from .jpyc import JPYC
+ 5
+ 6# __version__ = version("jpyc-core-sdk")
+ 7__all__ = [
+ 8    # "__version__",
+ 9    # client
+10    "SdkClient",
+11    # jpyc
+12    "JPYC",
+13    # utils
+14    "utils",
+15]
+
+ + +
+
+ +
+ + class + SdkClient(src.interfaces.client.ISdkClient): + + + +
+ +
 25class SdkClient(ISdkClient):
+ 26    """SDK client."""
+ 27
+ 28    @validate_call
+ 29    def __init__(
+ 30        self,
+ 31        chain_name: ChainName | None = None,
+ 32        network_name: str | None = None,
+ 33        rpc_endpoint: RpcEndpoint | None = None,
+ 34        private_key: Bytes32 | None = None,
+ 35    ) -> None:
+ 36        """Constructor that initializes SDK client.
+ 37
+ 38        Notes:
+ 39            - Either `chain_name` & `network_name` parameters\
+ 40              or `rpc_endpoint` parameter are required.
+ 41            - This constructor prioritizes `rpc_endpoint` parameter over\
+ 42            `chain_name` & `network_name` parameters when configuring `rpc_endpoint`.
+ 43
+ 44        Args:
+ 45            chain_name (str, optional): Chain name
+ 46            network_name (str, optional): Network name
+ 47            rpc_endpoint (RpcEndpoint, optional): RPC endpoint
+ 48            private_key (Bytes32, optional): private key of EOA
+ 49
+ 50        Raises:
+ 51            InvalidBytes32: If the supplied `private_key` is not in a valid form
+ 52            InvalidRpcEndpoint: If the supplied `rpc_endpoint` is not in a valid form
+ 53            NetworkNotSupported: If the specified network is not supported by the SDK
+ 54            ValidationError: If pydantic validation fails
+ 55        """
+ 56        rpc_endpoint = (
+ 57            rpc_endpoint
+ 58            if rpc_endpoint is not None
+ 59            else get_default_rpc_endpoint(chain_name, network_name)
+ 60        )
+ 61        account = Account.from_key(private_key) if private_key is not None else None
+ 62        w3 = self.__configure_w3(
+ 63            rpc_endpoint=rpc_endpoint,
+ 64            account=account,
+ 65        )
+ 66
+ 67        self.w3 = w3
+ 68        """Web3: Configured web3 instance"""
+ 69        self.rpc_endpoint = rpc_endpoint
+ 70        """str: RPC endpoint"""
+ 71        self.account = account
+ 72        """LocalAccount | None: Account instance"""
+ 73
+ 74    @staticmethod
+ 75    def __configure_w3(
+ 76        rpc_endpoint: RpcEndpoint,
+ 77        account: LocalAccount | None = None,
+ 78    ) -> Web3:
+ 79        """Configure a web3 instance.
+ 80
+ 81        Args:
+ 82            rpc_endpoint (RpcEndpoint): RPC endpoint
+ 83            account (LocalAccount, optional): Account instance
+ 84
+ 85        Returns:
+ 86            Web3: Configured web3 instance
+ 87        """
+ 88        w3 = Web3(HTTPProvider(rpc_endpoint))
+ 89        w3.middleware_onion.inject(
+ 90            ExtraDataToPOAMiddleware,
+ 91            name=POA_MIDDLEWARE,
+ 92            layer=0,
+ 93        )
+ 94        if account is not None:
+ 95            w3.eth.default_account = account.address
+ 96            w3.middleware_onion.inject(
+ 97                SignAndSendRawMiddlewareBuilder.build(account),
+ 98                name=SIGN_MIDDLEWARE,
+ 99                layer=0,
+100            )
+101        else:
+102            w3.eth.default_account = None  # type: ignore[assignment]
+103
+104        return w3
+105
+106    @validate_call
+107    def set_default_provider(self, chain_name: ChainName, network_name: str) -> Web3:
+108        self.w3 = self.__configure_w3(
+109            rpc_endpoint=get_default_rpc_endpoint(chain_name, network_name),
+110            account=self.account,
+111        )
+112
+113        return self.w3
+114
+115    @validate_call
+116    def set_custom_provider(self, rpc_endpoint: RpcEndpoint) -> Web3:
+117        self.w3 = self.__configure_w3(rpc_endpoint=rpc_endpoint, account=self.account)
+118
+119        return self.w3
+120
+121    @validate_call
+122    def set_account(self, private_key: Bytes32 | None) -> LocalAccount | None:
+123        if private_key is None:
+124            self.account = None
+125            self.w3 = self.__configure_w3(
+126                rpc_endpoint=self.rpc_endpoint,
+127            )
+128        else:
+129            self.account = Account.from_key(private_key)
+130            self.w3 = self.__configure_w3(
+131                rpc_endpoint=self.rpc_endpoint, account=self.account
+132            )
+133
+134        return self.account
+135
+136    def get_account_address(self) -> ChecksumAddress:
+137        if self.account is None:
+138            raise AccountNotInitialized()
+139
+140        return self.account.address
+
+ + +

SDK client.

+
+ + +
+ +
+
@validate_call
+ + SdkClient( chain_name: ChainName | None = None, network_name: str | None = None, rpc_endpoint: Optional[Annotated[str, AfterValidator(func=<function validate_rpc_endpoint>)]] = None, private_key: Optional[Annotated[str, AfterValidator(func=<function validate_bytes32>)]] = None) + + + +
+ +
28    @validate_call
+29    def __init__(
+30        self,
+31        chain_name: ChainName | None = None,
+32        network_name: str | None = None,
+33        rpc_endpoint: RpcEndpoint | None = None,
+34        private_key: Bytes32 | None = None,
+35    ) -> None:
+36        """Constructor that initializes SDK client.
+37
+38        Notes:
+39            - Either `chain_name` & `network_name` parameters\
+40              or `rpc_endpoint` parameter are required.
+41            - This constructor prioritizes `rpc_endpoint` parameter over\
+42            `chain_name` & `network_name` parameters when configuring `rpc_endpoint`.
+43
+44        Args:
+45            chain_name (str, optional): Chain name
+46            network_name (str, optional): Network name
+47            rpc_endpoint (RpcEndpoint, optional): RPC endpoint
+48            private_key (Bytes32, optional): private key of EOA
+49
+50        Raises:
+51            InvalidBytes32: If the supplied `private_key` is not in a valid form
+52            InvalidRpcEndpoint: If the supplied `rpc_endpoint` is not in a valid form
+53            NetworkNotSupported: If the specified network is not supported by the SDK
+54            ValidationError: If pydantic validation fails
+55        """
+56        rpc_endpoint = (
+57            rpc_endpoint
+58            if rpc_endpoint is not None
+59            else get_default_rpc_endpoint(chain_name, network_name)
+60        )
+61        account = Account.from_key(private_key) if private_key is not None else None
+62        w3 = self.__configure_w3(
+63            rpc_endpoint=rpc_endpoint,
+64            account=account,
+65        )
+66
+67        self.w3 = w3
+68        """Web3: Configured web3 instance"""
+69        self.rpc_endpoint = rpc_endpoint
+70        """str: RPC endpoint"""
+71        self.account = account
+72        """LocalAccount | None: Account instance"""
+
+ + +

Constructor that initializes SDK client.

+ +
Notes:
+ +
+
    +
  • Either chain_name & network_name parameters or rpc_endpoint parameter are required.
  • +
  • This constructor prioritizes rpc_endpoint parameter over chain_name & network_name parameters when configuring rpc_endpoint.
  • +
+
+ +
Arguments:
+ +
    +
  • chain_name (str, optional): Chain name
  • +
  • network_name (str, optional): Network name
  • +
  • rpc_endpoint (RpcEndpoint, optional): RPC endpoint
  • +
  • private_key (Bytes32, optional): private key of EOA
  • +
+ +
Raises:
+ +
    +
  • InvalidBytes32: If the supplied private_key is not in a valid form
  • +
  • InvalidRpcEndpoint: If the supplied rpc_endpoint is not in a valid form
  • +
  • NetworkNotSupported: If the specified network is not supported by the SDK
  • +
  • ValidationError: If pydantic validation fails
  • +
+
+ + +
+
+
+ w3 + + +
+ + +

Web3: Configured web3 instance

+
+ + +
+
+
+ rpc_endpoint + + +
+ + +

str: RPC endpoint

+
+ + +
+
+
+ account + + +
+ + +

LocalAccount | None: Account instance

+
+ + +
+
+ +
+
@validate_call
+ + def + set_default_provider(self, chain_name: ChainName, network_name: str) -> web3.main.Web3: + + + +
+ +
106    @validate_call
+107    def set_default_provider(self, chain_name: ChainName, network_name: str) -> Web3:
+108        self.w3 = self.__configure_w3(
+109            rpc_endpoint=get_default_rpc_endpoint(chain_name, network_name),
+110            account=self.account,
+111        )
+112
+113        return self.w3
+
+ + +

Set provider using one of the default RPC endpoints.

+ +
Arguments:
+ +
    +
  • chain_name (str): Chain name
  • +
  • network_name (str): Network name
  • +
+ +
Returns:
+ +
+

Web3: Configured web3 instance

+
+ +
Raises:
+ +
    +
  • NetworkNotSupported: If the specified network is not supported by the SDK
  • +
  • ValidationError: If pydantic validation fails
  • +
+
+ + +
+
+ +
+
@validate_call
+ + def + set_custom_provider( self, rpc_endpoint: Annotated[str, AfterValidator(func=<function validate_rpc_endpoint>)]) -> web3.main.Web3: + + + +
+ +
115    @validate_call
+116    def set_custom_provider(self, rpc_endpoint: RpcEndpoint) -> Web3:
+117        self.w3 = self.__configure_w3(rpc_endpoint=rpc_endpoint, account=self.account)
+118
+119        return self.w3
+
+ + +

Set provider using a custom RPC endpoint.

+ +
Arguments:
+ +
    +
  • rpc_endpoint (RpcEndpoint): Custom RPC endpoint
  • +
+ +
Returns:
+ +
+

Web3: Configured web3 instance

+
+ +
Raises:
+ +
    +
  • InvalidRpcEndpoint: If the supplied rpc_endpoint is not in a valid form
  • +
+
+ + +
+
+ +
+
@validate_call
+ + def + set_account( self, private_key: Optional[Annotated[str, AfterValidator(func=<function validate_bytes32>)]]) -> eth_account.signers.local.LocalAccount | None: + + + +
+ +
121    @validate_call
+122    def set_account(self, private_key: Bytes32 | None) -> LocalAccount | None:
+123        if private_key is None:
+124            self.account = None
+125            self.w3 = self.__configure_w3(
+126                rpc_endpoint=self.rpc_endpoint,
+127            )
+128        else:
+129            self.account = Account.from_key(private_key)
+130            self.w3 = self.__configure_w3(
+131                rpc_endpoint=self.rpc_endpoint, account=self.account
+132            )
+133
+134        return self.account
+
+ + +

Set account with a private key.

+ +
Notes:
+ +
+

If private_key parameter is set to None, this method removes account from the configured web3 instance.

+
+ +
Arguments:
+ +
    +
  • private_key (Bytes32, optional): Private key of account
  • +
+ +
Returns:
+ +
+

LocalAccount | None: Configured account instance

+
+ +
Raises:
+ +
    +
  • InvalidBytes32: If the supplied private_key is not in a valid form
  • +
+
+ + +
+
+ +
+ + def + get_account_address( self) -> Annotated[str, AfterValidator(func=<function validate_checksum_address at 0x1086211c0>)]: + + + +
+ +
136    def get_account_address(self) -> ChecksumAddress:
+137        if self.account is None:
+138            raise AccountNotInitialized()
+139
+140        return self.account.address
+
+ + +

Get address of the configured account.

+ +
Returns:
+ +
+

ChecksumAddress: Public address of account

+
+ +
Raises:
+ +
    +
  • AccountNotInitialized: If account is not initialized
  • +
+
+ + +
+
+
+ +
+ + class + JPYC(src.interfaces.jpyc.IJPYC): + + + +
+ +
 32class JPYC(IJPYC):
+ 33    """Implementation of IJPYC."""
+ 34
+ 35    def __init__(
+ 36        self,
+ 37        client: SdkClient,
+ 38        contract_version: ContractVersion = "2",
+ 39        contract_address: EthChecksumAddress | None = None,
+ 40    ) -> None:
+ 41        """Constructor that initializes JPYC client.
+ 42
+ 43        Notes:
+ 44            - If `client` parameter is configured to use localhost network,\
+ 45            this deploys JPYC contracts to localhost network, initializes it,\
+ 46            and sets its address to `address` attribute.
+ 47            - If `contract_address` is supplied,\
+ 48            this configures contract instance with that address.
+ 49
+ 50        Args:
+ 51            client (SdkClient): Configured SDK client
+ 52            contract_version (ContractVersion): Contract version
+ 53            contract_address (EthChecksumAddress, optional): Contract address
+ 54        """
+ 55        if (
+ 56            client.w3.eth.chain_id == SUPPORTED_CHAINS["localhost"]["devnet"]["id"]
+ 57            and contract_address is None
+ 58        ):
+ 59            address = self.__deploy_contract(
+ 60                client=client,
+ 61                contract_version=contract_version,
+ 62            )
+ 63            contract = self.__get_contract(
+ 64                client=client,
+ 65                contract_address=address,
+ 66                contract_version=contract_version,
+ 67            )
+ 68            self.__initialize_contract(
+ 69                client=client,
+ 70                contract=contract,
+ 71            )
+ 72        else:
+ 73            address = (
+ 74                contract_address
+ 75                if contract_address is not None
+ 76                else get_proxy_address(contract_version=contract_version)
+ 77            )
+ 78            contract = self.__get_contract(
+ 79                client=client,
+ 80                contract_address=address,
+ 81                contract_version=contract_version,
+ 82            )
+ 83
+ 84        self.client = client
+ 85        """ISdkClient: Configured SDK client"""
+ 86        self.contract = contract
+ 87        """Contract: Configured contract instance"""
+ 88
+ 89    ##################
+ 90    # Helper methods #
+ 91    ##################
+ 92
+ 93    @staticmethod
+ 94    def __deploy_contract(
+ 95        client: SdkClient,
+ 96        contract_version: ContractVersion = "2",
+ 97    ) -> ChecksumAddress:
+ 98        """Deploy contracts to the configured network.
+ 99
+100        Note:
+101            This helper method is mainly for development purposes. \
+102            Please use this method to deploy contracts to localhost network.
+103
+104        Args:
+105            client (SdkClient): Configured SDK client
+106            contract_version (ContractVersion): Contract version
+107
+108        Returns:
+109            ChecksumAddress: Address of the deployed contracts
+110        """
+111        file_path = resolve_artifacts_file_path(contract_version=contract_version)
+112        contract = client.w3.eth.contract(
+113            abi=get_artifacts(file_path, "abi"),
+114            bytecode=get_artifacts(file_path, "bytecode"),
+115        )
+116        tx_hash = contract.constructor().transact()
+117
+118        return client.w3.eth.wait_for_transaction_receipt(tx_hash).contractAddress  # type: ignore[attr-defined]
+119
+120    @staticmethod
+121    def __get_contract(
+122        client: SdkClient,
+123        contract_address: ChecksumAddress,
+124        contract_version: ContractVersion = "2",
+125    ) -> Contract:
+126        """Get contract instance from the configured network.
+127
+128        Args:
+129            client (SdkClient): Configured SDK client
+130            contract_address (ChecksumAddress): Contract address
+131            contract_version (ContractVersion): Contract version
+132
+133        Returns:
+134            Contract: Address of the deployed contracts
+135        """
+136        return client.w3.eth.contract(  # type: ignore[call-overload]
+137            address=contract_address,
+138            abi=get_artifacts(
+139                file_path=resolve_artifacts_file_path(
+140                    contract_version=contract_version
+141                ),
+142                artifact_type="abi",
+143            ),
+144        )
+145
+146    @staticmethod
+147    def __initialize_contract(
+148        client: SdkClient,
+149        contract: Contract,
+150    ) -> None:
+151        """Initialize contract.
+152
+153        Args:
+154            client (SdkClient): Configured SDK client
+155            contract (Contract): Configured contract instance
+156        """
+157        owner_address = client.get_account_address()
+158        contract.functions.initialize(
+159            "JPY Coin",
+160            "JPYC",
+161            "Yen",
+162            18,
+163            owner_address,
+164            owner_address,
+165            owner_address,
+166            owner_address,
+167            owner_address,
+168        ).transact()
+169
+170    def __account_initialized(self) -> None:
+171        """Checks if account is initialized.
+172
+173        Note:
+174            An account must be set to web3 instance to send transactions.
+175
+176        Raises:
+177            AccountNotInitialized: If account is not initialized
+178        """
+179        if SIGN_MIDDLEWARE not in self.client.w3.middleware_onion:
+180            raise AccountNotInitialized()
+181
+182    @staticmethod
+183    def __simulate_transaction(
+184        contract_func: ContractFunction,
+185        func_args: dict[str, object],
+186    ) -> None:
+187        """Simulates a transaction locally.
+188
+189        Note:
+190            This method should be called before sending actual transactions.
+191
+192        Args:
+193            contract_func (ContractFunction): Contract function
+194            func_args (dict[str, object]): Arguments of contract function
+195
+196        Raises:
+197            TransactionSimulationFailed: If transaction simulation fails
+198        """
+199        try:
+200            contract_func(**func_args).call()
+201        except Exception as e:
+202            raise TransactionSimulationFailed(str(e))
+203
+204    @staticmethod
+205    def __send_transaction(
+206        contract_func: ContractFunction,
+207        func_args: dict[str, object],
+208    ) -> Any:
+209        """Sends a transaction to blockchain.
+210
+211        Args:
+212            contract_func (ContractFunction): Contract function
+213            func_args (dict[str, object]): Arguments of contract function
+214
+215        Returns:
+216            Any: Response from the contract function
+217
+218        Raises:
+219            TransactionFailed: If transaction fails
+220        """
+221        try:
+222            return contract_func(**func_args).transact()
+223        except Exception as e:
+224            raise TransactionFailed(str(e))
+225
+226    def __transact(
+227        self, contract_func: ContractFunction, func_args: dict[str, object]
+228    ) -> Any:
+229        """Helper method to prepare & send a transaction in one method.
+230
+231        Args:
+232            contract_func (ContractFunction): Contract function
+233            func_args (dict[str, object]): Arguments of contract function
+234
+235        Returns:
+236            Any: Response from the contract function
+237
+238        Raises:
+239            AccountNotInitialized: If account is not initialized
+240            TransactionSimulationFailed: If transaction simulation fails
+241            TransactionFailed: If transaction fails
+242        """
+243
+244        self.__account_initialized()
+245        self.__simulate_transaction(
+246            contract_func,
+247            func_args,
+248        )
+249        return self.__send_transaction(
+250            contract_func,
+251            func_args,
+252        )
+253
+254    ##################
+255    # View functions #
+256    ##################
+257
+258    @validate_call
+259    def is_minter(self, account: ChecksumAddress) -> bool:
+260        return self.contract.functions.isMinter(account).call()
+261
+262    @restore_decimals
+263    @validate_call
+264    def minter_allowance(self, minter: ChecksumAddress) -> Uint256:
+265        return self.contract.functions.minterAllowance(minter).call()
+266
+267    @restore_decimals
+268    def total_supply(self) -> Uint256:
+269        return self.contract.functions.totalSupply().call()
+270
+271    @restore_decimals
+272    @validate_call
+273    def balance_of(self, account: ChecksumAddress) -> Uint256:
+274        return self.contract.functions.balanceOf(account).call()
+275
+276    @restore_decimals
+277    @validate_call
+278    def allowance(self, owner: ChecksumAddress, spender: ChecksumAddress) -> Uint256:
+279        return self.contract.functions.allowance(owner, spender).call()
+280
+281    @validate_call
+282    def nonces(self, owner: ChecksumAddress) -> Uint256:
+283        return self.contract.functions.nonces(owner).call()
+284
+285    ######################
+286    # Mutation functions #
+287    ######################
+288
+289    @validate_call
+290    def configure_minter(
+291        self, minter: ChecksumAddress, minter_allowed_amount: Uint256
+292    ) -> Bytes32:
+293        tx_args: TransactionArgs = {
+294            "contract_func": self.contract.functions.configureMinter,
+295            "func_args": {
+296                "minter": minter,
+297                "minterAllowedAmount": remove_decimals(minter_allowed_amount),
+298            },
+299        }
+300
+301        return self.__transact(**tx_args)
+302
+303    @validate_call
+304    def mint(self, to: ChecksumAddress, amount: Uint256) -> Bytes32:
+305        tx_args: TransactionArgs = {
+306            "contract_func": self.contract.functions.mint,
+307            "func_args": {
+308                "_to": to,
+309                "_amount": remove_decimals(amount),
+310            },
+311        }
+312
+313        return self.__transact(**tx_args)
+314
+315    @validate_call
+316    def transfer(self, to: ChecksumAddress, value: Uint256) -> Bytes32:
+317        tx_args: TransactionArgs = {
+318            "contract_func": self.contract.functions.transfer,
+319            "func_args": {
+320                "to": to,
+321                "value": remove_decimals(value),
+322            },
+323        }
+324
+325        return self.__transact(**tx_args)
+326
+327    @validate_call
+328    def transfer_from(
+329        self, from_: ChecksumAddress, to: ChecksumAddress, value: Uint256
+330    ) -> Bytes32:
+331        tx_args: TransactionArgs = {
+332            "contract_func": self.contract.functions.transferFrom,
+333            "func_args": {
+334                "from": from_,
+335                "to": to,
+336                "value": remove_decimals(value),
+337            },
+338        }
+339
+340        return self.__transact(**tx_args)
+341
+342    @validate_call
+343    def transfer_with_authorization(
+344        self,
+345        from_: ChecksumAddress,
+346        to: ChecksumAddress,
+347        value: Uint256,
+348        valid_after: Uint256,
+349        valid_before: Uint256,
+350        nonce: Bytes32,
+351        v: Uint8,
+352        r: Bytes32,
+353        s: Bytes32,
+354    ) -> Bytes32:
+355        tx_args: TransactionArgs = {
+356            "contract_func": self.contract.functions.transferWithAuthorization,
+357            "func_args": {
+358                "from": from_,
+359                "to": to,
+360                "value": remove_decimals(value),
+361                "validAfter": valid_after,
+362                "validBefore": valid_before,
+363                "nonce": nonce,
+364                "v": v,
+365                "r": r,
+366                "s": s,
+367            },
+368        }
+369
+370        return self.__transact(**tx_args)
+371
+372    @validate_call
+373    def receive_with_authorization(
+374        self,
+375        from_: ChecksumAddress,
+376        to: ChecksumAddress,
+377        value: Uint256,
+378        valid_after: Uint256,
+379        valid_before: Uint256,
+380        nonce: Bytes32,
+381        v: Uint8,
+382        r: Bytes32,
+383        s: Bytes32,
+384    ) -> Bytes32:
+385        tx_args: TransactionArgs = {
+386            "contract_func": self.contract.functions.receiveWithAuthorization,
+387            "func_args": {
+388                "from": from_,
+389                "to": to,
+390                "value": remove_decimals(value),
+391                "validAfter": valid_after,
+392                "validBefore": valid_before,
+393                "nonce": nonce,
+394                "v": v,
+395                "r": r,
+396                "s": s,
+397            },
+398        }
+399
+400        return self.__transact(**tx_args)
+401
+402    @validate_call
+403    def cancel_authorization(
+404        self,
+405        authorizer: ChecksumAddress,
+406        nonce: Bytes32,
+407        v: Uint8,
+408        r: Bytes32,
+409        s: Bytes32,
+410    ) -> Bytes32:
+411        tx_args: TransactionArgs = {
+412            "contract_func": self.contract.functions.cancelAuthorization,
+413            "func_args": {
+414                "authorizer": authorizer,
+415                "nonce": nonce,
+416                "v": v,
+417                "r": r,
+418                "s": s,
+419            },
+420        }
+421
+422        return self.__transact(**tx_args)
+423
+424    @validate_call
+425    def approve(self, spender: ChecksumAddress, value: Uint256) -> Bytes32:
+426        tx_args: TransactionArgs = {
+427            "contract_func": self.contract.functions.approve,
+428            "func_args": {
+429                "spender": spender,
+430                "value": remove_decimals(value),
+431            },
+432        }
+433
+434        return self.__transact(**tx_args)
+435
+436    @validate_call
+437    def increase_allowance(
+438        self, spender: ChecksumAddress, increment: Uint256
+439    ) -> Bytes32:
+440        tx_args: TransactionArgs = {
+441            "contract_func": self.contract.functions.increaseAllowance,
+442            "func_args": {
+443                "spender": spender,
+444                "increment": remove_decimals(increment),
+445            },
+446        }
+447
+448        return self.__transact(**tx_args)
+449
+450    @validate_call
+451    def decrease_allowance(
+452        self, spender: ChecksumAddress, decrement: Uint256
+453    ) -> Bytes32:
+454        tx_args: TransactionArgs = {
+455            "contract_func": self.contract.functions.decreaseAllowance,
+456            "func_args": {
+457                "spender": spender,
+458                "decrement": remove_decimals(decrement),
+459            },
+460        }
+461
+462        return self.__transact(**tx_args)
+463
+464    @validate_call
+465    def permit(
+466        self,
+467        owner: ChecksumAddress,
+468        spender: ChecksumAddress,
+469        value: Uint256,
+470        deadline: Uint256,
+471        v: Uint8,
+472        r: Bytes32,
+473        s: Bytes32,
+474    ) -> Bytes32:
+475        tx_args: TransactionArgs = {
+476            "contract_func": self.contract.functions.permit,
+477            "func_args": {
+478                "owner": owner,
+479                "spender": spender,
+480                "value": remove_decimals(value),
+481                "deadline": deadline,
+482                "v": v,
+483                "r": r,
+484                "s": s,
+485            },
+486        }
+487
+488        return self.__transact(**tx_args)
+
+ + +

Implementation of IJPYC.

+
+ + +
+ +
+ + JPYC( client: SdkClient, contract_version: ContractVersion = '2', contract_address: Optional[eth_typing.evm.ChecksumAddress] = None) + + + +
+ +
35    def __init__(
+36        self,
+37        client: SdkClient,
+38        contract_version: ContractVersion = "2",
+39        contract_address: EthChecksumAddress | None = None,
+40    ) -> None:
+41        """Constructor that initializes JPYC client.
+42
+43        Notes:
+44            - If `client` parameter is configured to use localhost network,\
+45            this deploys JPYC contracts to localhost network, initializes it,\
+46            and sets its address to `address` attribute.
+47            - If `contract_address` is supplied,\
+48            this configures contract instance with that address.
+49
+50        Args:
+51            client (SdkClient): Configured SDK client
+52            contract_version (ContractVersion): Contract version
+53            contract_address (EthChecksumAddress, optional): Contract address
+54        """
+55        if (
+56            client.w3.eth.chain_id == SUPPORTED_CHAINS["localhost"]["devnet"]["id"]
+57            and contract_address is None
+58        ):
+59            address = self.__deploy_contract(
+60                client=client,
+61                contract_version=contract_version,
+62            )
+63            contract = self.__get_contract(
+64                client=client,
+65                contract_address=address,
+66                contract_version=contract_version,
+67            )
+68            self.__initialize_contract(
+69                client=client,
+70                contract=contract,
+71            )
+72        else:
+73            address = (
+74                contract_address
+75                if contract_address is not None
+76                else get_proxy_address(contract_version=contract_version)
+77            )
+78            contract = self.__get_contract(
+79                client=client,
+80                contract_address=address,
+81                contract_version=contract_version,
+82            )
+83
+84        self.client = client
+85        """ISdkClient: Configured SDK client"""
+86        self.contract = contract
+87        """Contract: Configured contract instance"""
+
+ + +

Constructor that initializes JPYC client.

+ +
Notes:
+ +
+
    +
  • If client parameter is configured to use localhost network, this deploys JPYC contracts to localhost network, initializes it, and sets its address to address attribute.
  • +
  • If contract_address is supplied, this configures contract instance with that address.
  • +
+
+ +
Arguments:
+ +
    +
  • client (SdkClient): Configured SDK client
  • +
  • contract_version (ContractVersion): Contract version
  • +
  • contract_address (EthChecksumAddress, optional): Contract address
  • +
+
+ + +
+
+
+ client + + +
+ + +

ISdkClient: Configured SDK client

+
+ + +
+
+
+ contract + + +
+ + +

Contract: Configured contract instance

+
+ + +
+
+ +
+
@validate_call
+ + def + is_minter( self, account: Annotated[str, AfterValidator(func=<function validate_checksum_address>)]) -> bool: + + + +
+ +
258    @validate_call
+259    def is_minter(self, account: ChecksumAddress) -> bool:
+260        return self.contract.functions.isMinter(account).call()
+
+ + +

Call isMinter function.

+ +
Arguments:
+ +
    +
  • account (ChecksumAddress): Account address
  • +
+ +
Returns:
+ +
+

bool: True if account is a minter, false otherwise

+
+ +
Raises:
+ +
    +
  • InvalidChecksumAddress: If supplied account is not in a valid form
  • +
+
+ + +
+
+ +
+ + def + minter_allowance(*args, **kwargs): + + + +
+ +
24    def wrapper(*args, **kwargs):  # type: ignore[no-untyped-def]
+25        result = func(*args, **kwargs)
+26        return Web3.from_wei(result, "ether")
+
+ + +

The type of the None singleton.

+
+ + +
+
+ +
+ + def + total_supply(*args, **kwargs): + + + +
+ +
24    def wrapper(*args, **kwargs):  # type: ignore[no-untyped-def]
+25        result = func(*args, **kwargs)
+26        return Web3.from_wei(result, "ether")
+
+ + +

The type of the None singleton.

+
+ + +
+
+ +
+ + def + balance_of(*args, **kwargs): + + + +
+ +
24    def wrapper(*args, **kwargs):  # type: ignore[no-untyped-def]
+25        result = func(*args, **kwargs)
+26        return Web3.from_wei(result, "ether")
+
+ + +

The type of the None singleton.

+
+ + +
+
+ +
+ + def + allowance(*args, **kwargs): + + + +
+ +
24    def wrapper(*args, **kwargs):  # type: ignore[no-untyped-def]
+25        result = func(*args, **kwargs)
+26        return Web3.from_wei(result, "ether")
+
+ + +

The type of the None singleton.

+
+ + +
+
+ +
+
@validate_call
+ + def + nonces( self, owner: Annotated[str, AfterValidator(func=<function validate_checksum_address>)]) -> Annotated[int, AfterValidator(func=<function validate_uint256 at 0x1086214e0>)]: + + + +
+ +
281    @validate_call
+282    def nonces(self, owner: ChecksumAddress) -> Uint256:
+283        return self.contract.functions.nonces(owner).call()
+
+ + +

Call nonces function.

+ +
Arguments:
+ +
    +
  • owner (ChecksumAddress): Owner address
  • +
+ +
Returns:
+ +
+

Uint256: Nonce for EIP2612's permit.

+
+ +
Raises:
+ +
    +
  • InvalidChecksumAddress: If supplied owner is not in a valid form
  • +
+
+ + +
+
+ +
+
@validate_call
+ + def + configure_minter( self, minter: Annotated[str, AfterValidator(func=<function validate_checksum_address>)], minter_allowed_amount: Annotated[int, AfterValidator(func=<function validate_uint256>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]: + + + +
+ +
289    @validate_call
+290    def configure_minter(
+291        self, minter: ChecksumAddress, minter_allowed_amount: Uint256
+292    ) -> Bytes32:
+293        tx_args: TransactionArgs = {
+294            "contract_func": self.contract.functions.configureMinter,
+295            "func_args": {
+296                "minter": minter,
+297                "minterAllowedAmount": remove_decimals(minter_allowed_amount),
+298            },
+299        }
+300
+301        return self.__transact(**tx_args)
+
+ + +

Call configureMinter function.

+ +
Arguments:
+ +
    +
  • minter (ChecksumAddress): Minter address
  • +
  • minter_allowed_amount (Uint256): Minter allowance
  • +
+ +
Returns:
+ +
+

Bytes32: Transaction hash

+
+ +
Raises:
+ +
    +
  • AccountNotInitialized: If account is not initialized
  • +
  • InvalidChecksumAddress: If supplied minter is not in a valid form
  • +
  • InvalidUint256: If supplied minter_allowed_amount is not in a valid form
  • +
  • TransactionFailed: If transaction fails
  • +
  • TransactionSimulationFailed: If transaction simulation fails
  • +
+
+ + +
+
+ +
+
@validate_call
+ + def + mint( self, to: Annotated[str, AfterValidator(func=<function validate_checksum_address>)], amount: Annotated[int, AfterValidator(func=<function validate_uint256>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]: + + + +
+ +
303    @validate_call
+304    def mint(self, to: ChecksumAddress, amount: Uint256) -> Bytes32:
+305        tx_args: TransactionArgs = {
+306            "contract_func": self.contract.functions.mint,
+307            "func_args": {
+308                "_to": to,
+309                "_amount": remove_decimals(amount),
+310            },
+311        }
+312
+313        return self.__transact(**tx_args)
+
+ + +

Call mint function.

+ +
Arguments:
+ +
    +
  • to (ChecksumAddress): Receiver address
  • +
  • amount (Uint256): Amount of tokens to mint
  • +
+ +
Returns:
+ +
+

Bytes32: Transaction hash

+
+ +
Raises:
+ +
    +
  • AccountNotInitialized: If account is not initialized
  • +
  • InvalidChecksumAddress: If supplied to is not in a valid form
  • +
  • InvalidUint256: If supplied amount is not in a valid form
  • +
  • TransactionFailed: If transaction fails
  • +
  • TransactionSimulationFailed: If transaction simulation fails
  • +
+
+ + +
+
+ +
+
@validate_call
+ + def + transfer( self, to: Annotated[str, AfterValidator(func=<function validate_checksum_address>)], value: Annotated[int, AfterValidator(func=<function validate_uint256>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]: + + + +
+ +
315    @validate_call
+316    def transfer(self, to: ChecksumAddress, value: Uint256) -> Bytes32:
+317        tx_args: TransactionArgs = {
+318            "contract_func": self.contract.functions.transfer,
+319            "func_args": {
+320                "to": to,
+321                "value": remove_decimals(value),
+322            },
+323        }
+324
+325        return self.__transact(**tx_args)
+
+ + +

Call transfer function.

+ +
Arguments:
+ +
    +
  • to (ChecksumAddress): Receiver address
  • +
  • value (Uint256): Amount of tokens to transfer
  • +
+ +
Returns:
+ +
+

Bytes32: Transaction hash

+
+ +
Raises:
+ +
    +
  • AccountNotInitialized: If account is not initialized
  • +
  • InvalidChecksumAddress: If supplied to is not in a valid form
  • +
  • InvalidUint256: If supplied value is not in a valid form
  • +
  • TransactionFailed: If transaction fails
  • +
  • TransactionSimulationFailed: If transaction simulation fails
  • +
+
+ + +
+
+ +
+
@validate_call
+ + def + transfer_from( self, from_: Annotated[str, AfterValidator(func=<function validate_checksum_address>)], to: Annotated[str, AfterValidator(func=<function validate_checksum_address>)], value: Annotated[int, AfterValidator(func=<function validate_uint256>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]: + + + +
+ +
327    @validate_call
+328    def transfer_from(
+329        self, from_: ChecksumAddress, to: ChecksumAddress, value: Uint256
+330    ) -> Bytes32:
+331        tx_args: TransactionArgs = {
+332            "contract_func": self.contract.functions.transferFrom,
+333            "func_args": {
+334                "from": from_,
+335                "to": to,
+336                "value": remove_decimals(value),
+337            },
+338        }
+339
+340        return self.__transact(**tx_args)
+
+ + +

Call transferFrom function.

+ +
Arguments:
+ +
    +
  • from_ (ChecksumAddress): Owner address
  • +
  • to (ChecksumAddress): Receiver address
  • +
  • value (Uint256): Amount of tokens to transfer
  • +
+ +
Returns:
+ +
+

Bytes32: Transaction hash

+
+ +
Raises:
+ +
    +
  • AccountNotInitialized: If account is not initialized
  • +
  • InvalidChecksumAddress: If supplied from_ or to is not in a valid form
  • +
  • InvalidUint256: If supplied value is not in a valid form
  • +
  • TransactionFailed: If transaction fails
  • +
  • TransactionSimulationFailed: If transaction simulation fails
  • +
+
+ + +
+
+ +
+
@validate_call
+ + def + transfer_with_authorization( self, from_: Annotated[str, AfterValidator(func=<function validate_checksum_address>)], to: Annotated[str, AfterValidator(func=<function validate_checksum_address>)], value: Annotated[int, AfterValidator(func=<function validate_uint256>)], valid_after: Annotated[int, AfterValidator(func=<function validate_uint256>)], valid_before: Annotated[int, AfterValidator(func=<function validate_uint256>)], nonce: Annotated[str, AfterValidator(func=<function validate_bytes32>)], v: Annotated[int, AfterValidator(func=<function validate_uint8>)], r: Annotated[str, AfterValidator(func=<function validate_bytes32>)], s: Annotated[str, AfterValidator(func=<function validate_bytes32>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]: + + + +
+ +
342    @validate_call
+343    def transfer_with_authorization(
+344        self,
+345        from_: ChecksumAddress,
+346        to: ChecksumAddress,
+347        value: Uint256,
+348        valid_after: Uint256,
+349        valid_before: Uint256,
+350        nonce: Bytes32,
+351        v: Uint8,
+352        r: Bytes32,
+353        s: Bytes32,
+354    ) -> Bytes32:
+355        tx_args: TransactionArgs = {
+356            "contract_func": self.contract.functions.transferWithAuthorization,
+357            "func_args": {
+358                "from": from_,
+359                "to": to,
+360                "value": remove_decimals(value),
+361                "validAfter": valid_after,
+362                "validBefore": valid_before,
+363                "nonce": nonce,
+364                "v": v,
+365                "r": r,
+366                "s": s,
+367            },
+368        }
+369
+370        return self.__transact(**tx_args)
+
+ + +

Call transferWithAuthorization function.

+ +
Arguments:
+ +
    +
  • from_ (ChecksumAddress): Owner address
  • +
  • to (ChecksumAddress): Receiver allowance
  • +
  • value (Uint256): Amount of tokens to transfer
  • +
  • valid_after (Uint256): Unix time when transaction becomes valid
  • +
  • valid_before (Uint256): Unix time when transaction becomes invalid
  • +
  • nonce (Bytes32): Unique nonce
  • +
  • v (Uint8): v of ECDSA
  • +
  • r (Bytes32): r of ECDSA
  • +
  • s (Bytes32): s of ECDSA
  • +
+ +
Returns:
+ +
+

Bytes32: Transaction hash

+
+ +
Raises:
+ +
    +
  • AccountNotInitialized: If account is not initialized
  • +
  • InvalidBytes32: If supplied nonce or r or s is not in a valid form
  • +
  • InvalidChecksumAddress: If supplied from_ or to is not in a valid form
  • +
  • InvalidUint256: If supplied value or valid_after or valid_before is not in a valid form
  • +
  • InvalidUint8: If supplied v is not in a valid form
  • +
  • TransactionFailed: If transaction fails
  • +
  • TransactionSimulationFailed: If transaction simulation fails
  • +
+
+ + +
+
+ +
+
@validate_call
+ + def + receive_with_authorization( self, from_: Annotated[str, AfterValidator(func=<function validate_checksum_address>)], to: Annotated[str, AfterValidator(func=<function validate_checksum_address>)], value: Annotated[int, AfterValidator(func=<function validate_uint256>)], valid_after: Annotated[int, AfterValidator(func=<function validate_uint256>)], valid_before: Annotated[int, AfterValidator(func=<function validate_uint256>)], nonce: Annotated[str, AfterValidator(func=<function validate_bytes32>)], v: Annotated[int, AfterValidator(func=<function validate_uint8>)], r: Annotated[str, AfterValidator(func=<function validate_bytes32>)], s: Annotated[str, AfterValidator(func=<function validate_bytes32>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]: + + + +
+ +
372    @validate_call
+373    def receive_with_authorization(
+374        self,
+375        from_: ChecksumAddress,
+376        to: ChecksumAddress,
+377        value: Uint256,
+378        valid_after: Uint256,
+379        valid_before: Uint256,
+380        nonce: Bytes32,
+381        v: Uint8,
+382        r: Bytes32,
+383        s: Bytes32,
+384    ) -> Bytes32:
+385        tx_args: TransactionArgs = {
+386            "contract_func": self.contract.functions.receiveWithAuthorization,
+387            "func_args": {
+388                "from": from_,
+389                "to": to,
+390                "value": remove_decimals(value),
+391                "validAfter": valid_after,
+392                "validBefore": valid_before,
+393                "nonce": nonce,
+394                "v": v,
+395                "r": r,
+396                "s": s,
+397            },
+398        }
+399
+400        return self.__transact(**tx_args)
+
+ + +

Call receiveWithAuthorization function.

+ +
Arguments:
+ +
    +
  • from_ (ChecksumAddress): Owner address
  • +
  • to (ChecksumAddress): Receiver allowance
  • +
  • value (Uint256): Amount of tokens to transfer
  • +
  • valid_after (Uint256): Unix time when transaction becomes valid
  • +
  • valid_before (Uint256): Unix time when transaction becomes invalid
  • +
  • nonce (Bytes32): Unique nonce
  • +
  • v (Uint8): v of ECDSA
  • +
  • r (Bytes32): r of ECDSA
  • +
  • s (Bytes32): s of ECDSA
  • +
+ +
Returns:
+ +
+

Bytes32: Transaction hash

+
+ +
Raises:
+ +
    +
  • AccountNotInitialized: If account is not initialized
  • +
  • InvalidBytes32: If supplied nonce or r or s is not in a valid form
  • +
  • InvalidChecksumAddress: If supplied from_ or to is not in a valid form
  • +
  • InvalidUint256: If supplied value or valid_after or valid_before is not in a valid form
  • +
  • InvalidUint8: If supplied v is not in a valid form
  • +
  • TransactionFailed: If transaction fails
  • +
  • TransactionSimulationFailed: If transaction simulation fails
  • +
+
+ + +
+
+ +
+
@validate_call
+ + def + cancel_authorization( self, authorizer: Annotated[str, AfterValidator(func=<function validate_checksum_address>)], nonce: Annotated[str, AfterValidator(func=<function validate_bytes32>)], v: Annotated[int, AfterValidator(func=<function validate_uint8>)], r: Annotated[str, AfterValidator(func=<function validate_bytes32>)], s: Annotated[str, AfterValidator(func=<function validate_bytes32>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]: + + + +
+ +
402    @validate_call
+403    def cancel_authorization(
+404        self,
+405        authorizer: ChecksumAddress,
+406        nonce: Bytes32,
+407        v: Uint8,
+408        r: Bytes32,
+409        s: Bytes32,
+410    ) -> Bytes32:
+411        tx_args: TransactionArgs = {
+412            "contract_func": self.contract.functions.cancelAuthorization,
+413            "func_args": {
+414                "authorizer": authorizer,
+415                "nonce": nonce,
+416                "v": v,
+417                "r": r,
+418                "s": s,
+419            },
+420        }
+421
+422        return self.__transact(**tx_args)
+
+ + +

Call cancelAuthorization function.

+ +
Arguments:
+ +
    +
  • authorizer (ChecksumAddress): Owner address
  • +
  • nonce (Bytes32): Unique nonce
  • +
  • v (Uint8): v of ECDSA
  • +
  • r (Bytes32): r of ECDSA
  • +
  • s (Bytes32): s of ECDSA
  • +
+ +
Returns:
+ +
+

Bytes32: Transaction hash

+
+ +
Raises:
+ +
    +
  • AccountNotInitialized: If account is not initialized
  • +
  • InvalidBytes32: If supplied nonce or r or s is not in a valid form
  • +
  • InvalidChecksumAddress: If supplied authorizer is not in a valid form
  • +
  • InvalidUint8: If supplied v is not in a valid form
  • +
  • TransactionFailed: If transaction fails
  • +
  • TransactionSimulationFailed: If transaction simulation fails
  • +
+
+ + +
+
+ +
+
@validate_call
+ + def + approve( self, spender: Annotated[str, AfterValidator(func=<function validate_checksum_address>)], value: Annotated[int, AfterValidator(func=<function validate_uint256>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]: + + + +
+ +
424    @validate_call
+425    def approve(self, spender: ChecksumAddress, value: Uint256) -> Bytes32:
+426        tx_args: TransactionArgs = {
+427            "contract_func": self.contract.functions.approve,
+428            "func_args": {
+429                "spender": spender,
+430                "value": remove_decimals(value),
+431            },
+432        }
+433
+434        return self.__transact(**tx_args)
+
+ + +

Call approve function.

+ +
Arguments:
+ +
    +
  • spender (ChecksumAddress): Spender address
  • +
  • value (Uint256): Amount of allowance
  • +
+ +
Returns:
+ +
+

Bytes32: Transaction hash

+
+ +
Raises:
+ +
    +
  • AccountNotInitialized: If account is not initialized
  • +
  • InvalidChecksumAddress: If supplied spender is not in a valid form
  • +
  • InvalidUint256: If supplied value is not in a valid form
  • +
  • TransactionFailed: If transaction fails
  • +
  • TransactionSimulationFailed: If transaction simulation fails
  • +
+
+ + +
+
+ +
+
@validate_call
+ + def + increase_allowance( self, spender: Annotated[str, AfterValidator(func=<function validate_checksum_address>)], increment: Annotated[int, AfterValidator(func=<function validate_uint256>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]: + + + +
+ +
436    @validate_call
+437    def increase_allowance(
+438        self, spender: ChecksumAddress, increment: Uint256
+439    ) -> Bytes32:
+440        tx_args: TransactionArgs = {
+441            "contract_func": self.contract.functions.increaseAllowance,
+442            "func_args": {
+443                "spender": spender,
+444                "increment": remove_decimals(increment),
+445            },
+446        }
+447
+448        return self.__transact(**tx_args)
+
+ + +

Call increaseAllowance function.

+ +
Arguments:
+ +
    +
  • spender (ChecksumAddress): Spender address
  • +
  • increment (Uint256): Amount of allowance to increase
  • +
+ +
Returns:
+ +
+

Bytes32: Transaction hash

+
+ +
Raises:
+ +
    +
  • AccountNotInitialized: If account is not initialized
  • +
  • InvalidChecksumAddress: If supplied spender is not in a valid form
  • +
  • InvalidUint256: If supplied increment is not in a valid form
  • +
  • TransactionFailed: If transaction fails
  • +
  • TransactionSimulationFailed: If transaction simulation fails
  • +
+
+ + +
+
+ +
+
@validate_call
+ + def + decrease_allowance( self, spender: Annotated[str, AfterValidator(func=<function validate_checksum_address>)], decrement: Annotated[int, AfterValidator(func=<function validate_uint256>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]: + + + +
+ +
450    @validate_call
+451    def decrease_allowance(
+452        self, spender: ChecksumAddress, decrement: Uint256
+453    ) -> Bytes32:
+454        tx_args: TransactionArgs = {
+455            "contract_func": self.contract.functions.decreaseAllowance,
+456            "func_args": {
+457                "spender": spender,
+458                "decrement": remove_decimals(decrement),
+459            },
+460        }
+461
+462        return self.__transact(**tx_args)
+
+ + +

Call decreaseAllowance function.

+ +
Arguments:
+ +
    +
  • spender (ChecksumAddress): Spender address
  • +
  • decrement (Uint256): Amount of allowance to decrease
  • +
+ +
Returns:
+ +
+

Bytes32: Transaction hash

+
+ +
Raises:
+ +
    +
  • AccountNotInitialized: If account is not initialized
  • +
  • InvalidChecksumAddress: If supplied spender is not in a valid form
  • +
  • InvalidUint256: If supplied decrement is not in a valid form
  • +
  • TransactionFailed: If transaction fails
  • +
  • TransactionSimulationFailed: If transaction simulation fails
  • +
+
+ + +
+
+ +
+
@validate_call
+ + def + permit( self, owner: Annotated[str, AfterValidator(func=<function validate_checksum_address>)], spender: Annotated[str, AfterValidator(func=<function validate_checksum_address>)], value: Annotated[int, AfterValidator(func=<function validate_uint256>)], deadline: Annotated[int, AfterValidator(func=<function validate_uint256>)], v: Annotated[int, AfterValidator(func=<function validate_uint8>)], r: Annotated[str, AfterValidator(func=<function validate_bytes32>)], s: Annotated[str, AfterValidator(func=<function validate_bytes32>)]) -> Annotated[str, AfterValidator(func=<function validate_bytes32 at 0x108621580>)]: + + + +
+ +
464    @validate_call
+465    def permit(
+466        self,
+467        owner: ChecksumAddress,
+468        spender: ChecksumAddress,
+469        value: Uint256,
+470        deadline: Uint256,
+471        v: Uint8,
+472        r: Bytes32,
+473        s: Bytes32,
+474    ) -> Bytes32:
+475        tx_args: TransactionArgs = {
+476            "contract_func": self.contract.functions.permit,
+477            "func_args": {
+478                "owner": owner,
+479                "spender": spender,
+480                "value": remove_decimals(value),
+481                "deadline": deadline,
+482                "v": v,
+483                "r": r,
+484                "s": s,
+485            },
+486        }
+487
+488        return self.__transact(**tx_args)
+
+ + +

Call permit function.

+ +
Arguments:
+ +
    +
  • owner (ChecksumAddress): Owner address
  • +
  • spender (ChecksumAddress): Spender address
  • +
  • value (Uint256): Amount of allowance
  • +
  • deadline (Uint256): Unix time when transaction becomes invalid
  • +
  • v (Uint8): v of ECDSA
  • +
  • r (Bytes32): r of ECDSA
  • +
  • s (Bytes32): s of ECDSA
  • +
+ +
Returns:
+ +
+

Bytes32: Transaction hash

+
+ +
Raises:
+ +
    +
  • AccountNotInitialized: If account is not initialized
  • +
  • InvalidBytes32: If supplied r or s is not in a valid form
  • +
  • InvalidChecksumAddress: If supplied owner or spender is not in a valid form
  • +
  • InvalidUint256: If supplied value or deadline is not in a valid form
  • +
  • InvalidUint8: If supplied v is not in a valid form
  • +
  • TransactionFailed: If transaction fails
  • +
  • TransactionSimulationFailed: If transaction simulation fails
  • +
+
+ + +
+
+
+ + \ No newline at end of file diff --git a/docs/core/src/utils.html b/docs/core/src/utils.html new file mode 100644 index 0000000..7def8d2 --- /dev/null +++ b/docs/core/src/utils.html @@ -0,0 +1,1501 @@ + + + + + + + src.utils API documentation + + + + + + + + + +
+
+

+src.utils

+ + + + + + +
 1from .addresses import get_proxy_address
+ 2from .artifacts import (
+ 3    get_artifacts,
+ 4    resolve_artifacts_file_path,
+ 5)
+ 6from .chains import (
+ 7    SUPPORTED_CHAINS,
+ 8    enumerate_supported_networks,
+ 9    get_default_rpc_endpoint,
+10)
+11from .constants import (
+12    POA_MIDDLEWARE,
+13    SIGN_MIDDLEWARE,
+14    UINT8_MAX,
+15    UINT256_MAX,
+16    UINT_MIN,
+17)
+18from .currencies import (
+19    remove_decimals,
+20    restore_decimals,
+21)
+22from .errors import (
+23    AccountNotInitialized,
+24    InvalidBytes32,
+25    InvalidChecksumAddress,
+26    InvalidUint8,
+27    InvalidUint256,
+28    NetworkNotSupported,
+29    TransactionFailed,
+30    TransactionSimulationFailed,
+31)
+32from .types import (
+33    ArtifactType,
+34    ChainMetadata,
+35    ChainName,
+36    ContractVersion,
+37)
+38from .validators import (
+39    Bytes32,
+40    ChecksumAddress,
+41    RpcEndpoint,
+42    Uint8,
+43    Uint256,
+44)
+45
+46__all__ = [
+47    # addresses
+48    "get_proxy_address",
+49    # artifacts
+50    "get_artifacts",
+51    "resolve_artifacts_file_path",
+52    # chains
+53    "enumerate_supported_networks",
+54    "get_default_rpc_endpoint",
+55    "SUPPORTED_CHAINS",
+56    # constants
+57    "POA_MIDDLEWARE",
+58    "SIGN_MIDDLEWARE",
+59    "UINT_MIN",
+60    "UINT256_MAX",
+61    "UINT8_MAX",
+62    # currencies
+63    "remove_decimals",
+64    "restore_decimals",
+65    # errors
+66    "AccountNotInitialized",
+67    "InvalidBytes32",
+68    "InvalidChecksumAddress",
+69    "InvalidUint8",
+70    "InvalidUint256",
+71    "NetworkNotSupported",
+72    "TransactionFailed",
+73    "TransactionSimulationFailed",
+74    # types
+75    "ArtifactType",
+76    "ChainMetadata",
+77    "ChainName",
+78    "ContractVersion",
+79    # validators
+80    "Bytes32",
+81    "ChecksumAddress",
+82    "RpcEndpoint",
+83    "Uint256",
+84    "Uint8",
+85]
+
+ + +
+
+ +
+ + def + get_proxy_address(contract_version: ContractVersion) -> eth_typing.evm.ChecksumAddress: + + + +
+ +
43def get_proxy_address(contract_version: ContractVersion) -> ChecksumAddress:
+44    """Get proxy address from the specified version.
+45
+46    Note:
+47        Default address should be the address of the latest version \
+48        (e.g., v2 as of May 2025).
+49
+50    Args:
+51        contract_version (ContractVersion): Contract version
+52
+53    Returns:
+54        ChecksumAddress: Checksum address of proxy contract
+55    """
+56    match contract_version:
+57        case "2":
+58            return V2_PROXY_ADDRESS
+
+ + +

Get proxy address from the specified version.

+ +
Note:
+ +
+

Default address should be the address of the latest version (e.g., v2 as of May 2025).

+
+ +
Arguments:
+ +
    +
  • contract_version (ContractVersion): Contract version
  • +
+ +
Returns:
+ +
+

ChecksumAddress: Checksum address of proxy contract

+
+
+ + +
+
+ +
+ + def + get_artifacts(file_path: pathlib._local.Path, artifact_type: ArtifactType) -> Any: + + + +
+ +
25def get_artifacts(file_path: Path, artifact_type: ArtifactType) -> Any:
+26    """Get contract artifacts from the specified file path.
+27
+28    Args:
+29        file_path (Path): absolute path of artifacts file
+30        artifact_type (ArtifactType): type of artifacts
+31
+32    Returns:
+33        Any: Artifacts of contracts
+34    """
+35    with open(file_path) as f:
+36        return json.load(f)[artifact_type]
+
+ + +

Get contract artifacts from the specified file path.

+ +
Arguments:
+ +
    +
  • file_path (Path): absolute path of artifacts file
  • +
  • artifact_type (ArtifactType): type of artifacts
  • +
+ +
Returns:
+ +
+

Any: Artifacts of contracts

+
+
+ + +
+
+ +
+ + def + resolve_artifacts_file_path(contract_version: ContractVersion) -> pathlib._local.Path: + + + +
+ +
 9def resolve_artifacts_file_path(contract_version: ContractVersion) -> Path:
+10    """Resolve the path of artifacts file from the specified contract version.
+11
+12    Args:
+13        contract_version (ContractVersion): Contract version
+14
+15    Returns:
+16        Path: Absolute path of artifacts file
+17    """
+18    path = Path(__file__).parent.parent.parent.joinpath(
+19        "artifacts", f"v{contract_version}.json"
+20    )
+21
+22    return path.absolute()
+
+ + +

Resolve the path of artifacts file from the specified contract version.

+ +
Arguments:
+ +
    +
  • contract_version (ContractVersion): Contract version
  • +
+ +
Returns:
+ +
+

Path: Absolute path of artifacts file

+
+
+ + +
+
+ +
+ + def + enumerate_supported_networks() -> str: + + + +
+ +
90def enumerate_supported_networks() -> str:
+91    """Enumerate all the supported networks.
+92
+93    Returns:
+94        str: supported networks
+95    """
+96    return ", ".join(
+97        f"'{chain}' => {list(networks.keys())}"
+98        for chain, networks in SUPPORTED_CHAINS.items()
+99    )
+
+ + +

Enumerate all the supported networks.

+ +
Returns:
+ +
+

str: supported networks

+
+
+ + +
+
+ +
+ + def + get_default_rpc_endpoint( chain_name: ChainName | None, network_name: str | None) -> Annotated[str, AfterValidator(func=<function validate_rpc_endpoint at 0x108621620>)]: + + + +
+ +
119def get_default_rpc_endpoint(
+120    chain_name: ChainName | None, network_name: str | None
+121) -> RpcEndpoint:
+122    """Get the default RPC endpoint for the specified network.
+123
+124    Args:
+125        chain_name (ChainName, optional): Chain name
+126        network_name (str, optional): Network name
+127
+128    Returns:
+129        RpcEndpoint: RPC endpoint
+130
+131    Raises:
+132        NetworkNotSupported: If the specified network is not supported by the SDK
+133    """
+134    if not is_supported_network(chain_name, network_name):
+135        raise NetworkNotSupported(chain_name, network_name)  # type: ignore[arg-type]
+136
+137    return SUPPORTED_CHAINS[chain_name][network_name]["rpc_endpoints"][0]  # type: ignore[index]
+
+ + +

Get the default RPC endpoint for the specified network.

+ +
Arguments:
+ +
    +
  • chain_name (ChainName, optional): Chain name
  • +
  • network_name (str, optional): Network name
  • +
+ +
Returns:
+ +
+

RpcEndpoint: RPC endpoint

+
+ +
Raises:
+ +
    +
  • NetworkNotSupported: If the specified network is not supported by the SDK
  • +
+
+ + +
+
+
+ SUPPORTED_CHAINS = + + {'ethereum': {'mainnet': {'id': 1, 'name': 'Ethereum Mainnet', 'rpc_endpoints': ['https://ethereum-rpc.publicnode.com']}, 'sepolia': {'id': 11155111, 'name': 'Ethereum Sepolia Testnet', 'rpc_endpoints': ['https://ethereum-sepolia-rpc.publicnode.com']}}, 'polygon': {'mainnet': {'id': 137, 'name': 'Polygon Mainnet', 'rpc_endpoints': ['https://polygon-rpc.com']}, 'amoy': {'id': 80002, 'name': 'Polygon Amoy Testnet', 'rpc_endpoints': ['https://rpc-amoy.polygon.technology']}}, 'gnosis': {'mainnet': {'id': 100, 'name': 'Gnosis Chain', 'rpc_endpoints': ['https://rpc.gnosischain.com']}, 'chiado': {'id': 10200, 'name': 'Gnosis Chiado Testnet', 'rpc_endpoints': ['https://rpc.chiadochain.net']}}, 'avalanche': {'mainnet': {'id': 43114, 'name': 'Avalanche C-Chain', 'rpc_endpoints': ['https://api.avax.network/ext/bc/C/rpc']}, 'fuji': {'id': 43113, 'name': 'Avalanche Fuji Testnet', 'rpc_endpoints': ['https://api.avax-test.network/ext/bc/C/rpc']}}, 'astar': {'mainnet': {'id': 592, 'name': 'Astar Network', 'rpc_endpoints': ['https://astar.public.blastapi.io']}}, 'shiden': {'mainnet': {'id': 336, 'name': 'Shiden Network', 'rpc_endpoints': ['https://shiden.public.blastapi.io']}}, 'localhost': {'devnet': {'id': 31337, 'name': 'Localhost Network', 'rpc_endpoints': ['http://127.0.0.1:8545/']}}} + + +
+ + + + +
+
+
+ POA_MIDDLEWARE = +'poa_middleware' + + +
+ + + + +
+
+
+ SIGN_MIDDLEWARE = +'sign_middleware' + + +
+ + + + +
+
+
+ UINT_MIN = +0 + + +
+ + + + +
+
+
+ UINT256_MAX = +115792089237316195423570985008687907853269984665640564039457584007913129639935 + + +
+ + + + +
+
+
+ UINT8_MAX = +255 + + +
+ + + + +
+
+ +
+ + def + remove_decimals( value: Union[Annotated[int, AfterValidator(func=<function validate_uint256>)], decimal.Decimal]) -> Annotated[int, AfterValidator(func=<function validate_uint256 at 0x1086214e0>)]: + + + +
+ +
 9def remove_decimals(value: Uint256 | Decimal) -> Uint256:
+10    """Remove decimals.
+11
+12    Args:
+13        value (Uint256 | Decimal): Value in ether
+14
+15    Returns:
+16        Uint256: Value in wei
+17    """
+18    return Web3.to_wei(value, "ether")
+
+ + +

Remove decimals.

+ +
Arguments:
+ +
    +
  • value (Uint256 | Decimal): Value in ether
  • +
+ +
Returns:
+ +
+

Uint256: Value in wei

+
+
+ + +
+
+ +
+ + def + restore_decimals(func): + + + +
+ +
21def restore_decimals(func):  # type: ignore[no-untyped-def]
+22    """Decorator to restore decimals."""
+23
+24    def wrapper(*args, **kwargs):  # type: ignore[no-untyped-def]
+25        result = func(*args, **kwargs)
+26        return Web3.from_wei(result, "ether")
+27
+28    return wrapper
+
+ + +

Decorator to restore decimals.

+
+ + +
+
+ +
+ + class + AccountNotInitialized(src.utils.errors.JpycSdkError): + + + +
+ +
41class AccountNotInitialized(JpycSdkError):
+42    """Raised when account is not initialized or hoisted to web3 instance."""
+43
+44    code = 101
+45
+46    def __init__(self) -> None:
+47        super().__init__(
+48            code=AccountNotInitialized.code,
+49            message="Account is not initialized.",
+50        )
+
+ + +

Raised when account is not initialized or hoisted to web3 instance.

+
+ + +
+
+ code = +101 + + +
+ + +

int: Custom error code

+
+ + +
+
+
+ +
+ + class + InvalidBytes32(src.utils.errors.JpycSdkError, builtins.TypeError): + + + +
+ +
 94class InvalidBytes32(JpycSdkError, TypeError):
+ 95    """Raised when the given byte string is not a valid bytes32."""
+ 96
+ 97    code = 203
+ 98
+ 99    def __init__(self, message_: str) -> None:
+100        super().__init__(
+101            code=InvalidBytes32.code,
+102            message=f"Invalid bytes32: {message_}.",
+103        )
+
+ + +

Raised when the given byte string is not a valid bytes32.

+
+ + +
+ +
+ + InvalidBytes32(message_: str) + + + +
+ +
 99    def __init__(self, message_: str) -> None:
+100        super().__init__(
+101            code=InvalidBytes32.code,
+102            message=f"Invalid bytes32: {message_}.",
+103        )
+
+ + + + +
+
+
+ code = +203 + + +
+ + +

int: Custom error code

+
+ + +
+
+
+ +
+ + class + InvalidChecksumAddress(src.utils.errors.JpycSdkError, builtins.TypeError): + + + +
+ +
56class InvalidChecksumAddress(JpycSdkError, TypeError):
+57    """Raised when the given address is not a valid checksum address."""
+58
+59    code = 200
+60
+61    def __init__(self, message_: str) -> None:
+62        super().__init__(
+63            code=InvalidChecksumAddress.code,
+64            message=f"Invalid checksum address: {message_}. "
+65            f"Address must be compatible with EIP55.",
+66        )
+
+ + +

Raised when the given address is not a valid checksum address.

+
+ + +
+ +
+ + InvalidChecksumAddress(message_: str) + + + +
+ +
61    def __init__(self, message_: str) -> None:
+62        super().__init__(
+63            code=InvalidChecksumAddress.code,
+64            message=f"Invalid checksum address: {message_}. "
+65            f"Address must be compatible with EIP55.",
+66        )
+
+ + + + +
+
+
+ code = +200 + + +
+ + +

int: Custom error code

+
+ + +
+
+
+ +
+ + class + InvalidUint8(src.utils.errors.JpycSdkError, builtins.TypeError): + + + +
+ +
69class InvalidUint8(JpycSdkError, TypeError):
+70    """Raised when the given integer is not a valid uint8."""
+71
+72    code = 201
+73
+74    def __init__(self, message_: str) -> None:
+75        super().__init__(
+76            code=InvalidUint8.code,
+77            message=f"Invalid uint8: {message_}. Integer must be between 0 ~ 2^8 - 1.",
+78        )
+
+ + +

Raised when the given integer is not a valid uint8.

+
+ + +
+ +
+ + InvalidUint8(message_: str) + + + +
+ +
74    def __init__(self, message_: str) -> None:
+75        super().__init__(
+76            code=InvalidUint8.code,
+77            message=f"Invalid uint8: {message_}. Integer must be between 0 ~ 2^8 - 1.",
+78        )
+
+ + + + +
+
+
+ code = +201 + + +
+ + +

int: Custom error code

+
+ + +
+
+
+ +
+ + class + InvalidUint256(src.utils.errors.JpycSdkError, builtins.TypeError): + + + +
+ +
81class InvalidUint256(JpycSdkError, TypeError):
+82    """Raised when the given integer is not a valid uint256."""
+83
+84    code = 202
+85
+86    def __init__(self, message_: str) -> None:
+87        super().__init__(
+88            code=InvalidUint256.code,
+89            message=f"Invalid uint256: {message_}. "
+90            f"Integer must be between 0 ~ 2^256 - 1.",
+91        )
+
+ + +

Raised when the given integer is not a valid uint256.

+
+ + +
+ +
+ + InvalidUint256(message_: str) + + + +
+ +
86    def __init__(self, message_: str) -> None:
+87        super().__init__(
+88            code=InvalidUint256.code,
+89            message=f"Invalid uint256: {message_}. "
+90            f"Integer must be between 0 ~ 2^256 - 1.",
+91        )
+
+ + + + +
+
+
+ code = +202 + + +
+ + +

int: Custom error code

+
+ + +
+
+
+ +
+ + class + NetworkNotSupported(src.utils.errors.JpycSdkError): + + + +
+ +
21class NetworkNotSupported(JpycSdkError):
+22    """Raised when the specified network is not supported by the SDK.
+23
+24    Attributes:
+25        chain_name (str): Chain name
+26        network_name (str): Network name
+27    """
+28
+29    code = 100
+30
+31    def __init__(self, chain_name: ChainName, network_name: str) -> None:
+32        from .chains import enumerate_supported_networks
+33
+34        super().__init__(
+35            code=NetworkNotSupported.code,
+36            message=f"Network '{chain_name}/{network_name}' is not supported. "
+37            f"Supported networks are: {enumerate_supported_networks()}",
+38        )
+
+ + +

Raised when the specified network is not supported by the SDK.

+ +
Attributes:
+ +
    +
  • chain_name (str): Chain name
  • +
  • network_name (str): Network name
  • +
+
+ + +
+ +
+ + NetworkNotSupported(chain_name: ChainName, network_name: str) + + + +
+ +
31    def __init__(self, chain_name: ChainName, network_name: str) -> None:
+32        from .chains import enumerate_supported_networks
+33
+34        super().__init__(
+35            code=NetworkNotSupported.code,
+36            message=f"Network '{chain_name}/{network_name}' is not supported. "
+37            f"Supported networks are: {enumerate_supported_networks()}",
+38        )
+
+ + + + +
+
+
+ code = +100 + + +
+ + +

int: Custom error code

+
+ + +
+
+
+ +
+ + class + TransactionFailed(src.utils.errors.JpycSdkError): + + + +
+ +
139class TransactionFailed(JpycSdkError):
+140    """Raised when transaction fails.
+141
+142    Attributes:
+143        message (str): Error message
+144    """
+145
+146    code = 301
+147
+148    def __init__(self, message_: str) -> None:
+149        super().__init__(
+150            code=TransactionFailed.code,
+151            message=f"Transaction failed: {message_}",
+152        )
+
+ + +

Raised when transaction fails.

+ +
Attributes:
+ +
    +
  • message (str): Error message
  • +
+
+ + +
+ +
+ + TransactionFailed(message_: str) + + + +
+ +
148    def __init__(self, message_: str) -> None:
+149        super().__init__(
+150            code=TransactionFailed.code,
+151            message=f"Transaction failed: {message_}",
+152        )
+
+ + + + +
+
+
+ code = +301 + + +
+ + +

int: Custom error code

+
+ + +
+
+
+ +
+ + class + TransactionSimulationFailed(src.utils.errors.JpycSdkError): + + + +
+ +
123class TransactionSimulationFailed(JpycSdkError):
+124    """Raised when transaction simulation fails.
+125
+126    Attributes:
+127        message (str): Error message
+128    """
+129
+130    code = 300
+131
+132    def __init__(self, message_: str) -> None:
+133        super().__init__(
+134            code=TransactionSimulationFailed.code,
+135            message=f"Failed to simulate a transaction locally: {message_}",
+136        )
+
+ + +

Raised when transaction simulation fails.

+ +
Attributes:
+ +
    +
  • message (str): Error message
  • +
+
+ + +
+ +
+ + TransactionSimulationFailed(message_: str) + + + +
+ +
132    def __init__(self, message_: str) -> None:
+133        super().__init__(
+134            code=TransactionSimulationFailed.code,
+135            message=f"Failed to simulate a transaction locally: {message_}",
+136        )
+
+ + + + +
+
+
+ code = +300 + + +
+ + +

int: Custom error code

+
+ + +
+
+
+
+ type ArtifactType = +Literal['abi', 'bytecode'] + + +
+ + + + +
+
+
+ type ChainMetadata = +dict[ChainName, dict[str, src.utils.types.NetworkMetadata]] + + +
+ + + + +
+
+
+ type ChainName = +Literal['ethereum', 'polygon', 'gnosis', 'avalanche', 'astar', 'shiden', 'localhost'] + + +
+ + + + +
+
+
+ type ContractVersion = +Literal['2'] + + +
+ + + + +
+
+
+ Bytes32 = +typing.Annotated[str, AfterValidator(func=<function validate_bytes32>)] + + +
+ + + + +
+
+
+ ChecksumAddress = +typing.Annotated[str, AfterValidator(func=<function validate_checksum_address>)] + + +
+ + + + +
+
+
+ RpcEndpoint = +typing.Annotated[str, AfterValidator(func=<function validate_rpc_endpoint>)] + + +
+ + + + +
+
+
+ Uint256 = +typing.Annotated[int, AfterValidator(func=<function validate_uint256>)] + + +
+ + + + +
+
+
+ Uint8 = +typing.Annotated[int, AfterValidator(func=<function validate_uint8>)] + + +
+ + + + +
+
+ + \ No newline at end of file diff --git a/packages/core/.gitignore b/packages/core/.gitignore new file mode 100644 index 0000000..5ff391e --- /dev/null +++ b/packages/core/.gitignore @@ -0,0 +1,17 @@ +# python +dist +*.egg-info +__pycache__ + +# mypy +.mypy_cache + +# ruff +.ruff_cache + +# pytest +.pytest_cache +.coverage + +# misc +DS_STORE diff --git a/packages/core/LICENSE b/packages/core/LICENSE new file mode 100644 index 0000000..5caab71 --- /dev/null +++ b/packages/core/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 JPYC株式会社 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/core/README.md b/packages/core/README.md new file mode 100644 index 0000000..f67cdc4 --- /dev/null +++ b/packages/core/README.md @@ -0,0 +1,161 @@ +# Core SDK + +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE) +![build](https://github.com/jcam1/python-sdk/actions/workflows/check.yml/badge.svg) + +A Python SDK to interact with [the JPYCv2's core contracts](https://github.com/jcam1/JPYCv2/blob/main/contracts/v1/FiatTokenV1.sol). Ideal for those who want to interact with JPYC protocol in any Python-backend environments. + +## 🪄 Usage + +### 1. Install `jpyc_core_sdk` Package + +```sh +# uv +$ uv add jpyc_core_sdk +# poetry +$ poetry add jpyc_core_sdk +# pip +$ pip install jpyc_core_sdk +``` + +### 2. Configure SDK Clients + +```py +from jpyc_core_sdk.client import SdkClient +from jpyc_core_sdk.jpyc import JPYC + +# Configure SDK client using default RPC endpoint +client = SdkClient( + chain_name="ethereum", + network_name="mainnet", + private_key={PRIVATE_KEY}, +) + +# Or configure SDK client using custom RPC endpoint +client = SdkClient( + chain_name="ethereum", + network_name="mainnet", + private_key={PRIVATE_KEY}, + rpc_endpoint={CUSTOM_RPC_ENDPOINT}, +) + +# Configure JPYC client +jpyc = JPYC(client=client) +``` + +> [!TIP] +> As for sensitive data such as private keys or api keys, we strongly recommend using some secure storage and read them from the securely embedded environment variables. This reflects our design decision of not using any environment variables within the SDK itself, aiming to make it as flexible as possible for the developers. Also, using some arbitrary environmental variables often results in unexpected behaviors (e.g., naming conflicts). + +### 3. Call JPYC Contracts + +Use the configured JPYC client to call JPYC's contract functions wherever you would like. + +```py +from {CONFIG_FILE} import jpyc + +... +# Call a contract function (e.g., transfer) +tx_hash = jpyc.transfer( + to={TO_ADDRESS}, + value=2025, +) +... +``` + +> [!NOTE] +> +> - More code examples are available at [`examples` directory](./examples/). +> - More detailed development documentation is available at [`docs` directory](../../docs/core/). + +## ⛓️ Supported Networks + +Please use one of the combinations of chain-network names when configuring the SDK clients. + +> [!TIP] +> For local testing & development, you could use `localhost`-`devnet` pair. + +| Chain Name | Network Names | +| ----------: | :------------------- | +| `ethereum` | `mainnet`, `sepolia` | +| `polygon` | `mainnet`, `amoy` | +| `gnosis` | `mainnet`, `chiado` | +| `avalanche` | `mainnet`, `fuji` | +| `astar` | `mainnet` | +| `shiden` | `mainnet` | +| `localhost` | `devnet` | + +## 💬 Supported Providers + +**We're currently supporting `HTTPProvider` (the most simple & widely-used one) only.** More providers (notably `WebSocketProvider`) are to be supported in the near future, so stay tuned! + +## 🛠 Development + +> [!IMPORTANT] +> Sections below are mainly for the advanced users (e.g., contributors of this repo). + +### 📦 Package Management + +#### Add packages + +```sh +# add packages for production +$ uv add {package_name} +# add packages for development +$ uv add --dev {package_name} +``` + +#### Remove packages + +```sh +# remove production packages +$ uv remove {package_name} +# remove development packages +$ uv remove --dev {package_name} +``` + +### 🔎 Testing + +Please see [`README` at `tests` directory](../../tests/README.md). + +### ✅ Static Code Analysis + +> [!NOTE] +> Analysis results are also to be checked on our [CI workflow](../../.github/workflows/check.yml). + +#### Linting + +```sh +# run linter without fixing +$ uv run ruff check {dir_name} +# run linter & auto-fix (if available) +$ uv run ruff check {dir_name} --fix +``` + +#### Formatting + +```sh +# run formatter without fixing +$ uv run ruff format {dir_name} --check +# run formatter & auto-fix +$ uv run ruff format {dir_name} +``` + +#### Type Checking + +```sh +# run mypy +$ uv run mypy {dir_name} +``` + +#### Pre-Commit Hooks + +Pre-commit script is configured at [`.pre-commit-config.yaml`](../../.pre-commit-config.yaml). This automatically runs the configured hooks before executing any `git commit` commands. You could also simulate the hooks by running the following. + +```sh +# simulate pre-commit hooks without creating an actual commit +$ uv run pre-commit run --all-files +``` + +### 📝 Comments & Docstrings + +Docstrings should be written in [the Google-style](https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings). diff --git a/packages/core/artifacts/README.md b/packages/core/artifacts/README.md new file mode 100644 index 0000000..9c6e40d --- /dev/null +++ b/packages/core/artifacts/README.md @@ -0,0 +1,13 @@ +# Artifacts + +> [!IMPORTANT] +> This `README` is mainly for the advanced users (e.g., contributors of this repo). + +This directory contains the auto-generated artifacts of [JPYC's core contracts](https://github.com/jcam1/JPYCv2). + +## 📚 Available Versions + +| Version | File | Description | +| ------: | :--------------------- | :----------------------------------------- | +| `v3` | n/a | Coming Soon | +| `v2` | [`v2.json`](./v2.json) | Artifacts of JPYCv2 contracts (**latest**) | diff --git a/packages/core/artifacts/v2.json b/packages/core/artifacts/v2.json new file mode 100644 index 0000000..45ab6cb --- /dev/null +++ b/packages/core/artifacts/v2.json @@ -0,0 +1,1254 @@ +{ + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "authorizer", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "nonce", + "type": "bytes32" + } + ], + "name": "AuthorizationCanceled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "authorizer", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "nonce", + "type": "bytes32" + } + ], + "name": "AuthorizationUsed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "Blocklisted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newBlocklister", + "type": "address" + } + ], + "name": "BlocklisterChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "burner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Burn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "minter", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Mint", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newMinterAdmin", + "type": "address" + } + ], + "name": "MinterAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "minter", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "minterAllowedAmount", + "type": "uint256" + } + ], + "name": "MinterConfigured", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oldMinter", + "type": "address" + } + ], + "name": "MinterRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Pause", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newAddress", + "type": "address" + } + ], + "name": "PauserChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newRescuer", + "type": "address" + } + ], + "name": "RescuerChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "UnBlocklisted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Unpause", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [], + "name": "CANCEL_AUTHORIZATION_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PERMIT_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RECEIVE_WITH_AUTHORIZATION_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TRANSFER_WITH_AUTHORIZATION_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_domainSeparatorV4", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "authorizer", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "nonce", + "type": "bytes32" + } + ], + "name": "authorizationState", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "blocklist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "blocklister", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "authorizer", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "nonce", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "cancelAuthorization", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "minter", + "type": "address" + }, + { + "internalType": "uint256", + "name": "minterAllowedAmount", + "type": "uint256" + } + ], + "name": "configureMinter", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "currency", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "decrement", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "increment", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "tokenName", + "type": "string" + }, + { + "internalType": "string", + "name": "tokenSymbol", + "type": "string" + }, + { + "internalType": "string", + "name": "tokenCurrency", + "type": "string" + }, + { + "internalType": "uint8", + "name": "tokenDecimals", + "type": "uint8" + }, + { + "internalType": "address", + "name": "newMinterAdmin", + "type": "address" + }, + { + "internalType": "address", + "name": "newPauser", + "type": "address" + }, + { + "internalType": "address", + "name": "newBlocklister", + "type": "address" + }, + { + "internalType": "address", + "name": "newRescuer", + "type": "address" + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "isBlocklisted", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "isMinter", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "minterAdmin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "minter", + "type": "address" + } + ], + "name": "minterAllowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pauser", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "validAfter", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "validBefore", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "nonce", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "receiveWithAuthorization", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "minter", + "type": "address" + } + ], + "name": "removeMinter", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "tokenContract", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "rescueERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "rescuer", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "validAfter", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "validBefore", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "nonce", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "transferWithAuthorization", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "unBlocklist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newBlocklister", + "type": "address" + } + ], + "name": "updateBlocklister", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newMinterAdmin", + "type": "address" + } + ], + "name": "updateMinterAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newPauser", + "type": "address" + } + ], + "name": "updatePauser", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newRescuer", + "type": "address" + } + ], + "name": "updateRescuer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } + ], + "bytecode": "0x60a0604052306080523480156200001557600080fd5b50620000213362000027565b62000077565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b608051614e33620000af600039600081816111da0152818161127001528181611f0e01528181611fa4015261209f0152614e336000f3fe6080604052600436106103295760003560e01c80637ecebe00116101a5578063aa271e1a116100ec578063e3ee160e11610095578063e94a01021161006f578063e94a0102146109d7578063ef55bec614610a1e578063f2fde38b14610a3e578063f9b5aa9214610a5e57600080fd5b8063e3ee160e14610982578063e5a6b10f146109a2578063e5c7160b146109b757600080fd5b8063d505accf116100c6578063d505accf146108e7578063d916948714610907578063dd62ed3e1461093b57600080fd5b8063aa271e1a1461086d578063b2118a8d146108a7578063b54d9497146108c757600080fd5b806395d89b411161014e578063a457c2d711610128578063a457c2d71461080c578063a754d48f1461082c578063a9059cbb1461084d57600080fd5b806395d89b41146107a35780639fd0506d146107b8578063a0cc6a68146107d857600080fd5b80638a6db9c31161017f5780638a6db9c3146107155780638da5cb5b1461074c5780638e204c431461076a57600080fd5b80637ecebe00146106955780637f2eecc3146106cc5780638456cb591461070057600080fd5b80633f4ba83a1161027457806352d1902d1161021d5780635c975abb116101f75780635c975abb1461060857806370a082311461062957806374ebf673146106605780637b134b4c1461068057600080fd5b806352d1902d146105b3578063554bab3c146105c85780635a049a70146105e857600080fd5b8063439531fd1161024e578063439531fd146105605780634e44d956146105805780634f1ef286146105a057600080fd5b80633f4ba83a1461050b57806340c10f191461052057806342966c681461054057600080fd5b806330adf81f116102d65780633659cfe6116102b05780633659cfe61461049357806338a63183146104b357806339509351146104eb57600080fd5b806330adf81f1461040b578063313ce5671461043f57806331b230201461047357600080fd5b806323b872dd1161030757806323b872dd146103a95780632ab60045146103c95780633092afd5146103eb57600080fd5b806306fdde031461032e578063095ea7b31461035957806318160ddd14610389575b600080fd5b34801561033a57600080fd5b50610343610a7e565b604051610350919061481c565b60405180910390f35b34801561036557600080fd5b5061037961037436600461486f565b610b0d565b6040519015158152602001610350565b34801561039557600080fd5b50610202545b604051908152602001610350565b3480156103b557600080fd5b506103796103c436600461489b565b610c59565b3480156103d557600080fd5b506103e96103e43660046148dc565b610eed565b005b3480156103f757600080fd5b506103796104063660046148dc565b611029565b34801561041757600080fd5b5061039b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b34801561044b57600080fd5b506102035461046190600160a01b900460ff1681565b60405160ff9091168152602001610350565b34801561047f57600080fd5b506103e961048e3660046148dc565b61110b565b34801561049f57600080fd5b506103e96104ae3660046148dc565b6111cf565b3480156104bf57600080fd5b50609a546104d3906001600160a01b031681565b6040516001600160a01b039091168152602001610350565b3480156104f757600080fd5b5061037961050636600461486f565b61136d565b34801561051757600080fd5b506103e96114a9565b34801561052c57600080fd5b5061037961053b36600461486f565b61157c565b34801561054c57600080fd5b506103e961055b3660046148f9565b6119a7565b34801561056c57600080fd5b506103e961057b3660046148dc565b611c89565b34801561058c57600080fd5b5061037961059b36600461486f565b611dc6565b6103e96105ae3660046149b7565b611f03565b3480156105bf57600080fd5b5061039b612092565b3480156105d457600080fd5b506103e96105e33660046148dc565b612157565b3480156105f457600080fd5b506103e9610603366004614a2c565b612293565b34801561061457600080fd5b5060335461037990600160a01b900460ff1681565b34801561063557600080fd5b5061039b6106443660046148dc565b6001600160a01b03166000908152610204602052604090205490565b34801561066c57600080fd5b506103e961067b366004614a9c565b6122f4565b34801561068c57600080fd5b5061039b612838565b3480156106a157600080fd5b5061039b6106b03660046148dc565b6001600160a01b03166000908152610168602052604090205490565b3480156106d857600080fd5b5061039b7fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de881565b34801561070c57600080fd5b506103e96129de565b34801561072157600080fd5b5061039b6107303660046148dc565b6001600160a01b03166000908152610207602052604090205490565b34801561075857600080fd5b506000546001600160a01b03166104d3565b34801561077657600080fd5b506103796107853660046148dc565b6001600160a01b031660009081526067602052604090205460011490565b3480156107af57600080fd5b50610343612ab7565b3480156107c457600080fd5b506033546104d3906001600160a01b031681565b3480156107e457600080fd5b5061039b7f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226781565b34801561081857600080fd5b5061037961082736600461486f565b612ac5565b34801561083857600080fd5b50610203546104d3906001600160a01b031681565b34801561085957600080fd5b5061037961086836600461486f565b612c01565b34801561087957600080fd5b506103796108883660046148dc565b6001600160a01b03166000908152610206602052604090205460ff1690565b3480156108b357600080fd5b506103e96108c236600461489b565b612d3d565b3480156108d357600080fd5b506066546104d3906001600160a01b031681565b3480156108f357600080fd5b506103e9610902366004614b89565b612e4e565b34801561091357600080fd5b5061039b7f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a159742981565b34801561094757600080fd5b5061039b610956366004614bf7565b6001600160a01b0391821660009081526102056020908152604080832093909416825291909152205490565b34801561098e57600080fd5b506103e961099d366004614c30565b612fa1565b3480156109ae57600080fd5b506103436130f8565b3480156109c357600080fd5b506103e96109d23660046148dc565b613106565b3480156109e357600080fd5b506103796109f236600461486f565b6001600160a01b0391909116600090815261013560209081526040808320938352929052205460011490565b348015610a2a57600080fd5b506103e9610a39366004614c30565b6131cb565b348015610a4a57600080fd5b506103e9610a593660046148dc565b613315565b348015610a6a57600080fd5b506103e9610a793660046148dc565b613403565b6101ff8054610a8c90614cb2565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab890614cb2565b8015610b055780601f10610ada57610100808354040283529160200191610b05565b820191906000526020600020905b815481529060010190602001808311610ae857829003601f168201915b505050505081565b603354600090600160a01b900460ff1615610b625760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064015b60405180910390fd5b3360008181526067602052604090205415610bcd5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038416600090815260676020526040902054849015610c435760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b610c4e33868661353f565b506001949350505050565b603354600090600160a01b900460ff1615610ca95760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b3360008181526067602052604090205415610d145760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038516600090815260676020526040902054859015610d8a5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038516600090815260676020526040902054859015610e005760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b0387166000908152610205602090815260408083203384529091529020546000198114610ed45785811015610ea45760405162461bcd60e51b815260206004820152602c60248201527f46696174546f6b656e3a207472616e7366657220616d6f756e7420657863656560448201527f647320616c6c6f77616e636500000000000000000000000000000000000000006064820152608401610b59565b610eae8682614d35565b6001600160a01b0389166000908152610205602090815260408083203384529091529020555b610edf888888613691565b506001979650505050505050565b33610f006000546001600160a01b031690565b6001600160a01b031614610f565760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b6001600160a01b038116610fd25760405162461bcd60e51b815260206004820152602a60248201527f526573637561626c653a206e6577207265736375657220697320746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610b59565b609a805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517fe475e580d85111348e40d8ca33cfdd74c30fe1655c2d8537a13abc10065ffa5a90600090a250565b610203546000906001600160a01b031633146110ad5760405162461bcd60e51b815260206004820152602860248201527f46696174546f6b656e3a2063616c6c6572206973206e6f7420746865206d696e60448201527f74657241646d696e0000000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b038216600081815261020660209081526040808320805460ff19169055610207909152808220829055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a25060015b919050565b6066546001600160a01b0316331461118b5760405162461bcd60e51b815260206004820152602c60248201527f426c6f636b6c69737461626c653a2063616c6c6572206973206e6f742074686560448201527f20626c6f636b6c697374657200000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b038116600081815260676020526040808220829055517fbc3fe0fc667d12a7a22748747f024a7d971127ffc48f6622675d3e97a2591a519190a250565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016141561126e5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610b59565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166112c97f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146113455760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610b59565b61134e816138b7565b6040805160008082526020820190925261136a91839190613920565b50565b603354600090600160a01b900460ff16156113bd5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b33600081815260676020526040902054156114285760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b03841660009081526067602052604090205484901561149e5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b610c4e338686613ac5565b6033546001600160a01b031633146115295760405162461bcd60e51b815260206004820152602260248201527f5061757361626c653a2063616c6c6572206973206e6f7420746865207061757360448201527f65720000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b603380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b603354600090600160a01b900460ff16156115cc5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b336000908152610206602052604090205460ff166116525760405162461bcd60e51b815260206004820152602160248201527f46696174546f6b656e3a2063616c6c6572206973206e6f742061206d696e746560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b33600081815260676020526040902054156116bd5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b0384166000908152606760205260409020548490156117335760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b0385166117af5760405162461bcd60e51b815260206004820152602360248201527f46696174546f6b656e3a206d696e7420746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610b59565b600084116118255760405162461bcd60e51b815260206004820152602960248201527f46696174546f6b656e3a206d696e7420616d6f756e74206e6f7420677265617460448201527f6572207468616e203000000000000000000000000000000000000000000000006064820152608401610b59565b3360009081526102076020526040902054808511156118ac5760405162461bcd60e51b815260206004820152602e60248201527f46696174546f6b656e3a206d696e7420616d6f756e742065786365656473206d60448201527f696e746572416c6c6f77616e63650000000000000000000000000000000000006064820152608401610b59565b84610202546118bb9190614d4c565b610202556001600160a01b038616600090815261020460205260409020546118e4908690614d4c565b6001600160a01b038716600090815261020460205260409020556119088582614d35565b336000818152610207602090815260409182902093909355518781526001600160a01b038916927fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8910160405180910390a36040518581526001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350600195945050505050565b603354600160a01b900460ff16156119f45760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b336000908152610206602052604090205460ff16611a7a5760405162461bcd60e51b815260206004820152602160248201527f46696174546f6b656e3a2063616c6c6572206973206e6f742061206d696e746560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b3360008181526067602052604090205415611ae55760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b336000908152610204602052604090205482611b695760405162461bcd60e51b815260206004820152602960248201527f46696174546f6b656e3a206275726e20616d6f756e74206e6f7420677265617460448201527f6572207468616e203000000000000000000000000000000000000000000000006064820152608401610b59565b82811015611bdf5760405162461bcd60e51b815260206004820152602660248201527f46696174546f6b656e3a206275726e20616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610b59565b8261020254611bee9190614d35565b61020255611bfc8382614d35565b3360008181526102046020526040908190209290925590517fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca590611c439086815260200190565b60405180910390a260405183815260009033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a3505050565b33611c9c6000546001600160a01b031690565b6001600160a01b031614611cf25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b6001600160a01b038116611d6e5760405162461bcd60e51b815260206004820152602e60248201527f46696174546f6b656e3a206e6577206d696e74657241646d696e20697320746860448201527f65207a65726f20616464726573730000000000000000000000000000000000006064820152608401610b59565b610203805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f4e6db312b79f0cdadbee5f76e2473786c1e81cba2356eacccc2aa5b5e6e3664c90600090a250565b603354600090600160a01b900460ff1615611e165760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b610203546001600160a01b03163314611e975760405162461bcd60e51b815260206004820152602860248201527f46696174546f6b656e3a2063616c6c6572206973206e6f7420746865206d696e60448201527f74657241646d696e0000000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b038316600081815261020660209081526040808320805460ff1916600117905561020782529182902085905590518481527f46980fca912ef9bcdbd36877427b6b90e860769f604e89c0e67720cece530d20910160405180910390a250600192915050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415611fa25760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610b59565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611ffd7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146120795760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610b59565b612082826138b7565b61208e82826001613920565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146121325760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610b59565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b3361216a6000546001600160a01b031690565b6001600160a01b0316146121c05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b6001600160a01b03811661223c5760405162461bcd60e51b815260206004820152602860248201527f5061757361626c653a206e65772070617573657220697320746865207a65726f60448201527f20616464726573730000000000000000000000000000000000000000000000006064820152608401610b59565b6033805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517fb80482a293ca2e013eda8683c9bd7fc8347cfdaeea5ede58cba46df502c2a60490600090a250565b603354600160a01b900460ff16156122e05760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b6122ed8585858585613b04565b5050505050565b610203547501000000000000000000000000000000000000000000900460ff16156123875760405162461bcd60e51b815260206004820152602a60248201527f46696174546f6b656e3a20636f6e747261637420697320616c7265616479206960448201527f6e697469616c697a6564000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0385166124035760405162461bcd60e51b815260206004820152602e60248201527f46696174546f6b656e3a206e6577206d696e74657241646d696e20697320746860448201527f65207a65726f20616464726573730000000000000000000000000000000000006064820152608401610b59565b6001600160a01b03841661247f5760405162461bcd60e51b815260206004820152602960248201527f46696174546f6b656e3a206e65772070617573657220697320746865207a657260448201527f6f206164647265737300000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0383166124fb5760405162461bcd60e51b815260206004820152602e60248201527f46696174546f6b656e3a206e657720626c6f636b6c697374657220697320746860448201527f65207a65726f20616464726573730000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0382166125775760405162461bcd60e51b815260206004820152602a60248201527f46696174546f6b656e3a206e6577207265736375657220697320746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0381166125f35760405162461bcd60e51b815260206004820152602860248201527f46696174546f6b656e3a206e6577206f776e657220697320746865207a65726f60448201527f20616464726573730000000000000000000000000000000000000000000000006064820152608401610b59565b8851612607906101ff9060208c0190614757565b50875161261c906102009060208b0190614757565b508651612631906102019060208a0190614757565b5061020380547fffffffffffffffffffffff00000000000000000000000000000000000000000016600160a01b60ff89160273ffffffffffffffffffffffffffffffffffffffff19908116919091176001600160a01b0388811691909117909255603380548216878416179055606680548216868416179055609a80549091169184169190911790556126c381613c25565b30600081815260676020908152604091829020600190819055825180840184529081527f3100000000000000000000000000000000000000000000000000000000000000908201528b518c82012082517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81840152808401919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015246608082015260a0808201949094528251808203909401845260c001909152815191012060ff55466101005588516127a5906101019060208c0190614757565b506040805180820190915260018082527f310000000000000000000000000000000000000000000000000000000000000060209092019182526127eb9161010291614757565b505061020380547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555050505050505050565b60006101005446141561284c575060ff5490565b6129d9610101805461285d90614cb2565b80601f016020809104026020016040519081016040528092919081815260200182805461288990614cb2565b80156128d65780601f106128ab576101008083540402835291602001916128d6565b820191906000526020600020905b8154815290600101906020018083116128b957829003601f168201915b505050505061010280546128e990614cb2565b80601f016020809104026020016040519081016040528092919081815260200182805461291590614cb2565b80156129625780601f1061293757610100808354040283529160200191612962565b820191906000526020600020905b81548152906001019060200180831161294557829003601f168201915b50505050508151602092830120815191830191909120604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818601528082019390935260608301919091524660808301523060a0808401919091528151808403909101815260c09092019052805191012090565b905090565b6033546001600160a01b03163314612a5e5760405162461bcd60e51b815260206004820152602260248201527f5061757361626c653a2063616c6c6572206973206e6f7420746865207061757360448201527f65720000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b603380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b6102008054610a8c90614cb2565b603354600090600160a01b900460ff1615612b155760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b3360008181526067602052604090205415612b805760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038416600090815260676020526040902054849015612bf65760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b610c4e338686613c82565b603354600090600160a01b900460ff1615612c515760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b3360008181526067602052604090205415612cbc5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038416600090815260676020526040902054849015612d325760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b610c4e338686613691565b609a546001600160a01b03163314612dbc5760405162461bcd60e51b8152602060048201526024808201527f526573637561626c653a2063616c6c6572206973206e6f74207468652072657360448201527f63756572000000000000000000000000000000000000000000000000000000006064820152608401610b59565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af1158015612e24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e489190614d64565b50505050565b603354600160a01b900460ff1615612e9b5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b6001600160a01b038716600090815260676020526040902054879015612f115760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b038716600090815260676020526040902054879015612f875760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b612f9689898989898989613d2e565b505050505050505050565b603354600160a01b900460ff1615612fee5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b6001600160a01b0389166000908152606760205260409020548990156130645760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b0389166000908152606760205260409020548990156130da5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6130eb8b8b8b8b8b8b8b8b8b613e99565b5050505050505050505050565b6102018054610a8c90614cb2565b6066546001600160a01b031633146131865760405162461bcd60e51b815260206004820152602c60248201527f426c6f636b6c69737461626c653a2063616c6c6572206973206e6f742074686560448201527f20626c6f636b6c697374657200000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b03811660008181526067602052604080822060019055517f917c251bb231c4b997a420bebe47edad5c20e70715da16c38e9b2e172e44ab929190a250565b603354600160a01b900460ff16156132185760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b59565b6001600160a01b03891660009081526067602052604090205489901561328e5760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6001600160a01b0389166000908152606760205260409020548990156133045760405162461bcd60e51b815260206004820152602560248201527f426c6f636b6c69737461626c653a206163636f756e7420697320626c6f636b6c6044820152641a5cdd195960da1b6064820152608401610b59565b6130eb8b8b8b8b8b8b8b8b8b613faa565b336133286000546001600160a01b031690565b6001600160a01b03161461337e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b6001600160a01b0381166133fa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b59565b61136a81613c25565b336134166000546001600160a01b031690565b6001600160a01b03161461346c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b6001600160a01b0381166134e85760405162461bcd60e51b815260206004820152603260248201527f426c6f636b6c69737461626c653a206e657720626c6f636b6c6973746572206960448201527f7320746865207a65726f206164647265737300000000000000000000000000006064820152608401610b59565b6066805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f68f10ceb42d30acc930aaaedf5b94559e14fc4f22496dc2c1b38b1b1b5231f9890600090a250565b6001600160a01b0383166135bb5760405162461bcd60e51b815260206004820152602860248201527f46696174546f6b656e3a20617070726f76652066726f6d20746865207a65726f60448201527f20616464726573730000000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0382166136375760405162461bcd60e51b815260206004820152602660248201527f46696174546f6b656e3a20617070726f766520746f20746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b038381166000818152610205602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101611c7c565b6001600160a01b03831661370d5760405162461bcd60e51b815260206004820152602960248201527f46696174546f6b656e3a207472616e736665722066726f6d20746865207a657260448201527f6f206164647265737300000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b0382166137895760405162461bcd60e51b815260206004820152602760248201527f46696174546f6b656e3a207472616e7366657220746f20746865207a65726f2060448201527f61646472657373000000000000000000000000000000000000000000000000006064820152608401610b59565b6001600160a01b03831660009081526102046020526040902054808211156138195760405162461bcd60e51b815260206004820152602a60248201527f46696174546f6b656e3a207472616e7366657220616d6f756e7420657863656560448201527f64732062616c616e6365000000000000000000000000000000000000000000006064820152608401610b59565b6138238282614d35565b6001600160a01b03808616600090815261020460205260408082209390935590851681522054613854908390614d4c565b6001600160a01b038085166000818152610204602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906138a99086815260200190565b60405180910390a350505050565b336138ca6000546001600160a01b031690565b6001600160a01b03161461136a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b59565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561395857613953836140a0565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156139b2575060408051601f3d908101601f191682019092526139af91810190614d86565b60015b613a245760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610b59565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114613ab95760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610b59565b50613953838383614162565b6001600160a01b03808416600090815261020560209081526040808320938616835292905220546139539084908490613aff908590614d4c565b61353f565b613b0e8585614187565b604080517f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a159742960208201526001600160a01b038716818301819052606080830188905283518084039091018152608090920190925290613b77613b6e612838565b8686868661421f565b6001600160a01b031614613bcd5760405162461bcd60e51b815260206004820152601a60248201527f454950333030393a20696e76616c6964207369676e61747572650000000000006044820152606401610b59565b6001600160a01b03861660008181526101356020908152604080832089845290915280822060019055518792917f1cdd46ff242716cdaa72d159d339a485b3438398348d68f09d7c8c0a59353d8191a3505050505050565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038084166000908152610205602090815260408083209386168352929052205480821115613d1f5760405162461bcd60e51b815260206004820152602960248201527f46696174546f6b656e3a2064656372656173656420616c6c6f77616e6365206260448201527f656c6f77207a65726f00000000000000000000000000000000000000000000006064820152608401610b59565b612e488484613aff8585614d35565b42841015613d7e5760405162461bcd60e51b815260206004820152601a60248201527f454950323631323a207065726d697420697320657870697265640000000000006044820152606401610b59565b6001600160a01b03871660009081526101686020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a919086613dcc83614d9f565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040529050876001600160a01b0316613e2e613b6e612838565b6001600160a01b031614613e845760405162461bcd60e51b815260206004820152601a60248201527f454950323631323a20696e76616c6964207369676e61747572650000000000006044820152606401610b59565b613e8f88888861353f565b5050505050505050565b613ea58985888861429c565b604080517f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226760208201526001600160a01b03808c169282019290925290891660608201526080810188905260a0810187905260c0810186905260e08101859052600090610100015b6040516020818303038152906040529050896001600160a01b0316613f33613b6e612838565b6001600160a01b031614613f895760405162461bcd60e51b815260206004820152601a60248201527f454950333030393a20696e76616c6964207369676e61747572650000000000006044820152606401610b59565b613f938a86614390565b613f9e8a8a8a613691565b50505050505050505050565b6001600160a01b03881633146140285760405162461bcd60e51b815260206004820152602160248201527f454950333030393a2063616c6c6572206d75737420626520746865207061796560448201527f65000000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b6140348985888861429c565b604080517fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de860208201526001600160a01b03808c169282019290925290891660608201526080810188905260a0810187905260c0810186905260e0810185905260009061010001613f0d565b803b6141145760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610b59565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b61416b836143e4565b6000825111806141785750805b1561395357612e488383614424565b6001600160a01b0382166000908152610135602090815260408083208484529091529020541561208e5760405162461bcd60e51b815260206004820152602a60248201527f454950333030393a20617574686f72697a6174696f6e2069732075736564206f60448201527f722063616e63656c6564000000000000000000000000000000000000000000006064820152608401610b59565b60008086838051906020012060405160200161426d9291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b60405160208183030381529060405280519060200120905061429181878787614450565b979650505050505050565b8142116143115760405162461bcd60e51b815260206004820152602760248201527f454950333030393a20617574686f72697a6174696f6e206973206e6f7420796560448201527f742076616c6964000000000000000000000000000000000000000000000000006064820152608401610b59565b8042106143865760405162461bcd60e51b815260206004820152602160248201527f454950333030393a20617574686f72697a6174696f6e2069732065787069726560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610b59565b612e488484614187565b6001600160a01b03821660008181526101356020908152604080832085845290915280822060019055518392917f98de503528ee59b575ef0c0a2576a82497bfc029a5685b209e9ec333479b10a591a35050565b6143ed816140a0565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606144498383604051806060016040528060278152602001614dd760279139614633565b9392505050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156144e85760405162461bcd60e51b815260206004820152602660248201527f45435265636f7665723a20696e76616c6964207369676e61747572652027732760448201527f2076616c756500000000000000000000000000000000000000000000000000006064820152608401610b59565b8360ff16601b1415801561450057508360ff16601c14155b156145735760405162461bcd60e51b815260206004820152602660248201527f45435265636f7665723a20696e76616c6964207369676e61747572652027762760448201527f2076616c756500000000000000000000000000000000000000000000000000006064820152608401610b59565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa1580156145c7573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661462a5760405162461bcd60e51b815260206004820152601c60248201527f45435265636f7665723a20696e76616c6964207369676e6174757265000000006044820152606401610b59565b95945050505050565b6060833b6146a95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e747261637400000000000000000000000000000000000000000000000000006064820152608401610b59565b600080856001600160a01b0316856040516146c49190614dba565b600060405180830381855af49150503d80600081146146ff576040519150601f19603f3d011682016040523d82523d6000602084013e614704565b606091505b509150915061471482828661471e565b9695505050505050565b6060831561472d575081614449565b82511561473d5782518084602001fd5b8160405162461bcd60e51b8152600401610b59919061481c565b82805461476390614cb2565b90600052602060002090601f01602090048101928261478557600085556147cb565b82601f1061479e57805160ff19168380011785556147cb565b828001600101855582156147cb579182015b828111156147cb5782518255916020019190600101906147b0565b506147d79291506147db565b5090565b5b808211156147d757600081556001016147dc565b60005b8381101561480b5781810151838201526020016147f3565b83811115612e485750506000910152565b602081526000825180602084015261483b8160408501602087016147f0565b601f01601f19169190910160400192915050565b6001600160a01b038116811461136a57600080fd5b80356111068161484f565b6000806040838503121561488257600080fd5b823561488d8161484f565b946020939093013593505050565b6000806000606084860312156148b057600080fd5b83356148bb8161484f565b925060208401356148cb8161484f565b929592945050506040919091013590565b6000602082840312156148ee57600080fd5b81356144498161484f565b60006020828403121561490b57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561495c5761495c614912565b604051601f8501601f19908116603f0116810190828211818310171561498457614984614912565b8160405280935085815286868601111561499d57600080fd5b858560208301376000602087830101525050509392505050565b600080604083850312156149ca57600080fd5b82356149d58161484f565b9150602083013567ffffffffffffffff8111156149f157600080fd5b8301601f81018513614a0257600080fd5b614a1185823560208401614941565b9150509250929050565b803560ff8116811461110657600080fd5b600080600080600060a08688031215614a4457600080fd5b8535614a4f8161484f565b945060208601359350614a6460408701614a1b565b94979396509394606081013594506080013592915050565b600082601f830112614a8d57600080fd5b61444983833560208501614941565b60008060008060008060008060006101208a8c031215614abb57600080fd5b893567ffffffffffffffff80821115614ad357600080fd5b614adf8d838e01614a7c565b9a5060208c0135915080821115614af557600080fd5b614b018d838e01614a7c565b995060408c0135915080821115614b1757600080fd5b50614b248c828d01614a7c565b975050614b3360608b01614a1b565b9550614b4160808b01614864565b9450614b4f60a08b01614864565b9350614b5d60c08b01614864565b9250614b6b60e08b01614864565b9150614b7a6101008b01614864565b90509295985092959850929598565b600080600080600080600060e0888a031215614ba457600080fd5b8735614baf8161484f565b96506020880135614bbf8161484f565b95506040880135945060608801359350614bdb60808901614a1b565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215614c0a57600080fd5b8235614c158161484f565b91506020830135614c258161484f565b809150509250929050565b60008060008060008060008060006101208a8c031215614c4f57600080fd5b8935614c5a8161484f565b985060208a0135614c6a8161484f565b975060408a0135965060608a0135955060808a0135945060a08a01359350614c9460c08b01614a1b565b925060e08a013591506101008a013590509295985092959850929598565b600181811c90821680614cc657607f821691505b60208210811415614d00577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015614d4757614d47614d06565b500390565b60008219821115614d5f57614d5f614d06565b500190565b600060208284031215614d7657600080fd5b8151801515811461444957600080fd5b600060208284031215614d9857600080fd5b5051919050565b6000600019821415614db357614db3614d06565b5060010190565b60008251614dcc8184602087016147f0565b919091019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122088b0c5194b9eca0801c00f098997e6c9042e68a8d796e28173d6611567e0d9a464736f6c634300080b0033" +} diff --git a/packages/core/examples/README.md b/packages/core/examples/README.md new file mode 100644 index 0000000..d574c61 --- /dev/null +++ b/packages/core/examples/README.md @@ -0,0 +1,29 @@ +# Examples + +This directory contains a collection of code examples of using the SDK. + +## 🏃🏻 Run Code Examples + +Before running any examples, please make sure to start a blockchain network (i.e., execution client) on localhost. You can use some framework (e.g., [Foundry](https://book.getfoundry.sh/), [Hardhat](https://hardhat.org/)) or some direct client (e.g., [Geth](https://geth.ethereum.org/docs)). + +```sh +# cd into one of the package directories (e.g., `core`) +$ cd python-sdk/packages/core +# run a python file (e.g., `transfer`) +$ uv run examples/transfer.py +``` + +## 🌲 Directory Structure + +| Module | Description | +| ----------------------------------------------------------------: | :--------------------------------------------------------- | +| [`main`](./main.py) | Code example that configures SDK clients. | +| [`transfer`](./transfer.py) | Code example that uses `transfer` method. | +| [`transfer_from`](./transfer_from.py) | Code example that uses `approve` & `transferFrom` methods. | +| [`transfer_with_authorization`](./transfer_with_authorization.py) | Code example that uses `transferWithAuthorization` method. | +| [`receive_with_authorization`](./receive_with_authorization.py) | Code example that uses `receiveWithAuthorization` method. | +| [`cancel_authorization`](./cancel_authorization.py) | Code example that uses `cancelAuthorization` method. | +| [`permit`](./permit.py) | Code example that uses `permit` method. | +| [`mint`](./mint.py) | Code example that uses `mint` method. | +| [`constants`](./constants.py) | Some constants for code examples. | +| [`utils`](./utils.py) | Some utility functions for code examples. | diff --git a/.github/actions/.gitkeep b/packages/core/examples/__init__.py similarity index 100% rename from .github/actions/.gitkeep rename to packages/core/examples/__init__.py diff --git a/packages/core/examples/cancel_authorization.py b/packages/core/examples/cancel_authorization.py new file mode 100644 index 0000000..cf39930 --- /dev/null +++ b/packages/core/examples/cancel_authorization.py @@ -0,0 +1,136 @@ +import sys +import time +from pathlib import Path +from random import randbytes + +from eth_account import Account + +sys.path.append(str(Path(__file__).parents[1])) + +from examples.constants import KNOWN_ACCOUNTS +from examples.main import jpyc_0 +from examples.utils import add_zero_padding_to_hex, remove_decimals + + +def main() -> None: + # 0. Configure a minter + jpyc_0.configure_minter( + minter=KNOWN_ACCOUNTS[0].address, + minter_allowed_amount=1000000, + ) + + # 1. Mint JPYC tokens + # NOTE: caller here is `KNOWN_ACCOUNTS[0]` + jpyc_0.mint( + to=KNOWN_ACCOUNTS[0].address, + amount=10000, + ) + + # 2. Prepare common typed data + domain = { + "name": jpyc_0.contract.functions.name().call(), + "version": "1", + "chainId": jpyc_0.client.w3.eth.chain_id, + "verifyingContract": jpyc_0.contract.address, + } + nonce = f"0x{randbytes(32).hex()}" + + # 3. Sign a typed message for`transferWithAuthorization` + types = { + "EIP712Domain": [ + {"name": "name", "type": "string"}, + {"name": "version", "type": "string"}, + {"name": "chainId", "type": "uint256"}, + {"name": "verifyingContract", "type": "address"}, + ], + "TransferWithAuthorization": [ + {"name": "from", "type": "address"}, + {"name": "to", "type": "address"}, + {"name": "value", "type": "uint256"}, + {"name": "validAfter", "type": "uint256"}, + {"name": "validBefore", "type": "uint256"}, + {"name": "nonce", "type": "bytes32"}, + ], + } + from_ = KNOWN_ACCOUNTS[0].address + to = KNOWN_ACCOUNTS[2].address + value = 3000 + valid_after = 0 + valid_before = int(time.time()) + 3600 + + signed_message_transfer = Account.sign_typed_data( + KNOWN_ACCOUNTS[0].private_key, + full_message={ + "domain": domain, + "types": types, + "primaryType": "TransferWithAuthorization", + "message": { + "from": from_, + "to": to, + "value": remove_decimals(value), # NOTE: Don't forget decimals handling + "validAfter": valid_after, + "validBefore": valid_before, + "nonce": nonce, + }, + }, + ) + + # 4. Sign a typed message for `cancelAuthorization` + types = { + "EIP712Domain": [ + {"name": "name", "type": "string"}, + {"name": "version", "type": "string"}, + {"name": "chainId", "type": "uint256"}, + {"name": "verifyingContract", "type": "address"}, + ], + "CancelAuthorization": [ + {"name": "authorizer", "type": "address"}, + {"name": "nonce", "type": "bytes32"}, + ], + } + + signed_message_cancel = Account.sign_typed_data( + KNOWN_ACCOUNTS[0].private_key, + full_message={ + "domain": domain, + "types": types, + "primaryType": "CancelAuthorization", + "message": { + "authorizer": from_, + "nonce": nonce, + }, + }, + ) + + # 5. Cancel authorization + # NOTE: caller here is `KNOWN_ACCOUNTS[0]` + jpyc_0.cancel_authorization( + authorizer=from_, + nonce=nonce, + v=signed_message_cancel.v, + r=add_zero_padding_to_hex(hex(signed_message_cancel.r), 32), + s=add_zero_padding_to_hex(hex(signed_message_cancel.s), 32), + ) + + # 6. Check if authorization has been cancelled + # NOTE: caller here is `KNOWN_ACCOUNTS[0]` + try: + jpyc_0.transfer_with_authorization( + from_=from_, + to=to, + value=value, + valid_after=valid_after, + valid_before=valid_before, + nonce=nonce, + v=signed_message_transfer.v, + r=add_zero_padding_to_hex(hex(signed_message_transfer.r), 32), + s=add_zero_padding_to_hex(hex(signed_message_transfer.s), 32), + ) + except Exception: + print("Authorization has been cancelled successfully.") + else: + raise Exception("ERROR: authorization has not been cancelled.") + + +if __name__ == "__main__": + main() diff --git a/packages/core/examples/constants.py b/packages/core/examples/constants.py new file mode 100644 index 0000000..ed794cc --- /dev/null +++ b/packages/core/examples/constants.py @@ -0,0 +1,25 @@ +from dataclasses import dataclass +from typing import Final + + +@dataclass(frozen=True) +class KnownAccount: + address: str + private_key: str + + +# A list of known accounts (DO NOT USE IN PRODUCTION) +KNOWN_ACCOUNTS: Final[list[KnownAccount]] = [ + KnownAccount( + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80", + ), + KnownAccount( + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d", + ), + KnownAccount( + "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", + "0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a", + ), +] diff --git a/packages/core/examples/main.py b/packages/core/examples/main.py new file mode 100644 index 0000000..a265b20 --- /dev/null +++ b/packages/core/examples/main.py @@ -0,0 +1,29 @@ +import sys +from pathlib import Path + +sys.path.append(str(Path(__file__).parents[1])) + +from examples.constants import KNOWN_ACCOUNTS +from src.client import SdkClient +from src.jpyc import JPYC + +# SDK clients +client_0 = SdkClient( + chain_name="localhost", + network_name="devnet", + private_key=KNOWN_ACCOUNTS[0].private_key, +) +client_1 = SdkClient( + chain_name="localhost", + network_name="devnet", + private_key=KNOWN_ACCOUNTS[1].private_key, +) + +# JPYC clients +jpyc_0 = JPYC( + client=client_0, +) +jpyc_1 = JPYC( + client=client_1, + contract_address=jpyc_0.contract.address, +) diff --git a/packages/core/examples/mint.py b/packages/core/examples/mint.py new file mode 100644 index 0000000..386a07d --- /dev/null +++ b/packages/core/examples/mint.py @@ -0,0 +1,48 @@ +import sys +from pathlib import Path + +sys.path.append(str(Path(__file__).parents[1])) + +from examples.constants import KNOWN_ACCOUNTS +from examples.main import jpyc_0 + + +def main() -> None: + # 0. Check initial total supply of jpyc tokens + total_supply = jpyc_0.total_supply() + print(f"Total Supply (before minting): {total_supply}") + + # 1. Configure a minter + jpyc_0.configure_minter( + minter=KNOWN_ACCOUNTS[0].address, + minter_allowed_amount=1000000, + ) + + # 2. Check minter validity + is_minter_0 = jpyc_0.is_minter(account=KNOWN_ACCOUNTS[0].address) + print(f"Is {KNOWN_ACCOUNTS[0].address} a minter?: {is_minter_0}") + + is_minter_1 = jpyc_0.is_minter(account=KNOWN_ACCOUNTS[1].address) + print(f"Is {KNOWN_ACCOUNTS[1].address} a minter?: {is_minter_1}") + + # 3. Check minter allowance + minter_allowance = jpyc_0.minter_allowance(minter=KNOWN_ACCOUNTS[0].address) + print(f"Minter allowance of {KNOWN_ACCOUNTS[0].address}: {minter_allowance}") + + # 4. Mint jpyc tokens (note that caller here is `KNOWN_ACCOUNTS[0]`) + jpyc_0.mint( + to=KNOWN_ACCOUNTS[1].address, + amount=10000, + ) + + # 5. Check balance of receiver address + balance = jpyc_0.balance_of(account=KNOWN_ACCOUNTS[1].address) + print(f"Balance of {KNOWN_ACCOUNTS[1].address}: {balance}") + + # 6. Check total supply of jpyc tokens after minting + total_supply = jpyc_0.total_supply() + print(f"Total Supply (after minting): {total_supply}") + + +if __name__ == "__main__": + main() diff --git a/packages/core/examples/permit.py b/packages/core/examples/permit.py new file mode 100644 index 0000000..87c8fed --- /dev/null +++ b/packages/core/examples/permit.py @@ -0,0 +1,96 @@ +import sys +import time +from pathlib import Path + +from eth_account import Account + +sys.path.append(str(Path(__file__).parents[1])) + +from examples.constants import KNOWN_ACCOUNTS +from examples.main import jpyc_0 +from examples.utils import add_zero_padding_to_hex, remove_decimals + + +def main() -> None: + # 0. Configure a minter + jpyc_0.configure_minter( + minter=KNOWN_ACCOUNTS[0].address, + minter_allowed_amount=1000000, + ) + + # 1. Mint JPYC tokens + # NOTE: caller here is `KNOWN_ACCOUNTS[0]` + jpyc_0.mint( + to=KNOWN_ACCOUNTS[0].address, + amount=10000, + ) + + # 2. Sign a typed message + domain = { + "name": jpyc_0.contract.functions.name().call(), + "version": "1", + "chainId": jpyc_0.client.w3.eth.chain_id, + "verifyingContract": jpyc_0.contract.address, + } + types = { + "EIP712Domain": [ + {"name": "name", "type": "string"}, + {"name": "version", "type": "string"}, + {"name": "chainId", "type": "uint256"}, + {"name": "verifyingContract", "type": "address"}, + ], + "Permit": [ + {"name": "owner", "type": "address"}, + {"name": "spender", "type": "address"}, + {"name": "value", "type": "uint256"}, + {"name": "nonce", "type": "uint256"}, + {"name": "deadline", "type": "uint256"}, + ], + } + owner = KNOWN_ACCOUNTS[0].address + spender = KNOWN_ACCOUNTS[1].address + value = 3000 + deadline = int(time.time()) + 3600 + nonce = jpyc_0.nonces(owner=owner) + + signed_message = Account.sign_typed_data( + KNOWN_ACCOUNTS[0].private_key, + full_message={ + "domain": domain, + "types": types, + "primaryType": "Permit", + "message": { + "owner": owner, + "spender": spender, + "value": remove_decimals(value), # NOTE: Don't forget decimals handling + "nonce": nonce, + "deadline": deadline, + }, + }, + ) + + # 3. Permit `spender` to transfer JPYC tokens on behalf of `owner` + # NOTE: caller here is `KNOWN_ACCOUNTS[0]` + jpyc_0.permit( + owner=owner, + spender=spender, + value=value, + deadline=deadline, + v=signed_message.v, + r=add_zero_padding_to_hex(hex(signed_message.r), 32), + s=add_zero_padding_to_hex(hex(signed_message.s), 32), + ) + + # 4. Check allowance + allowance = jpyc_0.allowance( + owner=KNOWN_ACCOUNTS[0].address, + spender=KNOWN_ACCOUNTS[1].address, + ) + print( + f"Allowance of {KNOWN_ACCOUNTS[1].address}" + f"over {KNOWN_ACCOUNTS[0].address}'s assets: {allowance}" + ) + + +if __name__ == "__main__": + main() diff --git a/packages/core/examples/receive_with_authorization.py b/packages/core/examples/receive_with_authorization.py new file mode 100644 index 0000000..fa68a12 --- /dev/null +++ b/packages/core/examples/receive_with_authorization.py @@ -0,0 +1,100 @@ +import sys +import time +from pathlib import Path +from random import randbytes + +from eth_account import Account + +sys.path.append(str(Path(__file__).parents[1])) + +from examples.constants import KNOWN_ACCOUNTS +from examples.main import jpyc_0, jpyc_1 +from examples.utils import add_zero_padding_to_hex, remove_decimals + + +def main() -> None: + # 0. Configure a minter + jpyc_0.configure_minter( + minter=KNOWN_ACCOUNTS[0].address, + minter_allowed_amount=1000000, + ) + + # 1. Mint JPYC tokens (note that caller here is `KNOWN_ACCOUNTS[0]`) + jpyc_0.mint( + to=KNOWN_ACCOUNTS[0].address, + amount=10000, + ) + + # 2. Sign a typed message + domain = { + "name": jpyc_0.contract.functions.name().call(), + "version": "1", + "chainId": jpyc_0.client.w3.eth.chain_id, + "verifyingContract": jpyc_0.contract.address, + } + types = { + "EIP712Domain": [ + {"name": "name", "type": "string"}, + {"name": "version", "type": "string"}, + {"name": "chainId", "type": "uint256"}, + {"name": "verifyingContract", "type": "address"}, + ], + "ReceiveWithAuthorization": [ + {"name": "from", "type": "address"}, + {"name": "to", "type": "address"}, + {"name": "value", "type": "uint256"}, + {"name": "validAfter", "type": "uint256"}, + {"name": "validBefore", "type": "uint256"}, + {"name": "nonce", "type": "bytes32"}, + ], + } + from_ = KNOWN_ACCOUNTS[0].address + to = KNOWN_ACCOUNTS[1].address + value = 3000 + valid_after = 0 + valid_before = int(time.time()) + 3600 + nonce = f"0x{randbytes(32).hex()}" + + signed_message = Account.sign_typed_data( + KNOWN_ACCOUNTS[0].private_key, + full_message={ + "domain": domain, + "types": types, + "primaryType": "ReceiveWithAuthorization", + "message": { + "from": from_, + "to": to, + "value": remove_decimals(value), # NOTE: Don't forget decimals handling + "validAfter": valid_after, + "validBefore": valid_before, + "nonce": nonce, + }, + }, + ) + + # 3. Receive JPYC tokens (note that caller here is `KNOWN_ACCOUNTS[1]`) + jpyc_1.receive_with_authorization( + from_=from_, + to=to, + value=value, + valid_after=valid_after, + valid_before=valid_before, + nonce=nonce, + v=signed_message.v, + r=add_zero_padding_to_hex(hex(signed_message.r), 32), + s=add_zero_padding_to_hex(hex(signed_message.s), 32), + ) + + # 4. Check balances + balance_0 = jpyc_0.balance_of(account=KNOWN_ACCOUNTS[0].address) + print(f"Balance of {KNOWN_ACCOUNTS[0].address}: {balance_0}") + + balance_1 = jpyc_0.balance_of(account=KNOWN_ACCOUNTS[1].address) + print(f"Balance of {KNOWN_ACCOUNTS[1].address}: {balance_1}") + + balance_2 = jpyc_0.balance_of(account=KNOWN_ACCOUNTS[2].address) + print(f"Balance of {KNOWN_ACCOUNTS[2].address}: {balance_2}") + + +if __name__ == "__main__": + main() diff --git a/packages/core/examples/transfer.py b/packages/core/examples/transfer.py new file mode 100644 index 0000000..90b89f3 --- /dev/null +++ b/packages/core/examples/transfer.py @@ -0,0 +1,38 @@ +import sys +from pathlib import Path + +sys.path.append(str(Path(__file__).parents[1])) + +from examples.constants import KNOWN_ACCOUNTS +from examples.main import jpyc_0 + + +def main() -> None: + # 0. Configure a minter + jpyc_0.configure_minter( + minter=KNOWN_ACCOUNTS[0].address, + minter_allowed_amount=1000000, + ) + + # 1. Mint JPYC tokens (note that caller here is `KNOWN_ACCOUNTS[0]`) + jpyc_0.mint( + to=KNOWN_ACCOUNTS[0].address, + amount=10000, + ) + + # 2. Transfer JPYC tokens (note that caller here is `KNOWN_ACCOUNTS[0]`) + jpyc_0.transfer( + to=KNOWN_ACCOUNTS[1].address, + value=3000, + ) + + # 3. Check balances + balance_0 = jpyc_0.balance_of(account=KNOWN_ACCOUNTS[0].address) + print(f"Balance of {KNOWN_ACCOUNTS[0].address}: {balance_0}") + + balance_1 = jpyc_0.balance_of(account=KNOWN_ACCOUNTS[1].address) + print(f"Balance of {KNOWN_ACCOUNTS[1].address}: {balance_1}") + + +if __name__ == "__main__": + main() diff --git a/packages/core/examples/transfer_from.py b/packages/core/examples/transfer_from.py new file mode 100644 index 0000000..8f0549b --- /dev/null +++ b/packages/core/examples/transfer_from.py @@ -0,0 +1,59 @@ +import sys +from pathlib import Path + +sys.path.append(str(Path(__file__).parents[1])) + +from examples.constants import KNOWN_ACCOUNTS +from examples.main import jpyc_0, jpyc_1 + + +def main() -> None: + # 0. Configure a minter + jpyc_0.configure_minter( + minter=KNOWN_ACCOUNTS[0].address, + minter_allowed_amount=1000000, + ) + + # 1. Mint JPYC tokens + # NOTE: caller here is `KNOWN_ACCOUNTS[0]` + jpyc_0.mint( + to=KNOWN_ACCOUNTS[0].address, + amount=10000, + ) + + # 2. Approve `KNOWN_ACCOUNTS[1]` to transfer JPYC tokens + jpyc_0.approve( + spender=KNOWN_ACCOUNTS[1].address, + value=5000, + ) + + # 3. Check allowance + allowance = jpyc_0.allowance( + owner=KNOWN_ACCOUNTS[0].address, + spender=KNOWN_ACCOUNTS[1].address, + ) + print( + f"Allowance of {KNOWN_ACCOUNTS[1].address}" + f"over {KNOWN_ACCOUNTS[0].address}'s assets: {allowance}" + ) + + # 4. Transfer JPYC tokens (note that caller here is `KNOWN_ACCOUNTS[1]`) + jpyc_1.transfer_from( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[2].address, + value=2500, + ) + + # 5. Check balances + balance_0 = jpyc_0.balance_of(account=KNOWN_ACCOUNTS[0].address) + print(f"Balance of {KNOWN_ACCOUNTS[0].address}: {balance_0}") + + balance_1 = jpyc_0.balance_of(account=KNOWN_ACCOUNTS[1].address) + print(f"Balance of {KNOWN_ACCOUNTS[1].address}: {balance_1}") + + balance_2 = jpyc_0.balance_of(account=KNOWN_ACCOUNTS[2].address) + print(f"Balance of {KNOWN_ACCOUNTS[2].address}: {balance_2}") + + +if __name__ == "__main__": + main() diff --git a/packages/core/examples/transfer_with_authorization.py b/packages/core/examples/transfer_with_authorization.py new file mode 100644 index 0000000..b8aabc0 --- /dev/null +++ b/packages/core/examples/transfer_with_authorization.py @@ -0,0 +1,100 @@ +import sys +import time +from pathlib import Path +from random import randbytes + +from eth_account import Account + +sys.path.append(str(Path(__file__).parents[1])) + +from examples.constants import KNOWN_ACCOUNTS +from examples.main import jpyc_0 +from examples.utils import add_zero_padding_to_hex, remove_decimals + + +def main() -> None: + # 0. Configure a minter + jpyc_0.configure_minter( + minter=KNOWN_ACCOUNTS[0].address, + minter_allowed_amount=1000000, + ) + + # 1. Mint JPYC tokens (note that caller here is `KNOWN_ACCOUNTS[0]`) + jpyc_0.mint( + to=KNOWN_ACCOUNTS[0].address, + amount=10000, + ) + + # 2. Sign a typed message + domain = { + "name": jpyc_0.contract.functions.name().call(), + "version": "1", + "chainId": jpyc_0.client.w3.eth.chain_id, + "verifyingContract": jpyc_0.contract.address, + } + types = { + "EIP712Domain": [ + {"name": "name", "type": "string"}, + {"name": "version", "type": "string"}, + {"name": "chainId", "type": "uint256"}, + {"name": "verifyingContract", "type": "address"}, + ], + "TransferWithAuthorization": [ + {"name": "from", "type": "address"}, + {"name": "to", "type": "address"}, + {"name": "value", "type": "uint256"}, + {"name": "validAfter", "type": "uint256"}, + {"name": "validBefore", "type": "uint256"}, + {"name": "nonce", "type": "bytes32"}, + ], + } + from_ = KNOWN_ACCOUNTS[0].address + to = KNOWN_ACCOUNTS[2].address + value = 3000 + valid_after = 0 + valid_before = int(time.time()) + 3600 + nonce = f"0x{randbytes(32).hex()}" + + signed_message = Account.sign_typed_data( + KNOWN_ACCOUNTS[0].private_key, + full_message={ + "domain": domain, + "types": types, + "primaryType": "TransferWithAuthorization", + "message": { + "from": from_, + "to": to, + "value": remove_decimals(value), # NOTE: Don't forget decimals handling + "validAfter": valid_after, + "validBefore": valid_before, + "nonce": nonce, + }, + }, + ) + + # 3. Transfer JPYC tokens (note that caller here is `KNOWN_ACCOUNTS[0]`) + jpyc_0.transfer_with_authorization( + from_=from_, + to=to, + value=value, + valid_after=valid_after, + valid_before=valid_before, + nonce=nonce, + v=signed_message.v, + r=add_zero_padding_to_hex(hex(signed_message.r), 32), + s=add_zero_padding_to_hex(hex(signed_message.s), 32), + ) + + # 4. Check balances + balance_0 = jpyc_0.balance_of(account=KNOWN_ACCOUNTS[0].address) + print(f"Balance of {KNOWN_ACCOUNTS[0].address}: {balance_0}") + + balance_1 = jpyc_0.balance_of(account=KNOWN_ACCOUNTS[1].address) + print(f"Balance of {KNOWN_ACCOUNTS[1].address}: {balance_1}") + + balance_2 = jpyc_0.balance_of(account=KNOWN_ACCOUNTS[2].address) + print(f"Balance of {KNOWN_ACCOUNTS[2].address}: {balance_2}") + + +if __name__ == "__main__": + main() diff --git a/packages/core/examples/utils.py b/packages/core/examples/utils.py new file mode 100644 index 0000000..dff4cbd --- /dev/null +++ b/packages/core/examples/utils.py @@ -0,0 +1,9 @@ +from web3 import Web3 + + +def add_zero_padding_to_hex(hex_string: str, num_of_bytes: int) -> str: + return f"0x{hex_string[2:].zfill(num_of_bytes * 2)}" + + +def remove_decimals(value: int) -> int: + return Web3.to_wei(value, "ether") diff --git a/packages/core/pyproject.toml b/packages/core/pyproject.toml new file mode 100644 index 0000000..3cdfcb1 --- /dev/null +++ b/packages/core/pyproject.toml @@ -0,0 +1,107 @@ +[project] +name = "jpyc-core-sdk" +version = "1.0.0" +requires-python = ">=3.12" +license = "MIT" +description = "A Python SDK for interacting with JPYCv2 contracts" +readme = "README.md" +keywords = [ + "jpyc", + "jpy", + "stablecoin", + "ethereum", + "evm", + "erc20", + "blockchain", +] +classifiers = [ + "Development Status :: 4 - Beta", + "Intended Audience :: Developers", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", + "Programming Language :: Python :: 3.15", + "Topic :: Software Development :: Libraries", + "Topic :: Software Development :: Libraries :: Python Modules", +] +authors = [ + { name = "mameta", email = "mameta.zk@gmail.com" }, + { name = "SeiyaKobayashi", email = "eng@seiya.work" }, +] +maintainers = [ + { name = "mameta", email = "mameta.zk@gmail.com" }, + { name = "SeiyaKobayashi", email = "eng@seiya.work" }, +] +# Production dependencies +dependencies = [ + "eth-typing>=5.2.1", + "pydantic>=2.11.4", + "web3>=7.11.0", +] + +[project.urls] +repository = "https://github.com/jcam1/python-sdk" +documentation = "https://github.com/jcam1/python-sdk/tree/main/docs/core" +"Bug Tracker" = "https://github.com/jcam1/python-sdk/issues/new?template=bug_report.md" + +[dependency-groups] +# Development dependencies +dev = [ + "mypy>=1.15.0", + "pytest>=8.3.5", + "pytest-cov>=6.1.1", + "pytest-mock>=3.14.0", + "ruff>=0.11.9", +] + +[build-system] +requires = ["setuptools>=61.0"] +build-backend = "setuptools.build_meta" + +# pytest + +[tool.pytest.ini_options] +testpaths = ["../../tests"] +python_files = "test_*.py" +python_functions = "test_*" +filterwarnings = [ + "ignore::DeprecationWarning", +] + +# Ruff + +[tool.ruff] +target-version = "py312" +line-length = 88 +indent-width = 4 + +[tool.ruff.lint] +select = ["B", "C4", "E", "F", "I", "UP", "W"] +ignore = ["B904"] +fixable = ["ALL"] +unfixable = [] +dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" + +[tool.ruff.format] +indent-style = "space" +quote-style = "double" +skip-magic-trailing-comma = false +line-ending = "auto" +docstring-code-format = true +docstring-code-line-length = "dynamic" + +# mypy + +[tool.mypy] +python_version = "3.12" +warn_unused_configs = true +disallow_untyped_defs = true +disallow_incomplete_defs = true +check_untyped_defs = true +no_implicit_optional = true +warn_redundant_casts = true +warn_unused_ignores = true +warn_no_return = true +warn_unreachable = true +ignore_missing_imports = false diff --git a/packages/core/src/__init__.py b/packages/core/src/__init__.py new file mode 100644 index 0000000..c8f2b3a --- /dev/null +++ b/packages/core/src/__init__.py @@ -0,0 +1,15 @@ +# from importlib.metadata import version + +from .client import SdkClient +from .jpyc import JPYC + +# __version__ = version("jpyc-core-sdk") +__all__ = [ + # "__version__", + # client + "SdkClient", + # jpyc + "JPYC", + # utils + "utils", +] diff --git a/packages/core/src/client.py b/packages/core/src/client.py new file mode 100644 index 0000000..01ee77b --- /dev/null +++ b/packages/core/src/client.py @@ -0,0 +1,139 @@ +from eth_account.signers.local import LocalAccount +from pydantic import validate_call +from web3 import Account, HTTPProvider, Web3 +from web3.middleware import ( + ExtraDataToPOAMiddleware, + SignAndSendRawMiddlewareBuilder, +) + +from .interfaces import ISdkClient +from .utils.chains import get_default_rpc_endpoint +from .utils.constants import ( + POA_MIDDLEWARE, + SIGN_MIDDLEWARE, +) +from .utils.errors import AccountNotInitialized +from .utils.types import ChainName +from .utils.validators import ( + Bytes32, + ChecksumAddress, + RpcEndpoint, +) + + +class SdkClient(ISdkClient): + """SDK client.""" + + @validate_call + def __init__( + self, + chain_name: ChainName | None = None, + network_name: str | None = None, + rpc_endpoint: RpcEndpoint | None = None, + private_key: Bytes32 | None = None, + ) -> None: + """Constructor that initializes SDK client. + + Notes: + - Either `chain_name` & `network_name` parameters\ + or `rpc_endpoint` parameter are required. + - This constructor prioritizes `rpc_endpoint` parameter over\ + `chain_name` & `network_name` parameters when configuring `rpc_endpoint`. + + Args: + chain_name (str, optional): Chain name + network_name (str, optional): Network name + rpc_endpoint (RpcEndpoint, optional): RPC endpoint + private_key (Bytes32, optional): private key of EOA + + Raises: + InvalidBytes32: If the supplied `private_key` is not in a valid form + InvalidRpcEndpoint: If the supplied `rpc_endpoint` is not in a valid form + NetworkNotSupported: If the specified network is not supported by the SDK + ValidationError: If pydantic validation fails + """ + rpc_endpoint = ( + rpc_endpoint + if rpc_endpoint is not None + else get_default_rpc_endpoint(chain_name, network_name) + ) + account = Account.from_key(private_key) if private_key is not None else None + w3 = self.__configure_w3( + rpc_endpoint=rpc_endpoint, + account=account, + ) + + self.w3 = w3 + """Web3: Configured web3 instance""" + self.rpc_endpoint = rpc_endpoint + """str: RPC endpoint""" + self.account = account + """LocalAccount | None: Account instance""" + + @staticmethod + def __configure_w3( + rpc_endpoint: RpcEndpoint, + account: LocalAccount | None = None, + ) -> Web3: + """Configure a web3 instance. + + Args: + rpc_endpoint (RpcEndpoint): RPC endpoint + account (LocalAccount, optional): Account instance + + Returns: + Web3: Configured web3 instance + """ + w3 = Web3(HTTPProvider(rpc_endpoint)) + w3.middleware_onion.inject( + ExtraDataToPOAMiddleware, + name=POA_MIDDLEWARE, + layer=0, + ) + if account is not None: + w3.eth.default_account = account.address + w3.middleware_onion.inject( + SignAndSendRawMiddlewareBuilder.build(account), + name=SIGN_MIDDLEWARE, + layer=0, + ) + else: + w3.eth.default_account = None # type: ignore[assignment] + + return w3 + + @validate_call + def set_default_provider(self, chain_name: ChainName, network_name: str) -> Web3: + self.w3 = self.__configure_w3( + rpc_endpoint=get_default_rpc_endpoint(chain_name, network_name), + account=self.account, + ) + + return self.w3 + + @validate_call + def set_custom_provider(self, rpc_endpoint: RpcEndpoint) -> Web3: + self.w3 = self.__configure_w3(rpc_endpoint=rpc_endpoint, account=self.account) + + return self.w3 + + @validate_call + def set_account(self, private_key: Bytes32 | None) -> LocalAccount | None: + if private_key is None: + self.account = None + self.w3 = self.__configure_w3( + rpc_endpoint=self.rpc_endpoint, + ) + else: + self.account = Account.from_key(private_key) + self.w3 = self.__configure_w3( + rpc_endpoint=self.rpc_endpoint, account=self.account + ) + + return self.account + + def get_account_address(self) -> ChecksumAddress: + if self.account is None: + raise AccountNotInitialized() + + return self.account.address diff --git a/packages/core/src/interfaces/README.md b/packages/core/src/interfaces/README.md new file mode 100644 index 0000000..7a609c1 --- /dev/null +++ b/packages/core/src/interfaces/README.md @@ -0,0 +1,17 @@ +# Interfaces + +> [!IMPORTANT] +> This `README` is mainly for the advanced users (e.g., contributors of this repo). + +This directory contains the interfaces of the SDK. + +## 👨🏻‍💻 Implementation + +Please modify interface classes (expressed as [Python's abstract classes](https://docs.python.org/3/library/abc.html)) before modifying implementation classes. Comments should be written in [the Google-style docstrings](https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings). + +## 🌲 Directory Structure + +| Module | Description | +| ----------------------: | :--------------------------- | +| [`client`](./client.py) | Interface of SDK client. | +| [`jpyc`](./jpyc.py) | Interface of JPYC contracts. | diff --git a/packages/core/src/interfaces/__init__.py b/packages/core/src/interfaces/__init__.py new file mode 100644 index 0000000..a70d614 --- /dev/null +++ b/packages/core/src/interfaces/__init__.py @@ -0,0 +1,9 @@ +from .client import ISdkClient +from .jpyc import IJPYC + +__all__ = [ + # client + "ISdkClient", + # jpyc + "IJPYC", +] diff --git a/packages/core/src/interfaces/client.py b/packages/core/src/interfaces/client.py new file mode 100644 index 0000000..bcc3a30 --- /dev/null +++ b/packages/core/src/interfaces/client.py @@ -0,0 +1,78 @@ +from abc import ABC, abstractmethod + +from eth_account.signers.local import LocalAccount +from web3 import Web3 + +from ..utils.types import ChainName +from ..utils.validators import ( + Bytes32, + ChecksumAddress, + RpcEndpoint, +) + + +class ISdkClient(ABC): + """Interface of SDK client.""" + + @abstractmethod + def set_default_provider(self, chain_name: ChainName, network_name: str) -> Web3: + """Set provider using one of the default RPC endpoints. + + Args: + chain_name (str): Chain name + network_name (str): Network name + + Returns: + Web3: Configured web3 instance + + Raises: + NetworkNotSupported: If the specified network is not supported by the SDK + ValidationError: If pydantic validation fails + """ + pass + + @abstractmethod + def set_custom_provider(self, rpc_endpoint: RpcEndpoint) -> Web3: + """Set provider using a custom RPC endpoint. + + Args: + rpc_endpoint (RpcEndpoint): Custom RPC endpoint + + Returns: + Web3: Configured web3 instance + + Raises: + InvalidRpcEndpoint: If the supplied `rpc_endpoint` is not in a valid form + """ + pass + + @abstractmethod + def set_account(self, private_key: Bytes32 | None) -> LocalAccount | None: + """Set account with a private key. + + Notes: + If `private_key` parameter is set to `None`, \ + this method removes `account` from the configured web3 instance. + + Args: + private_key (Bytes32, optional): Private key of account + + Returns: + LocalAccount | None: Configured account instance + + Raises: + InvalidBytes32: If the supplied `private_key` is not in a valid form + """ + pass + + @abstractmethod + def get_account_address(self) -> ChecksumAddress: + """Get address of the configured account. + + Returns: + ChecksumAddress: Public address of account + + Raises: + AccountNotInitialized: If account is not initialized + """ + pass diff --git a/packages/core/src/interfaces/jpyc.py b/packages/core/src/interfaces/jpyc.py new file mode 100644 index 0000000..a3ea5fe --- /dev/null +++ b/packages/core/src/interfaces/jpyc.py @@ -0,0 +1,405 @@ +from abc import ABC, abstractmethod + +from ..utils.validators import ( + Bytes32, + ChecksumAddress, + Uint8, + Uint256, +) + + +class IJPYC(ABC): + """Interface of JPYC contracts.""" + + ################## + # View functions # + ################## + + @abstractmethod + def is_minter(self, account: ChecksumAddress) -> bool: + """Call `isMinter` function. + + Args: + account (ChecksumAddress): Account address + + Returns: + bool: True if `account` is a minter, false otherwise + + Raises: + InvalidChecksumAddress: If supplied `account` is not in a valid form + """ + pass + + @abstractmethod + def minter_allowance(self, minter: ChecksumAddress) -> Uint256: + """Call `minterAllowance` function. + + Args: + minter (ChecksumAddress): Minter address + + Returns: + Uint256: Minter allowance + + Raises: + InvalidChecksumAddress: If supplied `minter` is not in a valid form + """ + pass + + @abstractmethod + def total_supply(self) -> Uint256: + """Call `totalSupply` function. + + Returns: + Uint256: Total supply of tokens + """ + pass + + @abstractmethod + def balance_of(self, account: ChecksumAddress) -> Uint256: + """Call `balanceOf` function. + + Args: + account (ChecksumAddress): Account address + + Returns: + Uint256: Account balance + + Raises: + InvalidChecksumAddress: If supplied `account` is not in a valid form + """ + pass + + @abstractmethod + def allowance(self, owner: ChecksumAddress, spender: ChecksumAddress) -> Uint256: + """Call `allowance` function. + + Args: + owner (ChecksumAddress): Owner address + spender (ChecksumAddress): Spender address + + Returns: + Uint256: Allowance of spender over owner's tokens + + Raises: + InvalidChecksumAddress: If supplied `owner` or `spender`\ + is not in a valid form + """ + pass + + @abstractmethod + def nonces(self, owner: ChecksumAddress) -> Uint256: + """Call `nonces` function. + + Args: + owner (ChecksumAddress): Owner address + + Returns: + Uint256: Nonce for EIP2612's `permit`. + + Raises: + InvalidChecksumAddress: If supplied `owner` is not in a valid form + """ + pass + + ###################### + # Mutation functions # + ###################### + + @abstractmethod + def configure_minter( + self, minter: ChecksumAddress, minter_allowed_amount: Uint256 + ) -> Bytes32: + """Call `configureMinter` function. + + Args: + minter (ChecksumAddress): Minter address + minter_allowed_amount (Uint256): Minter allowance + + Returns: + Bytes32: Transaction hash + + Raises: + AccountNotInitialized: If account is not initialized + InvalidChecksumAddress: If supplied `minter` is not in a valid form + InvalidUint256: If supplied `minter_allowed_amount` is not in a valid form + TransactionFailed: If transaction fails + TransactionSimulationFailed: If transaction simulation fails + """ + pass + + @abstractmethod + def mint(self, to: ChecksumAddress, amount: Uint256) -> Bytes32: + """Call `mint` function. + + Args: + to (ChecksumAddress): Receiver address + amount (Uint256): Amount of tokens to mint + + Returns: + Bytes32: Transaction hash + + Raises: + AccountNotInitialized: If account is not initialized + InvalidChecksumAddress: If supplied `to` is not in a valid form + InvalidUint256: If supplied `amount` is not in a valid form + TransactionFailed: If transaction fails + TransactionSimulationFailed: If transaction simulation fails + """ + pass + + @abstractmethod + def transfer(self, to: ChecksumAddress, value: Uint256) -> Bytes32: + """Call `transfer` function. + + Args: + to (ChecksumAddress): Receiver address + value (Uint256): Amount of tokens to transfer + + Returns: + Bytes32: Transaction hash + + Raises: + AccountNotInitialized: If account is not initialized + InvalidChecksumAddress: If supplied `to` is not in a valid form + InvalidUint256: If supplied `value` is not in a valid form + TransactionFailed: If transaction fails + TransactionSimulationFailed: If transaction simulation fails + """ + pass + + @abstractmethod + def transfer_from( + self, from_: ChecksumAddress, to: ChecksumAddress, value: Uint256 + ) -> Bytes32: + """Call `transferFrom` function. + + Args: + from_ (ChecksumAddress): Owner address + to (ChecksumAddress): Receiver address + value (Uint256): Amount of tokens to transfer + + Returns: + Bytes32: Transaction hash + + Raises: + AccountNotInitialized: If account is not initialized + InvalidChecksumAddress: If supplied `from_` or `to` is not in a valid form + InvalidUint256: If supplied `value` is not in a valid form + TransactionFailed: If transaction fails + TransactionSimulationFailed: If transaction simulation fails + """ + pass + + @abstractmethod + def transfer_with_authorization( + self, + from_: ChecksumAddress, + to: ChecksumAddress, + value: Uint256, + valid_after: Uint256, + valid_before: Uint256, + nonce: Bytes32, + v: Uint8, + r: Bytes32, + s: Bytes32, + ) -> Bytes32: + """Call `transferWithAuthorization` function. + + Args: + from_ (ChecksumAddress): Owner address + to (ChecksumAddress): Receiver allowance + value (Uint256): Amount of tokens to transfer + valid_after (Uint256): Unix time when transaction becomes valid + valid_before (Uint256): Unix time when transaction becomes invalid + nonce (Bytes32): Unique nonce + v (Uint8): v of ECDSA + r (Bytes32): r of ECDSA + s (Bytes32): s of ECDSA + + Returns: + Bytes32: Transaction hash + + Raises: + AccountNotInitialized: If account is not initialized + InvalidBytes32: If supplied `nonce` or `r` or `s` is not in a valid form + InvalidChecksumAddress: If supplied `from_` or `to` is not in a valid form + InvalidUint256: If supplied `value` or `valid_after` or `valid_before`\ + is not in a valid form + InvalidUint8: If supplied `v` is not in a valid form + TransactionFailed: If transaction fails + TransactionSimulationFailed: If transaction simulation fails + """ + pass + + @abstractmethod + def receive_with_authorization( + self, + from_: ChecksumAddress, + to: ChecksumAddress, + value: Uint256, + valid_after: Uint256, + valid_before: Uint256, + nonce: Bytes32, + v: Uint8, + r: Bytes32, + s: Bytes32, + ) -> Bytes32: + """Call `receiveWithAuthorization` function. + + Args: + from_ (ChecksumAddress): Owner address + to (ChecksumAddress): Receiver allowance + value (Uint256): Amount of tokens to transfer + valid_after (Uint256): Unix time when transaction becomes valid + valid_before (Uint256): Unix time when transaction becomes invalid + nonce (Bytes32): Unique nonce + v (Uint8): v of ECDSA + r (Bytes32): r of ECDSA + s (Bytes32): s of ECDSA + + Returns: + Bytes32: Transaction hash + + Raises: + AccountNotInitialized: If account is not initialized + InvalidBytes32: If supplied `nonce` or `r` or `s` is not in a valid form + InvalidChecksumAddress: If supplied `from_` or `to` is not in a valid form + InvalidUint256: If supplied `value` or `valid_after` or `valid_before`\ + is not in a valid form + InvalidUint8: If supplied `v` is not in a valid form + TransactionFailed: If transaction fails + TransactionSimulationFailed: If transaction simulation fails + """ + pass + + @abstractmethod + def cancel_authorization( + self, + authorizer: ChecksumAddress, + nonce: Bytes32, + v: Uint8, + r: Bytes32, + s: Bytes32, + ) -> Bytes32: + """Call `cancelAuthorization` function. + + Args: + authorizer (ChecksumAddress): Owner address + nonce (Bytes32): Unique nonce + v (Uint8): v of ECDSA + r (Bytes32): r of ECDSA + s (Bytes32): s of ECDSA + + Returns: + Bytes32: Transaction hash + + Raises: + AccountNotInitialized: If account is not initialized + InvalidBytes32: If supplied `nonce` or `r` or `s` is not in a valid form + InvalidChecksumAddress: If supplied `authorizer` is not in a valid form + InvalidUint8: If supplied `v` is not in a valid form + TransactionFailed: If transaction fails + TransactionSimulationFailed: If transaction simulation fails + """ + pass + + @abstractmethod + def approve(self, spender: ChecksumAddress, value: Uint256) -> Bytes32: + """Call `approve` function. + + Args: + spender (ChecksumAddress): Spender address + value (Uint256): Amount of allowance + + Returns: + Bytes32: Transaction hash + + Raises: + AccountNotInitialized: If account is not initialized + InvalidChecksumAddress: If supplied `spender` is not in a valid form + InvalidUint256: If supplied `value` is not in a valid form + TransactionFailed: If transaction fails + TransactionSimulationFailed: If transaction simulation fails + """ + pass + + @abstractmethod + def increase_allowance( + self, spender: ChecksumAddress, increment: Uint256 + ) -> Bytes32: + """Call `increaseAllowance` function. + + Args: + spender (ChecksumAddress): Spender address + increment (Uint256): Amount of allowance to increase + + Returns: + Bytes32: Transaction hash + + Raises: + AccountNotInitialized: If account is not initialized + InvalidChecksumAddress: If supplied `spender` is not in a valid form + InvalidUint256: If supplied `increment` is not in a valid form + TransactionFailed: If transaction fails + TransactionSimulationFailed: If transaction simulation fails + """ + pass + + @abstractmethod + def decrease_allowance( + self, spender: ChecksumAddress, decrement: Uint256 + ) -> Bytes32: + """Call `decreaseAllowance` function. + + Args: + spender (ChecksumAddress): Spender address + decrement (Uint256): Amount of allowance to decrease + + Returns: + Bytes32: Transaction hash + + Raises: + AccountNotInitialized: If account is not initialized + InvalidChecksumAddress: If supplied `spender` is not in a valid form + InvalidUint256: If supplied `decrement` is not in a valid form + TransactionFailed: If transaction fails + TransactionSimulationFailed: If transaction simulation fails + """ + pass + + @abstractmethod + def permit( + self, + owner: ChecksumAddress, + spender: ChecksumAddress, + value: Uint256, + deadline: Uint256, + v: Uint8, + r: Bytes32, + s: Bytes32, + ) -> Bytes32: + """Call `permit` function. + + Args: + owner (ChecksumAddress): Owner address + spender (ChecksumAddress): Spender address + value (Uint256): Amount of allowance + deadline (Uint256): Unix time when transaction becomes invalid + v (Uint8): v of ECDSA + r (Bytes32): r of ECDSA + s (Bytes32): s of ECDSA + + Returns: + Bytes32: Transaction hash + + Raises: + AccountNotInitialized: If account is not initialized + InvalidBytes32: If supplied `r` or `s` is not in a valid form + InvalidChecksumAddress: If supplied `owner` or `spender`\ + is not in a valid form + InvalidUint256: If supplied `value` or `deadline` is not in a valid form + InvalidUint8: If supplied `v` is not in a valid form + TransactionFailed: If transaction fails + TransactionSimulationFailed: If transaction simulation fails + """ + pass diff --git a/packages/core/src/jpyc.py b/packages/core/src/jpyc.py new file mode 100644 index 0000000..9a5eb8e --- /dev/null +++ b/packages/core/src/jpyc.py @@ -0,0 +1,487 @@ +from typing import Any + +from eth_typing import ChecksumAddress as EthChecksumAddress +from pydantic import validate_call +from web3.contract.contract import Contract, ContractFunction + +from .client import SdkClient +from .interfaces import IJPYC +from .utils.addresses import ( + get_proxy_address, +) +from .utils.artifacts import ( + get_artifacts, + resolve_artifacts_file_path, +) +from .utils.chains import SUPPORTED_CHAINS +from .utils.constants import SIGN_MIDDLEWARE +from .utils.currencies import ( + remove_decimals, + restore_decimals, +) +from .utils.errors import ( + AccountNotInitialized, + TransactionFailed, + TransactionSimulationFailed, +) +from .utils.types import ContractVersion, TransactionArgs +from .utils.validators import Bytes32, ChecksumAddress, Uint8, Uint256 + + +class JPYC(IJPYC): + """Implementation of IJPYC.""" + + def __init__( + self, + client: SdkClient, + contract_version: ContractVersion = "2", + contract_address: EthChecksumAddress | None = None, + ) -> None: + """Constructor that initializes JPYC client. + + Notes: + - If `client` parameter is configured to use localhost network,\ + this deploys JPYC contracts to localhost network, initializes it,\ + and sets its address to `address` attribute. + - If `contract_address` is supplied,\ + this configures contract instance with that address. + + Args: + client (SdkClient): Configured SDK client + contract_version (ContractVersion): Contract version + contract_address (EthChecksumAddress, optional): Contract address + """ + if ( + client.w3.eth.chain_id == SUPPORTED_CHAINS["localhost"]["devnet"]["id"] + and contract_address is None + ): + address = self.__deploy_contract( + client=client, + contract_version=contract_version, + ) + contract = self.__get_contract( + client=client, + contract_address=address, + contract_version=contract_version, + ) + self.__initialize_contract( + client=client, + contract=contract, + ) + else: + address = ( + contract_address + if contract_address is not None + else get_proxy_address(contract_version=contract_version) + ) + contract = self.__get_contract( + client=client, + contract_address=address, + contract_version=contract_version, + ) + + self.client = client + """ISdkClient: Configured SDK client""" + self.contract = contract + """Contract: Configured contract instance""" + + ################## + # Helper methods # + ################## + + @staticmethod + def __deploy_contract( + client: SdkClient, + contract_version: ContractVersion = "2", + ) -> ChecksumAddress: + """Deploy contracts to the configured network. + + Note: + This helper method is mainly for development purposes. \ + Please use this method to deploy contracts to localhost network. + + Args: + client (SdkClient): Configured SDK client + contract_version (ContractVersion): Contract version + + Returns: + ChecksumAddress: Address of the deployed contracts + """ + file_path = resolve_artifacts_file_path(contract_version=contract_version) + contract = client.w3.eth.contract( + abi=get_artifacts(file_path, "abi"), + bytecode=get_artifacts(file_path, "bytecode"), + ) + tx_hash = contract.constructor().transact() + + return client.w3.eth.wait_for_transaction_receipt(tx_hash).contractAddress # type: ignore[attr-defined] + + @staticmethod + def __get_contract( + client: SdkClient, + contract_address: ChecksumAddress, + contract_version: ContractVersion = "2", + ) -> Contract: + """Get contract instance from the configured network. + + Args: + client (SdkClient): Configured SDK client + contract_address (ChecksumAddress): Contract address + contract_version (ContractVersion): Contract version + + Returns: + Contract: Address of the deployed contracts + """ + return client.w3.eth.contract( # type: ignore[call-overload] + address=contract_address, + abi=get_artifacts( + file_path=resolve_artifacts_file_path( + contract_version=contract_version + ), + artifact_type="abi", + ), + ) + + @staticmethod + def __initialize_contract( + client: SdkClient, + contract: Contract, + ) -> None: + """Initialize contract. + + Args: + client (SdkClient): Configured SDK client + contract (Contract): Configured contract instance + """ + owner_address = client.get_account_address() + contract.functions.initialize( + "JPY Coin", + "JPYC", + "Yen", + 18, + owner_address, + owner_address, + owner_address, + owner_address, + owner_address, + ).transact() + + def __account_initialized(self) -> None: + """Checks if account is initialized. + + Note: + An account must be set to web3 instance to send transactions. + + Raises: + AccountNotInitialized: If account is not initialized + """ + if SIGN_MIDDLEWARE not in self.client.w3.middleware_onion: + raise AccountNotInitialized() + + @staticmethod + def __simulate_transaction( + contract_func: ContractFunction, + func_args: dict[str, object], + ) -> None: + """Simulates a transaction locally. + + Note: + This method should be called before sending actual transactions. + + Args: + contract_func (ContractFunction): Contract function + func_args (dict[str, object]): Arguments of contract function + + Raises: + TransactionSimulationFailed: If transaction simulation fails + """ + try: + contract_func(**func_args).call() + except Exception as e: + raise TransactionSimulationFailed(str(e)) + + @staticmethod + def __send_transaction( + contract_func: ContractFunction, + func_args: dict[str, object], + ) -> Any: + """Sends a transaction to blockchain. + + Args: + contract_func (ContractFunction): Contract function + func_args (dict[str, object]): Arguments of contract function + + Returns: + Any: Response from the contract function + + Raises: + TransactionFailed: If transaction fails + """ + try: + return contract_func(**func_args).transact() + except Exception as e: + raise TransactionFailed(str(e)) + + def __transact( + self, contract_func: ContractFunction, func_args: dict[str, object] + ) -> Any: + """Helper method to prepare & send a transaction in one method. + + Args: + contract_func (ContractFunction): Contract function + func_args (dict[str, object]): Arguments of contract function + + Returns: + Any: Response from the contract function + + Raises: + AccountNotInitialized: If account is not initialized + TransactionSimulationFailed: If transaction simulation fails + TransactionFailed: If transaction fails + """ + + self.__account_initialized() + self.__simulate_transaction( + contract_func, + func_args, + ) + return self.__send_transaction( + contract_func, + func_args, + ) + + ################## + # View functions # + ################## + + @validate_call + def is_minter(self, account: ChecksumAddress) -> bool: + return self.contract.functions.isMinter(account).call() + + @restore_decimals + @validate_call + def minter_allowance(self, minter: ChecksumAddress) -> Uint256: + return self.contract.functions.minterAllowance(minter).call() + + @restore_decimals + def total_supply(self) -> Uint256: + return self.contract.functions.totalSupply().call() + + @restore_decimals + @validate_call + def balance_of(self, account: ChecksumAddress) -> Uint256: + return self.contract.functions.balanceOf(account).call() + + @restore_decimals + @validate_call + def allowance(self, owner: ChecksumAddress, spender: ChecksumAddress) -> Uint256: + return self.contract.functions.allowance(owner, spender).call() + + @validate_call + def nonces(self, owner: ChecksumAddress) -> Uint256: + return self.contract.functions.nonces(owner).call() + + ###################### + # Mutation functions # + ###################### + + @validate_call + def configure_minter( + self, minter: ChecksumAddress, minter_allowed_amount: Uint256 + ) -> Bytes32: + tx_args: TransactionArgs = { + "contract_func": self.contract.functions.configureMinter, + "func_args": { + "minter": minter, + "minterAllowedAmount": remove_decimals(minter_allowed_amount), + }, + } + + return self.__transact(**tx_args) + + @validate_call + def mint(self, to: ChecksumAddress, amount: Uint256) -> Bytes32: + tx_args: TransactionArgs = { + "contract_func": self.contract.functions.mint, + "func_args": { + "_to": to, + "_amount": remove_decimals(amount), + }, + } + + return self.__transact(**tx_args) + + @validate_call + def transfer(self, to: ChecksumAddress, value: Uint256) -> Bytes32: + tx_args: TransactionArgs = { + "contract_func": self.contract.functions.transfer, + "func_args": { + "to": to, + "value": remove_decimals(value), + }, + } + + return self.__transact(**tx_args) + + @validate_call + def transfer_from( + self, from_: ChecksumAddress, to: ChecksumAddress, value: Uint256 + ) -> Bytes32: + tx_args: TransactionArgs = { + "contract_func": self.contract.functions.transferFrom, + "func_args": { + "from": from_, + "to": to, + "value": remove_decimals(value), + }, + } + + return self.__transact(**tx_args) + + @validate_call + def transfer_with_authorization( + self, + from_: ChecksumAddress, + to: ChecksumAddress, + value: Uint256, + valid_after: Uint256, + valid_before: Uint256, + nonce: Bytes32, + v: Uint8, + r: Bytes32, + s: Bytes32, + ) -> Bytes32: + tx_args: TransactionArgs = { + "contract_func": self.contract.functions.transferWithAuthorization, + "func_args": { + "from": from_, + "to": to, + "value": remove_decimals(value), + "validAfter": valid_after, + "validBefore": valid_before, + "nonce": nonce, + "v": v, + "r": r, + "s": s, + }, + } + + return self.__transact(**tx_args) + + @validate_call + def receive_with_authorization( + self, + from_: ChecksumAddress, + to: ChecksumAddress, + value: Uint256, + valid_after: Uint256, + valid_before: Uint256, + nonce: Bytes32, + v: Uint8, + r: Bytes32, + s: Bytes32, + ) -> Bytes32: + tx_args: TransactionArgs = { + "contract_func": self.contract.functions.receiveWithAuthorization, + "func_args": { + "from": from_, + "to": to, + "value": remove_decimals(value), + "validAfter": valid_after, + "validBefore": valid_before, + "nonce": nonce, + "v": v, + "r": r, + "s": s, + }, + } + + return self.__transact(**tx_args) + + @validate_call + def cancel_authorization( + self, + authorizer: ChecksumAddress, + nonce: Bytes32, + v: Uint8, + r: Bytes32, + s: Bytes32, + ) -> Bytes32: + tx_args: TransactionArgs = { + "contract_func": self.contract.functions.cancelAuthorization, + "func_args": { + "authorizer": authorizer, + "nonce": nonce, + "v": v, + "r": r, + "s": s, + }, + } + + return self.__transact(**tx_args) + + @validate_call + def approve(self, spender: ChecksumAddress, value: Uint256) -> Bytes32: + tx_args: TransactionArgs = { + "contract_func": self.contract.functions.approve, + "func_args": { + "spender": spender, + "value": remove_decimals(value), + }, + } + + return self.__transact(**tx_args) + + @validate_call + def increase_allowance( + self, spender: ChecksumAddress, increment: Uint256 + ) -> Bytes32: + tx_args: TransactionArgs = { + "contract_func": self.contract.functions.increaseAllowance, + "func_args": { + "spender": spender, + "increment": remove_decimals(increment), + }, + } + + return self.__transact(**tx_args) + + @validate_call + def decrease_allowance( + self, spender: ChecksumAddress, decrement: Uint256 + ) -> Bytes32: + tx_args: TransactionArgs = { + "contract_func": self.contract.functions.decreaseAllowance, + "func_args": { + "spender": spender, + "decrement": remove_decimals(decrement), + }, + } + + return self.__transact(**tx_args) + + @validate_call + def permit( + self, + owner: ChecksumAddress, + spender: ChecksumAddress, + value: Uint256, + deadline: Uint256, + v: Uint8, + r: Bytes32, + s: Bytes32, + ) -> Bytes32: + tx_args: TransactionArgs = { + "contract_func": self.contract.functions.permit, + "func_args": { + "owner": owner, + "spender": spender, + "value": remove_decimals(value), + "deadline": deadline, + "v": v, + "r": r, + "s": s, + }, + } + + return self.__transact(**tx_args) diff --git a/packages/core/src/utils/README.md b/packages/core/src/utils/README.md new file mode 100644 index 0000000..e067a0f --- /dev/null +++ b/packages/core/src/utils/README.md @@ -0,0 +1,19 @@ +# Utils + +> [!IMPORTANT] +> This `README` is mainly for the advanced users (e.g., contributors of this repo). + +This directory contains a collection of utility tools (e.g., functions, type definitions, constants) for the SDK. + +## 🌲 Directory Structure + +| Module | Description | +| ------------------------------: | :------------------------------------------------------------------- | +| [`addresses`](./addresses.py) | Address constants & helper functions for address-related operations. | +| [`artifacts`](./artifacts.py) | Helper functions to load contract artifacts. | +| [`chains`](./chains.py) | Chain constants & helper functions for chain-related operations. | +| [`constants`](./constants.py) | Common constants among modules. | +| [`currencies`](./currencies.py) | Helper functions for converting units of currencies. | +| [`errors`](./errors.py) | Custom error classes. | +| [`types`](./types.py) | Custom types. | +| [`validators`](./validators.py) | Pydantic validators & validator-enabled types. | diff --git a/packages/core/src/utils/__init__.py b/packages/core/src/utils/__init__.py new file mode 100644 index 0000000..a5be385 --- /dev/null +++ b/packages/core/src/utils/__init__.py @@ -0,0 +1,85 @@ +from .addresses import get_proxy_address +from .artifacts import ( + get_artifacts, + resolve_artifacts_file_path, +) +from .chains import ( + SUPPORTED_CHAINS, + enumerate_supported_networks, + get_default_rpc_endpoint, +) +from .constants import ( + POA_MIDDLEWARE, + SIGN_MIDDLEWARE, + UINT8_MAX, + UINT256_MAX, + UINT_MIN, +) +from .currencies import ( + remove_decimals, + restore_decimals, +) +from .errors import ( + AccountNotInitialized, + InvalidBytes32, + InvalidChecksumAddress, + InvalidUint8, + InvalidUint256, + NetworkNotSupported, + TransactionFailed, + TransactionSimulationFailed, +) +from .types import ( + ArtifactType, + ChainMetadata, + ChainName, + ContractVersion, +) +from .validators import ( + Bytes32, + ChecksumAddress, + RpcEndpoint, + Uint8, + Uint256, +) + +__all__ = [ + # addresses + "get_proxy_address", + # artifacts + "get_artifacts", + "resolve_artifacts_file_path", + # chains + "enumerate_supported_networks", + "get_default_rpc_endpoint", + "SUPPORTED_CHAINS", + # constants + "POA_MIDDLEWARE", + "SIGN_MIDDLEWARE", + "UINT_MIN", + "UINT256_MAX", + "UINT8_MAX", + # currencies + "remove_decimals", + "restore_decimals", + # errors + "AccountNotInitialized", + "InvalidBytes32", + "InvalidChecksumAddress", + "InvalidUint8", + "InvalidUint256", + "NetworkNotSupported", + "TransactionFailed", + "TransactionSimulationFailed", + # types + "ArtifactType", + "ChainMetadata", + "ChainName", + "ContractVersion", + # validators + "Bytes32", + "ChecksumAddress", + "RpcEndpoint", + "Uint256", + "Uint8", +] diff --git a/packages/core/src/utils/addresses.py b/packages/core/src/utils/addresses.py new file mode 100644 index 0000000..5a5b7fa --- /dev/null +++ b/packages/core/src/utils/addresses.py @@ -0,0 +1,69 @@ +from typing import Final + +from eth_typing import ( + ChecksumAddress, + HexAddress, + HexStr, +) +from web3 import Web3 +from web3.constants import ADDRESS_ZERO + +from .types import ContractVersion + +#################################### +# Address-related helper functions # +#################################### + + +def calc_checksum_address(address: str) -> ChecksumAddress: + """Calculates checksum address. + + Args: + address (str): Address string + + Returns: + ChecksumAddress: Checksum address + """ + return ChecksumAddress(HexAddress(HexStr(Web3.to_checksum_address(address)))) + + +def is_valid_address(address: str) -> bool: + """Checks validity of address. + + Args: + address (str): Address string + + Returns: + bool: True if valid, false otherwise + """ + return Web3.is_checksum_address(address) + + +def get_proxy_address(contract_version: ContractVersion) -> ChecksumAddress: + """Get proxy address from the specified version. + + Note: + Default address should be the address of the latest version \ + (e.g., v2 as of May 2025). + + Args: + contract_version (ContractVersion): Contract version + + Returns: + ChecksumAddress: Checksum address of proxy contract + """ + match contract_version: + case "2": + return V2_PROXY_ADDRESS + + +###################### +# Constant addresses # +###################### + +ZERO_ADDRESS: Final[ChecksumAddress] = calc_checksum_address(str(ADDRESS_ZERO)) +"""ChecksumAddress: Zero address.""" +V2_PROXY_ADDRESS: Final[ChecksumAddress] = calc_checksum_address( + "0x431D5dfF03120AFA4bDf332c61A6e1766eF37BDB" +) +"""ChecksumAddress: JPYCv2 address.""" diff --git a/packages/core/src/utils/artifacts.py b/packages/core/src/utils/artifacts.py new file mode 100644 index 0000000..d1b029c --- /dev/null +++ b/packages/core/src/utils/artifacts.py @@ -0,0 +1,35 @@ +import json +from pathlib import Path +from typing import Any + +from .types import ArtifactType, ContractVersion + + +def resolve_artifacts_file_path(contract_version: ContractVersion) -> Path: + """Resolve the path of artifacts file from the specified contract version. + + Args: + contract_version (ContractVersion): Contract version + + Returns: + Path: Absolute path of artifacts file + """ + path = Path(__file__).parent.parent.parent.joinpath( + "artifacts", f"v{contract_version}.json" + ) + + return path.absolute() + + +def get_artifacts(file_path: Path, artifact_type: ArtifactType) -> Any: + """Get contract artifacts from the specified file path. + + Args: + file_path (Path): absolute path of artifacts file + artifact_type (ArtifactType): type of artifacts + + Returns: + Any: Artifacts of contracts + """ + with open(file_path) as f: + return json.load(f)[artifact_type] diff --git a/packages/core/src/utils/chains.py b/packages/core/src/utils/chains.py new file mode 100644 index 0000000..daec698 --- /dev/null +++ b/packages/core/src/utils/chains.py @@ -0,0 +1,136 @@ +from typing import Final + +from .errors import NetworkNotSupported +from .types import ChainMetadata, ChainName +from .validators import RpcEndpoint + +################## +# Chain Metadata # +################## + +SUPPORTED_CHAINS: Final[ChainMetadata] = { + "ethereum": { + "mainnet": { + "id": 1, + "name": "Ethereum Mainnet", + "rpc_endpoints": ["https://ethereum-rpc.publicnode.com"], + }, + "sepolia": { + "id": 11155111, + "name": "Ethereum Sepolia Testnet", + "rpc_endpoints": ["https://ethereum-sepolia-rpc.publicnode.com"], + }, + }, + "polygon": { + "mainnet": { + "id": 137, + "name": "Polygon Mainnet", + "rpc_endpoints": ["https://polygon-rpc.com"], + }, + "amoy": { + "id": 80002, + "name": "Polygon Amoy Testnet", + "rpc_endpoints": ["https://rpc-amoy.polygon.technology"], + }, + }, + "gnosis": { + "mainnet": { + "id": 100, + "name": "Gnosis Chain", + "rpc_endpoints": ["https://rpc.gnosischain.com"], + }, + "chiado": { + "id": 10200, + "name": "Gnosis Chiado Testnet", + "rpc_endpoints": ["https://rpc.chiadochain.net"], + }, + }, + "avalanche": { + "mainnet": { + "id": 43114, + "name": "Avalanche C-Chain", + "rpc_endpoints": ["https://api.avax.network/ext/bc/C/rpc"], + }, + "fuji": { + "id": 43113, + "name": "Avalanche Fuji Testnet", + "rpc_endpoints": ["https://api.avax-test.network/ext/bc/C/rpc"], + }, + }, + "astar": { + "mainnet": { + "id": 592, + "name": "Astar Network", + "rpc_endpoints": ["https://astar.public.blastapi.io"], + }, + }, + "shiden": { + "mainnet": { + "id": 336, + "name": "Shiden Network", + "rpc_endpoints": ["https://shiden.public.blastapi.io"], + }, + }, + "localhost": { + "devnet": { + "id": 31337, + "name": "Localhost Network", + "rpc_endpoints": ["http://127.0.0.1:8545/"], + }, + }, +} +"""ChainMetadata: Supported chains & networks.""" + +################################## +# Chain-related helper functions # +################################## + + +def enumerate_supported_networks() -> str: + """Enumerate all the supported networks. + + Returns: + str: supported networks + """ + return ", ".join( + f"'{chain}' => {list(networks.keys())}" + for chain, networks in SUPPORTED_CHAINS.items() + ) + + +def is_supported_network( + chain_name: ChainName | None, network_name: str | None +) -> bool: + """Check if the specified network is supported by the SDK. + + Args: + chain_name (ChainName, optional): Chain name + network_name (str, optional): Network name + + Returns: + bool: True if supported, false otherwise + """ + return ( + chain_name in SUPPORTED_CHAINS and network_name in SUPPORTED_CHAINS[chain_name] + ) + + +def get_default_rpc_endpoint( + chain_name: ChainName | None, network_name: str | None +) -> RpcEndpoint: + """Get the default RPC endpoint for the specified network. + + Args: + chain_name (ChainName, optional): Chain name + network_name (str, optional): Network name + + Returns: + RpcEndpoint: RPC endpoint + + Raises: + NetworkNotSupported: If the specified network is not supported by the SDK + """ + if not is_supported_network(chain_name, network_name): + raise NetworkNotSupported(chain_name, network_name) # type: ignore[arg-type] + + return SUPPORTED_CHAINS[chain_name][network_name]["rpc_endpoints"][0] # type: ignore[index] diff --git a/packages/core/src/utils/constants.py b/packages/core/src/utils/constants.py new file mode 100644 index 0000000..de2bc9f --- /dev/null +++ b/packages/core/src/utils/constants.py @@ -0,0 +1,23 @@ +from typing import Final + +######## +# Math # +######## + +UINT_MIN: Final[int] = 0 +"""int: Minimum value of uint.""" +UINT8_MAX: Final[int] = 255 +"""int: Maximum value of uint8.""" +UINT256_MAX: Final[int] = ( + 115792089237316195423570985008687907853269984665640564039457584007913129639935 +) +"""int: Maximum value of uint256.""" + +#################### +# Middleware Names # +#################### + +POA_MIDDLEWARE: Final[str] = "poa_middleware" +"""str: Name of POA compatibility middleware.""" +SIGN_MIDDLEWARE: Final[str] = "sign_middleware" +"""str: Name of auto-signature middleware.""" diff --git a/packages/core/src/utils/currencies.py b/packages/core/src/utils/currencies.py new file mode 100644 index 0000000..8c81f2f --- /dev/null +++ b/packages/core/src/utils/currencies.py @@ -0,0 +1,27 @@ +from decimal import Decimal + +from web3 import Web3 + +from .validators import Uint256 + + +def remove_decimals(value: Uint256 | Decimal) -> Uint256: + """Remove decimals. + + Args: + value (Uint256 | Decimal): Value in ether + + Returns: + Uint256: Value in wei + """ + return Web3.to_wei(value, "ether") + + +def restore_decimals(func): # type: ignore[no-untyped-def] + """Decorator to restore decimals.""" + + def wrapper(*args, **kwargs): # type: ignore[no-untyped-def] + result = func(*args, **kwargs) + return Web3.from_wei(result, "ether") + + return wrapper diff --git a/packages/core/src/utils/errors.py b/packages/core/src/utils/errors.py new file mode 100644 index 0000000..fa613e8 --- /dev/null +++ b/packages/core/src/utils/errors.py @@ -0,0 +1,151 @@ +from .types import ChainName + + +class JpycSdkError(Exception): + """A base class for any errors related to JPYC SDK.""" + + def __init__(self, code: int, message: str) -> None: + self.code = code + """int: Custom error code""" + self.message = message + """str: Error message""" + super().__init__(f"\nError Code: {code}\nMessage: {message}") + + +################# +# Config Errors # +################# + + +class NetworkNotSupported(JpycSdkError): + """Raised when the specified network is not supported by the SDK. + + Attributes: + chain_name (str): Chain name + network_name (str): Network name + """ + + code = 100 + + def __init__(self, chain_name: ChainName, network_name: str) -> None: + from .chains import enumerate_supported_networks + + super().__init__( + code=NetworkNotSupported.code, + message=f"Network '{chain_name}/{network_name}' is not supported. " + f"Supported networks are: {enumerate_supported_networks()}", + ) + + +class AccountNotInitialized(JpycSdkError): + """Raised when account is not initialized or hoisted to web3 instance.""" + + code = 101 + + def __init__(self) -> None: + super().__init__( + code=AccountNotInitialized.code, + message="Account is not initialized.", + ) + + +##################### +# Validation Errors # +##################### +class InvalidChecksumAddress(JpycSdkError, TypeError): + """Raised when the given address is not a valid checksum address.""" + + code = 200 + + def __init__(self, message_: str) -> None: + super().__init__( + code=InvalidChecksumAddress.code, + message=f"Invalid checksum address: {message_}. " + f"Address must be compatible with EIP55.", + ) + + +class InvalidUint8(JpycSdkError, TypeError): + """Raised when the given integer is not a valid uint8.""" + + code = 201 + + def __init__(self, message_: str) -> None: + super().__init__( + code=InvalidUint8.code, + message=f"Invalid uint8: {message_}. Integer must be between 0 ~ 2^8 - 1.", + ) + + +class InvalidUint256(JpycSdkError, TypeError): + """Raised when the given integer is not a valid uint256.""" + + code = 202 + + def __init__(self, message_: str) -> None: + super().__init__( + code=InvalidUint256.code, + message=f"Invalid uint256: {message_}. " + f"Integer must be between 0 ~ 2^256 - 1.", + ) + + +class InvalidBytes32(JpycSdkError, TypeError): + """Raised when the given byte string is not a valid bytes32.""" + + code = 203 + + def __init__(self, message_: str) -> None: + super().__init__( + code=InvalidBytes32.code, + message=f"Invalid bytes32: {message_}.", + ) + + +class InvalidRpcEndpoint(JpycSdkError, TypeError): + """Raised when the given string is not a valid RPC endpoint.""" + + code = 204 + + def __init__(self, message_: str) -> None: + super().__init__( + code=InvalidRpcEndpoint.code, + message=f"Invalid RPC endpoint: {message_}.", + ) + + +###################### +# Transaction Errors # +###################### + + +class TransactionSimulationFailed(JpycSdkError): + """Raised when transaction simulation fails. + + Attributes: + message (str): Error message + """ + + code = 300 + + def __init__(self, message_: str) -> None: + super().__init__( + code=TransactionSimulationFailed.code, + message=f"Failed to simulate a transaction locally: {message_}", + ) + + +class TransactionFailed(JpycSdkError): + """Raised when transaction fails. + + Attributes: + message (str): Error message + """ + + code = 301 + + def __init__(self, message_: str) -> None: + super().__init__( + code=TransactionFailed.code, + message=f"Transaction failed: {message_}", + ) diff --git a/packages/core/src/utils/types.py b/packages/core/src/utils/types.py new file mode 100644 index 0000000..7b1ef98 --- /dev/null +++ b/packages/core/src/utils/types.py @@ -0,0 +1,45 @@ +from typing import Literal, TypedDict + +from web3.contract.contract import ContractFunction + +########## +# Chains # +########## + +type ChainName = Literal[ + "ethereum", + "polygon", + "gnosis", + "avalanche", + "astar", + "shiden", + "localhost", +] + + +class NetworkMetadata(TypedDict): + id: int + name: str + rpc_endpoints: list[str] + + +type ChainMetadata = dict[ChainName, dict[str, NetworkMetadata]] +"""A type that contains metadata of chains.""" + +############# +# Contracts # +############# + +type ContractVersion = Literal["2"] +"""A type that contains available contract versions.""" +type ArtifactType = Literal["abi", "bytecode"] +"""A type that contains types of contract artifacts.""" + +################ +# Transactions # +################ + + +class TransactionArgs(TypedDict): + contract_func: ContractFunction + func_args: dict[str, object] diff --git a/packages/core/src/utils/validators.py b/packages/core/src/utils/validators.py new file mode 100644 index 0000000..4c46c83 --- /dev/null +++ b/packages/core/src/utils/validators.py @@ -0,0 +1,130 @@ +from typing import Annotated + +from pydantic.functional_validators import AfterValidator +from web3 import Web3 + +from .constants import UINT8_MAX, UINT256_MAX, UINT_MIN +from .errors import ( + InvalidBytes32, + InvalidChecksumAddress, + InvalidRpcEndpoint, + InvalidUint8, + InvalidUint256, +) + + +def validate_checksum_address(address: str) -> str: + """Checks if the given address is a checksum address. + + Args: + address (str): Address string + + Returns: + str: Address string + + Raises: + InvalidChecksumAddress: If the address is not a valid checksum address + """ + if not Web3.is_checksum_address(address): + raise InvalidChecksumAddress(address) + + return address + + +ChecksumAddress = Annotated[str, AfterValidator(validate_checksum_address)] +"""A type that contains a checksum address. \ +See `EIP55 `_ for more details. +""" + + +def validate_uint8(integer: int) -> int: + """Checks if the given integer is a uint8. + + Args: + integer (int): Integer + + Returns: + int: Integer + + Raises: + InvalidUint8: If the integer is not a valid uint8 + """ + if integer < UINT_MIN or UINT8_MAX < integer: + raise InvalidUint8(str(integer)) + + return integer + + +Uint8 = Annotated[int, AfterValidator(validate_uint8)] +"""A type that contains a uint8.""" + + +def validate_uint256(integer: int) -> int: + """Checks if the given integer is a uint256. + + Args: + integer (int): Integer + + Returns: + int: Integer + + Raises: + InvalidUint256: If the integer is not a valid uint256 + """ + if integer < UINT_MIN or UINT256_MAX < integer: + raise InvalidUint256(str(integer)) + + return integer + + +Uint256 = Annotated[int, AfterValidator(validate_uint256)] +"""A type that contains a uint256.""" + + +def validate_bytes32(string: str) -> str: + """Checks if the given string is bytes32. + + Args: + string (str): String + + Returns: + str: String + + Raises: + InvalidBytes32: If the string is not a valid bytes32 + """ + try: + assert string[:2] == "0x" + assert len(bytes.fromhex(string[2:])) == 32 + except Exception: + raise InvalidBytes32(string) + + return string + + +Bytes32 = Annotated[str, AfterValidator(validate_bytes32)] +"""A type that contains a bytes32.""" + + +def validate_rpc_endpoint(string: str) -> str: + """Checks if the given string is a valid RPC endpoint. + + Args: + string (str): String + + Returns: + str: String + + Raises: + InvalidRpcEndpoint: If the string is not a valid RPC endpoint + """ + try: + assert string.startswith("http") is True + except Exception: + raise InvalidRpcEndpoint(string) + + return string + + +RpcEndpoint = Annotated[str, AfterValidator(validate_rpc_endpoint)] +"""A type that contains a rpc endpoint.""" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..36d6a15 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,18 @@ +[project] +name = "jpyc-python-sdks" +version = "1.0.0" +requires-python = ">=3.11" +description = "Python SDKs for JPYC protocols" +readme = "README.md" + +[tool.uv.sources] +core = { workspace = true } + +[tool.uv.workspace] +members = ["packages/*"] + +[dependency-groups] +dev = [ + "pdoc>=15.0.3", + "pre-commit>=4.2.0", +] diff --git a/tests/README.md b/tests/README.md new file mode 100644 index 0000000..fd1999f --- /dev/null +++ b/tests/README.md @@ -0,0 +1,30 @@ +# Tests + +> [!IMPORTANT] +> This `README` is mainly for the advanced users (e.g., contributors of this repo). + +This directory contains test code of the SDK. + +## 🏃🏻 Run Tests + +Run one of the following commands to run tests. Please run `uv run pytest --help` for other available CLI options. + +> [!NOTE] +> Testing results are also to be checked on our [CI workflow](../.github/workflows/check.yml). + +```sh +# cd into one of the package directories (e.g., `core`) +$ cd python-sdk/packages/core +# run tests with default config +$ uv run pytest +# run tests with verbosity +$ uv run pytest -v +# run tests with coverage info +$ uv run pytest --cov --cov-branch +``` + +## 🌲 Directory Structure + +| Module | Description | +| ---------------: | :---------------------------- | +| [`core`](./core) | Unit tests of `core` package. | diff --git a/docs/.gitkeep b/tests/__init__.py similarity index 100% rename from docs/.gitkeep rename to tests/__init__.py diff --git a/src/core/.gitkeep b/tests/core/__init__.py similarity index 100% rename from src/core/.gitkeep rename to tests/core/__init__.py diff --git a/tests/core/conftest.py b/tests/core/conftest.py new file mode 100644 index 0000000..43128dc --- /dev/null +++ b/tests/core/conftest.py @@ -0,0 +1,198 @@ +from dataclasses import dataclass +import time +from random import randbytes + +import pytest +from pytest_mock import MockFixture +from web3.contract.contract import ( + ContractConstructor, + ContractFunction, +) +from web3.eth import Eth + +from packages.core.src.client import SdkClient +from packages.core.src.jpyc import JPYC + + +@dataclass(frozen=True) +class KnownAccount: + address: str + private_key: str + + +KNOWN_ACCOUNTS = [ + KnownAccount( + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80", + ), + KnownAccount( + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d", + ), + KnownAccount( + "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", + "0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a", + ), +] + + +V2_PROXY_ADDRESS = "0x431D5dfF03120AFA4bDf332c61A6e1766eF37BDB" + + +def add_zero_padding_to_hex(hex_string: str, num_of_bytes: int) -> str: + return f"0x{hex_string[2:].zfill(num_of_bytes * 2)}" + + +@pytest.fixture(scope="function") +def sdk_client(): + return SdkClient( + chain_name="ethereum", + network_name="mainnet", + private_key=KNOWN_ACCOUNTS[0].private_key, + ) + + +@pytest.fixture(scope="function") +def sdk_client_localhost(): + return SdkClient( + chain_name="localhost", + network_name="devnet", + private_key=KNOWN_ACCOUNTS[0].private_key, + ) + + +@pytest.fixture(scope="session") +def sdk_client_without_account(): + return SdkClient( + chain_name="ethereum", + network_name="mainnet", + ) + + +@pytest.fixture(scope="function") +def jpyc_client(sdk_client, mocker: MockFixture): + mocker.patch.object( + Eth, + "chain_id", + new_callable=mocker.PropertyMock, + return_value=1, + ) + return JPYC( + client=sdk_client, + contract_address=V2_PROXY_ADDRESS, + ) + + +@pytest.fixture(scope="function") +def jpyc_client_without_account(sdk_client_without_account, mocker: MockFixture): + mocker.patch.object( + Eth, + "chain_id", + new_callable=mocker.PropertyMock, + return_value=1, + ) + return JPYC( + client=sdk_client_without_account, + contract_address=V2_PROXY_ADDRESS, + ) + + +@pytest.fixture(scope="function") +def eip712_domain_separator(): + return { + "name": "JPY Coin", + "version": "1", + "chainId": 1, + "verifyingContract": V2_PROXY_ADDRESS, + } + + +@pytest.fixture(scope="function") +def eip712_domain_types(): + return [ + {"name": "name", "type": "string"}, + {"name": "version", "type": "string"}, + {"name": "chainId", "type": "uint256"}, + {"name": "verifyingContract", "type": "address"}, + ] + + +@pytest.fixture(scope="function") +def valid_before(): + return int(time.time()) + 3600 + + +@pytest.fixture(scope="function") +def nonce(): + return f"0x{randbytes(32).hex()}" + + +@pytest.fixture(scope="function") +def mocked_eth_chain_id(mocker: MockFixture, request): + return mocker.patch.object( + Eth, + "chain_id", + new_callable=mocker.PropertyMock, + return_value=request.param["chain_id"], + ) + + +@pytest.fixture(scope="function") +def mocked_eth_contract_constructor_transact(mocker: MockFixture): + return mocker.patch.object( + ContractConstructor, + "transact", + return_value="0x", + ) + + +@pytest.fixture(scope="function") +def mocked_eth_wait_for_transaction_receipt(mocker: MockFixture, request): + @dataclass() + class TxReceipt: + contractAddress: str + + return mocker.patch.object( + Eth, + "wait_for_transaction_receipt", + return_value=TxReceipt( + contractAddress=request.param["address"], + ), + ) + + +@pytest.fixture(scope="function") +def mocked_eth_contract_functions_transact(mocker: MockFixture): + return mocker.patch.object( + ContractFunction, + "transact", + return_value="0x", + ) + + +@pytest.fixture(scope="function") +def mocked_eth_contract_functions( + mocker: MockFixture, + jpyc_client, + request, +): + if "return_value" in request.param: + return mocker.patch.object( + jpyc_client.contract.functions, + request.param["func_name"], + return_value=( + getattr( + jpyc_client.contract.functions, + request.param["func_name"], + )(*request.param["func_args"]) + if "func_args" in request.param + else getattr( + jpyc_client.contract.functions, + request.param["func_name"], + )() + ), + ) + return mocker.patch.object( + jpyc_client.contract.functions, + request.param["func_name"], + ) diff --git a/tests/.gitkeep b/tests/core/jpyc_methods/__init__.py similarity index 100% rename from tests/.gitkeep rename to tests/core/jpyc_methods/__init__.py diff --git a/tests/core/jpyc_methods/test_allowance.py b/tests/core/jpyc_methods/test_allowance.py new file mode 100644 index 0000000..5630a24 --- /dev/null +++ b/tests/core/jpyc_methods/test_allowance.py @@ -0,0 +1,72 @@ +import pytest + +from packages.core.src.utils.errors import ( + InvalidChecksumAddress, +) + +from ..conftest import KNOWN_ACCOUNTS + + +@pytest.mark.parametrize( + [ + "mocked_eth_contract_functions", + ], + [ + pytest.param( + { + "func_name": "allowance", + "func_args": [ + KNOWN_ACCOUNTS[0].address, + KNOWN_ACCOUNTS[1].address, + ], + "return_value": 1000000000000000000000, + }, + ), + ], + indirect=[ + "mocked_eth_contract_functions", + ], +) +def test_allowance( + jpyc_client, + mocked_eth_contract_functions, +): + owner = KNOWN_ACCOUNTS[0].address + spender = KNOWN_ACCOUNTS[1].address + + jpyc_client.allowance( + owner=owner, + spender=spender, + ) + + mocked_eth_contract_functions.assert_called_once_with(owner, spender) + + +@pytest.mark.parametrize( + [ + "owner", + "spender", + ], + [ + pytest.param( + "invalid_address", + KNOWN_ACCOUNTS[1].address, + id="invalid owner", + ), + pytest.param( + KNOWN_ACCOUNTS[0].address, + "invalid_address", + id="invalid spender", + ), + ], +) +def test_allowance_failures( + jpyc_client, + owner, + spender, +): + with pytest.raises(InvalidChecksumAddress): + jpyc_client.allowance( + owner=owner, + spender=spender, + ) diff --git a/tests/core/jpyc_methods/test_approve.py b/tests/core/jpyc_methods/test_approve.py new file mode 100644 index 0000000..a46ec07 --- /dev/null +++ b/tests/core/jpyc_methods/test_approve.py @@ -0,0 +1,81 @@ +import pytest + +from packages.core.src.utils.errors import ( + AccountNotInitialized, + InvalidChecksumAddress, + InvalidUint256, +) + +from ..conftest import KNOWN_ACCOUNTS + + +@pytest.mark.parametrize( + ["mocked_eth_contract_functions"], + [ + pytest.param( + {"func_name": "approve"}, + ), + ], + indirect=["mocked_eth_contract_functions"], +) +def test_approve( + jpyc_client, + mocked_eth_contract_functions, +): + spender = KNOWN_ACCOUNTS[1].address + value = 10000 + + jpyc_client.approve( + spender=spender, + value=value, + ) + + mocked_eth_contract_functions.call_count == 2 + mocked_eth_contract_functions.assert_called_with( + spender=spender, + value=value * 10**18, + ) + + +@pytest.mark.parametrize( + [ + "spender", + "value", + "exception_class", + ], + [ + pytest.param( + "invalid_address", + 10000, + InvalidChecksumAddress, + id="invalid spender", + ), + pytest.param( + KNOWN_ACCOUNTS[1].address, + -1, + InvalidUint256, + id="invalid value", + ), + ], +) +def test_approve_failures( + jpyc_client, + spender, + value, + exception_class, +): + with pytest.raises(exception_class): + jpyc_client.approve( + spender=spender, + value=value, + ) + + +def test_approve_account_not_initialized( + jpyc_client_without_account, +): + with pytest.raises(AccountNotInitialized): + jpyc_client_without_account.approve( + spender=KNOWN_ACCOUNTS[1].address, + value=1000, + ) diff --git a/tests/core/jpyc_methods/test_balance_of.py b/tests/core/jpyc_methods/test_balance_of.py new file mode 100644 index 0000000..a970e5c --- /dev/null +++ b/tests/core/jpyc_methods/test_balance_of.py @@ -0,0 +1,42 @@ +import pytest + +from packages.core.src.utils.errors import ( + InvalidChecksumAddress, +) + +from ..conftest import KNOWN_ACCOUNTS + + +@pytest.mark.parametrize( + [ + "mocked_eth_contract_functions", + ], + [ + pytest.param( + { + "func_name": "balanceOf", + "func_args": [KNOWN_ACCOUNTS[0].address], + "return_value": 1000000000000000000000, + }, + ), + ], + indirect=[ + "mocked_eth_contract_functions", + ], +) +def test_balance_of( + jpyc_client, + mocked_eth_contract_functions, +): + account = KNOWN_ACCOUNTS[0].address + + jpyc_client.balance_of(account=account) + + mocked_eth_contract_functions.assert_called_once_with(account) + + +def test_balance_of_failures( + jpyc_client, +): + with pytest.raises(InvalidChecksumAddress): + jpyc_client.balance_of(account="invalid_address") diff --git a/tests/core/jpyc_methods/test_cancel_authorization.py b/tests/core/jpyc_methods/test_cancel_authorization.py new file mode 100644 index 0000000..44bbd6f --- /dev/null +++ b/tests/core/jpyc_methods/test_cancel_authorization.py @@ -0,0 +1,180 @@ +from eth_account import Account +import pytest + +from packages.core.src.utils.errors import ( + AccountNotInitialized, + InvalidBytes32, + InvalidChecksumAddress, + InvalidUint8, +) + +from ..conftest import add_zero_padding_to_hex, KNOWN_ACCOUNTS + + +@pytest.fixture(scope="function") +def signed_message_cancel( + eip712_domain_separator, + eip712_domain_types, + nonce, +): + return Account.sign_typed_data( + KNOWN_ACCOUNTS[0].private_key, + full_message={ + "domain": eip712_domain_separator, + "types": { + "EIP712Domain": eip712_domain_types, + "CancelAuthorization": [ + {"name": "authorizer", "type": "address"}, + {"name": "nonce", "type": "bytes32"}, + ], + }, + "primaryType": "CancelAuthorization", + "message": { + "authorizer": KNOWN_ACCOUNTS[0].address, + "nonce": nonce, + }, + }, + ) + + +@pytest.fixture(scope="function") +def signed_message_cancel_v(signed_message_cancel): + return signed_message_cancel.v + + +@pytest.fixture(scope="function") +def signed_message_cancel_r(signed_message_cancel): + return add_zero_padding_to_hex(hex(signed_message_cancel.r), 32) + + +@pytest.fixture(scope="function") +def signed_message_cancel_s(signed_message_cancel): + return add_zero_padding_to_hex(hex(signed_message_cancel.s), 32) + + +@pytest.mark.parametrize( + ["mocked_eth_contract_functions"], + [ + pytest.param( + {"func_name": "cancelAuthorization"}, + ), + ], + indirect=["mocked_eth_contract_functions"], +) +def test_cancel_authorization( + jpyc_client, + nonce, + signed_message_cancel_v, + signed_message_cancel_r, + signed_message_cancel_s, + mocked_eth_contract_functions, +): + authorizer = KNOWN_ACCOUNTS[0].address + + jpyc_client.cancel_authorization( + authorizer=authorizer, + nonce=nonce, + v=signed_message_cancel_v, + r=signed_message_cancel_r, + s=signed_message_cancel_s, + ) + + mocked_eth_contract_functions.call_count == 2 + + +def test_cancel_authorization_invalid_authorizer( + jpyc_client, + nonce, + signed_message_cancel_v, + signed_message_cancel_r, + signed_message_cancel_s, +): + with pytest.raises(InvalidChecksumAddress): + jpyc_client.cancel_authorization( + authorizer="invalid_address", + nonce=nonce, + v=signed_message_cancel_v, + r=signed_message_cancel_r, + s=signed_message_cancel_s, + ) + + +def test_cancel_authorization_invalid_nonce( + jpyc_client, + signed_message_cancel_v, + signed_message_cancel_r, + signed_message_cancel_s, +): + with pytest.raises(InvalidBytes32): + jpyc_client.cancel_authorization( + authorizer=KNOWN_ACCOUNTS[0].address, + nonce="0x", + v=signed_message_cancel_v, + r=signed_message_cancel_r, + s=signed_message_cancel_s, + ) + + +def test_cancel_authorization_invalid_v( + jpyc_client, + nonce, + signed_message_cancel_r, + signed_message_cancel_s, +): + with pytest.raises(InvalidUint8): + jpyc_client.cancel_authorization( + authorizer=KNOWN_ACCOUNTS[0].address, + nonce=nonce, + v=-1, + r=signed_message_cancel_r, + s=signed_message_cancel_s, + ) + + +def test_cancel_authorization_invalid_r( + jpyc_client, + nonce, + signed_message_cancel_v, + signed_message_cancel_s, +): + with pytest.raises(InvalidBytes32): + jpyc_client.cancel_authorization( + authorizer=KNOWN_ACCOUNTS[0].address, + nonce=nonce, + v=signed_message_cancel_v, + r="0x", + s=signed_message_cancel_s, + ) + + +def test_cancel_authorization_invalid_s( + jpyc_client, + nonce, + signed_message_cancel_v, + signed_message_cancel_r, +): + with pytest.raises(InvalidBytes32): + jpyc_client.cancel_authorization( + authorizer=KNOWN_ACCOUNTS[0].address, + nonce=nonce, + v=signed_message_cancel_v, + r=signed_message_cancel_r, + s="0x", + ) + + +def test_cancel_authorization_account_not_initialized( + jpyc_client_without_account, + nonce, + signed_message_cancel_v, + signed_message_cancel_r, + signed_message_cancel_s, +): + with pytest.raises(AccountNotInitialized): + jpyc_client_without_account.cancel_authorization( + authorizer=KNOWN_ACCOUNTS[0].address, + nonce=nonce, + v=signed_message_cancel_v, + r=signed_message_cancel_r, + s=signed_message_cancel_s, + ) diff --git a/tests/core/jpyc_methods/test_configure_minter.py b/tests/core/jpyc_methods/test_configure_minter.py new file mode 100644 index 0000000..b7a0fa5 --- /dev/null +++ b/tests/core/jpyc_methods/test_configure_minter.py @@ -0,0 +1,86 @@ +import pytest + +from packages.core.src.utils.errors import ( + AccountNotInitialized, + InvalidChecksumAddress, + InvalidUint256, +) + +from ..conftest import KNOWN_ACCOUNTS + + +@pytest.mark.parametrize( + [ + "mocked_eth_contract_functions", + ], + [ + pytest.param( + { + "func_name": "configureMinter", + }, + ), + ], + indirect=[ + "mocked_eth_contract_functions", + ], +) +def test_configure_minter( + jpyc_client, + mocked_eth_contract_functions, +): + minter = KNOWN_ACCOUNTS[0].address + minter_allowed_amount = 10000 + + jpyc_client.configure_minter( + minter=minter, + minter_allowed_amount=minter_allowed_amount, + ) + + mocked_eth_contract_functions.call_count == 2 + mocked_eth_contract_functions.assert_called_with( + minter=minter, + minterAllowedAmount=minter_allowed_amount * 10**18, + ) + + +@pytest.mark.parametrize( + [ + "minter", + "minter_allowed_amount", + "exception_class", + ], + [ + pytest.param( + "invalid_address", + 10000, + InvalidChecksumAddress, + id="invalid minter", + ), + pytest.param( + KNOWN_ACCOUNTS[0].address, + -1, + InvalidUint256, + id="invalid minter_allowed_amount", + ), + ], +) +def test_configure_minter_failures( + jpyc_client, + minter, + minter_allowed_amount, + exception_class, +): + with pytest.raises(exception_class): + jpyc_client.configure_minter( + minter=minter, minter_allowed_amount=minter_allowed_amount + ) + + +def test_configure_minter_account_not_initialized( + jpyc_client_without_account, +): + with pytest.raises(AccountNotInitialized): + jpyc_client_without_account.configure_minter( + minter=KNOWN_ACCOUNTS[0].address, + minter_allowed_amount=10000, + ) diff --git a/tests/core/jpyc_methods/test_decrease_allowance.py b/tests/core/jpyc_methods/test_decrease_allowance.py new file mode 100644 index 0000000..2e1df83 --- /dev/null +++ b/tests/core/jpyc_methods/test_decrease_allowance.py @@ -0,0 +1,81 @@ +import pytest + +from packages.core.src.utils.errors import ( + AccountNotInitialized, + InvalidChecksumAddress, + InvalidUint256, +) + +from ..conftest import KNOWN_ACCOUNTS + + +@pytest.mark.parametrize( + ["mocked_eth_contract_functions"], + [ + pytest.param( + {"func_name": "decreaseAllowance"}, + ), + ], + indirect=["mocked_eth_contract_functions"], +) +def test_decrease_allowance( + jpyc_client, + mocked_eth_contract_functions, +): + spender = KNOWN_ACCOUNTS[1].address + decrement = 1000 + + jpyc_client.decrease_allowance( + spender=spender, + decrement=decrement, + ) + + mocked_eth_contract_functions.call_count == 2 + mocked_eth_contract_functions.assert_called_with( + spender=spender, + decrement=decrement * 10**18, + ) + + +@pytest.mark.parametrize( + [ + "spender", + "decrement", + "exception_class", + ], + [ + pytest.param( + "invalid_address", + 1000, + InvalidChecksumAddress, + id="invalid spender", + ), + pytest.param( + KNOWN_ACCOUNTS[1].address, + -1, + InvalidUint256, + id="invalid decrement", + ), + ], +) +def test_decrease_allowance_failures( + jpyc_client, + spender, + decrement, + exception_class, +): + with pytest.raises(exception_class): + jpyc_client.decrease_allowance( + spender=spender, + decrement=decrement, + ) + + +def test_decrease_allowance_account_not_initialized( + jpyc_client_without_account, +): + with pytest.raises(AccountNotInitialized): + jpyc_client_without_account.decrease_allowance( + spender=KNOWN_ACCOUNTS[1].address, + decrement=1000, + ) diff --git a/tests/core/jpyc_methods/test_increase_allowance.py b/tests/core/jpyc_methods/test_increase_allowance.py new file mode 100644 index 0000000..4a82e06 --- /dev/null +++ b/tests/core/jpyc_methods/test_increase_allowance.py @@ -0,0 +1,81 @@ +import pytest + +from packages.core.src.utils.errors import ( + AccountNotInitialized, + InvalidChecksumAddress, + InvalidUint256, +) + +from ..conftest import KNOWN_ACCOUNTS + + +@pytest.mark.parametrize( + ["mocked_eth_contract_functions"], + [ + pytest.param( + {"func_name": "increaseAllowance"}, + ), + ], + indirect=["mocked_eth_contract_functions"], +) +def test_increase_allowance( + jpyc_client, + mocked_eth_contract_functions, +): + spender = KNOWN_ACCOUNTS[1].address + increment = 1000 + + jpyc_client.increase_allowance( + spender=spender, + increment=increment, + ) + + mocked_eth_contract_functions.call_count == 2 + mocked_eth_contract_functions.assert_called_with( + spender=spender, + increment=increment * 10**18, + ) + + +@pytest.mark.parametrize( + [ + "spender", + "increment", + "exception_class", + ], + [ + pytest.param( + "invalid_address", + 1000, + InvalidChecksumAddress, + id="invalid spender", + ), + pytest.param( + KNOWN_ACCOUNTS[1].address, + -1, + InvalidUint256, + id="invalid increment", + ), + ], +) +def test_increase_allowance_failures( + jpyc_client, + spender, + increment, + exception_class, +): + with pytest.raises(exception_class): + jpyc_client.increase_allowance( + spender=spender, + increment=increment, + ) + + +def test_increase_allowance_account_not_initialized( + jpyc_client_without_account, +): + with pytest.raises(AccountNotInitialized): + jpyc_client_without_account.increase_allowance( + spender=KNOWN_ACCOUNTS[1].address, + increment=1000, + ) diff --git a/tests/core/jpyc_methods/test_is_minter.py b/tests/core/jpyc_methods/test_is_minter.py new file mode 100644 index 0000000..248adec --- /dev/null +++ b/tests/core/jpyc_methods/test_is_minter.py @@ -0,0 +1,38 @@ +import pytest + +from packages.core.src.utils.errors import ( + InvalidChecksumAddress, +) + +from ..conftest import KNOWN_ACCOUNTS + + +@pytest.mark.parametrize( + [ + "mocked_eth_contract_functions", + ], + [ + pytest.param( + {"func_name": "isMinter"}, + ), + ], + indirect=[ + "mocked_eth_contract_functions", + ], +) +def test_is_minter( + jpyc_client, + mocked_eth_contract_functions, +): + account = KNOWN_ACCOUNTS[0].address + + jpyc_client.is_minter(account=account) + + mocked_eth_contract_functions.assert_called_once_with(account) + + +def test_is_minter_failures( + jpyc_client, +): + with pytest.raises(InvalidChecksumAddress): + jpyc_client.is_minter(account="invalid_address") diff --git a/tests/core/jpyc_methods/test_mint.py b/tests/core/jpyc_methods/test_mint.py new file mode 100644 index 0000000..105286a --- /dev/null +++ b/tests/core/jpyc_methods/test_mint.py @@ -0,0 +1,81 @@ +import pytest + +from packages.core.src.utils.errors import ( + AccountNotInitialized, + InvalidChecksumAddress, + InvalidUint256, +) + +from ..conftest import KNOWN_ACCOUNTS + + +@pytest.mark.parametrize( + ["mocked_eth_contract_functions"], + [ + pytest.param( + {"func_name": "mint"}, + ), + ], + indirect=["mocked_eth_contract_functions"], +) +def test_mint( + jpyc_client, + mocked_eth_contract_functions, +): + to = KNOWN_ACCOUNTS[0].address + amount = 10000 + + jpyc_client.mint( + to=to, + amount=amount, + ) + + mocked_eth_contract_functions.call_count == 2 + mocked_eth_contract_functions.assert_called_with( + _to=to, + _amount=amount * 10**18, + ) + + +@pytest.mark.parametrize( + [ + "to", + "amount", + "exception_class", + ], + [ + pytest.param( + "invalid_address", + 10000, + InvalidChecksumAddress, + id="invalid to", + ), + pytest.param( + KNOWN_ACCOUNTS[0].address, + -1, + InvalidUint256, + id="invalid amount", + ), + ], +) +def test_mint_failures( + jpyc_client, + to, + amount, + exception_class, +): + with pytest.raises(exception_class): + jpyc_client.mint( + to=to, + amount=amount, + ) + + +def test_mint_account_not_initialized( + jpyc_client_without_account, +): + with pytest.raises(AccountNotInitialized): + jpyc_client_without_account.mint( + to=KNOWN_ACCOUNTS[1].address, + amount=1000, + ) diff --git a/tests/core/jpyc_methods/test_minter_allowance.py b/tests/core/jpyc_methods/test_minter_allowance.py new file mode 100644 index 0000000..74dee63 --- /dev/null +++ b/tests/core/jpyc_methods/test_minter_allowance.py @@ -0,0 +1,42 @@ +import pytest + +from packages.core.src.utils.errors import ( + InvalidChecksumAddress, +) + +from ..conftest import KNOWN_ACCOUNTS + + +@pytest.mark.parametrize( + [ + "mocked_eth_contract_functions", + ], + [ + pytest.param( + { + "func_name": "minterAllowance", + "func_args": [KNOWN_ACCOUNTS[0].address], + "return_value": 1000000000000000000000, + }, + ), + ], + indirect=[ + "mocked_eth_contract_functions", + ], +) +def test_minter_allowance( + jpyc_client, + mocked_eth_contract_functions, +): + minter = KNOWN_ACCOUNTS[0].address + + jpyc_client.minter_allowance(minter=minter) + + mocked_eth_contract_functions.assert_called_once_with(minter) + + +def test_minter_allowance_failures( + jpyc_client, +): + with pytest.raises(InvalidChecksumAddress): + jpyc_client.minter_allowance(minter="invalid_address") diff --git a/tests/core/jpyc_methods/test_nonces.py b/tests/core/jpyc_methods/test_nonces.py new file mode 100644 index 0000000..dc6d998 --- /dev/null +++ b/tests/core/jpyc_methods/test_nonces.py @@ -0,0 +1,40 @@ +import pytest + +from packages.core.src.utils.errors import ( + InvalidChecksumAddress, +) + +from ..conftest import KNOWN_ACCOUNTS + + +@pytest.mark.parametrize( + [ + "mocked_eth_contract_functions", + ], + [ + pytest.param( + { + "func_name": "nonces", + }, + ), + ], + indirect=[ + "mocked_eth_contract_functions", + ], +) +def test_nonces( + jpyc_client, + mocked_eth_contract_functions, +): + owner = KNOWN_ACCOUNTS[0].address + + jpyc_client.nonces(owner=owner) + + mocked_eth_contract_functions.assert_called_once_with(owner) + + +def test_nonces_failures( + jpyc_client, +): + with pytest.raises(InvalidChecksumAddress): + jpyc_client.nonces(owner="invalid_address") diff --git a/tests/core/jpyc_methods/test_permit.py b/tests/core/jpyc_methods/test_permit.py new file mode 100644 index 0000000..56314af --- /dev/null +++ b/tests/core/jpyc_methods/test_permit.py @@ -0,0 +1,239 @@ +from eth_account import Account +import pytest + +from packages.core.src.utils.errors import ( + AccountNotInitialized, + InvalidBytes32, + InvalidChecksumAddress, + InvalidUint256, + InvalidUint8, +) + +from ..conftest import add_zero_padding_to_hex, KNOWN_ACCOUNTS + + +@pytest.fixture(scope="function") +def signed_message_permit( + eip712_domain_separator, + eip712_domain_types, + valid_before, +): + return Account.sign_typed_data( + KNOWN_ACCOUNTS[0].private_key, + full_message={ + "domain": eip712_domain_separator, + "types": { + "EIP712Domain": eip712_domain_types, + "Permit": [ + {"name": "owner", "type": "address"}, + {"name": "spender", "type": "address"}, + {"name": "value", "type": "uint256"}, + {"name": "deadline", "type": "uint256"}, + ], + }, + "primaryType": "Permit", + "message": { + "owner": KNOWN_ACCOUNTS[0].address, + "spender": KNOWN_ACCOUNTS[1].address, + "value": 10000 * 10**18, + "deadline": valid_before, + }, + }, + ) + + +@pytest.fixture(scope="function") +def signed_message_permit_v(signed_message_permit): + return signed_message_permit.v + + +@pytest.fixture(scope="function") +def signed_message_permit_r(signed_message_permit): + return add_zero_padding_to_hex(hex(signed_message_permit.r), 32) + + +@pytest.fixture(scope="function") +def signed_message_permit_s(signed_message_permit): + return add_zero_padding_to_hex(hex(signed_message_permit.s), 32) + + +@pytest.mark.parametrize( + ["mocked_eth_contract_functions"], + [ + pytest.param( + {"func_name": "permit"}, + ), + ], + indirect=["mocked_eth_contract_functions"], +) +def test_permit( + jpyc_client, + valid_before, + signed_message_permit_v, + signed_message_permit_r, + signed_message_permit_s, + mocked_eth_contract_functions, +): + owner = KNOWN_ACCOUNTS[0].address + spender = KNOWN_ACCOUNTS[1].address + value = 10000 + + jpyc_client.permit( + owner=owner, + spender=spender, + value=value, + deadline=valid_before, + v=signed_message_permit_v, + r=signed_message_permit_r, + s=signed_message_permit_s, + ) + + mocked_eth_contract_functions.call_count == 2 + + +def test_permit_invalid_owner( + jpyc_client, + valid_before, + signed_message_permit_v, + signed_message_permit_r, + signed_message_permit_s, +): + with pytest.raises(InvalidChecksumAddress): + jpyc_client.permit( + owner="invalid_address", + spender=KNOWN_ACCOUNTS[1].address, + value=10000, + deadline=valid_before, + v=signed_message_permit_v, + r=signed_message_permit_r, + s=signed_message_permit_s, + ) + + +def test_permit_invalid_spender( + jpyc_client, + valid_before, + signed_message_permit_v, + signed_message_permit_r, + signed_message_permit_s, +): + with pytest.raises(InvalidChecksumAddress): + jpyc_client.permit( + owner=KNOWN_ACCOUNTS[0].address, + spender="invalid_address", + value=10000, + deadline=valid_before, + v=signed_message_permit_v, + r=signed_message_permit_r, + s=signed_message_permit_s, + ) + + +def test_permit_invalid_value( + jpyc_client, + valid_before, + signed_message_permit_v, + signed_message_permit_r, + signed_message_permit_s, +): + with pytest.raises(InvalidUint256): + jpyc_client.permit( + owner=KNOWN_ACCOUNTS[0].address, + spender=KNOWN_ACCOUNTS[1].address, + value=-1, + deadline=valid_before, + v=signed_message_permit_v, + r=signed_message_permit_r, + s=signed_message_permit_s, + ) + + +def test_permit_invalid_deadline( + jpyc_client, + signed_message_permit_v, + signed_message_permit_r, + signed_message_permit_s, +): + with pytest.raises(InvalidUint256): + jpyc_client.permit( + owner=KNOWN_ACCOUNTS[0].address, + spender=KNOWN_ACCOUNTS[1].address, + value=10000, + deadline=-1, + v=signed_message_permit_v, + r=signed_message_permit_r, + s=signed_message_permit_s, + ) + + +def test_permit_invalid_v( + jpyc_client, + valid_before, + signed_message_permit_r, + signed_message_permit_s, +): + with pytest.raises(InvalidUint8): + jpyc_client.permit( + owner=KNOWN_ACCOUNTS[0].address, + spender=KNOWN_ACCOUNTS[1].address, + value=10000, + deadline=valid_before, + v=-1, + r=signed_message_permit_r, + s=signed_message_permit_s, + ) + + +def test_permit_invalid_r( + jpyc_client, + valid_before, + signed_message_permit_v, + signed_message_permit_s, +): + with pytest.raises(InvalidBytes32): + jpyc_client.permit( + owner=KNOWN_ACCOUNTS[0].address, + spender=KNOWN_ACCOUNTS[1].address, + value=10000, + deadline=valid_before, + v=signed_message_permit_v, + r="0x", + s=signed_message_permit_s, + ) + + +def test_permit_invalid_s( + jpyc_client, + valid_before, + signed_message_permit_v, + signed_message_permit_r, +): + with pytest.raises(InvalidBytes32): + jpyc_client.permit( + owner=KNOWN_ACCOUNTS[0].address, + spender=KNOWN_ACCOUNTS[1].address, + value=10000, + deadline=valid_before, + v=signed_message_permit_v, + r=signed_message_permit_r, + s="0x", + ) + + +def test_permit_account_not_initialized( + jpyc_client_without_account, + valid_before, + signed_message_permit_v, + signed_message_permit_r, + signed_message_permit_s, +): + with pytest.raises(AccountNotInitialized): + jpyc_client_without_account.permit( + owner=KNOWN_ACCOUNTS[0].address, + spender=KNOWN_ACCOUNTS[1].address, + value=10000, + deadline=valid_before, + v=signed_message_permit_v, + r=signed_message_permit_r, + s=signed_message_permit_s, + ) diff --git a/tests/core/jpyc_methods/test_receive_with_authorization.py b/tests/core/jpyc_methods/test_receive_with_authorization.py new file mode 100644 index 0000000..3df7786 --- /dev/null +++ b/tests/core/jpyc_methods/test_receive_with_authorization.py @@ -0,0 +1,315 @@ +from eth_account import Account +import pytest + +from packages.core.src.utils.errors import ( + AccountNotInitialized, + InvalidBytes32, + InvalidChecksumAddress, + InvalidUint256, + InvalidUint8, +) + +from ..conftest import add_zero_padding_to_hex, KNOWN_ACCOUNTS + + +@pytest.fixture(scope="function") +def signed_message_receive( + eip712_domain_separator, + eip712_domain_types, + valid_before, + nonce, +): + return Account.sign_typed_data( + KNOWN_ACCOUNTS[0].private_key, + full_message={ + "domain": eip712_domain_separator, + "types": { + "EIP712Domain": eip712_domain_types, + "ReceiveWithAuthorization": [ + {"name": "from", "type": "address"}, + {"name": "to", "type": "address"}, + {"name": "value", "type": "uint256"}, + {"name": "validAfter", "type": "uint256"}, + {"name": "validBefore", "type": "uint256"}, + {"name": "nonce", "type": "bytes32"}, + ], + }, + "primaryType": "ReceiveWithAuthorization", + "message": { + "from": KNOWN_ACCOUNTS[0].address, + "to": KNOWN_ACCOUNTS[1].address, + "value": 10000 * 10**18, + "validAfter": 0, + "validBefore": valid_before, + "nonce": nonce, + }, + }, + ) + + +@pytest.fixture(scope="function") +def signed_message_receive_v(signed_message_receive): + return signed_message_receive.v + + +@pytest.fixture(scope="function") +def signed_message_receive_r(signed_message_receive): + return add_zero_padding_to_hex(hex(signed_message_receive.r), 32) + + +@pytest.fixture(scope="function") +def signed_message_receive_s(signed_message_receive): + return add_zero_padding_to_hex(hex(signed_message_receive.s), 32) + + +@pytest.mark.parametrize( + ["mocked_eth_contract_functions"], + [ + pytest.param( + {"func_name": "receiveWithAuthorization"}, + ), + ], + indirect=["mocked_eth_contract_functions"], +) +def test_receive_with_authorization( + jpyc_client, + valid_before, + nonce, + signed_message_receive_v, + signed_message_receive_r, + signed_message_receive_s, + mocked_eth_contract_functions, +): + from_ = KNOWN_ACCOUNTS[0].address + to = KNOWN_ACCOUNTS[1].address + value = 10000 + valid_after = 0 + + jpyc_client.receive_with_authorization( + from_=from_, + to=to, + value=value, + valid_after=valid_after, + valid_before=valid_before, + nonce=nonce, + v=signed_message_receive_v, + r=signed_message_receive_r, + s=signed_message_receive_s, + ) + + mocked_eth_contract_functions.call_count == 2 + + +def test_receive_with_authorization_invalid_from( + jpyc_client, + valid_before, + nonce, + signed_message_receive_v, + signed_message_receive_r, + signed_message_receive_s, +): + with pytest.raises(InvalidChecksumAddress): + jpyc_client.receive_with_authorization( + from_="invalid_address", + to=KNOWN_ACCOUNTS[1].address, + value=10000, + valid_after=0, + valid_before=valid_before, + nonce=nonce, + v=signed_message_receive_v, + r=signed_message_receive_r, + s=signed_message_receive_s, + ) + + +def test_receive_with_authorization_invalid_to( + jpyc_client, + valid_before, + nonce, + signed_message_receive_v, + signed_message_receive_r, + signed_message_receive_s, +): + with pytest.raises(InvalidChecksumAddress): + jpyc_client.receive_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to="invalid_address", + value=10000, + valid_after=0, + valid_before=valid_before, + nonce=nonce, + v=signed_message_receive_v, + r=signed_message_receive_r, + s=signed_message_receive_s, + ) + + +def test_receive_with_authorization_invalid_value( + jpyc_client, + valid_before, + nonce, + signed_message_receive_v, + signed_message_receive_r, + signed_message_receive_s, +): + with pytest.raises(InvalidUint256): + jpyc_client.receive_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[1].address, + value=-1, + valid_after=0, + valid_before=valid_before, + nonce=nonce, + v=signed_message_receive_v, + r=signed_message_receive_r, + s=signed_message_receive_s, + ) + + +def test_receive_with_authorization_invalid_valid_after( + jpyc_client, + valid_before, + nonce, + signed_message_receive_v, + signed_message_receive_r, + signed_message_receive_s, +): + with pytest.raises(InvalidUint256): + jpyc_client.receive_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[1].address, + value=10000, + valid_after=-1, + valid_before=valid_before, + nonce=nonce, + v=signed_message_receive_v, + r=signed_message_receive_r, + s=signed_message_receive_s, + ) + + +def test_receive_with_authorization_invalid_valid_before( + jpyc_client, + nonce, + signed_message_receive_v, + signed_message_receive_r, + signed_message_receive_s, +): + with pytest.raises(InvalidUint256): + jpyc_client.receive_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[1].address, + value=10000, + valid_after=0, + valid_before=-1, + nonce=nonce, + v=signed_message_receive_v, + r=signed_message_receive_r, + s=signed_message_receive_s, + ) + + +def test_receive_with_authorization_invalid_nonce( + jpyc_client, + valid_before, + signed_message_receive_v, + signed_message_receive_r, + signed_message_receive_s, +): + with pytest.raises(InvalidBytes32): + jpyc_client.receive_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[1].address, + value=10000, + valid_after=0, + valid_before=valid_before, + nonce="0x", + v=signed_message_receive_v, + r=signed_message_receive_r, + s=signed_message_receive_s, + ) + + +def test_receive_with_authorization_invalid_v( + jpyc_client, + valid_before, + nonce, + signed_message_receive_r, + signed_message_receive_s, +): + with pytest.raises(InvalidUint8): + jpyc_client.receive_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[1].address, + value=10000, + valid_after=0, + valid_before=valid_before, + nonce=nonce, + v=-1, + r=signed_message_receive_r, + s=signed_message_receive_s, + ) + + +def test_receive_with_authorization_invalid_r( + jpyc_client, + valid_before, + nonce, + signed_message_receive_v, + signed_message_receive_s, +): + with pytest.raises(InvalidBytes32): + jpyc_client.receive_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[1].address, + value=10000, + valid_after=0, + valid_before=valid_before, + nonce=nonce, + v=signed_message_receive_v, + r="0x", + s=signed_message_receive_s, + ) + + +def test_receive_with_authorization_invalid_s( + jpyc_client, + valid_before, + nonce, + signed_message_receive_v, + signed_message_receive_r, +): + with pytest.raises(InvalidBytes32): + jpyc_client.receive_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[1].address, + value=10000, + valid_after=0, + valid_before=valid_before, + nonce=nonce, + v=signed_message_receive_v, + r=signed_message_receive_r, + s="0x", + ) + + +def test_receive_with_authorization_account_not_initialized( + jpyc_client_without_account, + valid_before, + nonce, + signed_message_receive_v, + signed_message_receive_r, + signed_message_receive_s, +): + with pytest.raises(AccountNotInitialized): + jpyc_client_without_account.receive_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[1].address, + value=10000, + valid_after=0, + valid_before=valid_before, + nonce=nonce, + v=signed_message_receive_v, + r=signed_message_receive_r, + s=signed_message_receive_s, + ) diff --git a/tests/core/jpyc_methods/test_total_supply.py b/tests/core/jpyc_methods/test_total_supply.py new file mode 100644 index 0000000..29d2193 --- /dev/null +++ b/tests/core/jpyc_methods/test_total_supply.py @@ -0,0 +1,26 @@ +import pytest + + +@pytest.mark.parametrize( + [ + "mocked_eth_contract_functions", + ], + [ + pytest.param( + { + "func_name": "totalSupply", + "return_value": 100000000000000000000000000, + }, + ), + ], + indirect=[ + "mocked_eth_contract_functions", + ], +) +def test_total_supply( + jpyc_client, + mocked_eth_contract_functions, +): + jpyc_client.total_supply() + + mocked_eth_contract_functions.assert_called_once() diff --git a/tests/core/jpyc_methods/test_transfer.py b/tests/core/jpyc_methods/test_transfer.py new file mode 100644 index 0000000..45e1630 --- /dev/null +++ b/tests/core/jpyc_methods/test_transfer.py @@ -0,0 +1,81 @@ +import pytest + +from packages.core.src.utils.errors import ( + AccountNotInitialized, + InvalidChecksumAddress, + InvalidUint256, +) + +from ..conftest import KNOWN_ACCOUNTS + + +@pytest.mark.parametrize( + ["mocked_eth_contract_functions"], + [ + pytest.param( + {"func_name": "transfer"}, + ), + ], + indirect=["mocked_eth_contract_functions"], +) +def test_transfer( + jpyc_client, + mocked_eth_contract_functions, +): + to = KNOWN_ACCOUNTS[1].address + value = 10000 + + jpyc_client.transfer( + to=to, + value=value, + ) + + mocked_eth_contract_functions.call_count == 2 + mocked_eth_contract_functions.assert_called_with( + to=to, + value=value * 10**18, + ) + + +@pytest.mark.parametrize( + [ + "to", + "value", + "exception_class", + ], + [ + pytest.param( + "invalid_address", + 10000, + InvalidChecksumAddress, + id="invalid to", + ), + pytest.param( + KNOWN_ACCOUNTS[1].address, + -1, + InvalidUint256, + id="invalid value", + ), + ], +) +def test_transfer_failures( + jpyc_client, + to, + value, + exception_class, +): + with pytest.raises(exception_class): + jpyc_client.transfer( + to=to, + value=value, + ) + + +def test_transfer_account_not_initialized( + jpyc_client_without_account, +): + with pytest.raises(AccountNotInitialized): + jpyc_client_without_account.transfer( + to=KNOWN_ACCOUNTS[1].address, + value=1000, + ) diff --git a/tests/core/jpyc_methods/test_transfer_from.py b/tests/core/jpyc_methods/test_transfer_from.py new file mode 100644 index 0000000..3f085db --- /dev/null +++ b/tests/core/jpyc_methods/test_transfer_from.py @@ -0,0 +1,92 @@ +import pytest + +from packages.core.src.utils.errors import ( + AccountNotInitialized, + InvalidChecksumAddress, + InvalidUint256, +) + +from ..conftest import KNOWN_ACCOUNTS + + +@pytest.mark.parametrize( + ["mocked_eth_contract_functions"], + [ + pytest.param( + {"func_name": "transferFrom"}, + ), + ], + indirect=["mocked_eth_contract_functions"], +) +def test_transfer_from( + jpyc_client, + mocked_eth_contract_functions, +): + from_ = KNOWN_ACCOUNTS[0].address + to = KNOWN_ACCOUNTS[1].address + value = 10000 + + jpyc_client.transfer_from( + from_=from_, + to=to, + value=value, + ) + + mocked_eth_contract_functions.call_count == 2 + + +@pytest.mark.parametrize( + [ + "from_", + "to", + "value", + "exception_class", + ], + [ + pytest.param( + "invalid_address", + KNOWN_ACCOUNTS[1].address, + 10000, + InvalidChecksumAddress, + id="invalid from", + ), + pytest.param( + KNOWN_ACCOUNTS[0].address, + "invalid_address", + 10000, + InvalidChecksumAddress, + id="invalid to", + ), + pytest.param( + KNOWN_ACCOUNTS[0].address, + KNOWN_ACCOUNTS[1].address, + -1, + InvalidUint256, + id="invalid value", + ), + ], +) +def test_transfer_from_failures( + jpyc_client, + from_, + to, + value, + exception_class, +): + with pytest.raises(exception_class): + jpyc_client.transfer_from( + from_=from_, + to=to, + value=value, + ) + + +def test_transfer_from_account_not_initialized( + jpyc_client_without_account, +): + with pytest.raises(AccountNotInitialized): + jpyc_client_without_account.transfer_from( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[1].address, + value=1000, + ) diff --git a/tests/core/jpyc_methods/test_transfer_with_authorization.py b/tests/core/jpyc_methods/test_transfer_with_authorization.py new file mode 100644 index 0000000..8785f5d --- /dev/null +++ b/tests/core/jpyc_methods/test_transfer_with_authorization.py @@ -0,0 +1,315 @@ +from eth_account import Account +import pytest + +from packages.core.src.utils.errors import ( + AccountNotInitialized, + InvalidBytes32, + InvalidChecksumAddress, + InvalidUint256, + InvalidUint8, +) + +from ..conftest import add_zero_padding_to_hex, KNOWN_ACCOUNTS + + +@pytest.fixture(scope="function") +def signed_message_transfer( + eip712_domain_separator, + eip712_domain_types, + valid_before, + nonce, +): + return Account.sign_typed_data( + KNOWN_ACCOUNTS[0].private_key, + full_message={ + "domain": eip712_domain_separator, + "types": { + "EIP712Domain": eip712_domain_types, + "TransferWithAuthorization": [ + {"name": "from", "type": "address"}, + {"name": "to", "type": "address"}, + {"name": "value", "type": "uint256"}, + {"name": "validAfter", "type": "uint256"}, + {"name": "validBefore", "type": "uint256"}, + {"name": "nonce", "type": "bytes32"}, + ], + }, + "primaryType": "TransferWithAuthorization", + "message": { + "from": KNOWN_ACCOUNTS[0].address, + "to": KNOWN_ACCOUNTS[1].address, + "value": 10000 * 10**18, + "validAfter": 0, + "validBefore": valid_before, + "nonce": nonce, + }, + }, + ) + + +@pytest.fixture(scope="function") +def signed_message_transfer_v(signed_message_transfer): + return signed_message_transfer.v + + +@pytest.fixture(scope="function") +def signed_message_transfer_r(signed_message_transfer): + return add_zero_padding_to_hex(hex(signed_message_transfer.r), 32) + + +@pytest.fixture(scope="function") +def signed_message_transfer_s(signed_message_transfer): + return add_zero_padding_to_hex(hex(signed_message_transfer.s), 32) + + +@pytest.mark.parametrize( + ["mocked_eth_contract_functions"], + [ + pytest.param( + {"func_name": "transferWithAuthorization"}, + ), + ], + indirect=["mocked_eth_contract_functions"], +) +def test_transfer_with_authorization( + jpyc_client, + valid_before, + nonce, + signed_message_transfer_v, + signed_message_transfer_r, + signed_message_transfer_s, + mocked_eth_contract_functions, +): + from_ = KNOWN_ACCOUNTS[0].address + to = KNOWN_ACCOUNTS[1].address + value = 10000 + valid_after = 0 + + jpyc_client.transfer_with_authorization( + from_=from_, + to=to, + value=value, + valid_after=valid_after, + valid_before=valid_before, + nonce=nonce, + v=signed_message_transfer_v, + r=signed_message_transfer_r, + s=signed_message_transfer_s, + ) + + mocked_eth_contract_functions.call_count == 2 + + +def test_transfer_with_authorization_invalid_from( + jpyc_client, + valid_before, + nonce, + signed_message_transfer_v, + signed_message_transfer_r, + signed_message_transfer_s, +): + with pytest.raises(InvalidChecksumAddress): + jpyc_client.transfer_with_authorization( + from_="invalid_address", + to=KNOWN_ACCOUNTS[1].address, + value=10000, + valid_after=0, + valid_before=valid_before, + nonce=nonce, + v=signed_message_transfer_v, + r=signed_message_transfer_r, + s=signed_message_transfer_s, + ) + + +def test_transfer_with_authorization_invalid_to( + jpyc_client, + valid_before, + nonce, + signed_message_transfer_v, + signed_message_transfer_r, + signed_message_transfer_s, +): + with pytest.raises(InvalidChecksumAddress): + jpyc_client.transfer_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to="invalid_address", + value=10000, + valid_after=0, + valid_before=valid_before, + nonce=nonce, + v=signed_message_transfer_v, + r=signed_message_transfer_r, + s=signed_message_transfer_s, + ) + + +def test_transfer_with_authorization_invalid_value( + jpyc_client, + valid_before, + nonce, + signed_message_transfer_v, + signed_message_transfer_r, + signed_message_transfer_s, +): + with pytest.raises(InvalidUint256): + jpyc_client.transfer_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[1].address, + value=-1, + valid_after=0, + valid_before=valid_before, + nonce=nonce, + v=signed_message_transfer_v, + r=signed_message_transfer_r, + s=signed_message_transfer_s, + ) + + +def test_transfer_with_authorization_invalid_valid_after( + jpyc_client, + valid_before, + nonce, + signed_message_transfer_v, + signed_message_transfer_r, + signed_message_transfer_s, +): + with pytest.raises(InvalidUint256): + jpyc_client.transfer_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[1].address, + value=10000, + valid_after=-1, + valid_before=valid_before, + nonce=nonce, + v=signed_message_transfer_v, + r=signed_message_transfer_r, + s=signed_message_transfer_s, + ) + + +def test_transfer_with_authorization_invalid_valid_before( + jpyc_client, + nonce, + signed_message_transfer_v, + signed_message_transfer_r, + signed_message_transfer_s, +): + with pytest.raises(InvalidUint256): + jpyc_client.transfer_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[1].address, + value=10000, + valid_after=0, + valid_before=-1, + nonce=nonce, + v=signed_message_transfer_v, + r=signed_message_transfer_r, + s=signed_message_transfer_s, + ) + + +def test_transfer_with_authorization_invalid_nonce( + jpyc_client, + valid_before, + signed_message_transfer_v, + signed_message_transfer_r, + signed_message_transfer_s, +): + with pytest.raises(InvalidBytes32): + jpyc_client.transfer_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[1].address, + value=10000, + valid_after=0, + valid_before=valid_before, + nonce="0x", + v=signed_message_transfer_v, + r=signed_message_transfer_r, + s=signed_message_transfer_s, + ) + + +def test_transfer_with_authorization_invalid_v( + jpyc_client, + valid_before, + nonce, + signed_message_transfer_r, + signed_message_transfer_s, +): + with pytest.raises(InvalidUint8): + jpyc_client.transfer_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[1].address, + value=10000, + valid_after=0, + valid_before=valid_before, + nonce=nonce, + v=-1, + r=signed_message_transfer_r, + s=signed_message_transfer_s, + ) + + +def test_transfer_with_authorization_invalid_r( + jpyc_client, + valid_before, + nonce, + signed_message_transfer_v, + signed_message_transfer_s, +): + with pytest.raises(InvalidBytes32): + jpyc_client.transfer_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[1].address, + value=10000, + valid_after=0, + valid_before=valid_before, + nonce=nonce, + v=signed_message_transfer_v, + r="0x", + s=signed_message_transfer_s, + ) + + +def test_transfer_with_authorization_invalid_s( + jpyc_client, + valid_before, + nonce, + signed_message_transfer_v, + signed_message_transfer_r, +): + with pytest.raises(InvalidBytes32): + jpyc_client.transfer_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[1].address, + value=10000, + valid_after=0, + valid_before=valid_before, + nonce=nonce, + v=signed_message_transfer_v, + r=signed_message_transfer_r, + s="0x", + ) + + +def test_transfer_with_authorization_account_not_initialized( + jpyc_client_without_account, + valid_before, + nonce, + signed_message_transfer_v, + signed_message_transfer_r, + signed_message_transfer_s, +): + with pytest.raises(AccountNotInitialized): + jpyc_client_without_account.transfer_with_authorization( + from_=KNOWN_ACCOUNTS[0].address, + to=KNOWN_ACCOUNTS[1].address, + value=10000, + valid_after=0, + valid_before=valid_before, + nonce=nonce, + v=signed_message_transfer_v, + r=signed_message_transfer_r, + s=signed_message_transfer_s, + ) diff --git a/tests/core/test_client.py b/tests/core/test_client.py new file mode 100644 index 0000000..9c751bf --- /dev/null +++ b/tests/core/test_client.py @@ -0,0 +1,263 @@ +from eth_account.signers.local import LocalAccount +from pydantic import ValidationError +import pytest +from web3 import Web3 + +from packages.core.src.client import SdkClient +from packages.core.src.utils.chains import get_default_rpc_endpoint +from packages.core.src.utils.errors import ( + AccountNotInitialized, + InvalidBytes32, + InvalidRpcEndpoint, + NetworkNotSupported, +) + +from .conftest import KNOWN_ACCOUNTS + + +@pytest.mark.parametrize( + [ + "chain_name", + "network_name", + "rpc_endpoint", + "private_key", + "num_of_middlewares", + "address", + ], + [ + pytest.param( + "ethereum", + "mainnet", + None, + None, + 6, + None, + id="valid default network; without account", + ), + pytest.param( + "ethereum", + "mainnet", + "http://127.0.0.1:8545/", + None, + 6, + None, + id="valid custom network; without account", + ), + pytest.param( + "ethereum", + "mainnet", + None, + KNOWN_ACCOUNTS[0].private_key, + 7, + KNOWN_ACCOUNTS[0].address, + id="valid network; with account", + ), + ], +) +def test_constructor( + chain_name, + network_name, + rpc_endpoint, + private_key, + num_of_middlewares, + address, +): + client = SdkClient( + chain_name=chain_name, + network_name=network_name, + rpc_endpoint=rpc_endpoint, + private_key=private_key, + ) + + assert isinstance(client.w3, Web3) + assert len(client.w3.middleware_onion.middleware) == num_of_middlewares + assert client.rpc_endpoint == ( + get_default_rpc_endpoint(chain_name, network_name) + if rpc_endpoint is None + else rpc_endpoint + ) + if private_key is None: + assert client.account is None + else: + assert isinstance(client.account, LocalAccount) + assert client.account.address == address + assert client.w3.eth.default_account == address + + +@pytest.mark.parametrize( + [ + "chain_name", + "network_name", + "rpc_endpoint", + "private_key", + "exception_class", + ], + [ + pytest.param( + "solana", + "mainnet", + None, + None, + ValidationError, + id="invalid chain_name", + ), + pytest.param( + "localhost", + "mainnet", + None, + None, + NetworkNotSupported, + id="invalid network configuration", + ), + pytest.param( + "ethereum", + "mainnet", + "invalid_uri", + None, + InvalidRpcEndpoint, + id="invalid rpc_endpoint", + ), + pytest.param( + "ethereum", + "mainnet", + None, + "invalid_private_key", + InvalidBytes32, + id="invalid private_key", + ), + ], +) +def test_constructor_failures( + chain_name, + network_name, + rpc_endpoint, + private_key, + exception_class, +): + with pytest.raises(exception_class): + SdkClient( + chain_name=chain_name, + network_name=network_name, + rpc_endpoint=rpc_endpoint, + private_key=private_key, + ) + + +def test_set_default_provider(sdk_client): + sdk_client.set_default_provider( + chain_name="ethereum", + network_name="sepolia", + ) + + assert ( + sdk_client.w3.provider.endpoint_uri + == "https://ethereum-sepolia-rpc.publicnode.com" + ) + assert sdk_client.w3.eth.default_account == KNOWN_ACCOUNTS[0].address + + +@pytest.mark.parametrize( + [ + "chain_name", + "network_name", + "exception_class", + ], + [ + pytest.param( + "solana", + "mainnet", + ValidationError, + id="invalid chain_name", + ), + pytest.param( + "localhost", + "mainnet", + NetworkNotSupported, + id="invalid network configuration", + ), + ], +) +def test_set_default_provider_failures( + sdk_client, + chain_name, + network_name, + exception_class, +): + with pytest.raises(exception_class): + sdk_client.set_default_provider( + chain_name=chain_name, + network_name=network_name, + ) + + +def test_set_custom_provider(sdk_client): + rpc_endpoint = "https://astar.public.blastapi.io" + + sdk_client.set_custom_provider( + rpc_endpoint=rpc_endpoint, + ) + + assert sdk_client.w3.provider.endpoint_uri == rpc_endpoint + assert sdk_client.w3.eth.default_account == KNOWN_ACCOUNTS[0].address + + +def test_set_custom_provider_failures(sdk_client): + with pytest.raises(InvalidRpcEndpoint): + sdk_client.set_custom_provider( + rpc_endpoint="invalid_uri", + ) + + +@pytest.mark.parametrize( + [ + "private_key", + "address", + ], + [ + pytest.param( + KNOWN_ACCOUNTS[1].private_key, + KNOWN_ACCOUNTS[1].address, + id="set new account to account", + ), + pytest.param( + None, + None, + id="set None to account", + ), + ], +) +def test_set_account( + sdk_client, + private_key, + address, +): + account = sdk_client.set_account( + private_key=private_key, + ) + + assert sdk_client.w3.provider.endpoint_uri == "https://ethereum-rpc.publicnode.com" + + if account is not None: + assert account.address == address + assert sdk_client.w3.eth.default_account == address + else: + assert account is None + assert sdk_client.w3.eth.default_account is None + + +def test_set_account_failures(sdk_client): + with pytest.raises(InvalidBytes32): + sdk_client.set_account( + private_key="invalid_private_key", + ) + + +def test_get_account_address(sdk_client): + address = sdk_client.get_account_address() + + assert address == KNOWN_ACCOUNTS[0].address + + +def test_get_account_address_failures(sdk_client_without_account): + with pytest.raises(AccountNotInitialized): + sdk_client_without_account.get_account_address() diff --git a/tests/core/test_jpyc.py b/tests/core/test_jpyc.py new file mode 100644 index 0000000..1b69c51 --- /dev/null +++ b/tests/core/test_jpyc.py @@ -0,0 +1,116 @@ +import pytest +from web3.contract.contract import Contract + +from packages.core.src.jpyc import JPYC + +from .conftest import V2_PROXY_ADDRESS + + +@pytest.mark.parametrize( + [ + "contract_address", + "mocked_eth_chain_id", + ], + [ + pytest.param( + None, + {"chain_id": 1}, + id="default contract address", + ), + pytest.param( + "0xC8CD2BE653759aed7B0996315821AAe71e1FEAdF", + {"chain_id": 1}, + id="custom contract address", + ), + ], + indirect=[ + "mocked_eth_chain_id", + ], +) +def test_constructor( + sdk_client, + contract_address, + mocked_eth_chain_id, +): + address = V2_PROXY_ADDRESS if contract_address is None else contract_address + + jpyc = JPYC( + client=sdk_client, + contract_address=address, + ) + + mocked_eth_chain_id.assert_called_once() + + assert jpyc.client == sdk_client + assert isinstance(jpyc.contract, Contract) + assert jpyc.contract.address == address + + +@pytest.mark.parametrize( + [ + "mocked_eth_chain_id", + ], + [ + pytest.param( + {"chain_id": 31337}, + id="default contract address", + ), + ], + indirect=[ + "mocked_eth_chain_id", + ], +) +def test_constructor_localhost( + sdk_client_localhost, + mocked_eth_chain_id, +): + address = "0xC8CD2BE653759aed7B0996315821AAe71e1FEAdF" + + jpyc = JPYC( + client=sdk_client_localhost, + contract_address=address, + ) + + mocked_eth_chain_id.assert_called_once() + + assert jpyc.client == sdk_client_localhost + assert isinstance(jpyc.contract, Contract) + assert jpyc.contract.address == address + + +@pytest.mark.parametrize( + [ + "mocked_eth_chain_id", + "mocked_eth_wait_for_transaction_receipt", + ], + [ + pytest.param( + {"chain_id": 31337}, + {"address": V2_PROXY_ADDRESS}, + id="default contract address", + ), + ], + indirect=[ + "mocked_eth_chain_id", + "mocked_eth_wait_for_transaction_receipt", + ], +) +def test_constructor_localhost_with_deployment( + sdk_client_localhost, + mocked_eth_chain_id, + mocked_eth_contract_constructor_transact, + mocked_eth_wait_for_transaction_receipt, + mocked_eth_contract_functions_transact, +): + jpyc = JPYC( + client=sdk_client_localhost, + ) + + mocked_eth_chain_id.assert_called_once() + mocked_eth_contract_constructor_transact.assert_called_once() + mocked_eth_wait_for_transaction_receipt.assert_called_once() + mocked_eth_contract_functions_transact.assert_called_once() + + assert jpyc.client == sdk_client_localhost + assert isinstance(jpyc.contract, Contract) + assert jpyc.contract.address == V2_PROXY_ADDRESS diff --git a/tests/core/utils/__init__.py b/tests/core/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/core/utils/test_addresses.py b/tests/core/utils/test_addresses.py new file mode 100644 index 0000000..76b26a0 --- /dev/null +++ b/tests/core/utils/test_addresses.py @@ -0,0 +1,76 @@ +import pytest + +from packages.core.src.utils.addresses import ( + calc_checksum_address, + get_proxy_address, + is_valid_address, +) + + +VALID_CHECKSUM_ADDRESS = "0x431D5dfF03120AFA4bDf332c61A6e1766eF37BDB" +INVALID_CHECKSUM_ADDRESS = "0x431d5dff03120afa4bdf332c61a6e1766ef37bdb" +VALID_ADDRESS_IN_INTEGER = 383157291474631222722397742278122605068030278619 +INVALID_ADDRESS_IN_INTEGER = 0 + + +@pytest.mark.parametrize( + [ + "address", + ], + [ + pytest.param( + VALID_CHECKSUM_ADDRESS, + id="valid checksum address", + ), + pytest.param( + INVALID_CHECKSUM_ADDRESS, + id="invalid checksum address", + ), + pytest.param( + VALID_ADDRESS_IN_INTEGER, + id="valid address in integer", + ), + ], +) +def test_calc_checksum_address(address): + checksum_address = calc_checksum_address(address=address) + + assert type(checksum_address) is str + assert checksum_address == VALID_CHECKSUM_ADDRESS + + +def test_calc_checksum_address_failures(): + with pytest.raises(ValueError): + calc_checksum_address(address=INVALID_ADDRESS_IN_INTEGER) + + +@pytest.mark.parametrize( + [ + "address", + "response", + ], + [ + pytest.param(VALID_CHECKSUM_ADDRESS, True, id="valid address"), + pytest.param(INVALID_CHECKSUM_ADDRESS, False, id="invalid address"), + pytest.param(VALID_ADDRESS_IN_INTEGER, False, id="valid address in integer"), + pytest.param( + INVALID_ADDRESS_IN_INTEGER, False, id="invalid address in integer" + ), + ], +) +def test_is_valid_address(address, response): + assert is_valid_address(address=address) is response + + +@pytest.mark.parametrize( + [ + "contract_version", + "response", + ], + [ + pytest.param("2", VALID_CHECKSUM_ADDRESS, id="valid contract version"), + pytest.param("3", None, id="invalid contract version"), + ], +) +def test_get_proxy_address(contract_version, response): + assert get_proxy_address(contract_version=contract_version) == response diff --git a/tests/core/utils/test_artifacts.py b/tests/core/utils/test_artifacts.py new file mode 100644 index 0000000..821386e --- /dev/null +++ b/tests/core/utils/test_artifacts.py @@ -0,0 +1,36 @@ +import pytest + +from packages.core.src.utils.artifacts import ( + get_artifacts, + resolve_artifacts_file_path, +) + + +def test_resolve_artifacts_file_path(): + path = resolve_artifacts_file_path(contract_version="2") + assert str(path).endswith("v2.json") is True + + +@pytest.mark.parametrize( + [ + "artifact_type", + "return_type", + ], + [ + pytest.param( + "abi", + list, + id="get abi", + ), + pytest.param( + "bytecode", + str, + id="get bytecode", + ), + ], +) +def test_get_artifacts(artifact_type, return_type): + path = resolve_artifacts_file_path(contract_version="2") + + artifact = get_artifacts(file_path=path, artifact_type=artifact_type) + assert type(artifact) is return_type diff --git a/tests/core/utils/test_chains.py b/tests/core/utils/test_chains.py new file mode 100644 index 0000000..574a501 --- /dev/null +++ b/tests/core/utils/test_chains.py @@ -0,0 +1,87 @@ +import pytest + +from packages.core.src.utils.chains import ( + enumerate_supported_networks, + get_default_rpc_endpoint, + is_supported_network, +) +from packages.core.src.utils.errors import ( + NetworkNotSupported, +) + + +def test_enumerate_supported_networks(): + supported_networks = enumerate_supported_networks() + assert ( + supported_networks == "'ethereum' => ['mainnet', 'sepolia'], " + "'polygon' => ['mainnet', 'amoy'], " + "'gnosis' => ['mainnet', 'chiado'], " + "'avalanche' => ['mainnet', 'fuji'], " + "'astar' => ['mainnet'], " + "'shiden' => ['mainnet'], " + "'localhost' => ['devnet']" + ) + + +@pytest.mark.parametrize( + ["chain_name", "network_name", "response"], + [ + pytest.param( + "ethereum", + "mainnet", + True, + id="ethereum mainnet", + ), + pytest.param( + "localhost", + "devnet", + True, + id="localhost devnet", + ), + pytest.param( + "solana", + "mainnet", + False, + id="solana mainnet", + ), + ], +) +def test_is_supported_network(chain_name, network_name, response): + network_supported = is_supported_network( + chain_name=chain_name, + network_name=network_name, + ) + assert network_supported is response + + +@pytest.mark.parametrize( + ["chain_name", "network_name", "response"], + [ + pytest.param( + "ethereum", + "mainnet", + "https://ethereum-rpc.publicnode.com", + id="ethereum mainnet", + ), + pytest.param( + "polygon", + "amoy", + "https://rpc-amoy.polygon.technology", + id="polygon amoy", + ), + ], +) +def test_get_default_rpc_endpoint(chain_name, network_name, response): + rpc_endpoint = get_default_rpc_endpoint( + chain_name=chain_name, + network_name=network_name, + ) + assert rpc_endpoint == response + + +def test_get_default_rpc_endpoint_failures(): + with pytest.raises(NetworkNotSupported): + get_default_rpc_endpoint( + chain_name="ethereum", + network_name="goerli", + ) diff --git a/tests/core/utils/test_currencies.py b/tests/core/utils/test_currencies.py new file mode 100644 index 0000000..7459a5a --- /dev/null +++ b/tests/core/utils/test_currencies.py @@ -0,0 +1,48 @@ +from decimal import Decimal + +import pytest + +from packages.core.src.utils.currencies import ( + remove_decimals, + restore_decimals, +) + + +@pytest.mark.parametrize( + ["value", "response"], + [ + pytest.param( + 10000, + 10000000000000000000000, + id="integer", + ), + pytest.param( + 0.05, + 50000000000000000, + id="decimal", + ), + ], +) +def test_remove_decimals(value, response): + on_chain_value = remove_decimals(value=value) + assert on_chain_value == response + + +@pytest.mark.parametrize( + ["value", "response"], + [ + pytest.param( + 10000000000000000000000, + 10000, + id="integer", + ), + pytest.param( + 50000000000000000, + Decimal("0.05"), + id="decimal", + ), + ], +) +def test_restore_decimals(value, response): + off_chain_value = restore_decimals(func=lambda v: v)(value) + assert off_chain_value == response diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..163c261 --- /dev/null +++ b/uv.lock @@ -0,0 +1,1317 @@ +version = 1 +revision = 2 +requires-python = ">=3.12" +resolution-markers = [ + "implementation_name == 'cpython'", + "implementation_name == 'pypy'", + "implementation_name != 'cpython' and implementation_name != 'pypy'", +] + +[manifest] +members = [ + "jpyc-core-sdk", + "jpyc-python-sdks", +] + +[[package]] +name = "aiohappyeyeballs" +version = "2.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760, upload-time = "2025-03-12T01:42:48.764Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265, upload-time = "2025-03-12T01:42:47.083Z" }, +] + +[[package]] +name = "aiohttp" +version = "3.11.18" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohappyeyeballs" }, + { name = "aiosignal" }, + { name = "attrs" }, + { name = "frozenlist" }, + { name = "multidict" }, + { name = "propcache" }, + { name = "yarl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/e7/fa1a8c00e2c54b05dc8cb5d1439f627f7c267874e3f7bb047146116020f9/aiohttp-3.11.18.tar.gz", hash = "sha256:ae856e1138612b7e412db63b7708735cff4d38d0399f6a5435d3dac2669f558a", size = 7678653, upload-time = "2025-04-21T09:43:09.191Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b5/d2/5bc436f42bf4745c55f33e1e6a2d69e77075d3e768e3d1a34f96ee5298aa/aiohttp-3.11.18-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:63d71eceb9cad35d47d71f78edac41fcd01ff10cacaa64e473d1aec13fa02df2", size = 706671, upload-time = "2025-04-21T09:41:28.021Z" }, + { url = "https://files.pythonhosted.org/packages/fe/d0/2dbabecc4e078c0474abb40536bbde717fb2e39962f41c5fc7a216b18ea7/aiohttp-3.11.18-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d1929da615840969929e8878d7951b31afe0bac883d84418f92e5755d7b49508", size = 466169, upload-time = "2025-04-21T09:41:29.783Z" }, + { url = "https://files.pythonhosted.org/packages/70/84/19edcf0b22933932faa6e0be0d933a27bd173da02dc125b7354dff4d8da4/aiohttp-3.11.18-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d0aebeb2392f19b184e3fdd9e651b0e39cd0f195cdb93328bd124a1d455cd0e", size = 457554, upload-time = "2025-04-21T09:41:31.327Z" }, + { url = "https://files.pythonhosted.org/packages/32/d0/e8d1f034ae5624a0f21e4fb3feff79342ce631f3a4d26bd3e58b31ef033b/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3849ead845e8444f7331c284132ab314b4dac43bfae1e3cf350906d4fff4620f", size = 1690154, upload-time = "2025-04-21T09:41:33.541Z" }, + { url = "https://files.pythonhosted.org/packages/16/de/2f9dbe2ac6f38f8495562077131888e0d2897e3798a0ff3adda766b04a34/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e8452ad6b2863709f8b3d615955aa0807bc093c34b8e25b3b52097fe421cb7f", size = 1733402, upload-time = "2025-04-21T09:41:35.634Z" }, + { url = "https://files.pythonhosted.org/packages/e0/04/bd2870e1e9aef990d14b6df2a695f17807baf5c85a4c187a492bda569571/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b8d2b42073611c860a37f718b3d61ae8b4c2b124b2e776e2c10619d920350ec", size = 1783958, upload-time = "2025-04-21T09:41:37.456Z" }, + { url = "https://files.pythonhosted.org/packages/23/06/4203ffa2beb5bedb07f0da0f79b7d9039d1c33f522e0d1a2d5b6218e6f2e/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fbf91f6a0ac317c0a07eb328a1384941872f6761f2e6f7208b63c4cc0a7ff6", size = 1695288, upload-time = "2025-04-21T09:41:39.756Z" }, + { url = "https://files.pythonhosted.org/packages/30/b2/e2285dda065d9f29ab4b23d8bcc81eb881db512afb38a3f5247b191be36c/aiohttp-3.11.18-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ff5625413fec55216da5eaa011cf6b0a2ed67a565914a212a51aa3755b0009", size = 1618871, upload-time = "2025-04-21T09:41:41.972Z" }, + { url = "https://files.pythonhosted.org/packages/57/e0/88f2987885d4b646de2036f7296ebea9268fdbf27476da551c1a7c158bc0/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7f33a92a2fde08e8c6b0c61815521324fc1612f397abf96eed86b8e31618fdb4", size = 1646262, upload-time = "2025-04-21T09:41:44.192Z" }, + { url = "https://files.pythonhosted.org/packages/e0/19/4d2da508b4c587e7472a032290b2981f7caeca82b4354e19ab3df2f51d56/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:11d5391946605f445ddafda5eab11caf310f90cdda1fd99865564e3164f5cff9", size = 1677431, upload-time = "2025-04-21T09:41:46.049Z" }, + { url = "https://files.pythonhosted.org/packages/eb/ae/047473ea50150a41440f3265f53db1738870b5a1e5406ece561ca61a3bf4/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3cc314245deb311364884e44242e00c18b5896e4fe6d5f942e7ad7e4cb640adb", size = 1637430, upload-time = "2025-04-21T09:41:47.973Z" }, + { url = "https://files.pythonhosted.org/packages/11/32/c6d1e3748077ce7ee13745fae33e5cb1dac3e3b8f8787bf738a93c94a7d2/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0f421843b0f70740772228b9e8093289924359d306530bcd3926f39acbe1adda", size = 1703342, upload-time = "2025-04-21T09:41:50.323Z" }, + { url = "https://files.pythonhosted.org/packages/c5/1d/a3b57bfdbe285f0d45572d6d8f534fd58761da3e9cbc3098372565005606/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e220e7562467dc8d589e31c1acd13438d82c03d7f385c9cd41a3f6d1d15807c1", size = 1740600, upload-time = "2025-04-21T09:41:52.111Z" }, + { url = "https://files.pythonhosted.org/packages/a5/71/f9cd2fed33fa2b7ce4d412fb7876547abb821d5b5520787d159d0748321d/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ab2ef72f8605046115bc9aa8e9d14fd49086d405855f40b79ed9e5c1f9f4faea", size = 1695131, upload-time = "2025-04-21T09:41:53.94Z" }, + { url = "https://files.pythonhosted.org/packages/97/97/d1248cd6d02b9de6aa514793d0dcb20099f0ec47ae71a933290116c070c5/aiohttp-3.11.18-cp312-cp312-win32.whl", hash = "sha256:12a62691eb5aac58d65200c7ae94d73e8a65c331c3a86a2e9670927e94339ee8", size = 412442, upload-time = "2025-04-21T09:41:55.689Z" }, + { url = "https://files.pythonhosted.org/packages/33/9a/e34e65506e06427b111e19218a99abf627638a9703f4b8bcc3e3021277ed/aiohttp-3.11.18-cp312-cp312-win_amd64.whl", hash = "sha256:364329f319c499128fd5cd2d1c31c44f234c58f9b96cc57f743d16ec4f3238c8", size = 439444, upload-time = "2025-04-21T09:41:57.977Z" }, + { url = "https://files.pythonhosted.org/packages/0a/18/be8b5dd6b9cf1b2172301dbed28e8e5e878ee687c21947a6c81d6ceaa15d/aiohttp-3.11.18-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:474215ec618974054cf5dc465497ae9708543cbfc312c65212325d4212525811", size = 699833, upload-time = "2025-04-21T09:42:00.298Z" }, + { url = "https://files.pythonhosted.org/packages/0d/84/ecdc68e293110e6f6f6d7b57786a77555a85f70edd2b180fb1fafaff361a/aiohttp-3.11.18-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6ced70adf03920d4e67c373fd692123e34d3ac81dfa1c27e45904a628567d804", size = 462774, upload-time = "2025-04-21T09:42:02.015Z" }, + { url = "https://files.pythonhosted.org/packages/d7/85/f07718cca55884dad83cc2433746384d267ee970e91f0dcc75c6d5544079/aiohttp-3.11.18-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2d9f6c0152f8d71361905aaf9ed979259537981f47ad099c8b3d81e0319814bd", size = 454429, upload-time = "2025-04-21T09:42:03.728Z" }, + { url = "https://files.pythonhosted.org/packages/82/02/7f669c3d4d39810db8842c4e572ce4fe3b3a9b82945fdd64affea4c6947e/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a35197013ed929c0aed5c9096de1fc5a9d336914d73ab3f9df14741668c0616c", size = 1670283, upload-time = "2025-04-21T09:42:06.053Z" }, + { url = "https://files.pythonhosted.org/packages/ec/79/b82a12f67009b377b6c07a26bdd1b81dab7409fc2902d669dbfa79e5ac02/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:540b8a1f3a424f1af63e0af2d2853a759242a1769f9f1ab053996a392bd70118", size = 1717231, upload-time = "2025-04-21T09:42:07.953Z" }, + { url = "https://files.pythonhosted.org/packages/a6/38/d5a1f28c3904a840642b9a12c286ff41fc66dfa28b87e204b1f242dbd5e6/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9e6710ebebfce2ba21cee6d91e7452d1125100f41b906fb5af3da8c78b764c1", size = 1769621, upload-time = "2025-04-21T09:42:09.855Z" }, + { url = "https://files.pythonhosted.org/packages/53/2d/deb3749ba293e716b5714dda06e257f123c5b8679072346b1eb28b766a0b/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8af2ef3b4b652ff109f98087242e2ab974b2b2b496304063585e3d78de0b000", size = 1678667, upload-time = "2025-04-21T09:42:11.741Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a8/04b6e11683a54e104b984bd19a9790eb1ae5f50968b601bb202d0406f0ff/aiohttp-3.11.18-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28c3f975e5ae3dbcbe95b7e3dcd30e51da561a0a0f2cfbcdea30fc1308d72137", size = 1601592, upload-time = "2025-04-21T09:42:14.137Z" }, + { url = "https://files.pythonhosted.org/packages/5e/9d/c33305ae8370b789423623f0e073d09ac775cd9c831ac0f11338b81c16e0/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c28875e316c7b4c3e745172d882d8a5c835b11018e33432d281211af35794a93", size = 1621679, upload-time = "2025-04-21T09:42:16.056Z" }, + { url = "https://files.pythonhosted.org/packages/56/45/8e9a27fff0538173d47ba60362823358f7a5f1653c6c30c613469f94150e/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:13cd38515568ae230e1ef6919e2e33da5d0f46862943fcda74e7e915096815f3", size = 1656878, upload-time = "2025-04-21T09:42:18.368Z" }, + { url = "https://files.pythonhosted.org/packages/84/5b/8c5378f10d7a5a46b10cb9161a3aac3eeae6dba54ec0f627fc4ddc4f2e72/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0e2a92101efb9f4c2942252c69c63ddb26d20f46f540c239ccfa5af865197bb8", size = 1620509, upload-time = "2025-04-21T09:42:20.141Z" }, + { url = "https://files.pythonhosted.org/packages/9e/2f/99dee7bd91c62c5ff0aa3c55f4ae7e1bc99c6affef780d7777c60c5b3735/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e6d3e32b8753c8d45ac550b11a1090dd66d110d4ef805ffe60fa61495360b3b2", size = 1680263, upload-time = "2025-04-21T09:42:21.993Z" }, + { url = "https://files.pythonhosted.org/packages/03/0a/378745e4ff88acb83e2d5c884a4fe993a6e9f04600a4560ce0e9b19936e3/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ea4cf2488156e0f281f93cc2fd365025efcba3e2d217cbe3df2840f8c73db261", size = 1715014, upload-time = "2025-04-21T09:42:23.87Z" }, + { url = "https://files.pythonhosted.org/packages/f6/0b/b5524b3bb4b01e91bc4323aad0c2fcaebdf2f1b4d2eb22743948ba364958/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d4df95ad522c53f2b9ebc07f12ccd2cb15550941e11a5bbc5ddca2ca56316d7", size = 1666614, upload-time = "2025-04-21T09:42:25.764Z" }, + { url = "https://files.pythonhosted.org/packages/c7/b7/3d7b036d5a4ed5a4c704e0754afe2eef24a824dfab08e6efbffb0f6dd36a/aiohttp-3.11.18-cp313-cp313-win32.whl", hash = "sha256:cdd1bbaf1e61f0d94aced116d6e95fe25942f7a5f42382195fd9501089db5d78", size = 411358, upload-time = "2025-04-21T09:42:27.558Z" }, + { url = "https://files.pythonhosted.org/packages/1e/3c/143831b32cd23b5263a995b2a1794e10aa42f8a895aae5074c20fda36c07/aiohttp-3.11.18-cp313-cp313-win_amd64.whl", hash = "sha256:bdd619c27e44382cf642223f11cfd4d795161362a5a1fc1fa3940397bc89db01", size = 437658, upload-time = "2025-04-21T09:42:29.209Z" }, +] + +[[package]] +name = "aiosignal" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "frozenlist" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ba/b5/6d55e80f6d8a08ce22b982eafa278d823b541c925f11ee774b0b9c43473d/aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54", size = 19424, upload-time = "2024-12-13T17:10:40.86Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/6a/bc7e17a3e87a2985d3e8f4da4cd0f481060eb78fb08596c42be62c90a4d9/aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", size = 7597, upload-time = "2024-12-13T17:10:38.469Z" }, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, +] + +[[package]] +name = "attrs" +version = "25.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032, upload-time = "2025-03-13T11:10:22.779Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload-time = "2025-03-13T11:10:21.14Z" }, +] + +[[package]] +name = "bitarray" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/17/7b/148091d4696b38a0b14ce495e64736472cc04b0757cc8b5e7846a1cf78a9/bitarray-3.4.0.tar.gz", hash = "sha256:33eee090eade2c8303bfc01a9e104fea306d330035b18b5c50a04cb0cb76f08d", size = 141279, upload-time = "2025-05-06T23:02:48.662Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/72/cb4d7c4377110aa4825c4f2971d66a856dddda229717b965ee75a5eb1845/bitarray-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ef3f2dc1a95bec2af77c8685c847d41fc0c64d7329c994b6054c54462f835401", size = 139210, upload-time = "2025-05-06T22:59:51.546Z" }, + { url = "https://files.pythonhosted.org/packages/01/74/69e2d97a9525fc06430fbc9a075fa76ce9772578e480c9cc8d3b0f041afa/bitarray-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:75df7335ed7324a1ee9002d747c36a37de42b6469601ac39fef00c6bd80a4cb4", size = 136227, upload-time = "2025-05-06T22:59:52.727Z" }, + { url = "https://files.pythonhosted.org/packages/a7/eb/fc23c954e9f67c8a7116610fd204dbfed79be98ed40221cfe668aaed13c9/bitarray-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d089a0570e2acfabac9dd40ee7bfbc36ec48ff73c9312f3e61ebf31b315d05d", size = 311845, upload-time = "2025-05-06T22:59:53.935Z" }, + { url = "https://files.pythonhosted.org/packages/51/0f/3e39f6d552bdeda7434969d53e072683297bb62abb2513ea58625408ff4c/bitarray-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:823decea26d8be2ec46000583114d050d02033f99e54e3285c0a80f31e3d7784", size = 325732, upload-time = "2025-05-06T22:59:55.715Z" }, + { url = "https://files.pythonhosted.org/packages/61/33/071d392af98a57d5539440cb60e07c1f123c181fbadf6f6789000760fd61/bitarray-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f455c100df47295ca19eb36527462fecbb2710140d92a61228df4cfdd2d7dd81", size = 319493, upload-time = "2025-05-06T22:59:57.497Z" }, + { url = "https://files.pythonhosted.org/packages/7b/a6/3f331582d8bfe6177cdc2f6a258c2fb3f074721ff0cdaf53bd706a4be6d8/bitarray-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a27456e66fae5726b2b1b9bc3ee0e2f1235bf8a353dc216d2651ad0652596657", size = 311900, upload-time = "2025-05-06T22:59:58.754Z" }, + { url = "https://files.pythonhosted.org/packages/e2/d4/19f84fc297b2e8e061ce9647793ab42a74f190b09a9635151a164b1d2d2d/bitarray-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f2c1c3d1d0109b993791755f18d4b495f02744118f8f683eed982b9c8ed8687", size = 299956, upload-time = "2025-05-06T23:00:00.471Z" }, + { url = "https://files.pythonhosted.org/packages/45/f8/0f506df3ce3a0bec5600a0bbba59dbdc061e2a9d5a0aaa5b597cf199e02b/bitarray-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6e7274cdfe405c4e70a585b997d3a8c001425c03fa37d09a8e5460828a3d8bd6", size = 305007, upload-time = "2025-05-06T23:00:02.119Z" }, + { url = "https://files.pythonhosted.org/packages/e9/32/4cfd70cfaa65d2ad437007adbf462995841abf8a626ef9a5cecce824061a/bitarray-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0330f470bdb76825d760215e01f8d60ce09d4ac84434b364e27236db5657d323", size = 296128, upload-time = "2025-05-06T23:00:03.716Z" }, + { url = "https://files.pythonhosted.org/packages/1e/7a/10ca59dab291c6289ab7fc2c75453bd7a906e4b48ecaac9635ed2ed08006/bitarray-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:013ba795deb6c54fdb0e70103fc142f97746074d2f67b4b6a8f67a17f2d03f06", size = 320568, upload-time = "2025-05-06T23:00:05.216Z" }, + { url = "https://files.pythonhosted.org/packages/08/0c/382f4bfd229e29e364bff0c3c29ffc60b865c21eeeab34f96cf731e223d5/bitarray-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5c62c2ae324c486f8e8f0482d5a8635e255da5302c44e7a5df83eee7d87e28ec", size = 325182, upload-time = "2025-05-06T23:00:07.029Z" }, + { url = "https://files.pythonhosted.org/packages/43/46/688f048fa43c95ba7f53d19837e5de96bb2d7ee641441ad5db20b5702d0f/bitarray-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:722c105dd4229b91d17804a0855e8f27519ceee99d8fd4db80bf09b507d7fb60", size = 303801, upload-time = "2025-05-06T23:00:08.416Z" }, + { url = "https://files.pythonhosted.org/packages/33/8d/4bd7db2d0415acbbe2aea7887dd17c6e38f25574c8676ed38da5919f9290/bitarray-3.4.0-cp312-cp312-win32.whl", hash = "sha256:d6895389eeebf6836cfad1b301bae9e5386e3b94a21076aaf0c2dab0524af6d1", size = 132479, upload-time = "2025-05-06T23:00:10.261Z" }, + { url = "https://files.pythonhosted.org/packages/74/e4/5499298f8a50883d0524c057befbbdf699ca9a56cfb76db85fafd0177f7a/bitarray-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:0a4bb5dd53250e3c70924fd473034cb2e741027938702d9cc319646e53091dc1", size = 139440, upload-time = "2025-05-06T23:00:11.539Z" }, + { url = "https://files.pythonhosted.org/packages/e3/19/9d6c8697e16b1a868cc3331e164b8a54c118f87384b5bfc506daa40ecff7/bitarray-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b238e48844645ac397cfc67f5c8df86d640a9b33063c82ca2393a39e48b01c15", size = 139195, upload-time = "2025-05-06T23:00:13.585Z" }, + { url = "https://files.pythonhosted.org/packages/46/eb/ae718c3787d5b57f167543eb92085656ec418bf6fab3e733cab2f285b9e3/bitarray-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4292ef2a67ff6a3811e018c7e32c3ce4fb74c2f5c85257c06222895138df86f4", size = 136212, upload-time = "2025-05-06T23:00:15.151Z" }, + { url = "https://files.pythonhosted.org/packages/64/7d/a98e9838c24361ab5e510f1b3b06c03a5756b1e947d3f9f138eec614917d/bitarray-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27bb390521ba1032b95e31683fa9aed042222fca653760d5101435c2dbf28ede", size = 311738, upload-time = "2025-05-06T23:00:16.535Z" }, + { url = "https://files.pythonhosted.org/packages/e3/41/5dc90c32ac9eb50648a8a103eb788f4b68e75f90bedf2ab7da1f556dad60/bitarray-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2984abfc4e6281e703675280edbcf7618fa6983367d1fb4822b41917e2c3490", size = 325631, upload-time = "2025-05-06T23:00:18.009Z" }, + { url = "https://files.pythonhosted.org/packages/a3/96/d136b999b25522c9f679224eb782caf4444a6b0a6d6112828830a59436e8/bitarray-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ae10e24915c7d84f5edb39d5385455b961c66e90a40b786cfcfba59f8399999e", size = 319420, upload-time = "2025-05-06T23:00:19.296Z" }, + { url = "https://files.pythonhosted.org/packages/f1/6b/8f7b9b40e2c6d3a281f658650076ba3bd4a993c460555d7fc83188a21cf5/bitarray-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5c10255889045479b86405dd040c58e77ccf4f63a0e6e686d341b5fd8fa32c2", size = 311742, upload-time = "2025-05-06T23:00:20.943Z" }, + { url = "https://files.pythonhosted.org/packages/5f/e4/e6b783745d43bd4ce3120213f14e3758d93d5a3cabfbc476b18a803b6aa6/bitarray-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d62db2fbf0a923ecbf5b71babc9deabd5ccea74d275bf74a5e37c050238d8f6a", size = 299863, upload-time = "2025-05-06T23:00:22.6Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a2/7e70a2cee6db8bc951c4bea3b646a327c859b3072ef0ae9e1f997a09ab26/bitarray-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1babc8dba17fad7409ca1cfe6ec4b89d175070f20d2c6f97f87d1c257be4aea9", size = 304969, upload-time = "2025-05-06T23:00:23.922Z" }, + { url = "https://files.pythonhosted.org/packages/c1/30/f6c7da738d9e1a87c8329670cdbd3920849bb09fca783a2952d43643fb26/bitarray-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:a7eaed4731bd84504176ba5e0af3eba7a6e66afe208d5efb6a8779b66ecd51aa", size = 296171, upload-time = "2025-05-06T23:00:25.244Z" }, + { url = "https://files.pythonhosted.org/packages/ef/e4/0e1725a53d945da593291d5f61aee840a9fccdfaadc0f0282027daff7ba3/bitarray-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:2d0b70cf75f82c919fe486af185895a77644ac3621ea8bd5b5a82fd21c03c843", size = 320575, upload-time = "2025-05-06T23:00:26.54Z" }, + { url = "https://files.pythonhosted.org/packages/f1/a0/ff073f39227c0089c1e0c50fab09524a0f1e02fb323dc142202e68c48c49/bitarray-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e1652bf956c8874c790fe78f0dcdc0de04d82ded81373759bfc05f427afd1ff3", size = 325140, upload-time = "2025-05-06T23:00:27.874Z" }, + { url = "https://files.pythonhosted.org/packages/c4/c1/0267051bbea0025da0f43e176df7695dff50ffe0a95edc4b826725418563/bitarray-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:49a41a724693b9f15ac965f548c2f68f6ff7b0ab36a29009d82e99f7d402888b", size = 303791, upload-time = "2025-05-06T23:00:29.73Z" }, + { url = "https://files.pythonhosted.org/packages/e5/a6/bcef1426a16195f96fd905c1be68905d9f6addc1cd900ccd23875922ad78/bitarray-3.4.0-cp313-cp313-win32.whl", hash = "sha256:d3c0db664bffeb4bb80b228ed31773ccb701da11f266f9d8a56732e083e2cab0", size = 132487, upload-time = "2025-05-06T23:00:31.209Z" }, + { url = "https://files.pythonhosted.org/packages/f3/18/b69e211181f90f8a3b4ef8c7022fcdf0ebe1ad5701b68f60382195f48f66/bitarray-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:340dd788dad07ad004b591925e4b906786aaefb6632ea9d9ac616913f3cafa4e", size = 139440, upload-time = "2025-05-06T23:00:32.716Z" }, +] + +[[package]] +name = "certifi" +version = "2025.4.26" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/9e/c05b3920a3b7d20d3d3310465f50348e5b3694f4f88c6daf736eef3024c4/certifi-2025.4.26.tar.gz", hash = "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", size = 160705, upload-time = "2025-04-26T02:12:29.51Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4a/7e/3db2bd1b1f9e95f7cddca6d6e75e2f2bd9f51b1246e546d88addca0106bd/certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3", size = 159618, upload-time = "2025-04-26T02:12:27.662Z" }, +] + +[[package]] +name = "cfgv" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114, upload-time = "2023-08-12T20:38:17.776Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249, upload-time = "2023-08-12T20:38:16.269Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367, upload-time = "2025-05-02T08:34:42.01Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/a4/37f4d6035c89cac7930395a35cc0f1b872e652eaafb76a6075943754f095/charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", size = 199936, upload-time = "2025-05-02T08:32:33.712Z" }, + { url = "https://files.pythonhosted.org/packages/ee/8a/1a5e33b73e0d9287274f899d967907cd0bf9c343e651755d9307e0dbf2b3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", size = 143790, upload-time = "2025-05-02T08:32:35.768Z" }, + { url = "https://files.pythonhosted.org/packages/66/52/59521f1d8e6ab1482164fa21409c5ef44da3e9f653c13ba71becdd98dec3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", size = 153924, upload-time = "2025-05-02T08:32:37.284Z" }, + { url = "https://files.pythonhosted.org/packages/86/2d/fb55fdf41964ec782febbf33cb64be480a6b8f16ded2dbe8db27a405c09f/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", size = 146626, upload-time = "2025-05-02T08:32:38.803Z" }, + { url = "https://files.pythonhosted.org/packages/8c/73/6ede2ec59bce19b3edf4209d70004253ec5f4e319f9a2e3f2f15601ed5f7/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", size = 148567, upload-time = "2025-05-02T08:32:40.251Z" }, + { url = "https://files.pythonhosted.org/packages/09/14/957d03c6dc343c04904530b6bef4e5efae5ec7d7990a7cbb868e4595ee30/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", size = 150957, upload-time = "2025-05-02T08:32:41.705Z" }, + { url = "https://files.pythonhosted.org/packages/0d/c8/8174d0e5c10ccebdcb1b53cc959591c4c722a3ad92461a273e86b9f5a302/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", size = 145408, upload-time = "2025-05-02T08:32:43.709Z" }, + { url = "https://files.pythonhosted.org/packages/58/aa/8904b84bc8084ac19dc52feb4f5952c6df03ffb460a887b42615ee1382e8/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", size = 153399, upload-time = "2025-05-02T08:32:46.197Z" }, + { url = "https://files.pythonhosted.org/packages/c2/26/89ee1f0e264d201cb65cf054aca6038c03b1a0c6b4ae998070392a3ce605/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", size = 156815, upload-time = "2025-05-02T08:32:48.105Z" }, + { url = "https://files.pythonhosted.org/packages/fd/07/68e95b4b345bad3dbbd3a8681737b4338ff2c9df29856a6d6d23ac4c73cb/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", size = 154537, upload-time = "2025-05-02T08:32:49.719Z" }, + { url = "https://files.pythonhosted.org/packages/77/1a/5eefc0ce04affb98af07bc05f3bac9094513c0e23b0562d64af46a06aae4/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", size = 149565, upload-time = "2025-05-02T08:32:51.404Z" }, + { url = "https://files.pythonhosted.org/packages/37/a0/2410e5e6032a174c95e0806b1a6585eb21e12f445ebe239fac441995226a/charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", size = 98357, upload-time = "2025-05-02T08:32:53.079Z" }, + { url = "https://files.pythonhosted.org/packages/6c/4f/c02d5c493967af3eda9c771ad4d2bbc8df6f99ddbeb37ceea6e8716a32bc/charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", size = 105776, upload-time = "2025-05-02T08:32:54.573Z" }, + { url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622, upload-time = "2025-05-02T08:32:56.363Z" }, + { url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435, upload-time = "2025-05-02T08:32:58.551Z" }, + { url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653, upload-time = "2025-05-02T08:33:00.342Z" }, + { url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231, upload-time = "2025-05-02T08:33:02.081Z" }, + { url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243, upload-time = "2025-05-02T08:33:04.063Z" }, + { url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442, upload-time = "2025-05-02T08:33:06.418Z" }, + { url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147, upload-time = "2025-05-02T08:33:08.183Z" }, + { url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057, upload-time = "2025-05-02T08:33:09.986Z" }, + { url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454, upload-time = "2025-05-02T08:33:11.814Z" }, + { url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174, upload-time = "2025-05-02T08:33:13.707Z" }, + { url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166, upload-time = "2025-05-02T08:33:15.458Z" }, + { url = "https://files.pythonhosted.org/packages/44/96/392abd49b094d30b91d9fbda6a69519e95802250b777841cf3bda8fe136c/charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", size = 98064, upload-time = "2025-05-02T08:33:17.06Z" }, + { url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", size = 105641, upload-time = "2025-05-02T08:33:18.753Z" }, + { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626, upload-time = "2025-05-02T08:34:40.053Z" }, +] + +[[package]] +name = "ckzg" +version = "2.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/55/df/f6db8e83bd4594c1ea685cd37fb81d5399e55765aae16d1a8a9502598f4e/ckzg-2.1.1.tar.gz", hash = "sha256:d6b306b7ec93a24e4346aa53d07f7f75053bc0afc7398e35fa649e5f9d48fcc4", size = 1120500, upload-time = "2025-03-31T21:24:12.324Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/a1/9c07513dd0ea01e5db727e67bd2660f3b300a4511281cdb8d5e04afa1cfd/ckzg-2.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c60e8903344ce98ce036f0fabacce952abb714cad4607198b2f0961c28b8aa72", size = 116421, upload-time = "2025-03-31T21:22:46.434Z" }, + { url = "https://files.pythonhosted.org/packages/27/04/b69a0dfbb2722a14c98a52973f276679151ec56a14178cb48e6f2e1697bc/ckzg-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4299149dd72448e5a8d2d1cc6cc7472c92fc9d9f00b1377f5b017c089d9cd92", size = 100216, upload-time = "2025-03-31T21:22:47.633Z" }, + { url = "https://files.pythonhosted.org/packages/2e/24/9cc850d0b8ead395ad5064de67c7c91adacaf31b6b35292ab53fbd93270b/ckzg-2.1.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:025dd31ffdcc799f3ff842570a2a6683b6c5b01567da0109c0c05d11768729c4", size = 175764, upload-time = "2025-03-31T21:22:48.768Z" }, + { url = "https://files.pythonhosted.org/packages/c0/c1/eb13ba399082a98b932f10b230ec08e6456051c0ce3886b3f6d8548d11ab/ckzg-2.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b42ab8385c273f40a693657c09d2bba40cb4f4666141e263906ba2e519e80bd", size = 161885, upload-time = "2025-03-31T21:22:50.05Z" }, + { url = "https://files.pythonhosted.org/packages/57/c7/58baa64199781950c5a8c6139a46e1acff0f057a36e56769817400eb87fb/ckzg-2.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1be3890fc1543f4fcfc0063e4baf5c036eb14bcf736dabdc6171ab017e0f1671", size = 170757, upload-time = "2025-03-31T21:22:51.282Z" }, + { url = "https://files.pythonhosted.org/packages/65/bd/4b8e1c70972c98829371b7004dc750a45268c5d3442d602e1b62f13ca867/ckzg-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b754210ded172968b201e2d7252573af6bf52d6ad127ddd13d0b9a45a51dae7b", size = 173761, upload-time = "2025-03-31T21:22:52.6Z" }, + { url = "https://files.pythonhosted.org/packages/1f/32/c3fd1002f97ba3e0c5b1d9ab2c8fb7a6f475fa9b80ed9c4fa55975501a54/ckzg-2.1.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b2f8fda87865897a269c4e951e3826c2e814427a6cdfed6731cccfe548f12b36", size = 188666, upload-time = "2025-03-31T21:22:53.47Z" }, + { url = "https://files.pythonhosted.org/packages/e2/d9/91cf5a8169ee60c9397c975163cbca34432571f94facec5f8c0086bb47d8/ckzg-2.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:98e70b5923d77c7359432490145e9d1ab0bf873eb5de56ec53f4a551d7eaec79", size = 183652, upload-time = "2025-03-31T21:22:54.351Z" }, + { url = "https://files.pythonhosted.org/packages/25/d4/8c9f6b852f99926862344b29f0c59681916ccfec2ac60a85952a369e0bca/ckzg-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:42af7bde4ca45469cd93a96c3d15d69d51d40e7f0d30e3a20711ebd639465fcb", size = 98816, upload-time = "2025-03-31T21:22:55.23Z" }, + { url = "https://files.pythonhosted.org/packages/b7/9a/fa698b12e97452d11dd314e0335aae759725284ef6e1c1665aed56b1cd3e/ckzg-2.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7e4edfdaf87825ff43b9885fabfdea408737a714f4ce5467100d9d1d0a03b673", size = 116426, upload-time = "2025-03-31T21:22:56.108Z" }, + { url = "https://files.pythonhosted.org/packages/a1/a6/8cccd308bd11b49b40eecad6900b5769da117951cac33e880dd25e851ef7/ckzg-2.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:815fd2a87d6d6c57d669fda30c150bc9bf387d47e67d84535aa42b909fdc28ea", size = 100219, upload-time = "2025-03-31T21:22:56.982Z" }, + { url = "https://files.pythonhosted.org/packages/30/0e/63573d816c1292b9a4d70eb6a7366b3593d29a977794039e926805a76ca0/ckzg-2.1.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c32466e809b1ab3ff01d3b0bb0b9912f61dcf72957885615595f75e3f7cc10e5", size = 175725, upload-time = "2025-03-31T21:22:58.213Z" }, + { url = "https://files.pythonhosted.org/packages/86/f6/a279609516695ad3fb8b201098c669ba3b2844cbf4fa0d83a0f02b9bb29b/ckzg-2.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f11b73ccf37b12993f39a7dbace159c6d580aacacde6ee17282848476550ddbc", size = 161835, upload-time = "2025-03-31T21:22:59.448Z" }, + { url = "https://files.pythonhosted.org/packages/39/e4/8cf7aef7dc05a777cb221e94046f947c6fe5317159a8dae2cd7090d52ef2/ckzg-2.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de3b9433a1f2604bd9ac1646d3c83ad84a850d454d3ac589fe8e70c94b38a6b0", size = 170759, upload-time = "2025-03-31T21:23:01.022Z" }, + { url = "https://files.pythonhosted.org/packages/0b/17/b34e3c08eb36bc67e338b114f289b2595e581b8bdc09a8f12299a1db5d2f/ckzg-2.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b7d7e1b5ea06234558cd95c483666fd785a629b720a7f1622b3cbffebdc62033", size = 173787, upload-time = "2025-03-31T21:23:01.974Z" }, + { url = "https://files.pythonhosted.org/packages/2e/f0/aff87c3ed80713453cb6c84fe6fbb7582d86a7a5e4460fda2a497d47f489/ckzg-2.1.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9f5556e6675866040cc4335907be6c537051e7f668da289fa660fdd8a30c9ddb", size = 188722, upload-time = "2025-03-31T21:23:02.966Z" }, + { url = "https://files.pythonhosted.org/packages/44/d9/1f08bfb8fd1cbb8c7513e7ad3fb76bbb5c3fb446238c1eba582276e4d905/ckzg-2.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:55b2ba30c5c9daac0c55f1aac851f1b7bf1f7aa0028c2db4440e963dd5b866d6", size = 183686, upload-time = "2025-03-31T21:23:03.905Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ff/434f6d2893cbdfad00c20d17e9a52d426ca042f5e980d5c3db96bc6b6e15/ckzg-2.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:10d201601fc8f28c0e8cec3406676797024dd374c367bbeec5a7a9eac9147237", size = 98817, upload-time = "2025-03-31T21:23:05.2Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "coverage" +version = "7.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/19/4f/2251e65033ed2ce1e68f00f91a0294e0f80c80ae8c3ebbe2f12828c4cd53/coverage-7.8.0.tar.gz", hash = "sha256:7a3d62b3b03b4b6fd41a085f3574874cf946cb4604d2b4d3e8dca8cd570ca501", size = 811872, upload-time = "2025-03-30T20:36:45.376Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/aa/12/4792669473297f7973518bec373a955e267deb4339286f882439b8535b39/coverage-7.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bbb5cc845a0292e0c520656d19d7ce40e18d0e19b22cb3e0409135a575bf79fc", size = 211684, upload-time = "2025-03-30T20:35:29.959Z" }, + { url = "https://files.pythonhosted.org/packages/be/e1/2a4ec273894000ebedd789e8f2fc3813fcaf486074f87fd1c5b2cb1c0a2b/coverage-7.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4dfd9a93db9e78666d178d4f08a5408aa3f2474ad4d0e0378ed5f2ef71640cb6", size = 211935, upload-time = "2025-03-30T20:35:31.912Z" }, + { url = "https://files.pythonhosted.org/packages/f8/3a/7b14f6e4372786709a361729164125f6b7caf4024ce02e596c4a69bccb89/coverage-7.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f017a61399f13aa6d1039f75cd467be388d157cd81f1a119b9d9a68ba6f2830d", size = 245994, upload-time = "2025-03-30T20:35:33.455Z" }, + { url = "https://files.pythonhosted.org/packages/54/80/039cc7f1f81dcbd01ea796d36d3797e60c106077e31fd1f526b85337d6a1/coverage-7.8.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0915742f4c82208ebf47a2b154a5334155ed9ef9fe6190674b8a46c2fb89cb05", size = 242885, upload-time = "2025-03-30T20:35:35.354Z" }, + { url = "https://files.pythonhosted.org/packages/10/e0/dc8355f992b6cc2f9dcd5ef6242b62a3f73264893bc09fbb08bfcab18eb4/coverage-7.8.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a40fcf208e021eb14b0fac6bdb045c0e0cab53105f93ba0d03fd934c956143a", size = 245142, upload-time = "2025-03-30T20:35:37.121Z" }, + { url = "https://files.pythonhosted.org/packages/43/1b/33e313b22cf50f652becb94c6e7dae25d8f02e52e44db37a82de9ac357e8/coverage-7.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a1f406a8e0995d654b2ad87c62caf6befa767885301f3b8f6f73e6f3c31ec3a6", size = 244906, upload-time = "2025-03-30T20:35:39.07Z" }, + { url = "https://files.pythonhosted.org/packages/05/08/c0a8048e942e7f918764ccc99503e2bccffba1c42568693ce6955860365e/coverage-7.8.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:77af0f6447a582fdc7de5e06fa3757a3ef87769fbb0fdbdeba78c23049140a47", size = 243124, upload-time = "2025-03-30T20:35:40.598Z" }, + { url = "https://files.pythonhosted.org/packages/5b/62/ea625b30623083c2aad645c9a6288ad9fc83d570f9adb913a2abdba562dd/coverage-7.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f2d32f95922927186c6dbc8bc60df0d186b6edb828d299ab10898ef3f40052fe", size = 244317, upload-time = "2025-03-30T20:35:42.204Z" }, + { url = "https://files.pythonhosted.org/packages/62/cb/3871f13ee1130a6c8f020e2f71d9ed269e1e2124aa3374d2180ee451cee9/coverage-7.8.0-cp312-cp312-win32.whl", hash = "sha256:769773614e676f9d8e8a0980dd7740f09a6ea386d0f383db6821df07d0f08545", size = 214170, upload-time = "2025-03-30T20:35:44.216Z" }, + { url = "https://files.pythonhosted.org/packages/88/26/69fe1193ab0bfa1eb7a7c0149a066123611baba029ebb448500abd8143f9/coverage-7.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:e5d2b9be5b0693cf21eb4ce0ec8d211efb43966f6657807f6859aab3814f946b", size = 214969, upload-time = "2025-03-30T20:35:45.797Z" }, + { url = "https://files.pythonhosted.org/packages/f3/21/87e9b97b568e223f3438d93072479c2f36cc9b3f6b9f7094b9d50232acc0/coverage-7.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ac46d0c2dd5820ce93943a501ac5f6548ea81594777ca585bf002aa8854cacd", size = 211708, upload-time = "2025-03-30T20:35:47.417Z" }, + { url = "https://files.pythonhosted.org/packages/75/be/882d08b28a0d19c9c4c2e8a1c6ebe1f79c9c839eb46d4fca3bd3b34562b9/coverage-7.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:771eb7587a0563ca5bb6f622b9ed7f9d07bd08900f7589b4febff05f469bea00", size = 211981, upload-time = "2025-03-30T20:35:49.002Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1d/ce99612ebd58082fbe3f8c66f6d8d5694976c76a0d474503fa70633ec77f/coverage-7.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42421e04069fb2cbcbca5a696c4050b84a43b05392679d4068acbe65449b5c64", size = 245495, upload-time = "2025-03-30T20:35:51.073Z" }, + { url = "https://files.pythonhosted.org/packages/dc/8d/6115abe97df98db6b2bd76aae395fcc941d039a7acd25f741312ced9a78f/coverage-7.8.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:554fec1199d93ab30adaa751db68acec2b41c5602ac944bb19187cb9a41a8067", size = 242538, upload-time = "2025-03-30T20:35:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/cb/74/2f8cc196643b15bc096d60e073691dadb3dca48418f08bc78dd6e899383e/coverage-7.8.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aaeb00761f985007b38cf463b1d160a14a22c34eb3f6a39d9ad6fc27cb73008", size = 244561, upload-time = "2025-03-30T20:35:54.658Z" }, + { url = "https://files.pythonhosted.org/packages/22/70/c10c77cd77970ac965734fe3419f2c98665f6e982744a9bfb0e749d298f4/coverage-7.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:581a40c7b94921fffd6457ffe532259813fc68eb2bdda60fa8cc343414ce3733", size = 244633, upload-time = "2025-03-30T20:35:56.221Z" }, + { url = "https://files.pythonhosted.org/packages/38/5a/4f7569d946a07c952688debee18c2bb9ab24f88027e3d71fd25dbc2f9dca/coverage-7.8.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f319bae0321bc838e205bf9e5bc28f0a3165f30c203b610f17ab5552cff90323", size = 242712, upload-time = "2025-03-30T20:35:57.801Z" }, + { url = "https://files.pythonhosted.org/packages/bb/a1/03a43b33f50475a632a91ea8c127f7e35e53786dbe6781c25f19fd5a65f8/coverage-7.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:04bfec25a8ef1c5f41f5e7e5c842f6b615599ca8ba8391ec33a9290d9d2db3a3", size = 244000, upload-time = "2025-03-30T20:35:59.378Z" }, + { url = "https://files.pythonhosted.org/packages/6a/89/ab6c43b1788a3128e4d1b7b54214548dcad75a621f9d277b14d16a80d8a1/coverage-7.8.0-cp313-cp313-win32.whl", hash = "sha256:dd19608788b50eed889e13a5d71d832edc34fc9dfce606f66e8f9f917eef910d", size = 214195, upload-time = "2025-03-30T20:36:01.005Z" }, + { url = "https://files.pythonhosted.org/packages/12/12/6bf5f9a8b063d116bac536a7fb594fc35cb04981654cccb4bbfea5dcdfa0/coverage-7.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:a9abbccd778d98e9c7e85038e35e91e67f5b520776781d9a1e2ee9d400869487", size = 214998, upload-time = "2025-03-30T20:36:03.006Z" }, + { url = "https://files.pythonhosted.org/packages/2a/e6/1e9df74ef7a1c983a9c7443dac8aac37a46f1939ae3499424622e72a6f78/coverage-7.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:18c5ae6d061ad5b3e7eef4363fb27a0576012a7447af48be6c75b88494c6cf25", size = 212541, upload-time = "2025-03-30T20:36:04.638Z" }, + { url = "https://files.pythonhosted.org/packages/04/51/c32174edb7ee49744e2e81c4b1414ac9df3dacfcb5b5f273b7f285ad43f6/coverage-7.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:95aa6ae391a22bbbce1b77ddac846c98c5473de0372ba5c463480043a07bff42", size = 212767, upload-time = "2025-03-30T20:36:06.503Z" }, + { url = "https://files.pythonhosted.org/packages/e9/8f/f454cbdb5212f13f29d4a7983db69169f1937e869a5142bce983ded52162/coverage-7.8.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e013b07ba1c748dacc2a80e69a46286ff145935f260eb8c72df7185bf048f502", size = 256997, upload-time = "2025-03-30T20:36:08.137Z" }, + { url = "https://files.pythonhosted.org/packages/e6/74/2bf9e78b321216d6ee90a81e5c22f912fc428442c830c4077b4a071db66f/coverage-7.8.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d766a4f0e5aa1ba056ec3496243150698dc0481902e2b8559314368717be82b1", size = 252708, upload-time = "2025-03-30T20:36:09.781Z" }, + { url = "https://files.pythonhosted.org/packages/92/4d/50d7eb1e9a6062bee6e2f92e78b0998848a972e9afad349b6cdde6fa9e32/coverage-7.8.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad80e6b4a0c3cb6f10f29ae4c60e991f424e6b14219d46f1e7d442b938ee68a4", size = 255046, upload-time = "2025-03-30T20:36:11.409Z" }, + { url = "https://files.pythonhosted.org/packages/40/9e/71fb4e7402a07c4198ab44fc564d09d7d0ffca46a9fb7b0a7b929e7641bd/coverage-7.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b87eb6fc9e1bb8f98892a2458781348fa37e6925f35bb6ceb9d4afd54ba36c73", size = 256139, upload-time = "2025-03-30T20:36:13.86Z" }, + { url = "https://files.pythonhosted.org/packages/49/1a/78d37f7a42b5beff027e807c2843185961fdae7fe23aad5a4837c93f9d25/coverage-7.8.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d1ba00ae33be84066cfbe7361d4e04dec78445b2b88bdb734d0d1cbab916025a", size = 254307, upload-time = "2025-03-30T20:36:16.074Z" }, + { url = "https://files.pythonhosted.org/packages/58/e9/8fb8e0ff6bef5e170ee19d59ca694f9001b2ec085dc99b4f65c128bb3f9a/coverage-7.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f3c38e4e5ccbdc9198aecc766cedbb134b2d89bf64533973678dfcf07effd883", size = 255116, upload-time = "2025-03-30T20:36:18.033Z" }, + { url = "https://files.pythonhosted.org/packages/56/b0/d968ecdbe6fe0a863de7169bbe9e8a476868959f3af24981f6a10d2b6924/coverage-7.8.0-cp313-cp313t-win32.whl", hash = "sha256:379fe315e206b14e21db5240f89dc0774bdd3e25c3c58c2c733c99eca96f1ada", size = 214909, upload-time = "2025-03-30T20:36:19.644Z" }, + { url = "https://files.pythonhosted.org/packages/87/e9/d6b7ef9fecf42dfb418d93544af47c940aa83056c49e6021a564aafbc91f/coverage-7.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2e4b6b87bb0c846a9315e3ab4be2d52fac905100565f4b92f02c445c8799e257", size = 216068, upload-time = "2025-03-30T20:36:21.282Z" }, + { url = "https://files.pythonhosted.org/packages/59/f1/4da7717f0063a222db253e7121bd6a56f6fb1ba439dcc36659088793347c/coverage-7.8.0-py3-none-any.whl", hash = "sha256:dbf364b4c5e7bae9250528167dfe40219b62e2d573c854d74be213e1e52069f7", size = 203435, upload-time = "2025-03-30T20:36:43.61Z" }, +] + +[[package]] +name = "cytoolz" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "toolz", marker = "implementation_name == 'cpython'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a7/f9/3243eed3a6545c2a33a21f74f655e3fcb5d2192613cd3db81a93369eb339/cytoolz-1.0.1.tar.gz", hash = "sha256:89cc3161b89e1bb3ed7636f74ed2e55984fd35516904fc878cae216e42b2c7d6", size = 626652, upload-time = "2024-12-13T05:47:36.672Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d8/e8/218098344ed2cb5f8441fade9b2428e435e7073962374a9c71e59ac141a7/cytoolz-1.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fcb8f7d0d65db1269022e7e0428471edee8c937bc288ebdcb72f13eaa67c2fe4", size = 414121, upload-time = "2024-12-13T05:45:26.588Z" }, + { url = "https://files.pythonhosted.org/packages/de/27/4d729a5653718109262b758fec1a959aa9facb74c15460d9074dc76d6635/cytoolz-1.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:207d4e4b445e087e65556196ff472ff134370d9a275d591724142e255f384662", size = 390904, upload-time = "2024-12-13T05:45:27.718Z" }, + { url = "https://files.pythonhosted.org/packages/72/c0/cbabfa788bab9c6038953bf9478adaec06e88903a726946ea7c88092f5c4/cytoolz-1.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21cdf6bac6fd843f3b20280a66fd8df20dea4c58eb7214a2cd8957ec176f0bb3", size = 2090734, upload-time = "2024-12-13T05:45:30.515Z" }, + { url = "https://files.pythonhosted.org/packages/c3/66/369262c60f9423c2da82a60864a259c852f1aa122aced4acd2c679af58c0/cytoolz-1.0.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a55ec098036c0dea9f3bdc021f8acd9d105a945227d0811589f0573f21c9ce1", size = 2155933, upload-time = "2024-12-13T05:45:32.721Z" }, + { url = "https://files.pythonhosted.org/packages/aa/4e/ee55186802f8d24b5fbf9a11405ccd1203b30eded07cc17750618219b94e/cytoolz-1.0.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a13ab79ff4ce202e03ab646a2134696988b554b6dc4b71451e948403db1331d8", size = 2171903, upload-time = "2024-12-13T05:45:34.205Z" }, + { url = "https://files.pythonhosted.org/packages/a1/96/bd1a9f3396e9b7f618db8cd08d15630769ce3c8b7d0534f92cd639c977ae/cytoolz-1.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e2d944799026e1ff08a83241f1027a2d9276c41f7a74224cd98b7df6e03957d", size = 2125270, upload-time = "2024-12-13T05:45:36.982Z" }, + { url = "https://files.pythonhosted.org/packages/28/48/2a3762873091c88a69e161111cfbc6c222ff145d57ff011a642b169f04f1/cytoolz-1.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88ba85834cd523b91fdf10325e1e6d71c798de36ea9bdc187ca7bd146420de6f", size = 1973967, upload-time = "2024-12-13T05:45:39.505Z" }, + { url = "https://files.pythonhosted.org/packages/e4/50/500bd69774bdc49a4d78ec8779eb6ac7c1a9d706bfd91cf2a1dba604373a/cytoolz-1.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a750b1af7e8bf6727f588940b690d69e25dc47cce5ce467925a76561317eaf7", size = 2021695, upload-time = "2024-12-13T05:45:40.911Z" }, + { url = "https://files.pythonhosted.org/packages/e4/4e/ba5a0ce34869495eb50653de8d676847490cf13a2cac1760fc4d313e78de/cytoolz-1.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:44a71870f7eae31d263d08b87da7c2bf1176f78892ed8bdade2c2850478cb126", size = 2010177, upload-time = "2024-12-13T05:45:42.48Z" }, + { url = "https://files.pythonhosted.org/packages/87/57/615c630b3089a13adb15351d958d227430cf624f03b1dd39eb52c34c1f59/cytoolz-1.0.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c8231b9abbd8e368e036f4cc2e16902c9482d4cf9e02a6147ed0e9a3cd4a9ab0", size = 2154321, upload-time = "2024-12-13T05:45:43.979Z" }, + { url = "https://files.pythonhosted.org/packages/7f/0f/fe1aa2d931e3b35ecc05215bd75da945ea7346095b3b6f6027164e602d5a/cytoolz-1.0.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:aa87599ccc755de5a096a4d6c34984de6cd9dc928a0c5eaa7607457317aeaf9b", size = 2188374, upload-time = "2024-12-13T05:45:46.783Z" }, + { url = "https://files.pythonhosted.org/packages/de/fa/fd363d97a641b6d0e2fd1d5c35b8fd41d9ccaeb4df56302f53bf23a58e3a/cytoolz-1.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:67cd16537df51baabde3baa770ab7b8d16839c4d21219d5b96ac59fb012ebd2d", size = 2077911, upload-time = "2024-12-13T05:45:48.219Z" }, + { url = "https://files.pythonhosted.org/packages/d9/68/0a22946b98ae5201b54ccb4e651295285c0fb79406022b6ee8b2f791940c/cytoolz-1.0.1-cp312-cp312-win32.whl", hash = "sha256:fb988c333f05ee30ad4693fe4da55d95ec0bb05775d2b60191236493ea2e01f9", size = 321903, upload-time = "2024-12-13T05:45:50.3Z" }, + { url = "https://files.pythonhosted.org/packages/62/1a/f3903197956055032f8cb297342e2dff07e50f83991aebfe5b4c4fcb55e4/cytoolz-1.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:8f89c48d8e5aec55ffd566a8ec858706d70ed0c6a50228eca30986bfa5b4da8b", size = 364490, upload-time = "2024-12-13T05:45:51.494Z" }, + { url = "https://files.pythonhosted.org/packages/aa/2e/a9f069db0107749e9e72baf6c21abe3f006841a3bcfdc9b8420e22ef31eb/cytoolz-1.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6944bb93b287032a4c5ca6879b69bcd07df46f3079cf8393958cf0b0454f50c0", size = 407365, upload-time = "2024-12-13T05:45:52.803Z" }, + { url = "https://files.pythonhosted.org/packages/a9/9b/5e87dd0e31f54c778b4f9f34cc14c1162d3096c8d746b0f8be97d70dd73c/cytoolz-1.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e027260fd2fc5cb041277158ac294fc13dca640714527219f702fb459a59823a", size = 385233, upload-time = "2024-12-13T05:45:53.994Z" }, + { url = "https://files.pythonhosted.org/packages/63/00/2fd32b16284cdb97cfe092822179bc0c3bcdd5e927dd39f986169a517642/cytoolz-1.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88662c0e07250d26f5af9bc95911e6137e124a5c1ec2ce4a5d74de96718ab242", size = 2062903, upload-time = "2024-12-13T05:45:55.202Z" }, + { url = "https://files.pythonhosted.org/packages/85/39/b3cbb5a9847ba59584a263772ad4f8ca2dbfd2a0e11efd09211d1219804c/cytoolz-1.0.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:309dffa78b0961b4c0cf55674b828fbbc793cf2d816277a5c8293c0c16155296", size = 2139517, upload-time = "2024-12-13T05:45:56.804Z" }, + { url = "https://files.pythonhosted.org/packages/ea/39/bfcab4a46d50c467e36fe704f19d8904efead417787806ee210327f68390/cytoolz-1.0.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:edb34246e6eb40343c5860fc51b24937698e4fa1ee415917a73ad772a9a1746b", size = 2154849, upload-time = "2024-12-13T05:45:58.814Z" }, + { url = "https://files.pythonhosted.org/packages/fd/42/3bc6ee61b0aa47e1cb40819adc1a456d7efa809f0dea9faddacb43fdde8f/cytoolz-1.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a54da7a8e4348a18d45d4d5bc84af6c716d7f131113a4f1cc45569d37edff1b", size = 2102302, upload-time = "2024-12-13T05:46:00.181Z" }, + { url = "https://files.pythonhosted.org/packages/00/66/3f636c6ddea7b18026b90a8c238af472e423b86e427b11df02213689b012/cytoolz-1.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:241c679c3b1913c0f7259cf1d9639bed5084c86d0051641d537a0980548aa266", size = 1960872, upload-time = "2024-12-13T05:46:01.612Z" }, + { url = "https://files.pythonhosted.org/packages/40/36/cb3b7cdd651007b69f9c48e9d104cec7cb8dc53afa1d6a720e5ad08022fa/cytoolz-1.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5bfc860251a8f280ac79696fc3343cfc3a7c30b94199e0240b6c9e5b6b01a2a5", size = 2014430, upload-time = "2024-12-13T05:46:03.022Z" }, + { url = "https://files.pythonhosted.org/packages/88/3f/2e9bd2a16cfd269808922147551dcb2d8b68ba54a2c4deca2fa6a6cd0d5f/cytoolz-1.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c8edd1547014050c1bdad3ff85d25c82bd1c2a3c96830c6181521eb78b9a42b3", size = 2003127, upload-time = "2024-12-13T05:46:04.401Z" }, + { url = "https://files.pythonhosted.org/packages/c4/7d/08604ff940aa784df8343c387fdf2489b948b714a6afb587775ae94da912/cytoolz-1.0.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b349bf6162e8de215403d7f35f8a9b4b1853dc2a48e6e1a609a5b1a16868b296", size = 2142369, upload-time = "2024-12-13T05:46:06.004Z" }, + { url = "https://files.pythonhosted.org/packages/d2/c6/39919a0645bdbdf720e97cae107f959ea9d1267fbc3b0d94fc6e1d12ac8f/cytoolz-1.0.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:1b18b35256219b6c3dd0fa037741b85d0bea39c552eab0775816e85a52834140", size = 2180427, upload-time = "2024-12-13T05:46:07.526Z" }, + { url = "https://files.pythonhosted.org/packages/d8/03/dbb9d47556ee54337e7e0ac209d17ceff2d2a197c34de08005abc7a7449b/cytoolz-1.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:738b2350f340ff8af883eb301054eb724997f795d20d90daec7911c389d61581", size = 2069785, upload-time = "2024-12-13T05:46:10.122Z" }, + { url = "https://files.pythonhosted.org/packages/ea/f8/11bb7b8947002231faae3ec2342df5896afbc19eb783a332cce6d219ff79/cytoolz-1.0.1-cp313-cp313-win32.whl", hash = "sha256:9cbd9c103df54fcca42be55ef40e7baea624ac30ee0b8bf1149f21146d1078d9", size = 320685, upload-time = "2024-12-13T05:46:11.553Z" }, + { url = "https://files.pythonhosted.org/packages/40/eb/dde173cf2357084ca9423950be1f2f11ab11d65d8bd30165bfb8fd4213e9/cytoolz-1.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:90e577e08d3a4308186d9e1ec06876d4756b1e8164b92971c69739ea17e15297", size = 362898, upload-time = "2024-12-13T05:46:12.771Z" }, +] + +[[package]] +name = "distlib" +version = "0.3.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0d/dd/1bec4c5ddb504ca60fc29472f3d27e8d4da1257a854e1d96742f15c1d02d/distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403", size = 613923, upload-time = "2024-10-09T18:35:47.551Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", size = 468973, upload-time = "2024-10-09T18:35:44.272Z" }, +] + +[[package]] +name = "eth-abi" +version = "5.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "eth-typing" }, + { name = "eth-utils" }, + { name = "parsimonious" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/00/71/d9e1380bd77fd22f98b534699af564f189b56d539cc2b9dab908d4e4c242/eth_abi-5.2.0.tar.gz", hash = "sha256:178703fa98c07d8eecd5ae569e7e8d159e493ebb6eeb534a8fe973fbc4e40ef0", size = 49797, upload-time = "2025-01-14T16:29:34.629Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/b4/2f3982c4cbcbf5eeb6aec62df1533c0e63c653b3021ff338d44944405676/eth_abi-5.2.0-py3-none-any.whl", hash = "sha256:17abe47560ad753f18054f5b3089fcb588f3e3a092136a416b6c1502cb7e8877", size = 28511, upload-time = "2025-01-14T16:29:31.862Z" }, +] + +[[package]] +name = "eth-account" +version = "0.13.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "bitarray" }, + { name = "ckzg" }, + { name = "eth-abi" }, + { name = "eth-keyfile" }, + { name = "eth-keys" }, + { name = "eth-rlp" }, + { name = "eth-utils" }, + { name = "hexbytes" }, + { name = "pydantic" }, + { name = "rlp" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/74/cf/20f76a29be97339c969fd765f1237154286a565a1d61be98e76bb7af946a/eth_account-0.13.7.tar.gz", hash = "sha256:5853ecbcbb22e65411176f121f5f24b8afeeaf13492359d254b16d8b18c77a46", size = 935998, upload-time = "2025-04-21T21:11:21.204Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/18/088fb250018cbe665bc2111974301b2d59f294a565aff7564c4df6878da2/eth_account-0.13.7-py3-none-any.whl", hash = "sha256:39727de8c94d004ff61d10da7587509c04d2dc7eac71e04830135300bdfc6d24", size = 587452, upload-time = "2025-04-21T21:11:18.346Z" }, +] + +[[package]] +name = "eth-hash" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/38/577b7bc9380ef9dff0f1dffefe0c9a1ded2385e7a06c306fd95afb6f9451/eth_hash-0.7.1.tar.gz", hash = "sha256:d2411a403a0b0a62e8247b4117932d900ffb4c8c64b15f92620547ca5ce46be5", size = 12227, upload-time = "2025-01-13T21:29:21.765Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/db/f8775490669d28aca24871c67dd56b3e72105cb3bcae9a4ec65dd70859b3/eth_hash-0.7.1-py3-none-any.whl", hash = "sha256:0fb1add2adf99ef28883fd6228eb447ef519ea72933535ad1a0b28c6f65f868a", size = 8028, upload-time = "2025-01-13T21:29:19.365Z" }, +] + +[package.optional-dependencies] +pycryptodome = [ + { name = "pycryptodome" }, +] + +[[package]] +name = "eth-keyfile" +version = "0.8.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "eth-keys" }, + { name = "eth-utils" }, + { name = "pycryptodome" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/35/66/dd823b1537befefbbff602e2ada88f1477c5b40ec3731e3d9bc676c5f716/eth_keyfile-0.8.1.tar.gz", hash = "sha256:9708bc31f386b52cca0969238ff35b1ac72bd7a7186f2a84b86110d3c973bec1", size = 12267, upload-time = "2024-04-23T20:28:53.862Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/fc/48a586175f847dd9e05e5b8994d2fe8336098781ec2e9836a2ad94280281/eth_keyfile-0.8.1-py3-none-any.whl", hash = "sha256:65387378b82fe7e86d7cb9f8d98e6d639142661b2f6f490629da09fddbef6d64", size = 7510, upload-time = "2024-04-23T20:28:51.063Z" }, +] + +[[package]] +name = "eth-keys" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "eth-typing" }, + { name = "eth-utils" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/11/1ed831c50bd74f57829aa06e58bd82a809c37e070ee501c953b9ac1f1552/eth_keys-0.7.0.tar.gz", hash = "sha256:79d24fd876201df67741de3e3fefb3f4dbcbb6ace66e47e6fe662851a4547814", size = 30166, upload-time = "2025-04-07T17:40:21.697Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/25/0ae00f2b0095e559d61ad3dc32171bd5a29dfd95ab04b4edd641f7c75f72/eth_keys-0.7.0-py3-none-any.whl", hash = "sha256:b0cdda8ffe8e5ba69c7c5ca33f153828edcace844f67aabd4542d7de38b159cf", size = 20656, upload-time = "2025-04-07T17:40:20.441Z" }, +] + +[[package]] +name = "eth-rlp" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "eth-utils" }, + { name = "hexbytes" }, + { name = "rlp" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7f/ea/ad39d001fa9fed07fad66edb00af701e29b48be0ed44a3bcf58cb3adf130/eth_rlp-2.2.0.tar.gz", hash = "sha256:5e4b2eb1b8213e303d6a232dfe35ab8c29e2d3051b86e8d359def80cd21db83d", size = 7720, upload-time = "2025-02-04T21:51:08.134Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/3b/57efe2bc2df0980680d57c01a36516cd3171d2319ceb30e675de19fc2cc5/eth_rlp-2.2.0-py3-none-any.whl", hash = "sha256:5692d595a741fbaef1203db6a2fedffbd2506d31455a6ad378c8449ee5985c47", size = 4446, upload-time = "2025-02-04T21:51:05.823Z" }, +] + +[[package]] +name = "eth-typing" +version = "5.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/60/54/62aa24b9cc708f06316167ee71c362779c8ed21fc8234a5cd94a8f53b623/eth_typing-5.2.1.tar.gz", hash = "sha256:7557300dbf02a93c70fa44af352b5c4a58f94e997a0fd6797fb7d1c29d9538ee", size = 21806, upload-time = "2025-04-14T20:39:28.217Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/72/c370bbe4c53da7bf998d3523f5a0f38867654923a82192df88d0705013d3/eth_typing-5.2.1-py3-none-any.whl", hash = "sha256:b0c2812ff978267563b80e9d701f487dd926f1d376d674f3b535cfe28b665d3d", size = 19163, upload-time = "2025-04-14T20:39:26.571Z" }, +] + +[[package]] +name = "eth-utils" +version = "5.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cytoolz", marker = "implementation_name == 'cpython'" }, + { name = "eth-hash" }, + { name = "eth-typing" }, + { name = "pydantic" }, + { name = "toolz", marker = "implementation_name == 'pypy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0d/49/bee95f16d2ef068097afeeffbd6c67738107001ee57ad7bcdd4fc4d3c6a7/eth_utils-5.3.0.tar.gz", hash = "sha256:1f096867ac6be895f456fa3acb26e9573ae66e753abad9208f316d24d6178156", size = 123753, upload-time = "2025-04-14T19:35:56.431Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/c6/0417a92e6a3fc9b85f5a8380d9f9d43b69ba836a90e45f79f9ae74d41e53/eth_utils-5.3.0-py3-none-any.whl", hash = "sha256:ac184883ab299d923428bbe25dae5e356979a3993e0ef695a864db0a20bc262d", size = 102531, upload-time = "2025-04-14T19:35:55.176Z" }, +] + +[[package]] +name = "filelock" +version = "3.18.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/10/c23352565a6544bdc5353e0b15fc1c563352101f30e24bf500207a54df9a/filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2", size = 18075, upload-time = "2025-03-14T07:11:40.47Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215, upload-time = "2025-03-14T07:11:39.145Z" }, +] + +[[package]] +name = "frozenlist" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/f4/d744cba2da59b5c1d88823cf9e8a6c74e4659e2b27604ed973be2a0bf5ab/frozenlist-1.6.0.tar.gz", hash = "sha256:b99655c32c1c8e06d111e7f41c06c29a5318cb1835df23a45518e02a47c63b68", size = 42831, upload-time = "2025-04-17T22:38:53.099Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9c/8a/289b7d0de2fbac832ea80944d809759976f661557a38bb8e77db5d9f79b7/frozenlist-1.6.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c5b9e42ace7d95bf41e19b87cec8f262c41d3510d8ad7514ab3862ea2197bfb1", size = 160193, upload-time = "2025-04-17T22:36:47.382Z" }, + { url = "https://files.pythonhosted.org/packages/19/80/2fd17d322aec7f430549f0669f599997174f93ee17929ea5b92781ec902c/frozenlist-1.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ca9973735ce9f770d24d5484dcb42f68f135351c2fc81a7a9369e48cf2998a29", size = 123831, upload-time = "2025-04-17T22:36:49.401Z" }, + { url = "https://files.pythonhosted.org/packages/99/06/f5812da431273f78c6543e0b2f7de67dfd65eb0a433978b2c9c63d2205e4/frozenlist-1.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6ac40ec76041c67b928ca8aaffba15c2b2ee3f5ae8d0cb0617b5e63ec119ca25", size = 121862, upload-time = "2025-04-17T22:36:51.899Z" }, + { url = "https://files.pythonhosted.org/packages/d0/31/9e61c6b5fc493cf24d54881731204d27105234d09878be1a5983182cc4a5/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95b7a8a3180dfb280eb044fdec562f9b461614c0ef21669aea6f1d3dac6ee576", size = 316361, upload-time = "2025-04-17T22:36:53.402Z" }, + { url = "https://files.pythonhosted.org/packages/9d/55/22ca9362d4f0222324981470fd50192be200154d51509ee6eb9baa148e96/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c444d824e22da6c9291886d80c7d00c444981a72686e2b59d38b285617cb52c8", size = 307115, upload-time = "2025-04-17T22:36:55.016Z" }, + { url = "https://files.pythonhosted.org/packages/ae/39/4fff42920a57794881e7bb3898dc7f5f539261711ea411b43bba3cde8b79/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb52c8166499a8150bfd38478248572c924c003cbb45fe3bcd348e5ac7c000f9", size = 322505, upload-time = "2025-04-17T22:36:57.12Z" }, + { url = "https://files.pythonhosted.org/packages/55/f2/88c41f374c1e4cf0092a5459e5f3d6a1e17ed274c98087a76487783df90c/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b35298b2db9c2468106278537ee529719228950a5fdda686582f68f247d1dc6e", size = 322666, upload-time = "2025-04-17T22:36:58.735Z" }, + { url = "https://files.pythonhosted.org/packages/75/51/034eeb75afdf3fd03997856195b500722c0b1a50716664cde64e28299c4b/frozenlist-1.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d108e2d070034f9d57210f22fefd22ea0d04609fc97c5f7f5a686b3471028590", size = 302119, upload-time = "2025-04-17T22:37:00.512Z" }, + { url = "https://files.pythonhosted.org/packages/2b/a6/564ecde55ee633270a793999ef4fd1d2c2b32b5a7eec903b1012cb7c5143/frozenlist-1.6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e1be9111cb6756868ac242b3c2bd1f09d9aea09846e4f5c23715e7afb647103", size = 316226, upload-time = "2025-04-17T22:37:02.102Z" }, + { url = "https://files.pythonhosted.org/packages/f1/c8/6c0682c32377f402b8a6174fb16378b683cf6379ab4d2827c580892ab3c7/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:94bb451c664415f02f07eef4ece976a2c65dcbab9c2f1705b7031a3a75349d8c", size = 312788, upload-time = "2025-04-17T22:37:03.578Z" }, + { url = "https://files.pythonhosted.org/packages/b6/b8/10fbec38f82c5d163ca1750bfff4ede69713badf236a016781cf1f10a0f0/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d1a686d0b0949182b8faddea596f3fc11f44768d1f74d4cad70213b2e139d821", size = 325914, upload-time = "2025-04-17T22:37:05.213Z" }, + { url = "https://files.pythonhosted.org/packages/62/ca/2bf4f3a1bd40cdedd301e6ecfdbb291080d5afc5f9ce350c0739f773d6b9/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ea8e59105d802c5a38bdbe7362822c522230b3faba2aa35c0fa1765239b7dd70", size = 305283, upload-time = "2025-04-17T22:37:06.985Z" }, + { url = "https://files.pythonhosted.org/packages/09/64/20cc13ccf94abc2a1f482f74ad210703dc78a590d0b805af1c9aa67f76f9/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:abc4e880a9b920bc5020bf6a431a6bb40589d9bca3975c980495f63632e8382f", size = 319264, upload-time = "2025-04-17T22:37:08.618Z" }, + { url = "https://files.pythonhosted.org/packages/20/ff/86c6a2bbe98cfc231519f5e6d712a0898488ceac804a917ce014f32e68f6/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9a79713adfe28830f27a3c62f6b5406c37376c892b05ae070906f07ae4487046", size = 326482, upload-time = "2025-04-17T22:37:10.196Z" }, + { url = "https://files.pythonhosted.org/packages/2f/da/8e381f66367d79adca245d1d71527aac774e30e291d41ef161ce2d80c38e/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9a0318c2068e217a8f5e3b85e35899f5a19e97141a45bb925bb357cfe1daf770", size = 318248, upload-time = "2025-04-17T22:37:12.284Z" }, + { url = "https://files.pythonhosted.org/packages/39/24/1a1976563fb476ab6f0fa9fefaac7616a4361dbe0461324f9fd7bf425dbe/frozenlist-1.6.0-cp312-cp312-win32.whl", hash = "sha256:853ac025092a24bb3bf09ae87f9127de9fe6e0c345614ac92536577cf956dfcc", size = 115161, upload-time = "2025-04-17T22:37:13.902Z" }, + { url = "https://files.pythonhosted.org/packages/80/2e/fb4ed62a65f8cd66044706b1013f0010930d8cbb0729a2219561ea075434/frozenlist-1.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:2bdfe2d7e6c9281c6e55523acd6c2bf77963cb422fdc7d142fb0cb6621b66878", size = 120548, upload-time = "2025-04-17T22:37:15.326Z" }, + { url = "https://files.pythonhosted.org/packages/6f/e5/04c7090c514d96ca00887932417f04343ab94904a56ab7f57861bf63652d/frozenlist-1.6.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1d7fb014fe0fbfee3efd6a94fc635aeaa68e5e1720fe9e57357f2e2c6e1a647e", size = 158182, upload-time = "2025-04-17T22:37:16.837Z" }, + { url = "https://files.pythonhosted.org/packages/e9/8f/60d0555c61eec855783a6356268314d204137f5e0c53b59ae2fc28938c99/frozenlist-1.6.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01bcaa305a0fdad12745502bfd16a1c75b14558dabae226852f9159364573117", size = 122838, upload-time = "2025-04-17T22:37:18.352Z" }, + { url = "https://files.pythonhosted.org/packages/5a/a7/d0ec890e3665b4b3b7c05dc80e477ed8dc2e2e77719368e78e2cd9fec9c8/frozenlist-1.6.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b314faa3051a6d45da196a2c495e922f987dc848e967d8cfeaee8a0328b1cd4", size = 120980, upload-time = "2025-04-17T22:37:19.857Z" }, + { url = "https://files.pythonhosted.org/packages/cc/19/9b355a5e7a8eba903a008579964192c3e427444752f20b2144b10bb336df/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da62fecac21a3ee10463d153549d8db87549a5e77eefb8c91ac84bb42bb1e4e3", size = 305463, upload-time = "2025-04-17T22:37:21.328Z" }, + { url = "https://files.pythonhosted.org/packages/9c/8d/5b4c758c2550131d66935ef2fa700ada2461c08866aef4229ae1554b93ca/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1eb89bf3454e2132e046f9599fbcf0a4483ed43b40f545551a39316d0201cd1", size = 297985, upload-time = "2025-04-17T22:37:23.55Z" }, + { url = "https://files.pythonhosted.org/packages/48/2c/537ec09e032b5865715726b2d1d9813e6589b571d34d01550c7aeaad7e53/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18689b40cb3936acd971f663ccb8e2589c45db5e2c5f07e0ec6207664029a9c", size = 311188, upload-time = "2025-04-17T22:37:25.221Z" }, + { url = "https://files.pythonhosted.org/packages/31/2f/1aa74b33f74d54817055de9a4961eff798f066cdc6f67591905d4fc82a84/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e67ddb0749ed066b1a03fba812e2dcae791dd50e5da03be50b6a14d0c1a9ee45", size = 311874, upload-time = "2025-04-17T22:37:26.791Z" }, + { url = "https://files.pythonhosted.org/packages/bf/f0/cfec18838f13ebf4b37cfebc8649db5ea71a1b25dacd691444a10729776c/frozenlist-1.6.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc5e64626e6682638d6e44398c9baf1d6ce6bc236d40b4b57255c9d3f9761f1f", size = 291897, upload-time = "2025-04-17T22:37:28.958Z" }, + { url = "https://files.pythonhosted.org/packages/ea/a5/deb39325cbbea6cd0a46db8ccd76150ae2fcbe60d63243d9df4a0b8c3205/frozenlist-1.6.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:437cfd39564744ae32ad5929e55b18ebd88817f9180e4cc05e7d53b75f79ce85", size = 305799, upload-time = "2025-04-17T22:37:30.889Z" }, + { url = "https://files.pythonhosted.org/packages/78/22/6ddec55c5243a59f605e4280f10cee8c95a449f81e40117163383829c241/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:62dd7df78e74d924952e2feb7357d826af8d2f307557a779d14ddf94d7311be8", size = 302804, upload-time = "2025-04-17T22:37:32.489Z" }, + { url = "https://files.pythonhosted.org/packages/5d/b7/d9ca9bab87f28855063c4d202936800219e39db9e46f9fb004d521152623/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:a66781d7e4cddcbbcfd64de3d41a61d6bdde370fc2e38623f30b2bd539e84a9f", size = 316404, upload-time = "2025-04-17T22:37:34.59Z" }, + { url = "https://files.pythonhosted.org/packages/a6/3a/1255305db7874d0b9eddb4fe4a27469e1fb63720f1fc6d325a5118492d18/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:482fe06e9a3fffbcd41950f9d890034b4a54395c60b5e61fae875d37a699813f", size = 295572, upload-time = "2025-04-17T22:37:36.337Z" }, + { url = "https://files.pythonhosted.org/packages/2a/f2/8d38eeee39a0e3a91b75867cc102159ecccf441deb6ddf67be96d3410b84/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e4f9373c500dfc02feea39f7a56e4f543e670212102cc2eeb51d3a99c7ffbde6", size = 307601, upload-time = "2025-04-17T22:37:37.923Z" }, + { url = "https://files.pythonhosted.org/packages/38/04/80ec8e6b92f61ef085422d7b196822820404f940950dde5b2e367bede8bc/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e69bb81de06827147b7bfbaeb284d85219fa92d9f097e32cc73675f279d70188", size = 314232, upload-time = "2025-04-17T22:37:39.669Z" }, + { url = "https://files.pythonhosted.org/packages/3a/58/93b41fb23e75f38f453ae92a2f987274c64637c450285577bd81c599b715/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7613d9977d2ab4a9141dde4a149f4357e4065949674c5649f920fec86ecb393e", size = 308187, upload-time = "2025-04-17T22:37:41.662Z" }, + { url = "https://files.pythonhosted.org/packages/6a/a2/e64df5c5aa36ab3dee5a40d254f3e471bb0603c225f81664267281c46a2d/frozenlist-1.6.0-cp313-cp313-win32.whl", hash = "sha256:4def87ef6d90429f777c9d9de3961679abf938cb6b7b63d4a7eb8a268babfce4", size = 114772, upload-time = "2025-04-17T22:37:43.132Z" }, + { url = "https://files.pythonhosted.org/packages/a0/77/fead27441e749b2d574bb73d693530d59d520d4b9e9679b8e3cb779d37f2/frozenlist-1.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:37a8a52c3dfff01515e9bbbee0e6063181362f9de3db2ccf9bc96189b557cbfd", size = 119847, upload-time = "2025-04-17T22:37:45.118Z" }, + { url = "https://files.pythonhosted.org/packages/df/bd/cc6d934991c1e5d9cafda83dfdc52f987c7b28343686aef2e58a9cf89f20/frozenlist-1.6.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:46138f5a0773d064ff663d273b309b696293d7a7c00a0994c5c13a5078134b64", size = 174937, upload-time = "2025-04-17T22:37:46.635Z" }, + { url = "https://files.pythonhosted.org/packages/f2/a2/daf945f335abdbfdd5993e9dc348ef4507436936ab3c26d7cfe72f4843bf/frozenlist-1.6.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:f88bc0a2b9c2a835cb888b32246c27cdab5740059fb3688852bf91e915399b91", size = 136029, upload-time = "2025-04-17T22:37:48.192Z" }, + { url = "https://files.pythonhosted.org/packages/51/65/4c3145f237a31247c3429e1c94c384d053f69b52110a0d04bfc8afc55fb2/frozenlist-1.6.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:777704c1d7655b802c7850255639672e90e81ad6fa42b99ce5ed3fbf45e338dd", size = 134831, upload-time = "2025-04-17T22:37:50.485Z" }, + { url = "https://files.pythonhosted.org/packages/77/38/03d316507d8dea84dfb99bdd515ea245628af964b2bf57759e3c9205cc5e/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85ef8d41764c7de0dcdaf64f733a27352248493a85a80661f3c678acd27e31f2", size = 392981, upload-time = "2025-04-17T22:37:52.558Z" }, + { url = "https://files.pythonhosted.org/packages/37/02/46285ef9828f318ba400a51d5bb616ded38db8466836a9cfa39f3903260b/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:da5cb36623f2b846fb25009d9d9215322318ff1c63403075f812b3b2876c8506", size = 371999, upload-time = "2025-04-17T22:37:54.092Z" }, + { url = "https://files.pythonhosted.org/packages/0d/64/1212fea37a112c3c5c05bfb5f0a81af4836ce349e69be75af93f99644da9/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cbb56587a16cf0fb8acd19e90ff9924979ac1431baea8681712716a8337577b0", size = 392200, upload-time = "2025-04-17T22:37:55.951Z" }, + { url = "https://files.pythonhosted.org/packages/81/ce/9a6ea1763e3366e44a5208f76bf37c76c5da570772375e4d0be85180e588/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6154c3ba59cda3f954c6333025369e42c3acd0c6e8b6ce31eb5c5b8116c07e0", size = 390134, upload-time = "2025-04-17T22:37:57.633Z" }, + { url = "https://files.pythonhosted.org/packages/bc/36/939738b0b495b2c6d0c39ba51563e453232813042a8d908b8f9544296c29/frozenlist-1.6.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e8246877afa3f1ae5c979fe85f567d220f86a50dc6c493b9b7d8191181ae01e", size = 365208, upload-time = "2025-04-17T22:37:59.742Z" }, + { url = "https://files.pythonhosted.org/packages/b4/8b/939e62e93c63409949c25220d1ba8e88e3960f8ef6a8d9ede8f94b459d27/frozenlist-1.6.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b0f6cce16306d2e117cf9db71ab3a9e8878a28176aeaf0dbe35248d97b28d0c", size = 385548, upload-time = "2025-04-17T22:38:01.416Z" }, + { url = "https://files.pythonhosted.org/packages/62/38/22d2873c90102e06a7c5a3a5b82ca47e393c6079413e8a75c72bff067fa8/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1b8e8cd8032ba266f91136d7105706ad57770f3522eac4a111d77ac126a25a9b", size = 391123, upload-time = "2025-04-17T22:38:03.049Z" }, + { url = "https://files.pythonhosted.org/packages/44/78/63aaaf533ee0701549500f6d819be092c6065cb5c577edb70c09df74d5d0/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:e2ada1d8515d3ea5378c018a5f6d14b4994d4036591a52ceaf1a1549dec8e1ad", size = 394199, upload-time = "2025-04-17T22:38:04.776Z" }, + { url = "https://files.pythonhosted.org/packages/54/45/71a6b48981d429e8fbcc08454dc99c4c2639865a646d549812883e9c9dd3/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:cdb2c7f071e4026c19a3e32b93a09e59b12000751fc9b0b7758da899e657d215", size = 373854, upload-time = "2025-04-17T22:38:06.576Z" }, + { url = "https://files.pythonhosted.org/packages/3f/f3/dbf2a5e11736ea81a66e37288bf9f881143a7822b288a992579ba1b4204d/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:03572933a1969a6d6ab509d509e5af82ef80d4a5d4e1e9f2e1cdd22c77a3f4d2", size = 395412, upload-time = "2025-04-17T22:38:08.197Z" }, + { url = "https://files.pythonhosted.org/packages/b3/f1/c63166806b331f05104d8ea385c4acd511598568b1f3e4e8297ca54f2676/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:77effc978947548b676c54bbd6a08992759ea6f410d4987d69feea9cd0919911", size = 394936, upload-time = "2025-04-17T22:38:10.056Z" }, + { url = "https://files.pythonhosted.org/packages/ef/ea/4f3e69e179a430473eaa1a75ff986526571215fefc6b9281cdc1f09a4eb8/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a2bda8be77660ad4089caf2223fdbd6db1858462c4b85b67fbfa22102021e497", size = 391459, upload-time = "2025-04-17T22:38:11.826Z" }, + { url = "https://files.pythonhosted.org/packages/d3/c3/0fc2c97dea550df9afd072a37c1e95421652e3206bbeaa02378b24c2b480/frozenlist-1.6.0-cp313-cp313t-win32.whl", hash = "sha256:a4d96dc5bcdbd834ec6b0f91027817214216b5b30316494d2b1aebffb87c534f", size = 128797, upload-time = "2025-04-17T22:38:14.013Z" }, + { url = "https://files.pythonhosted.org/packages/ae/f5/79c9320c5656b1965634fe4be9c82b12a3305bdbc58ad9cb941131107b20/frozenlist-1.6.0-cp313-cp313t-win_amd64.whl", hash = "sha256:e18036cb4caa17ea151fd5f3d70be9d354c99eb8cf817a3ccde8a7873b074348", size = 134709, upload-time = "2025-04-17T22:38:15.551Z" }, + { url = "https://files.pythonhosted.org/packages/71/3e/b04a0adda73bd52b390d730071c0d577073d3d26740ee1bad25c3ad0f37b/frozenlist-1.6.0-py3-none-any.whl", hash = "sha256:535eec9987adb04701266b92745d6cdcef2e77669299359c3009c3404dd5d191", size = 12404, upload-time = "2025-04-17T22:38:51.668Z" }, +] + +[[package]] +name = "hexbytes" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/83/71/1a3f2439cf138b555c182fffeffbf67c090837e4570370af85ee8e57013f/hexbytes-1.3.0.tar.gz", hash = "sha256:4a61840c24b0909a6534350e2d28ee50159ca1c9e89ce275fd31c110312cf684", size = 8200, upload-time = "2025-01-13T20:43:46.064Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/96/035871b535a728700d3cc5b94cf883706f345c5a088253f26f0bee0b7939/hexbytes-1.3.0-py3-none-any.whl", hash = "sha256:83720b529c6e15ed21627962938dc2dec9bb1010f17bbbd66bf1e6a8287d522c", size = 4902, upload-time = "2025-01-13T20:43:44.905Z" }, +] + +[[package]] +name = "identify" +version = "2.6.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0c/83/b6ea0334e2e7327084a46aaaf71f2146fc061a192d6518c0d020120cd0aa/identify-2.6.10.tar.gz", hash = "sha256:45e92fd704f3da71cc3880036633f48b4b7265fd4de2b57627cb157216eb7eb8", size = 99201, upload-time = "2025-04-19T15:10:38.32Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2b/d3/85feeba1d097b81a44bcffa6a0beab7b4dfffe78e82fc54978d3ac380736/identify-2.6.10-py2.py3-none-any.whl", hash = "sha256:5f34248f54136beed1a7ba6a6b5c4b6cf21ff495aac7c359e1ef831ae3b8ab25", size = 99101, upload-time = "2025-04-19T15:10:36.701Z" }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "jpyc-core-sdk" +version = "1.0.0" +source = { editable = "packages/core" } +dependencies = [ + { name = "eth-typing" }, + { name = "pydantic" }, + { name = "web3" }, +] + +[package.dev-dependencies] +dev = [ + { name = "mypy" }, + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "pytest-mock" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [ + { name = "eth-typing", specifier = ">=5.2.1" }, + { name = "pydantic", specifier = ">=2.11.4" }, + { name = "web3", specifier = ">=7.11.0" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "mypy", specifier = ">=1.15.0" }, + { name = "pytest", specifier = ">=8.3.5" }, + { name = "pytest-cov", specifier = ">=6.1.1" }, + { name = "pytest-mock", specifier = ">=3.14.0" }, + { name = "ruff", specifier = ">=0.11.9" }, +] + +[[package]] +name = "jpyc-python-sdks" +version = "1.0.0" +source = { virtual = "." } + +[package.dev-dependencies] +dev = [ + { name = "pdoc" }, + { name = "pre-commit" }, +] + +[package.metadata] + +[package.metadata.requires-dev] +dev = [ + { name = "pdoc", specifier = ">=15.0.3" }, + { name = "pre-commit", specifier = ">=4.2.0" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload-time = "2024-10-18T15:21:54.129Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274, upload-time = "2024-10-18T15:21:13.777Z" }, + { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348, upload-time = "2024-10-18T15:21:14.822Z" }, + { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149, upload-time = "2024-10-18T15:21:15.642Z" }, + { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118, upload-time = "2024-10-18T15:21:17.133Z" }, + { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993, upload-time = "2024-10-18T15:21:18.064Z" }, + { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178, upload-time = "2024-10-18T15:21:18.859Z" }, + { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319, upload-time = "2024-10-18T15:21:19.671Z" }, + { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352, upload-time = "2024-10-18T15:21:20.971Z" }, + { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097, upload-time = "2024-10-18T15:21:22.646Z" }, + { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601, upload-time = "2024-10-18T15:21:23.499Z" }, + { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274, upload-time = "2024-10-18T15:21:24.577Z" }, + { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352, upload-time = "2024-10-18T15:21:25.382Z" }, + { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122, upload-time = "2024-10-18T15:21:26.199Z" }, + { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085, upload-time = "2024-10-18T15:21:27.029Z" }, + { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978, upload-time = "2024-10-18T15:21:27.846Z" }, + { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208, upload-time = "2024-10-18T15:21:28.744Z" }, + { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357, upload-time = "2024-10-18T15:21:29.545Z" }, + { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344, upload-time = "2024-10-18T15:21:30.366Z" }, + { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101, upload-time = "2024-10-18T15:21:31.207Z" }, + { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603, upload-time = "2024-10-18T15:21:32.032Z" }, + { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510, upload-time = "2024-10-18T15:21:33.625Z" }, + { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486, upload-time = "2024-10-18T15:21:34.611Z" }, + { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480, upload-time = "2024-10-18T15:21:35.398Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914, upload-time = "2024-10-18T15:21:36.231Z" }, + { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796, upload-time = "2024-10-18T15:21:37.073Z" }, + { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473, upload-time = "2024-10-18T15:21:37.932Z" }, + { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114, upload-time = "2024-10-18T15:21:39.799Z" }, + { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098, upload-time = "2024-10-18T15:21:40.813Z" }, + { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208, upload-time = "2024-10-18T15:21:41.814Z" }, + { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload-time = "2024-10-18T15:21:42.784Z" }, +] + +[[package]] +name = "multidict" +version = "6.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/2c/e367dfb4c6538614a0c9453e510d75d66099edf1c4e69da1b5ce691a1931/multidict-6.4.3.tar.gz", hash = "sha256:3ada0b058c9f213c5f95ba301f922d402ac234f1111a7d8fd70f1b99f3c281ec", size = 89372, upload-time = "2025-04-10T22:20:17.956Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/bb/3abdaf8fe40e9226ce8a2ba5ecf332461f7beec478a455d6587159f1bf92/multidict-6.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1f1c2f58f08b36f8475f3ec6f5aeb95270921d418bf18f90dffd6be5c7b0e676", size = 64019, upload-time = "2025-04-10T22:18:23.174Z" }, + { url = "https://files.pythonhosted.org/packages/7e/b5/1b2e8de8217d2e89db156625aa0fe4a6faad98972bfe07a7b8c10ef5dd6b/multidict-6.4.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:26ae9ad364fc61b936fb7bf4c9d8bd53f3a5b4417142cd0be5c509d6f767e2f1", size = 37925, upload-time = "2025-04-10T22:18:24.834Z" }, + { url = "https://files.pythonhosted.org/packages/b4/e2/3ca91c112644a395c8eae017144c907d173ea910c913ff8b62549dcf0bbf/multidict-6.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:659318c6c8a85f6ecfc06b4e57529e5a78dfdd697260cc81f683492ad7e9435a", size = 37008, upload-time = "2025-04-10T22:18:26.069Z" }, + { url = "https://files.pythonhosted.org/packages/60/23/79bc78146c7ac8d1ac766b2770ca2e07c2816058b8a3d5da6caed8148637/multidict-6.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1eb72c741fd24d5a28242ce72bb61bc91f8451877131fa3fe930edb195f7054", size = 224374, upload-time = "2025-04-10T22:18:27.714Z" }, + { url = "https://files.pythonhosted.org/packages/86/35/77950ed9ebd09136003a85c1926ba42001ca5be14feb49710e4334ee199b/multidict-6.4.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3cd06d88cb7398252284ee75c8db8e680aa0d321451132d0dba12bc995f0adcc", size = 230869, upload-time = "2025-04-10T22:18:29.162Z" }, + { url = "https://files.pythonhosted.org/packages/49/97/2a33c6e7d90bc116c636c14b2abab93d6521c0c052d24bfcc231cbf7f0e7/multidict-6.4.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4543d8dc6470a82fde92b035a92529317191ce993533c3c0c68f56811164ed07", size = 231949, upload-time = "2025-04-10T22:18:30.679Z" }, + { url = "https://files.pythonhosted.org/packages/56/ce/e9b5d9fcf854f61d6686ada7ff64893a7a5523b2a07da6f1265eaaea5151/multidict-6.4.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:30a3ebdc068c27e9d6081fca0e2c33fdf132ecea703a72ea216b81a66860adde", size = 231032, upload-time = "2025-04-10T22:18:32.146Z" }, + { url = "https://files.pythonhosted.org/packages/f0/ac/7ced59dcdfeddd03e601edb05adff0c66d81ed4a5160c443e44f2379eef0/multidict-6.4.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b038f10e23f277153f86f95c777ba1958bcd5993194fda26a1d06fae98b2f00c", size = 223517, upload-time = "2025-04-10T22:18:33.538Z" }, + { url = "https://files.pythonhosted.org/packages/db/e6/325ed9055ae4e085315193a1b58bdb4d7fc38ffcc1f4975cfca97d015e17/multidict-6.4.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c605a2b2dc14282b580454b9b5d14ebe0668381a3a26d0ac39daa0ca115eb2ae", size = 216291, upload-time = "2025-04-10T22:18:34.962Z" }, + { url = "https://files.pythonhosted.org/packages/fa/84/eeee6d477dd9dcb7691c3bb9d08df56017f5dd15c730bcc9383dcf201cf4/multidict-6.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8bd2b875f4ca2bb527fe23e318ddd509b7df163407b0fb717df229041c6df5d3", size = 228982, upload-time = "2025-04-10T22:18:36.443Z" }, + { url = "https://files.pythonhosted.org/packages/82/94/4d1f3e74e7acf8b0c85db350e012dcc61701cd6668bc2440bb1ecb423c90/multidict-6.4.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c2e98c840c9c8e65c0e04b40c6c5066c8632678cd50c8721fdbcd2e09f21a507", size = 226823, upload-time = "2025-04-10T22:18:37.924Z" }, + { url = "https://files.pythonhosted.org/packages/09/f0/1e54b95bda7cd01080e5732f9abb7b76ab5cc795b66605877caeb2197476/multidict-6.4.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:66eb80dd0ab36dbd559635e62fba3083a48a252633164857a1d1684f14326427", size = 222714, upload-time = "2025-04-10T22:18:39.807Z" }, + { url = "https://files.pythonhosted.org/packages/e7/a2/f6cbca875195bd65a3e53b37ab46486f3cc125bdeab20eefe5042afa31fb/multidict-6.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c23831bdee0a2a3cf21be057b5e5326292f60472fb6c6f86392bbf0de70ba731", size = 233739, upload-time = "2025-04-10T22:18:41.341Z" }, + { url = "https://files.pythonhosted.org/packages/79/68/9891f4d2b8569554723ddd6154375295f789dc65809826c6fb96a06314fd/multidict-6.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1535cec6443bfd80d028052e9d17ba6ff8a5a3534c51d285ba56c18af97e9713", size = 230809, upload-time = "2025-04-10T22:18:42.817Z" }, + { url = "https://files.pythonhosted.org/packages/e6/72/a7be29ba1e87e4fc5ceb44dabc7940b8005fd2436a332a23547709315f70/multidict-6.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3b73e7227681f85d19dec46e5b881827cd354aabe46049e1a61d2f9aaa4e285a", size = 226934, upload-time = "2025-04-10T22:18:44.311Z" }, + { url = "https://files.pythonhosted.org/packages/12/c1/259386a9ad6840ff7afc686da96808b503d152ac4feb3a96c651dc4f5abf/multidict-6.4.3-cp312-cp312-win32.whl", hash = "sha256:8eac0c49df91b88bf91f818e0a24c1c46f3622978e2c27035bfdca98e0e18124", size = 35242, upload-time = "2025-04-10T22:18:46.193Z" }, + { url = "https://files.pythonhosted.org/packages/06/24/c8fdff4f924d37225dc0c56a28b1dca10728fc2233065fafeb27b4b125be/multidict-6.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:11990b5c757d956cd1db7cb140be50a63216af32cd6506329c2c59d732d802db", size = 38635, upload-time = "2025-04-10T22:18:47.498Z" }, + { url = "https://files.pythonhosted.org/packages/6c/4b/86fd786d03915c6f49998cf10cd5fe6b6ac9e9a071cb40885d2e080fb90d/multidict-6.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a76534263d03ae0cfa721fea40fd2b5b9d17a6f85e98025931d41dc49504474", size = 63831, upload-time = "2025-04-10T22:18:48.748Z" }, + { url = "https://files.pythonhosted.org/packages/45/05/9b51fdf7aef2563340a93be0a663acba2c428c4daeaf3960d92d53a4a930/multidict-6.4.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:805031c2f599eee62ac579843555ed1ce389ae00c7e9f74c2a1b45e0564a88dd", size = 37888, upload-time = "2025-04-10T22:18:50.021Z" }, + { url = "https://files.pythonhosted.org/packages/0b/43/53fc25394386c911822419b522181227ca450cf57fea76e6188772a1bd91/multidict-6.4.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c56c179839d5dcf51d565132185409d1d5dd8e614ba501eb79023a6cab25576b", size = 36852, upload-time = "2025-04-10T22:18:51.246Z" }, + { url = "https://files.pythonhosted.org/packages/8a/68/7b99c751e822467c94a235b810a2fd4047d4ecb91caef6b5c60116991c4b/multidict-6.4.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c64f4ddb3886dd8ab71b68a7431ad4aa01a8fa5be5b11543b29674f29ca0ba3", size = 223644, upload-time = "2025-04-10T22:18:52.965Z" }, + { url = "https://files.pythonhosted.org/packages/80/1b/d458d791e4dd0f7e92596667784fbf99e5c8ba040affe1ca04f06b93ae92/multidict-6.4.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3002a856367c0b41cad6784f5b8d3ab008eda194ed7864aaa58f65312e2abcac", size = 230446, upload-time = "2025-04-10T22:18:54.509Z" }, + { url = "https://files.pythonhosted.org/packages/e2/46/9793378d988905491a7806d8987862dc5a0bae8a622dd896c4008c7b226b/multidict-6.4.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3d75e621e7d887d539d6e1d789f0c64271c250276c333480a9e1de089611f790", size = 231070, upload-time = "2025-04-10T22:18:56.019Z" }, + { url = "https://files.pythonhosted.org/packages/a7/b8/b127d3e1f8dd2a5bf286b47b24567ae6363017292dc6dec44656e6246498/multidict-6.4.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:995015cf4a3c0d72cbf453b10a999b92c5629eaf3a0c3e1efb4b5c1f602253bb", size = 229956, upload-time = "2025-04-10T22:18:59.146Z" }, + { url = "https://files.pythonhosted.org/packages/0c/93/f70a4c35b103fcfe1443059a2bb7f66e5c35f2aea7804105ff214f566009/multidict-6.4.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b0fabae7939d09d7d16a711468c385272fa1b9b7fb0d37e51143585d8e72e0", size = 222599, upload-time = "2025-04-10T22:19:00.657Z" }, + { url = "https://files.pythonhosted.org/packages/63/8c/e28e0eb2fe34921d6aa32bfc4ac75b09570b4d6818cc95d25499fe08dc1d/multidict-6.4.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:61ed4d82f8a1e67eb9eb04f8587970d78fe7cddb4e4d6230b77eda23d27938f9", size = 216136, upload-time = "2025-04-10T22:19:02.244Z" }, + { url = "https://files.pythonhosted.org/packages/72/f5/fbc81f866585b05f89f99d108be5d6ad170e3b6c4d0723d1a2f6ba5fa918/multidict-6.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:062428944a8dc69df9fdc5d5fc6279421e5f9c75a9ee3f586f274ba7b05ab3c8", size = 228139, upload-time = "2025-04-10T22:19:04.151Z" }, + { url = "https://files.pythonhosted.org/packages/bb/ba/7d196bad6b85af2307d81f6979c36ed9665f49626f66d883d6c64d156f78/multidict-6.4.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:b90e27b4674e6c405ad6c64e515a505c6d113b832df52fdacb6b1ffd1fa9a1d1", size = 226251, upload-time = "2025-04-10T22:19:06.117Z" }, + { url = "https://files.pythonhosted.org/packages/cc/e2/fae46a370dce79d08b672422a33df721ec8b80105e0ea8d87215ff6b090d/multidict-6.4.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7d50d4abf6729921e9613d98344b74241572b751c6b37feed75fb0c37bd5a817", size = 221868, upload-time = "2025-04-10T22:19:07.981Z" }, + { url = "https://files.pythonhosted.org/packages/26/20/bbc9a3dec19d5492f54a167f08546656e7aef75d181d3d82541463450e88/multidict-6.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:43fe10524fb0a0514be3954be53258e61d87341008ce4914f8e8b92bee6f875d", size = 233106, upload-time = "2025-04-10T22:19:09.5Z" }, + { url = "https://files.pythonhosted.org/packages/ee/8d/f30ae8f5ff7a2461177f4d8eb0d8f69f27fb6cfe276b54ec4fd5a282d918/multidict-6.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:236966ca6c472ea4e2d3f02f6673ebfd36ba3f23159c323f5a496869bc8e47c9", size = 230163, upload-time = "2025-04-10T22:19:11Z" }, + { url = "https://files.pythonhosted.org/packages/15/e9/2833f3c218d3c2179f3093f766940ded6b81a49d2e2f9c46ab240d23dfec/multidict-6.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:422a5ec315018e606473ba1f5431e064cf8b2a7468019233dcf8082fabad64c8", size = 225906, upload-time = "2025-04-10T22:19:12.875Z" }, + { url = "https://files.pythonhosted.org/packages/f1/31/6edab296ac369fd286b845fa5dd4c409e63bc4655ed8c9510fcb477e9ae9/multidict-6.4.3-cp313-cp313-win32.whl", hash = "sha256:f901a5aace8e8c25d78960dcc24c870c8d356660d3b49b93a78bf38eb682aac3", size = 35238, upload-time = "2025-04-10T22:19:14.41Z" }, + { url = "https://files.pythonhosted.org/packages/23/57/2c0167a1bffa30d9a1383c3dab99d8caae985defc8636934b5668830d2ef/multidict-6.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:1c152c49e42277bc9a2f7b78bd5fa10b13e88d1b0328221e7aef89d5c60a99a5", size = 38799, upload-time = "2025-04-10T22:19:15.869Z" }, + { url = "https://files.pythonhosted.org/packages/c9/13/2ead63b9ab0d2b3080819268acb297bd66e238070aa8d42af12b08cbee1c/multidict-6.4.3-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:be8751869e28b9c0d368d94f5afcb4234db66fe8496144547b4b6d6a0645cfc6", size = 68642, upload-time = "2025-04-10T22:19:17.527Z" }, + { url = "https://files.pythonhosted.org/packages/85/45/f1a751e1eede30c23951e2ae274ce8fad738e8a3d5714be73e0a41b27b16/multidict-6.4.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0d4b31f8a68dccbcd2c0ea04f0e014f1defc6b78f0eb8b35f2265e8716a6df0c", size = 40028, upload-time = "2025-04-10T22:19:19.465Z" }, + { url = "https://files.pythonhosted.org/packages/a7/29/fcc53e886a2cc5595cc4560df333cb9630257bda65003a7eb4e4e0d8f9c1/multidict-6.4.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:032efeab3049e37eef2ff91271884303becc9e54d740b492a93b7e7266e23756", size = 39424, upload-time = "2025-04-10T22:19:20.762Z" }, + { url = "https://files.pythonhosted.org/packages/f6/f0/056c81119d8b88703971f937b371795cab1407cd3c751482de5bfe1a04a9/multidict-6.4.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e78006af1a7c8a8007e4f56629d7252668344442f66982368ac06522445e375", size = 226178, upload-time = "2025-04-10T22:19:22.17Z" }, + { url = "https://files.pythonhosted.org/packages/a3/79/3b7e5fea0aa80583d3a69c9d98b7913dfd4fbc341fb10bb2fb48d35a9c21/multidict-6.4.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:daeac9dd30cda8703c417e4fddccd7c4dc0c73421a0b54a7da2713be125846be", size = 222617, upload-time = "2025-04-10T22:19:23.773Z" }, + { url = "https://files.pythonhosted.org/packages/06/db/3ed012b163e376fc461e1d6a67de69b408339bc31dc83d39ae9ec3bf9578/multidict-6.4.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f6f90700881438953eae443a9c6f8a509808bc3b185246992c4233ccee37fea", size = 227919, upload-time = "2025-04-10T22:19:25.35Z" }, + { url = "https://files.pythonhosted.org/packages/b1/db/0433c104bca380989bc04d3b841fc83e95ce0c89f680e9ea4251118b52b6/multidict-6.4.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f84627997008390dd15762128dcf73c3365f4ec0106739cde6c20a07ed198ec8", size = 226097, upload-time = "2025-04-10T22:19:27.183Z" }, + { url = "https://files.pythonhosted.org/packages/c2/95/910db2618175724dd254b7ae635b6cd8d2947a8b76b0376de7b96d814dab/multidict-6.4.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3307b48cd156153b117c0ea54890a3bdbf858a5b296ddd40dc3852e5f16e9b02", size = 220706, upload-time = "2025-04-10T22:19:28.882Z" }, + { url = "https://files.pythonhosted.org/packages/d1/af/aa176c6f5f1d901aac957d5258d5e22897fe13948d1e69063ae3d5d0ca01/multidict-6.4.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ead46b0fa1dcf5af503a46e9f1c2e80b5d95c6011526352fa5f42ea201526124", size = 211728, upload-time = "2025-04-10T22:19:30.481Z" }, + { url = "https://files.pythonhosted.org/packages/e7/42/d51cc5fc1527c3717d7f85137d6c79bb7a93cd214c26f1fc57523774dbb5/multidict-6.4.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1748cb2743bedc339d63eb1bca314061568793acd603a6e37b09a326334c9f44", size = 226276, upload-time = "2025-04-10T22:19:32.454Z" }, + { url = "https://files.pythonhosted.org/packages/28/6b/d836dea45e0b8432343ba4acf9a8ecaa245da4c0960fb7ab45088a5e568a/multidict-6.4.3-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:acc9fa606f76fc111b4569348cc23a771cb52c61516dcc6bcef46d612edb483b", size = 212069, upload-time = "2025-04-10T22:19:34.17Z" }, + { url = "https://files.pythonhosted.org/packages/55/34/0ee1a7adb3560e18ee9289c6e5f7db54edc312b13e5c8263e88ea373d12c/multidict-6.4.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:31469d5832b5885adeb70982e531ce86f8c992334edd2f2254a10fa3182ac504", size = 217858, upload-time = "2025-04-10T22:19:35.879Z" }, + { url = "https://files.pythonhosted.org/packages/04/08/586d652c2f5acefe0cf4e658eedb4d71d4ba6dfd4f189bd81b400fc1bc6b/multidict-6.4.3-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ba46b51b6e51b4ef7bfb84b82f5db0dc5e300fb222a8a13b8cd4111898a869cf", size = 226988, upload-time = "2025-04-10T22:19:37.434Z" }, + { url = "https://files.pythonhosted.org/packages/82/e3/cc59c7e2bc49d7f906fb4ffb6d9c3a3cf21b9f2dd9c96d05bef89c2b1fd1/multidict-6.4.3-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:389cfefb599edf3fcfd5f64c0410da686f90f5f5e2c4d84e14f6797a5a337af4", size = 220435, upload-time = "2025-04-10T22:19:39.005Z" }, + { url = "https://files.pythonhosted.org/packages/e0/32/5c3a556118aca9981d883f38c4b1bfae646f3627157f70f4068e5a648955/multidict-6.4.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:64bc2bbc5fba7b9db5c2c8d750824f41c6994e3882e6d73c903c2afa78d091e4", size = 221494, upload-time = "2025-04-10T22:19:41.447Z" }, + { url = "https://files.pythonhosted.org/packages/b9/3b/1599631f59024b75c4d6e3069f4502409970a336647502aaf6b62fb7ac98/multidict-6.4.3-cp313-cp313t-win32.whl", hash = "sha256:0ecdc12ea44bab2807d6b4a7e5eef25109ab1c82a8240d86d3c1fc9f3b72efd5", size = 41775, upload-time = "2025-04-10T22:19:43.707Z" }, + { url = "https://files.pythonhosted.org/packages/e8/4e/09301668d675d02ca8e8e1a3e6be046619e30403f5ada2ed5b080ae28d02/multidict-6.4.3-cp313-cp313t-win_amd64.whl", hash = "sha256:7146a8742ea71b5d7d955bffcef58a9e6e04efba704b52a460134fefd10a8208", size = 45946, upload-time = "2025-04-10T22:19:45.071Z" }, + { url = "https://files.pythonhosted.org/packages/96/10/7d526c8974f017f1e7ca584c71ee62a638e9334d8d33f27d7cdfc9ae79e4/multidict-6.4.3-py3-none-any.whl", hash = "sha256:59fe01ee8e2a1e8ceb3f6dbb216b09c8d9f4ef1c22c4fc825d045a147fa2ebc9", size = 10400, upload-time = "2025-04-10T22:20:16.445Z" }, +] + +[[package]] +name = "mypy" +version = "1.15.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mypy-extensions" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ce/43/d5e49a86afa64bd3839ea0d5b9c7103487007d728e1293f52525d6d5486a/mypy-1.15.0.tar.gz", hash = "sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43", size = 3239717, upload-time = "2025-02-05T03:50:34.655Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/3a/03c74331c5eb8bd025734e04c9840532226775c47a2c39b56a0c8d4f128d/mypy-1.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:aea39e0583d05124836ea645f412e88a5c7d0fd77a6d694b60d9b6b2d9f184fd", size = 10793981, upload-time = "2025-02-05T03:50:28.25Z" }, + { url = "https://files.pythonhosted.org/packages/f0/1a/41759b18f2cfd568848a37c89030aeb03534411eef981df621d8fad08a1d/mypy-1.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f2147ab812b75e5b5499b01ade1f4a81489a147c01585cda36019102538615f", size = 9749175, upload-time = "2025-02-05T03:50:13.411Z" }, + { url = "https://files.pythonhosted.org/packages/12/7e/873481abf1ef112c582db832740f4c11b2bfa510e829d6da29b0ab8c3f9c/mypy-1.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce436f4c6d218a070048ed6a44c0bbb10cd2cc5e272b29e7845f6a2f57ee4464", size = 11455675, upload-time = "2025-02-05T03:50:31.421Z" }, + { url = "https://files.pythonhosted.org/packages/b3/d0/92ae4cde706923a2d3f2d6c39629134063ff64b9dedca9c1388363da072d/mypy-1.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8023ff13985661b50a5928fc7a5ca15f3d1affb41e5f0a9952cb68ef090b31ee", size = 12410020, upload-time = "2025-02-05T03:48:48.705Z" }, + { url = "https://files.pythonhosted.org/packages/46/8b/df49974b337cce35f828ba6fda228152d6db45fed4c86ba56ffe442434fd/mypy-1.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1124a18bc11a6a62887e3e137f37f53fbae476dc36c185d549d4f837a2a6a14e", size = 12498582, upload-time = "2025-02-05T03:49:03.628Z" }, + { url = "https://files.pythonhosted.org/packages/13/50/da5203fcf6c53044a0b699939f31075c45ae8a4cadf538a9069b165c1050/mypy-1.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22", size = 9366614, upload-time = "2025-02-05T03:50:00.313Z" }, + { url = "https://files.pythonhosted.org/packages/6a/9b/fd2e05d6ffff24d912f150b87db9e364fa8282045c875654ce7e32fffa66/mypy-1.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93faf3fdb04768d44bf28693293f3904bbb555d076b781ad2530214ee53e3445", size = 10788592, upload-time = "2025-02-05T03:48:55.789Z" }, + { url = "https://files.pythonhosted.org/packages/74/37/b246d711c28a03ead1fd906bbc7106659aed7c089d55fe40dd58db812628/mypy-1.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:811aeccadfb730024c5d3e326b2fbe9249bb7413553f15499a4050f7c30e801d", size = 9753611, upload-time = "2025-02-05T03:48:44.581Z" }, + { url = "https://files.pythonhosted.org/packages/a6/ac/395808a92e10cfdac8003c3de9a2ab6dc7cde6c0d2a4df3df1b815ffd067/mypy-1.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98b7b9b9aedb65fe628c62a6dc57f6d5088ef2dfca37903a7d9ee374d03acca5", size = 11438443, upload-time = "2025-02-05T03:49:25.514Z" }, + { url = "https://files.pythonhosted.org/packages/d2/8b/801aa06445d2de3895f59e476f38f3f8d610ef5d6908245f07d002676cbf/mypy-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43a7682e24b4f576d93072216bf56eeff70d9140241f9edec0c104d0c515036", size = 12402541, upload-time = "2025-02-05T03:49:57.623Z" }, + { url = "https://files.pythonhosted.org/packages/c7/67/5a4268782eb77344cc613a4cf23540928e41f018a9a1ec4c6882baf20ab8/mypy-1.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:baefc32840a9f00babd83251560e0ae1573e2f9d1b067719479bfb0e987c6357", size = 12494348, upload-time = "2025-02-05T03:48:52.361Z" }, + { url = "https://files.pythonhosted.org/packages/83/3e/57bb447f7bbbfaabf1712d96f9df142624a386d98fb026a761532526057e/mypy-1.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf", size = 9373648, upload-time = "2025-02-05T03:49:11.395Z" }, + { url = "https://files.pythonhosted.org/packages/09/4e/a7d65c7322c510de2c409ff3828b03354a7c43f5a8ed458a7a131b41c7b9/mypy-1.15.0-py3-none-any.whl", hash = "sha256:5469affef548bd1895d86d3bf10ce2b44e33d86923c29e4d675b3e323437ea3e", size = 2221777, upload-time = "2025-02-05T03:50:08.348Z" }, +] + +[[package]] +name = "mypy-extensions" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, +] + +[[package]] +name = "nodeenv" +version = "1.9.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437, upload-time = "2024-06-04T18:44:11.171Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload-time = "2024-06-04T18:44:08.352Z" }, +] + +[[package]] +name = "packaging" +version = "23.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fb/2b/9b9c33ffed44ee921d0967086d653047286054117d584f1b1a7c22ceaf7b/packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", size = 146714, upload-time = "2023-10-01T13:50:05.279Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/1a/610693ac4ee14fcdf2d9bf3c493370e4f2ef7ae2e19217d7a237ff42367d/packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7", size = 53011, upload-time = "2023-10-01T13:50:03.745Z" }, +] + +[[package]] +name = "parsimonious" +version = "0.10.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "regex" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7b/91/abdc50c4ef06fdf8d047f60ee777ca9b2a7885e1a9cea81343fbecda52d7/parsimonious-0.10.0.tar.gz", hash = "sha256:8281600da180ec8ae35427a4ab4f7b82bfec1e3d1e52f80cb60ea82b9512501c", size = 52172, upload-time = "2022-09-03T17:01:17.004Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/aa/0f/c8b64d9b54ea631fcad4e9e3c8dbe8c11bb32a623be94f22974c88e71eaf/parsimonious-0.10.0-py3-none-any.whl", hash = "sha256:982ab435fabe86519b57f6b35610aa4e4e977e9f02a14353edf4bbc75369fc0f", size = 48427, upload-time = "2022-09-03T17:01:13.814Z" }, +] + +[[package]] +name = "pdoc" +version = "15.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jinja2" }, + { name = "markupsafe" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9f/e9/66ab0fc39276a1818dea6302858ec9558964d8d9f1c90dd1facfe395d216/pdoc-15.0.3.tar.gz", hash = "sha256:6482d8ebbd40185fea5e6aec2f1592f4be92e93cf6bf70b9e2a00378bbaf3252", size = 155384, upload-time = "2025-04-21T12:55:47.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/37/bc3189471c63c84e15f7dc42d4b712747e9662ffbcfacfc4b6a93e6c3bc6/pdoc-15.0.3-py3-none-any.whl", hash = "sha256:686c921ef2622f166de5f73b7241935a4ddac79c8d10dbfa43def8c1fca86550", size = 145950, upload-time = "2025-04-21T12:55:46.178Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.3.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/8b/3c73abc9c759ecd3f1f7ceff6685840859e8070c4d947c93fae71f6a0bf2/platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", size = 21362, upload-time = "2025-05-07T22:47:42.121Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/39/979e8e21520d4e47a0bbe349e2713c0aac6f3d853d0e5b34d76206c439aa/platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4", size = 18567, upload-time = "2025-05-07T22:47:40.376Z" }, +] + +[[package]] +name = "pluggy" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955, upload-time = "2024-04-20T21:34:42.531Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556, upload-time = "2024-04-20T21:34:40.434Z" }, +] + +[[package]] +name = "pre-commit" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cfgv" }, + { name = "identify" }, + { name = "nodeenv" }, + { name = "pyyaml" }, + { name = "virtualenv" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/08/39/679ca9b26c7bb2999ff122d50faa301e49af82ca9c066ec061cfbc0c6784/pre_commit-4.2.0.tar.gz", hash = "sha256:601283b9757afd87d40c4c4a9b2b5de9637a8ea02eaff7adc2d0fb4e04841146", size = 193424, upload-time = "2025-03-18T21:35:20.987Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/74/a88bf1b1efeae488a0c0b7bdf71429c313722d1fc0f377537fbe554e6180/pre_commit-4.2.0-py2.py3-none-any.whl", hash = "sha256:a009ca7205f1eb497d10b845e52c838a98b6cdd2102a6c8e4540e94ee75c58bd", size = 220707, upload-time = "2025-03-18T21:35:19.343Z" }, +] + +[[package]] +name = "propcache" +version = "0.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/07/c8/fdc6686a986feae3541ea23dcaa661bd93972d3940460646c6bb96e21c40/propcache-0.3.1.tar.gz", hash = "sha256:40d980c33765359098837527e18eddefc9a24cea5b45e078a7f3bb5b032c6ecf", size = 43651, upload-time = "2025-03-26T03:06:12.05Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/aa/ca78d9be314d1e15ff517b992bebbed3bdfef5b8919e85bf4940e57b6137/propcache-0.3.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f78eb8422acc93d7b69964012ad7048764bb45a54ba7a39bb9e146c72ea29723", size = 80430, upload-time = "2025-03-26T03:04:26.436Z" }, + { url = "https://files.pythonhosted.org/packages/1a/d8/f0c17c44d1cda0ad1979af2e593ea290defdde9eaeb89b08abbe02a5e8e1/propcache-0.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:89498dd49c2f9a026ee057965cdf8192e5ae070ce7d7a7bd4b66a8e257d0c976", size = 46637, upload-time = "2025-03-26T03:04:27.932Z" }, + { url = "https://files.pythonhosted.org/packages/ae/bd/c1e37265910752e6e5e8a4c1605d0129e5b7933c3dc3cf1b9b48ed83b364/propcache-0.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09400e98545c998d57d10035ff623266927cb784d13dd2b31fd33b8a5316b85b", size = 46123, upload-time = "2025-03-26T03:04:30.659Z" }, + { url = "https://files.pythonhosted.org/packages/d4/b0/911eda0865f90c0c7e9f0415d40a5bf681204da5fd7ca089361a64c16b28/propcache-0.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa8efd8c5adc5a2c9d3b952815ff8f7710cefdcaf5f2c36d26aff51aeca2f12f", size = 243031, upload-time = "2025-03-26T03:04:31.977Z" }, + { url = "https://files.pythonhosted.org/packages/0a/06/0da53397c76a74271621807265b6eb61fb011451b1ddebf43213df763669/propcache-0.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2fe5c910f6007e716a06d269608d307b4f36e7babee5f36533722660e8c4a70", size = 249100, upload-time = "2025-03-26T03:04:33.45Z" }, + { url = "https://files.pythonhosted.org/packages/f1/eb/13090e05bf6b963fc1653cdc922133ced467cb4b8dab53158db5a37aa21e/propcache-0.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a0ab8cf8cdd2194f8ff979a43ab43049b1df0b37aa64ab7eca04ac14429baeb7", size = 250170, upload-time = "2025-03-26T03:04:35.542Z" }, + { url = "https://files.pythonhosted.org/packages/3b/4c/f72c9e1022b3b043ec7dc475a0f405d4c3e10b9b1d378a7330fecf0652da/propcache-0.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:563f9d8c03ad645597b8d010ef4e9eab359faeb11a0a2ac9f7b4bc8c28ebef25", size = 245000, upload-time = "2025-03-26T03:04:37.501Z" }, + { url = "https://files.pythonhosted.org/packages/e8/fd/970ca0e22acc829f1adf5de3724085e778c1ad8a75bec010049502cb3a86/propcache-0.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb6e0faf8cb6b4beea5d6ed7b5a578254c6d7df54c36ccd3d8b3eb00d6770277", size = 230262, upload-time = "2025-03-26T03:04:39.532Z" }, + { url = "https://files.pythonhosted.org/packages/c4/42/817289120c6b9194a44f6c3e6b2c3277c5b70bbad39e7df648f177cc3634/propcache-0.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1c5c7ab7f2bb3f573d1cb921993006ba2d39e8621019dffb1c5bc94cdbae81e8", size = 236772, upload-time = "2025-03-26T03:04:41.109Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9c/3b3942b302badd589ad6b672da3ca7b660a6c2f505cafd058133ddc73918/propcache-0.3.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:050b571b2e96ec942898f8eb46ea4bfbb19bd5502424747e83badc2d4a99a44e", size = 231133, upload-time = "2025-03-26T03:04:42.544Z" }, + { url = "https://files.pythonhosted.org/packages/98/a1/75f6355f9ad039108ff000dfc2e19962c8dea0430da9a1428e7975cf24b2/propcache-0.3.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e1c4d24b804b3a87e9350f79e2371a705a188d292fd310e663483af6ee6718ee", size = 230741, upload-time = "2025-03-26T03:04:44.06Z" }, + { url = "https://files.pythonhosted.org/packages/67/0c/3e82563af77d1f8731132166da69fdfd95e71210e31f18edce08a1eb11ea/propcache-0.3.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e4fe2a6d5ce975c117a6bb1e8ccda772d1e7029c1cca1acd209f91d30fa72815", size = 244047, upload-time = "2025-03-26T03:04:45.983Z" }, + { url = "https://files.pythonhosted.org/packages/f7/50/9fb7cca01532a08c4d5186d7bb2da6c4c587825c0ae134b89b47c7d62628/propcache-0.3.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:feccd282de1f6322f56f6845bf1207a537227812f0a9bf5571df52bb418d79d5", size = 246467, upload-time = "2025-03-26T03:04:47.699Z" }, + { url = "https://files.pythonhosted.org/packages/a9/02/ccbcf3e1c604c16cc525309161d57412c23cf2351523aedbb280eb7c9094/propcache-0.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ec314cde7314d2dd0510c6787326bbffcbdc317ecee6b7401ce218b3099075a7", size = 241022, upload-time = "2025-03-26T03:04:49.195Z" }, + { url = "https://files.pythonhosted.org/packages/db/19/e777227545e09ca1e77a6e21274ae9ec45de0f589f0ce3eca2a41f366220/propcache-0.3.1-cp312-cp312-win32.whl", hash = "sha256:7d2d5a0028d920738372630870e7d9644ce437142197f8c827194fca404bf03b", size = 40647, upload-time = "2025-03-26T03:04:50.595Z" }, + { url = "https://files.pythonhosted.org/packages/24/bb/3b1b01da5dd04c77a204c84e538ff11f624e31431cfde7201d9110b092b1/propcache-0.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:88c423efef9d7a59dae0614eaed718449c09a5ac79a5f224a8b9664d603f04a3", size = 44784, upload-time = "2025-03-26T03:04:51.791Z" }, + { url = "https://files.pythonhosted.org/packages/58/60/f645cc8b570f99be3cf46714170c2de4b4c9d6b827b912811eff1eb8a412/propcache-0.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f1528ec4374617a7a753f90f20e2f551121bb558fcb35926f99e3c42367164b8", size = 77865, upload-time = "2025-03-26T03:04:53.406Z" }, + { url = "https://files.pythonhosted.org/packages/6f/d4/c1adbf3901537582e65cf90fd9c26fde1298fde5a2c593f987112c0d0798/propcache-0.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dc1915ec523b3b494933b5424980831b636fe483d7d543f7afb7b3bf00f0c10f", size = 45452, upload-time = "2025-03-26T03:04:54.624Z" }, + { url = "https://files.pythonhosted.org/packages/d1/b5/fe752b2e63f49f727c6c1c224175d21b7d1727ce1d4873ef1c24c9216830/propcache-0.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a110205022d077da24e60b3df8bcee73971be9575dec5573dd17ae5d81751111", size = 44800, upload-time = "2025-03-26T03:04:55.844Z" }, + { url = "https://files.pythonhosted.org/packages/62/37/fc357e345bc1971e21f76597028b059c3d795c5ca7690d7a8d9a03c9708a/propcache-0.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d249609e547c04d190e820d0d4c8ca03ed4582bcf8e4e160a6969ddfb57b62e5", size = 225804, upload-time = "2025-03-26T03:04:57.158Z" }, + { url = "https://files.pythonhosted.org/packages/0d/f1/16e12c33e3dbe7f8b737809bad05719cff1dccb8df4dafbcff5575002c0e/propcache-0.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ced33d827625d0a589e831126ccb4f5c29dfdf6766cac441d23995a65825dcb", size = 230650, upload-time = "2025-03-26T03:04:58.61Z" }, + { url = "https://files.pythonhosted.org/packages/3e/a2/018b9f2ed876bf5091e60153f727e8f9073d97573f790ff7cdf6bc1d1fb8/propcache-0.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4114c4ada8f3181af20808bedb250da6bae56660e4b8dfd9cd95d4549c0962f7", size = 234235, upload-time = "2025-03-26T03:05:00.599Z" }, + { url = "https://files.pythonhosted.org/packages/45/5f/3faee66fc930dfb5da509e34c6ac7128870631c0e3582987fad161fcb4b1/propcache-0.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:975af16f406ce48f1333ec5e912fe11064605d5c5b3f6746969077cc3adeb120", size = 228249, upload-time = "2025-03-26T03:05:02.11Z" }, + { url = "https://files.pythonhosted.org/packages/62/1e/a0d5ebda5da7ff34d2f5259a3e171a94be83c41eb1e7cd21a2105a84a02e/propcache-0.3.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a34aa3a1abc50740be6ac0ab9d594e274f59960d3ad253cd318af76b996dd654", size = 214964, upload-time = "2025-03-26T03:05:03.599Z" }, + { url = "https://files.pythonhosted.org/packages/db/a0/d72da3f61ceab126e9be1f3bc7844b4e98c6e61c985097474668e7e52152/propcache-0.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9cec3239c85ed15bfaded997773fdad9fb5662b0a7cbc854a43f291eb183179e", size = 222501, upload-time = "2025-03-26T03:05:05.107Z" }, + { url = "https://files.pythonhosted.org/packages/18/6d/a008e07ad7b905011253adbbd97e5b5375c33f0b961355ca0a30377504ac/propcache-0.3.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:05543250deac8e61084234d5fc54f8ebd254e8f2b39a16b1dce48904f45b744b", size = 217917, upload-time = "2025-03-26T03:05:06.59Z" }, + { url = "https://files.pythonhosted.org/packages/98/37/02c9343ffe59e590e0e56dc5c97d0da2b8b19fa747ebacf158310f97a79a/propcache-0.3.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5cb5918253912e088edbf023788de539219718d3b10aef334476b62d2b53de53", size = 217089, upload-time = "2025-03-26T03:05:08.1Z" }, + { url = "https://files.pythonhosted.org/packages/53/1b/d3406629a2c8a5666d4674c50f757a77be119b113eedd47b0375afdf1b42/propcache-0.3.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f3bbecd2f34d0e6d3c543fdb3b15d6b60dd69970c2b4c822379e5ec8f6f621d5", size = 228102, upload-time = "2025-03-26T03:05:09.982Z" }, + { url = "https://files.pythonhosted.org/packages/cd/a7/3664756cf50ce739e5f3abd48febc0be1a713b1f389a502ca819791a6b69/propcache-0.3.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aca63103895c7d960a5b9b044a83f544b233c95e0dcff114389d64d762017af7", size = 230122, upload-time = "2025-03-26T03:05:11.408Z" }, + { url = "https://files.pythonhosted.org/packages/35/36/0bbabaacdcc26dac4f8139625e930f4311864251276033a52fd52ff2a274/propcache-0.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a0a9898fdb99bf11786265468571e628ba60af80dc3f6eb89a3545540c6b0ef", size = 226818, upload-time = "2025-03-26T03:05:12.909Z" }, + { url = "https://files.pythonhosted.org/packages/cc/27/4e0ef21084b53bd35d4dae1634b6d0bad35e9c58ed4f032511acca9d4d26/propcache-0.3.1-cp313-cp313-win32.whl", hash = "sha256:3a02a28095b5e63128bcae98eb59025924f121f048a62393db682f049bf4ac24", size = 40112, upload-time = "2025-03-26T03:05:14.289Z" }, + { url = "https://files.pythonhosted.org/packages/a6/2c/a54614d61895ba6dd7ac8f107e2b2a0347259ab29cbf2ecc7b94fa38c4dc/propcache-0.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:813fbb8b6aea2fc9659815e585e548fe706d6f663fa73dff59a1677d4595a037", size = 44034, upload-time = "2025-03-26T03:05:15.616Z" }, + { url = "https://files.pythonhosted.org/packages/5a/a8/0a4fd2f664fc6acc66438370905124ce62e84e2e860f2557015ee4a61c7e/propcache-0.3.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a444192f20f5ce8a5e52761a031b90f5ea6288b1eef42ad4c7e64fef33540b8f", size = 82613, upload-time = "2025-03-26T03:05:16.913Z" }, + { url = "https://files.pythonhosted.org/packages/4d/e5/5ef30eb2cd81576256d7b6caaa0ce33cd1d2c2c92c8903cccb1af1a4ff2f/propcache-0.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0fbe94666e62ebe36cd652f5fc012abfbc2342de99b523f8267a678e4dfdee3c", size = 47763, upload-time = "2025-03-26T03:05:18.607Z" }, + { url = "https://files.pythonhosted.org/packages/87/9a/87091ceb048efeba4d28e903c0b15bcc84b7c0bf27dc0261e62335d9b7b8/propcache-0.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f011f104db880f4e2166bcdcf7f58250f7a465bc6b068dc84c824a3d4a5c94dc", size = 47175, upload-time = "2025-03-26T03:05:19.85Z" }, + { url = "https://files.pythonhosted.org/packages/3e/2f/854e653c96ad1161f96194c6678a41bbb38c7947d17768e8811a77635a08/propcache-0.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e584b6d388aeb0001d6d5c2bd86b26304adde6d9bb9bfa9c4889805021b96de", size = 292265, upload-time = "2025-03-26T03:05:21.654Z" }, + { url = "https://files.pythonhosted.org/packages/40/8d/090955e13ed06bc3496ba4a9fb26c62e209ac41973cb0d6222de20c6868f/propcache-0.3.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a17583515a04358b034e241f952f1715243482fc2c2945fd99a1b03a0bd77d6", size = 294412, upload-time = "2025-03-26T03:05:23.147Z" }, + { url = "https://files.pythonhosted.org/packages/39/e6/d51601342e53cc7582449e6a3c14a0479fab2f0750c1f4d22302e34219c6/propcache-0.3.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5aed8d8308215089c0734a2af4f2e95eeb360660184ad3912686c181e500b2e7", size = 294290, upload-time = "2025-03-26T03:05:24.577Z" }, + { url = "https://files.pythonhosted.org/packages/3b/4d/be5f1a90abc1881884aa5878989a1acdafd379a91d9c7e5e12cef37ec0d7/propcache-0.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d8e309ff9a0503ef70dc9a0ebd3e69cf7b3894c9ae2ae81fc10943c37762458", size = 282926, upload-time = "2025-03-26T03:05:26.459Z" }, + { url = "https://files.pythonhosted.org/packages/57/2b/8f61b998c7ea93a2b7eca79e53f3e903db1787fca9373af9e2cf8dc22f9d/propcache-0.3.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b655032b202028a582d27aeedc2e813299f82cb232f969f87a4fde491a233f11", size = 267808, upload-time = "2025-03-26T03:05:28.188Z" }, + { url = "https://files.pythonhosted.org/packages/11/1c/311326c3dfce59c58a6098388ba984b0e5fb0381ef2279ec458ef99bd547/propcache-0.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f64d91b751df77931336b5ff7bafbe8845c5770b06630e27acd5dbb71e1931c", size = 290916, upload-time = "2025-03-26T03:05:29.757Z" }, + { url = "https://files.pythonhosted.org/packages/4b/74/91939924b0385e54dc48eb2e4edd1e4903ffd053cf1916ebc5347ac227f7/propcache-0.3.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:19a06db789a4bd896ee91ebc50d059e23b3639c25d58eb35be3ca1cbe967c3bf", size = 262661, upload-time = "2025-03-26T03:05:31.472Z" }, + { url = "https://files.pythonhosted.org/packages/c2/d7/e6079af45136ad325c5337f5dd9ef97ab5dc349e0ff362fe5c5db95e2454/propcache-0.3.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:bef100c88d8692864651b5f98e871fb090bd65c8a41a1cb0ff2322db39c96c27", size = 264384, upload-time = "2025-03-26T03:05:32.984Z" }, + { url = "https://files.pythonhosted.org/packages/b7/d5/ba91702207ac61ae6f1c2da81c5d0d6bf6ce89e08a2b4d44e411c0bbe867/propcache-0.3.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:87380fb1f3089d2a0b8b00f006ed12bd41bd858fabfa7330c954c70f50ed8757", size = 291420, upload-time = "2025-03-26T03:05:34.496Z" }, + { url = "https://files.pythonhosted.org/packages/58/70/2117780ed7edcd7ba6b8134cb7802aada90b894a9810ec56b7bb6018bee7/propcache-0.3.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e474fc718e73ba5ec5180358aa07f6aded0ff5f2abe700e3115c37d75c947e18", size = 290880, upload-time = "2025-03-26T03:05:36.256Z" }, + { url = "https://files.pythonhosted.org/packages/4a/1f/ecd9ce27710021ae623631c0146719280a929d895a095f6d85efb6a0be2e/propcache-0.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:17d1c688a443355234f3c031349da69444be052613483f3e4158eef751abcd8a", size = 287407, upload-time = "2025-03-26T03:05:37.799Z" }, + { url = "https://files.pythonhosted.org/packages/3e/66/2e90547d6b60180fb29e23dc87bd8c116517d4255240ec6d3f7dc23d1926/propcache-0.3.1-cp313-cp313t-win32.whl", hash = "sha256:359e81a949a7619802eb601d66d37072b79b79c2505e6d3fd8b945538411400d", size = 42573, upload-time = "2025-03-26T03:05:39.193Z" }, + { url = "https://files.pythonhosted.org/packages/cb/8f/50ad8599399d1861b4d2b6b45271f0ef6af1b09b0a2386a46dbaf19c9535/propcache-0.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e7fb9a84c9abbf2b2683fa3e7b0d7da4d8ecf139a1c635732a8bda29c5214b0e", size = 46757, upload-time = "2025-03-26T03:05:40.811Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d3/c3cb8f1d6ae3b37f83e1de806713a9b3642c5895f0215a62e1a4bd6e5e34/propcache-0.3.1-py3-none-any.whl", hash = "sha256:9a8ecf38de50a7f518c21568c80f985e776397b902f1ce0b01f799aba1608b40", size = 12376, upload-time = "2025-03-26T03:06:10.5Z" }, +] + +[[package]] +name = "pycryptodome" +version = "3.22.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/44/e6/099310419df5ada522ff34ffc2f1a48a11b37fc6a76f51a6854c182dbd3e/pycryptodome-3.22.0.tar.gz", hash = "sha256:fd7ab568b3ad7b77c908d7c3f7e167ec5a8f035c64ff74f10d47a4edd043d723", size = 4917300, upload-time = "2025-03-15T23:03:36.506Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/65/a05831c3e4bcd1bf6c2a034e399f74b3d6f30bb4e37e36b9c310c09dc8c0/pycryptodome-3.22.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:009e1c80eea42401a5bd5983c4bab8d516aef22e014a4705622e24e6d9d703c6", size = 2490637, upload-time = "2025-03-15T23:02:43.111Z" }, + { url = "https://files.pythonhosted.org/packages/5c/76/ff3c2e7a60d17c080c4c6120ebaf60f38717cd387e77f84da4dcf7f64ff0/pycryptodome-3.22.0-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3b76fa80daeff9519d7e9f6d9e40708f2fce36b9295a847f00624a08293f4f00", size = 1635372, upload-time = "2025-03-15T23:02:45.564Z" }, + { url = "https://files.pythonhosted.org/packages/cc/7f/cc5d6da0dbc36acd978d80a72b228e33aadaec9c4f91c93221166d8bdc05/pycryptodome-3.22.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a31fa5914b255ab62aac9265654292ce0404f6b66540a065f538466474baedbc", size = 2177456, upload-time = "2025-03-15T23:02:47.688Z" }, + { url = "https://files.pythonhosted.org/packages/92/65/35f5063e68790602d892ad36e35ac723147232a9084d1999630045c34593/pycryptodome-3.22.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0092fd476701eeeb04df5cc509d8b739fa381583cda6a46ff0a60639b7cd70d", size = 2263744, upload-time = "2025-03-15T23:02:49.548Z" }, + { url = "https://files.pythonhosted.org/packages/cc/67/46acdd35b1081c3dbc72dc466b1b95b80d2f64cad3520f994a9b6c5c7d00/pycryptodome-3.22.0-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18d5b0ddc7cf69231736d778bd3ae2b3efb681ae33b64b0c92fb4626bb48bb89", size = 2303356, upload-time = "2025-03-15T23:02:52.122Z" }, + { url = "https://files.pythonhosted.org/packages/3d/f9/a4f8a83384626098e3f55664519bec113002b9ef751887086ae63a53135a/pycryptodome-3.22.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f6cf6aa36fcf463e622d2165a5ad9963b2762bebae2f632d719dfb8544903cf5", size = 2176714, upload-time = "2025-03-15T23:02:53.85Z" }, + { url = "https://files.pythonhosted.org/packages/88/65/e5f8c3a885f70a6e05c84844cd5542120576f4369158946e8cfc623a464d/pycryptodome-3.22.0-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:aec7b40a7ea5af7c40f8837adf20a137d5e11a6eb202cde7e588a48fb2d871a8", size = 2337329, upload-time = "2025-03-15T23:02:56.11Z" }, + { url = "https://files.pythonhosted.org/packages/b8/2a/25e0be2b509c28375c7f75c7e8d8d060773f2cce4856a1654276e3202339/pycryptodome-3.22.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d21c1eda2f42211f18a25db4eaf8056c94a8563cd39da3683f89fe0d881fb772", size = 2262255, upload-time = "2025-03-15T23:02:58.055Z" }, + { url = "https://files.pythonhosted.org/packages/41/58/60917bc4bbd91712e53ce04daf237a74a0ad731383a01288130672994328/pycryptodome-3.22.0-cp37-abi3-win32.whl", hash = "sha256:f02baa9f5e35934c6e8dcec91fcde96612bdefef6e442813b8ea34e82c84bbfb", size = 1763403, upload-time = "2025-03-15T23:03:00.616Z" }, + { url = "https://files.pythonhosted.org/packages/55/f4/244c621afcf7867e23f63cfd7a9630f14cfe946c9be7e566af6c3915bcde/pycryptodome-3.22.0-cp37-abi3-win_amd64.whl", hash = "sha256:d086aed307e96d40c23c42418cbbca22ecc0ab4a8a0e24f87932eeab26c08627", size = 1794568, upload-time = "2025-03-15T23:03:03.189Z" }, +] + +[[package]] +name = "pydantic" +version = "2.11.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/77/ab/5250d56ad03884ab5efd07f734203943c8a8ab40d551e208af81d0257bf2/pydantic-2.11.4.tar.gz", hash = "sha256:32738d19d63a226a52eed76645a98ee07c1f410ee41d93b4afbfa85ed8111c2d", size = 786540, upload-time = "2025-04-29T20:38:55.02Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/12/46b65f3534d099349e38ef6ec98b1a5a81f42536d17e0ba382c28c67ba67/pydantic-2.11.4-py3-none-any.whl", hash = "sha256:d9615eaa9ac5a063471da949c8fc16376a84afb5024688b3ff885693506764eb", size = 443900, upload-time = "2025-04-29T20:38:52.724Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.33.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195, upload-time = "2025-04-23T18:33:52.104Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000, upload-time = "2025-04-23T18:31:25.863Z" }, + { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996, upload-time = "2025-04-23T18:31:27.341Z" }, + { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957, upload-time = "2025-04-23T18:31:28.956Z" }, + { url = "https://files.pythonhosted.org/packages/ec/6b/1ec2c03837ac00886ba8160ce041ce4e325b41d06a034adbef11339ae422/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", size = 1964199, upload-time = "2025-04-23T18:31:31.025Z" }, + { url = "https://files.pythonhosted.org/packages/2d/1d/6bf34d6adb9debd9136bd197ca72642203ce9aaaa85cfcbfcf20f9696e83/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", size = 2120296, upload-time = "2025-04-23T18:31:32.514Z" }, + { url = "https://files.pythonhosted.org/packages/e0/94/2bd0aaf5a591e974b32a9f7123f16637776c304471a0ab33cf263cf5591a/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", size = 2676109, upload-time = "2025-04-23T18:31:33.958Z" }, + { url = "https://files.pythonhosted.org/packages/f9/41/4b043778cf9c4285d59742281a769eac371b9e47e35f98ad321349cc5d61/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", size = 2002028, upload-time = "2025-04-23T18:31:39.095Z" }, + { url = "https://files.pythonhosted.org/packages/cb/d5/7bb781bf2748ce3d03af04d5c969fa1308880e1dca35a9bd94e1a96a922e/pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", size = 2100044, upload-time = "2025-04-23T18:31:41.034Z" }, + { url = "https://files.pythonhosted.org/packages/fe/36/def5e53e1eb0ad896785702a5bbfd25eed546cdcf4087ad285021a90ed53/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", size = 2058881, upload-time = "2025-04-23T18:31:42.757Z" }, + { url = "https://files.pythonhosted.org/packages/01/6c/57f8d70b2ee57fc3dc8b9610315949837fa8c11d86927b9bb044f8705419/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", size = 2227034, upload-time = "2025-04-23T18:31:44.304Z" }, + { url = "https://files.pythonhosted.org/packages/27/b9/9c17f0396a82b3d5cbea4c24d742083422639e7bb1d5bf600e12cb176a13/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", size = 2234187, upload-time = "2025-04-23T18:31:45.891Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6a/adf5734ffd52bf86d865093ad70b2ce543415e0e356f6cacabbc0d9ad910/pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", size = 1892628, upload-time = "2025-04-23T18:31:47.819Z" }, + { url = "https://files.pythonhosted.org/packages/43/e4/5479fecb3606c1368d496a825d8411e126133c41224c1e7238be58b87d7e/pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", size = 1955866, upload-time = "2025-04-23T18:31:49.635Z" }, + { url = "https://files.pythonhosted.org/packages/0d/24/8b11e8b3e2be9dd82df4b11408a67c61bb4dc4f8e11b5b0fc888b38118b5/pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", size = 1888894, upload-time = "2025-04-23T18:31:51.609Z" }, + { url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688, upload-time = "2025-04-23T18:31:53.175Z" }, + { url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808, upload-time = "2025-04-23T18:31:54.79Z" }, + { url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580, upload-time = "2025-04-23T18:31:57.393Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859, upload-time = "2025-04-23T18:31:59.065Z" }, + { url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810, upload-time = "2025-04-23T18:32:00.78Z" }, + { url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498, upload-time = "2025-04-23T18:32:02.418Z" }, + { url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611, upload-time = "2025-04-23T18:32:04.152Z" }, + { url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924, upload-time = "2025-04-23T18:32:06.129Z" }, + { url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196, upload-time = "2025-04-23T18:32:08.178Z" }, + { url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389, upload-time = "2025-04-23T18:32:10.242Z" }, + { url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223, upload-time = "2025-04-23T18:32:12.382Z" }, + { url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473, upload-time = "2025-04-23T18:32:14.034Z" }, + { url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269, upload-time = "2025-04-23T18:32:15.783Z" }, + { url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921, upload-time = "2025-04-23T18:32:18.473Z" }, + { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162, upload-time = "2025-04-23T18:32:20.188Z" }, + { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560, upload-time = "2025-04-23T18:32:22.354Z" }, + { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777, upload-time = "2025-04-23T18:32:25.088Z" }, +] + +[[package]] +name = "pygments" +version = "2.19.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581, upload-time = "2025-01-06T17:26:30.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293, upload-time = "2025-01-06T17:26:25.553Z" }, +] + +[[package]] +name = "pytest" +version = "8.3.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891, upload-time = "2025-03-02T12:54:54.503Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634, upload-time = "2025-03-02T12:54:52.069Z" }, +] + +[[package]] +name = "pytest-cov" +version = "6.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "coverage" }, + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/25/69/5f1e57f6c5a39f81411b550027bf72842c4567ff5fd572bed1edc9e4b5d9/pytest_cov-6.1.1.tar.gz", hash = "sha256:46935f7aaefba760e716c2ebfbe1c216240b9592966e7da99ea8292d4d3e2a0a", size = 66857, upload-time = "2025-04-05T14:07:51.592Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/28/d0/def53b4a790cfb21483016430ed828f64830dd981ebe1089971cd10cab25/pytest_cov-6.1.1-py3-none-any.whl", hash = "sha256:bddf29ed2d0ab6f4df17b4c55b0a657287db8684af9c42ea546b21b1041b3dde", size = 23841, upload-time = "2025-04-05T14:07:49.641Z" }, +] + +[[package]] +name = "pytest-mock" +version = "3.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c6/90/a955c3ab35ccd41ad4de556596fa86685bf4fc5ffcc62d22d856cfd4e29a/pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0", size = 32814, upload-time = "2024-03-21T22:14:04.964Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/3b/b26f90f74e2986a82df6e7ac7e319b8ea7ccece1caec9f8ab6104dc70603/pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f", size = 9863, upload-time = "2024-03-21T22:14:02.694Z" }, +] + +[[package]] +name = "pyunormalize" +version = "16.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b3/08/568036c725dac746ecb267bb749ef930fb7907454fe69fce83c8557287fb/pyunormalize-16.0.0.tar.gz", hash = "sha256:2e1dfbb4a118154ae26f70710426a52a364b926c9191f764601f5a8cb12761f7", size = 49968, upload-time = "2024-09-17T17:08:18.245Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/f9/9d86e56f716e0651194a5ad58be9c146fcaf1de6901ac6f3cd3affeeb74e/pyunormalize-16.0.0-py3-none-any.whl", hash = "sha256:c647d95e5d1e2ea9a2f448d1d95d8518348df24eab5c3fd32d2b5c3300a49152", size = 49173, upload-time = "2024-09-17T17:08:17.078Z" }, +] + +[[package]] +name = "pywin32" +version = "310" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/ec/4fdbe47932f671d6e348474ea35ed94227fb5df56a7c30cbbb42cd396ed0/pywin32-310-cp312-cp312-win32.whl", hash = "sha256:8a75a5cc3893e83a108c05d82198880704c44bbaee4d06e442e471d3c9ea4f3d", size = 8796239, upload-time = "2025-03-17T00:55:58.807Z" }, + { url = "https://files.pythonhosted.org/packages/e3/e5/b0627f8bb84e06991bea89ad8153a9e50ace40b2e1195d68e9dff6b03d0f/pywin32-310-cp312-cp312-win_amd64.whl", hash = "sha256:bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060", size = 9503839, upload-time = "2025-03-17T00:56:00.8Z" }, + { url = "https://files.pythonhosted.org/packages/1f/32/9ccf53748df72301a89713936645a664ec001abd35ecc8578beda593d37d/pywin32-310-cp312-cp312-win_arm64.whl", hash = "sha256:2349cc906eae872d0663d4d6290d13b90621eaf78964bb1578632ff20e152966", size = 8459470, upload-time = "2025-03-17T00:56:02.601Z" }, + { url = "https://files.pythonhosted.org/packages/1c/09/9c1b978ffc4ae53999e89c19c77ba882d9fce476729f23ef55211ea1c034/pywin32-310-cp313-cp313-win32.whl", hash = "sha256:5d241a659c496ada3253cd01cfaa779b048e90ce4b2b38cd44168ad555ce74ab", size = 8794384, upload-time = "2025-03-17T00:56:04.383Z" }, + { url = "https://files.pythonhosted.org/packages/45/3c/b4640f740ffebadd5d34df35fecba0e1cfef8fde9f3e594df91c28ad9b50/pywin32-310-cp313-cp313-win_amd64.whl", hash = "sha256:667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e", size = 9503039, upload-time = "2025-03-17T00:56:06.207Z" }, + { url = "https://files.pythonhosted.org/packages/b4/f4/f785020090fb050e7fb6d34b780f2231f302609dc964672f72bfaeb59a28/pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33", size = 8458152, upload-time = "2025-03-17T00:56:07.819Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload-time = "2024-08-06T20:33:50.674Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873, upload-time = "2024-08-06T20:32:25.131Z" }, + { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302, upload-time = "2024-08-06T20:32:26.511Z" }, + { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154, upload-time = "2024-08-06T20:32:28.363Z" }, + { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223, upload-time = "2024-08-06T20:32:30.058Z" }, + { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542, upload-time = "2024-08-06T20:32:31.881Z" }, + { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164, upload-time = "2024-08-06T20:32:37.083Z" }, + { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611, upload-time = "2024-08-06T20:32:38.898Z" }, + { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591, upload-time = "2024-08-06T20:32:40.241Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338, upload-time = "2024-08-06T20:32:41.93Z" }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload-time = "2024-08-06T20:32:43.4Z" }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload-time = "2024-08-06T20:32:44.801Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload-time = "2024-08-06T20:32:46.432Z" }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload-time = "2024-08-06T20:32:51.188Z" }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload-time = "2024-08-06T20:32:53.019Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload-time = "2024-08-06T20:32:54.708Z" }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload-time = "2024-08-06T20:32:56.985Z" }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload-time = "2024-08-06T20:33:03.001Z" }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload-time = "2024-08-06T20:33:04.33Z" }, +] + +[[package]] +name = "regex" +version = "2024.11.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/5f/bd69653fbfb76cf8604468d3b4ec4c403197144c7bfe0e6a5fc9e02a07cb/regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519", size = 399494, upload-time = "2024-11-06T20:12:31.635Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ba/30/9a87ce8336b172cc232a0db89a3af97929d06c11ceaa19d97d84fa90a8f8/regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a", size = 483781, upload-time = "2024-11-06T20:10:07.07Z" }, + { url = "https://files.pythonhosted.org/packages/01/e8/00008ad4ff4be8b1844786ba6636035f7ef926db5686e4c0f98093612add/regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9", size = 288455, upload-time = "2024-11-06T20:10:09.117Z" }, + { url = "https://files.pythonhosted.org/packages/60/85/cebcc0aff603ea0a201667b203f13ba75d9fc8668fab917ac5b2de3967bc/regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2", size = 284759, upload-time = "2024-11-06T20:10:11.155Z" }, + { url = "https://files.pythonhosted.org/packages/94/2b/701a4b0585cb05472a4da28ee28fdfe155f3638f5e1ec92306d924e5faf0/regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4", size = 794976, upload-time = "2024-11-06T20:10:13.24Z" }, + { url = "https://files.pythonhosted.org/packages/4b/bf/fa87e563bf5fee75db8915f7352e1887b1249126a1be4813837f5dbec965/regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577", size = 833077, upload-time = "2024-11-06T20:10:15.37Z" }, + { url = "https://files.pythonhosted.org/packages/a1/56/7295e6bad94b047f4d0834e4779491b81216583c00c288252ef625c01d23/regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3", size = 823160, upload-time = "2024-11-06T20:10:19.027Z" }, + { url = "https://files.pythonhosted.org/packages/fb/13/e3b075031a738c9598c51cfbc4c7879e26729c53aa9cca59211c44235314/regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e", size = 796896, upload-time = "2024-11-06T20:10:21.85Z" }, + { url = "https://files.pythonhosted.org/packages/24/56/0b3f1b66d592be6efec23a795b37732682520b47c53da5a32c33ed7d84e3/regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe", size = 783997, upload-time = "2024-11-06T20:10:24.329Z" }, + { url = "https://files.pythonhosted.org/packages/f9/a1/eb378dada8b91c0e4c5f08ffb56f25fcae47bf52ad18f9b2f33b83e6d498/regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e", size = 781725, upload-time = "2024-11-06T20:10:28.067Z" }, + { url = "https://files.pythonhosted.org/packages/83/f2/033e7dec0cfd6dda93390089864732a3409246ffe8b042e9554afa9bff4e/regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29", size = 789481, upload-time = "2024-11-06T20:10:31.612Z" }, + { url = "https://files.pythonhosted.org/packages/83/23/15d4552ea28990a74e7696780c438aadd73a20318c47e527b47a4a5a596d/regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39", size = 852896, upload-time = "2024-11-06T20:10:34.054Z" }, + { url = "https://files.pythonhosted.org/packages/e3/39/ed4416bc90deedbfdada2568b2cb0bc1fdb98efe11f5378d9892b2a88f8f/regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51", size = 860138, upload-time = "2024-11-06T20:10:36.142Z" }, + { url = "https://files.pythonhosted.org/packages/93/2d/dd56bb76bd8e95bbce684326302f287455b56242a4f9c61f1bc76e28360e/regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad", size = 787692, upload-time = "2024-11-06T20:10:38.394Z" }, + { url = "https://files.pythonhosted.org/packages/0b/55/31877a249ab7a5156758246b9c59539abbeba22461b7d8adc9e8475ff73e/regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54", size = 262135, upload-time = "2024-11-06T20:10:40.367Z" }, + { url = "https://files.pythonhosted.org/packages/38/ec/ad2d7de49a600cdb8dd78434a1aeffe28b9d6fc42eb36afab4a27ad23384/regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b", size = 273567, upload-time = "2024-11-06T20:10:43.467Z" }, + { url = "https://files.pythonhosted.org/packages/90/73/bcb0e36614601016552fa9344544a3a2ae1809dc1401b100eab02e772e1f/regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84", size = 483525, upload-time = "2024-11-06T20:10:45.19Z" }, + { url = "https://files.pythonhosted.org/packages/0f/3f/f1a082a46b31e25291d830b369b6b0c5576a6f7fb89d3053a354c24b8a83/regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4", size = 288324, upload-time = "2024-11-06T20:10:47.177Z" }, + { url = "https://files.pythonhosted.org/packages/09/c9/4e68181a4a652fb3ef5099e077faf4fd2a694ea6e0f806a7737aff9e758a/regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0", size = 284617, upload-time = "2024-11-06T20:10:49.312Z" }, + { url = "https://files.pythonhosted.org/packages/fc/fd/37868b75eaf63843165f1d2122ca6cb94bfc0271e4428cf58c0616786dce/regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0", size = 795023, upload-time = "2024-11-06T20:10:51.102Z" }, + { url = "https://files.pythonhosted.org/packages/c4/7c/d4cd9c528502a3dedb5c13c146e7a7a539a3853dc20209c8e75d9ba9d1b2/regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7", size = 833072, upload-time = "2024-11-06T20:10:52.926Z" }, + { url = "https://files.pythonhosted.org/packages/4f/db/46f563a08f969159c5a0f0e722260568425363bea43bb7ae370becb66a67/regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7", size = 823130, upload-time = "2024-11-06T20:10:54.828Z" }, + { url = "https://files.pythonhosted.org/packages/db/60/1eeca2074f5b87df394fccaa432ae3fc06c9c9bfa97c5051aed70e6e00c2/regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c", size = 796857, upload-time = "2024-11-06T20:10:56.634Z" }, + { url = "https://files.pythonhosted.org/packages/10/db/ac718a08fcee981554d2f7bb8402f1faa7e868c1345c16ab1ebec54b0d7b/regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3", size = 784006, upload-time = "2024-11-06T20:10:59.369Z" }, + { url = "https://files.pythonhosted.org/packages/c2/41/7da3fe70216cea93144bf12da2b87367590bcf07db97604edeea55dac9ad/regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07", size = 781650, upload-time = "2024-11-06T20:11:02.042Z" }, + { url = "https://files.pythonhosted.org/packages/a7/d5/880921ee4eec393a4752e6ab9f0fe28009435417c3102fc413f3fe81c4e5/regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e", size = 789545, upload-time = "2024-11-06T20:11:03.933Z" }, + { url = "https://files.pythonhosted.org/packages/dc/96/53770115e507081122beca8899ab7f5ae28ae790bfcc82b5e38976df6a77/regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6", size = 853045, upload-time = "2024-11-06T20:11:06.497Z" }, + { url = "https://files.pythonhosted.org/packages/31/d3/1372add5251cc2d44b451bd94f43b2ec78e15a6e82bff6a290ef9fd8f00a/regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4", size = 860182, upload-time = "2024-11-06T20:11:09.06Z" }, + { url = "https://files.pythonhosted.org/packages/ed/e3/c446a64984ea9f69982ba1a69d4658d5014bc7a0ea468a07e1a1265db6e2/regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d", size = 787733, upload-time = "2024-11-06T20:11:11.256Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f1/e40c8373e3480e4f29f2692bd21b3e05f296d3afebc7e5dcf21b9756ca1c/regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff", size = 262122, upload-time = "2024-11-06T20:11:13.161Z" }, + { url = "https://files.pythonhosted.org/packages/45/94/bc295babb3062a731f52621cdc992d123111282e291abaf23faa413443ea/regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a", size = 273545, upload-time = "2024-11-06T20:11:15Z" }, +] + +[[package]] +name = "requests" +version = "2.32.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218, upload-time = "2024-05-29T15:37:49.536Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928, upload-time = "2024-05-29T15:37:47.027Z" }, +] + +[[package]] +name = "rlp" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "eth-utils" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1b/2d/439b0728a92964a04d9c88ea1ca9ebb128893fbbd5834faa31f987f2fd4c/rlp-4.1.0.tar.gz", hash = "sha256:be07564270a96f3e225e2c107db263de96b5bc1f27722d2855bd3459a08e95a9", size = 33429, upload-time = "2025-02-04T22:05:59.089Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/fb/e4c0ced9893b84ac95b7181d69a9786ce5879aeb3bbbcbba80a164f85d6a/rlp-4.1.0-py3-none-any.whl", hash = "sha256:8eca394c579bad34ee0b937aecb96a57052ff3716e19c7a578883e767bc5da6f", size = 19973, upload-time = "2025-02-04T22:05:57.05Z" }, +] + +[[package]] +name = "ruff" +version = "0.11.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/e7/e55dda1c92cdcf34b677ebef17486669800de01e887b7831a1b8fdf5cb08/ruff-0.11.9.tar.gz", hash = "sha256:ebd58d4f67a00afb3a30bf7d383e52d0e036e6195143c6db7019604a05335517", size = 4132134, upload-time = "2025-05-09T16:19:41.511Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/71/75dfb7194fe6502708e547941d41162574d1f579c4676a8eb645bf1a6842/ruff-0.11.9-py3-none-linux_armv6l.whl", hash = "sha256:a31a1d143a5e6f499d1fb480f8e1e780b4dfdd580f86e05e87b835d22c5c6f8c", size = 10335453, upload-time = "2025-05-09T16:18:58.2Z" }, + { url = "https://files.pythonhosted.org/packages/74/fc/ad80c869b1732f53c4232bbf341f33c5075b2c0fb3e488983eb55964076a/ruff-0.11.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:66bc18ca783b97186a1f3100e91e492615767ae0a3be584e1266aa9051990722", size = 11072566, upload-time = "2025-05-09T16:19:01.432Z" }, + { url = "https://files.pythonhosted.org/packages/87/0d/0ccececef8a0671dae155cbf7a1f90ea2dd1dba61405da60228bbe731d35/ruff-0.11.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:bd576cd06962825de8aece49f28707662ada6a1ff2db848d1348e12c580acbf1", size = 10435020, upload-time = "2025-05-09T16:19:03.897Z" }, + { url = "https://files.pythonhosted.org/packages/52/01/e249e1da6ad722278094e183cbf22379a9bbe5f21a3e46cef24ccab76e22/ruff-0.11.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b1d18b4be8182cc6fddf859ce432cc9631556e9f371ada52f3eaefc10d878de", size = 10593935, upload-time = "2025-05-09T16:19:06.455Z" }, + { url = "https://files.pythonhosted.org/packages/ed/9a/40cf91f61e3003fe7bd43f1761882740e954506c5a0f9097b1cff861f04c/ruff-0.11.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0f3f46f759ac623e94824b1e5a687a0df5cd7f5b00718ff9c24f0a894a683be7", size = 10172971, upload-time = "2025-05-09T16:19:10.261Z" }, + { url = "https://files.pythonhosted.org/packages/61/12/d395203de1e8717d7a2071b5a340422726d4736f44daf2290aad1085075f/ruff-0.11.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f34847eea11932d97b521450cf3e1d17863cfa5a94f21a056b93fb86f3f3dba2", size = 11748631, upload-time = "2025-05-09T16:19:12.307Z" }, + { url = "https://files.pythonhosted.org/packages/66/d6/ef4d5eba77677eab511644c37c55a3bb8dcac1cdeb331123fe342c9a16c9/ruff-0.11.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f33b15e00435773df97cddcd263578aa83af996b913721d86f47f4e0ee0ff271", size = 12409236, upload-time = "2025-05-09T16:19:15.006Z" }, + { url = "https://files.pythonhosted.org/packages/c5/8f/5a2c5fc6124dd925a5faf90e1089ee9036462118b619068e5b65f8ea03df/ruff-0.11.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7b27613a683b086f2aca8996f63cb3dd7bc49e6eccf590563221f7b43ded3f65", size = 11881436, upload-time = "2025-05-09T16:19:17.063Z" }, + { url = "https://files.pythonhosted.org/packages/39/d1/9683f469ae0b99b95ef99a56cfe8c8373c14eba26bd5c622150959ce9f64/ruff-0.11.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e0d88756e63e8302e630cee3ce2ffb77859797cc84a830a24473939e6da3ca6", size = 13982759, upload-time = "2025-05-09T16:19:19.693Z" }, + { url = "https://files.pythonhosted.org/packages/4e/0b/c53a664f06e0faab596397867c6320c3816df479e888fe3af63bc3f89699/ruff-0.11.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:537c82c9829d7811e3aa680205f94c81a2958a122ac391c0eb60336ace741a70", size = 11541985, upload-time = "2025-05-09T16:19:21.831Z" }, + { url = "https://files.pythonhosted.org/packages/23/a0/156c4d7e685f6526a636a60986ee4a3c09c8c4e2a49b9a08c9913f46c139/ruff-0.11.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:440ac6a7029f3dee7d46ab7de6f54b19e34c2b090bb4f2480d0a2d635228f381", size = 10465775, upload-time = "2025-05-09T16:19:24.401Z" }, + { url = "https://files.pythonhosted.org/packages/43/d5/88b9a6534d9d4952c355e38eabc343df812f168a2c811dbce7d681aeb404/ruff-0.11.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:71c539bac63d0788a30227ed4d43b81353c89437d355fdc52e0cda4ce5651787", size = 10170957, upload-time = "2025-05-09T16:19:27.08Z" }, + { url = "https://files.pythonhosted.org/packages/f0/b8/2bd533bdaf469dc84b45815ab806784d561fab104d993a54e1852596d581/ruff-0.11.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c67117bc82457e4501473c5f5217d49d9222a360794bfb63968e09e70f340abd", size = 11143307, upload-time = "2025-05-09T16:19:29.462Z" }, + { url = "https://files.pythonhosted.org/packages/2f/d9/43cfba291788459b9bfd4e09a0479aa94d05ab5021d381a502d61a807ec1/ruff-0.11.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e4b78454f97aa454586e8a5557facb40d683e74246c97372af3c2d76901d697b", size = 11603026, upload-time = "2025-05-09T16:19:31.569Z" }, + { url = "https://files.pythonhosted.org/packages/22/e6/7ed70048e89b01d728ccc950557a17ecf8df4127b08a56944b9d0bae61bc/ruff-0.11.9-py3-none-win32.whl", hash = "sha256:7fe1bc950e7d7b42caaee2a8a3bc27410547cc032c9558ee2e0f6d3b209e845a", size = 10548627, upload-time = "2025-05-09T16:19:33.657Z" }, + { url = "https://files.pythonhosted.org/packages/90/36/1da5d566271682ed10f436f732e5f75f926c17255c9c75cefb77d4bf8f10/ruff-0.11.9-py3-none-win_amd64.whl", hash = "sha256:52edaa4a6d70f8180343a5b7f030c7edd36ad180c9f4d224959c2d689962d964", size = 11634340, upload-time = "2025-05-09T16:19:35.815Z" }, + { url = "https://files.pythonhosted.org/packages/40/f7/70aad26e5877c8f7ee5b161c4c9fa0100e63fc4c944dc6d97b9c7e871417/ruff-0.11.9-py3-none-win_arm64.whl", hash = "sha256:bcf42689c22f2e240f496d0c183ef2c6f7b35e809f12c1db58f75d9aa8d630ca", size = 10741080, upload-time = "2025-05-09T16:19:39.605Z" }, +] + +[[package]] +name = "toolz" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/0b/d80dfa675bf592f636d1ea0b835eab4ec8df6e9415d8cfd766df54456123/toolz-1.0.0.tar.gz", hash = "sha256:2c86e3d9a04798ac556793bced838816296a2f085017664e4995cb40a1047a02", size = 66790, upload-time = "2024-10-04T16:17:04.001Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/03/98/eb27cc78ad3af8e302c9d8ff4977f5026676e130d28dd7578132a457170c/toolz-1.0.0-py3-none-any.whl", hash = "sha256:292c8f1c4e7516bf9086f8850935c799a874039c8bcf959d47b600e4c44a6236", size = 56383, upload-time = "2024-10-04T16:17:01.533Z" }, +] + +[[package]] +name = "types-requests" +version = "2.32.0.20250328" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/00/7d/eb174f74e3f5634eaacb38031bbe467dfe2e545bc255e5c90096ec46bc46/types_requests-2.32.0.20250328.tar.gz", hash = "sha256:c9e67228ea103bd811c96984fac36ed2ae8da87a36a633964a21f199d60baf32", size = 22995, upload-time = "2025-03-28T02:55:13.271Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/15/3700282a9d4ea3b37044264d3e4d1b1f0095a4ebf860a99914fd544e3be3/types_requests-2.32.0.20250328-py3-none-any.whl", hash = "sha256:72ff80f84b15eb3aa7a8e2625fffb6a93f2ad5a0c20215fc1dcfa61117bcb2a2", size = 20663, upload-time = "2025-03-28T02:55:11.946Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.13.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967, upload-time = "2025-04-10T14:19:05.416Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806, upload-time = "2025-04-10T14:19:03.967Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222, upload-time = "2025-02-25T17:27:59.638Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125, upload-time = "2025-02-25T17:27:57.754Z" }, +] + +[[package]] +name = "urllib3" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/78/16493d9c386d8e60e442a35feac5e00f0913c0f4b7c217c11e8ec2ff53e0/urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466", size = 390672, upload-time = "2025-04-10T15:23:39.232Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813", size = 128680, upload-time = "2025-04-10T15:23:37.377Z" }, +] + +[[package]] +name = "virtualenv" +version = "20.31.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "distlib" }, + { name = "filelock" }, + { name = "platformdirs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/56/2c/444f465fb2c65f40c3a104fd0c495184c4f2336d65baf398e3c75d72ea94/virtualenv-20.31.2.tar.gz", hash = "sha256:e10c0a9d02835e592521be48b332b6caee6887f332c111aa79a09b9e79efc2af", size = 6076316, upload-time = "2025-05-08T17:58:23.811Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/40/b1c265d4b2b62b58576588510fc4d1fe60a86319c8de99fd8e9fec617d2c/virtualenv-20.31.2-py3-none-any.whl", hash = "sha256:36efd0d9650ee985f0cad72065001e66d49a6f24eb44d98980f630686243cf11", size = 6057982, upload-time = "2025-05-08T17:58:21.15Z" }, +] + +[[package]] +name = "web3" +version = "7.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohttp" }, + { name = "eth-abi" }, + { name = "eth-account" }, + { name = "eth-hash", extra = ["pycryptodome"] }, + { name = "eth-typing" }, + { name = "eth-utils" }, + { name = "hexbytes" }, + { name = "pydantic" }, + { name = "pyunormalize" }, + { name = "pywin32", marker = "sys_platform == 'win32'" }, + { name = "requests" }, + { name = "types-requests" }, + { name = "typing-extensions" }, + { name = "websockets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/11/8a/d3017597fb48d7f8b5d8955a9ca9d8bd97f232fb3e89fd8842ddeb837010/web3-7.11.0.tar.gz", hash = "sha256:5e65f43aed028fc9a2e094e95499e66b18d7878d829ff8ff13f1a825141ab747", size = 2197541, upload-time = "2025-04-29T17:28:29.29Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/d8/afd0fc2919177d1c1f4e7e30e2dc83eb5be71d29046497b80892e3a978cf/web3-7.11.0-py3-none-any.whl", hash = "sha256:bbc844e4ea8d5769aa7be28cd737693cab41c4c52dc3d28c32d91718bfddfb91", size = 1367624, upload-time = "2025-04-29T17:28:26.766Z" }, +] + +[[package]] +name = "websockets" +version = "15.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016, upload-time = "2025-03-05T20:03:41.606Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/6b/4545a0d843594f5d0771e86463606a3988b5a09ca5123136f8a76580dd63/websockets-15.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3e90baa811a5d73f3ca0bcbf32064d663ed81318ab225ee4f427ad4e26e5aff3", size = 175437, upload-time = "2025-03-05T20:02:16.706Z" }, + { url = "https://files.pythonhosted.org/packages/f4/71/809a0f5f6a06522af902e0f2ea2757f71ead94610010cf570ab5c98e99ed/websockets-15.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:592f1a9fe869c778694f0aa806ba0374e97648ab57936f092fd9d87f8bc03665", size = 173096, upload-time = "2025-03-05T20:02:18.832Z" }, + { url = "https://files.pythonhosted.org/packages/3d/69/1a681dd6f02180916f116894181eab8b2e25b31e484c5d0eae637ec01f7c/websockets-15.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2", size = 173332, upload-time = "2025-03-05T20:02:20.187Z" }, + { url = "https://files.pythonhosted.org/packages/a6/02/0073b3952f5bce97eafbb35757f8d0d54812b6174ed8dd952aa08429bcc3/websockets-15.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8b56bdcdb4505c8078cb6c7157d9811a85790f2f2b3632c7d1462ab5783d215", size = 183152, upload-time = "2025-03-05T20:02:22.286Z" }, + { url = "https://files.pythonhosted.org/packages/74/45/c205c8480eafd114b428284840da0b1be9ffd0e4f87338dc95dc6ff961a1/websockets-15.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0af68c55afbd5f07986df82831c7bff04846928ea8d1fd7f30052638788bc9b5", size = 182096, upload-time = "2025-03-05T20:02:24.368Z" }, + { url = "https://files.pythonhosted.org/packages/14/8f/aa61f528fba38578ec553c145857a181384c72b98156f858ca5c8e82d9d3/websockets-15.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dee438fed052b52e4f98f76c5790513235efaa1ef7f3f2192c392cd7c91b65", size = 182523, upload-time = "2025-03-05T20:02:25.669Z" }, + { url = "https://files.pythonhosted.org/packages/ec/6d/0267396610add5bc0d0d3e77f546d4cd287200804fe02323797de77dbce9/websockets-15.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d5f6b181bb38171a8ad1d6aa58a67a6aa9d4b38d0f8c5f496b9e42561dfc62fe", size = 182790, upload-time = "2025-03-05T20:02:26.99Z" }, + { url = "https://files.pythonhosted.org/packages/02/05/c68c5adbf679cf610ae2f74a9b871ae84564462955d991178f95a1ddb7dd/websockets-15.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5d54b09eba2bada6011aea5375542a157637b91029687eb4fdb2dab11059c1b4", size = 182165, upload-time = "2025-03-05T20:02:30.291Z" }, + { url = "https://files.pythonhosted.org/packages/29/93/bb672df7b2f5faac89761cb5fa34f5cec45a4026c383a4b5761c6cea5c16/websockets-15.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3be571a8b5afed347da347bfcf27ba12b069d9d7f42cb8c7028b5e98bbb12597", size = 182160, upload-time = "2025-03-05T20:02:31.634Z" }, + { url = "https://files.pythonhosted.org/packages/ff/83/de1f7709376dc3ca9b7eeb4b9a07b4526b14876b6d372a4dc62312bebee0/websockets-15.0.1-cp312-cp312-win32.whl", hash = "sha256:c338ffa0520bdb12fbc527265235639fb76e7bc7faafbb93f6ba80d9c06578a9", size = 176395, upload-time = "2025-03-05T20:02:33.017Z" }, + { url = "https://files.pythonhosted.org/packages/7d/71/abf2ebc3bbfa40f391ce1428c7168fb20582d0ff57019b69ea20fa698043/websockets-15.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcd5cf9e305d7b8338754470cf69cf81f420459dbae8a3b40cee57417f4614a7", size = 176841, upload-time = "2025-03-05T20:02:34.498Z" }, + { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440, upload-time = "2025-03-05T20:02:36.695Z" }, + { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098, upload-time = "2025-03-05T20:02:37.985Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329, upload-time = "2025-03-05T20:02:39.298Z" }, + { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111, upload-time = "2025-03-05T20:02:40.595Z" }, + { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054, upload-time = "2025-03-05T20:02:41.926Z" }, + { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496, upload-time = "2025-03-05T20:02:43.304Z" }, + { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829, upload-time = "2025-03-05T20:02:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217, upload-time = "2025-03-05T20:02:50.14Z" }, + { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195, upload-time = "2025-03-05T20:02:51.561Z" }, + { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393, upload-time = "2025-03-05T20:02:53.814Z" }, + { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837, upload-time = "2025-03-05T20:02:55.237Z" }, + { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743, upload-time = "2025-03-05T20:03:39.41Z" }, +] + +[[package]] +name = "yarl" +version = "1.20.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "multidict" }, + { name = "propcache" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/62/51/c0edba5219027f6eab262e139f73e2417b0f4efffa23bf562f6e18f76ca5/yarl-1.20.0.tar.gz", hash = "sha256:686d51e51ee5dfe62dec86e4866ee0e9ed66df700d55c828a615640adc885307", size = 185258, upload-time = "2025-04-17T00:45:14.661Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/e8/3efdcb83073df978bb5b1a9cc0360ce596680e6c3fac01f2a994ccbb8939/yarl-1.20.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e06b9f6cdd772f9b665e5ba8161968e11e403774114420737f7884b5bd7bdf6f", size = 147089, upload-time = "2025-04-17T00:42:39.602Z" }, + { url = "https://files.pythonhosted.org/packages/60/c3/9e776e98ea350f76f94dd80b408eaa54e5092643dbf65fd9babcffb60509/yarl-1.20.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b9ae2fbe54d859b3ade40290f60fe40e7f969d83d482e84d2c31b9bff03e359e", size = 97706, upload-time = "2025-04-17T00:42:41.469Z" }, + { url = "https://files.pythonhosted.org/packages/0c/5b/45cdfb64a3b855ce074ae607b9fc40bc82e7613b94e7612b030255c93a09/yarl-1.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d12b8945250d80c67688602c891237994d203d42427cb14e36d1a732eda480e", size = 95719, upload-time = "2025-04-17T00:42:43.666Z" }, + { url = "https://files.pythonhosted.org/packages/2d/4e/929633b249611eeed04e2f861a14ed001acca3ef9ec2a984a757b1515889/yarl-1.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:087e9731884621b162a3e06dc0d2d626e1542a617f65ba7cc7aeab279d55ad33", size = 343972, upload-time = "2025-04-17T00:42:45.391Z" }, + { url = "https://files.pythonhosted.org/packages/49/fd/047535d326c913f1a90407a3baf7ff535b10098611eaef2c527e32e81ca1/yarl-1.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:69df35468b66c1a6e6556248e6443ef0ec5f11a7a4428cf1f6281f1879220f58", size = 339639, upload-time = "2025-04-17T00:42:47.552Z" }, + { url = "https://files.pythonhosted.org/packages/48/2f/11566f1176a78f4bafb0937c0072410b1b0d3640b297944a6a7a556e1d0b/yarl-1.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b2992fe29002fd0d4cbaea9428b09af9b8686a9024c840b8a2b8f4ea4abc16f", size = 353745, upload-time = "2025-04-17T00:42:49.406Z" }, + { url = "https://files.pythonhosted.org/packages/26/17/07dfcf034d6ae8837b33988be66045dd52f878dfb1c4e8f80a7343f677be/yarl-1.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4c903e0b42aab48abfbac668b5a9d7b6938e721a6341751331bcd7553de2dcae", size = 354178, upload-time = "2025-04-17T00:42:51.588Z" }, + { url = "https://files.pythonhosted.org/packages/15/45/212604d3142d84b4065d5f8cab6582ed3d78e4cc250568ef2a36fe1cf0a5/yarl-1.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf099e2432131093cc611623e0b0bcc399b8cddd9a91eded8bfb50402ec35018", size = 349219, upload-time = "2025-04-17T00:42:53.674Z" }, + { url = "https://files.pythonhosted.org/packages/e6/e0/a10b30f294111c5f1c682461e9459935c17d467a760c21e1f7db400ff499/yarl-1.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a7f62f5dc70a6c763bec9ebf922be52aa22863d9496a9a30124d65b489ea672", size = 337266, upload-time = "2025-04-17T00:42:55.49Z" }, + { url = "https://files.pythonhosted.org/packages/33/a6/6efa1d85a675d25a46a167f9f3e80104cde317dfdf7f53f112ae6b16a60a/yarl-1.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:54ac15a8b60382b2bcefd9a289ee26dc0920cf59b05368c9b2b72450751c6eb8", size = 360873, upload-time = "2025-04-17T00:42:57.895Z" }, + { url = "https://files.pythonhosted.org/packages/77/67/c8ab718cb98dfa2ae9ba0f97bf3cbb7d45d37f13fe1fbad25ac92940954e/yarl-1.20.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:25b3bc0763a7aca16a0f1b5e8ef0f23829df11fb539a1b70476dcab28bd83da7", size = 360524, upload-time = "2025-04-17T00:43:00.094Z" }, + { url = "https://files.pythonhosted.org/packages/bd/e8/c3f18660cea1bc73d9f8a2b3ef423def8dadbbae6c4afabdb920b73e0ead/yarl-1.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b2586e36dc070fc8fad6270f93242124df68b379c3a251af534030a4a33ef594", size = 365370, upload-time = "2025-04-17T00:43:02.242Z" }, + { url = "https://files.pythonhosted.org/packages/c9/99/33f3b97b065e62ff2d52817155a89cfa030a1a9b43fee7843ef560ad9603/yarl-1.20.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:866349da9d8c5290cfefb7fcc47721e94de3f315433613e01b435473be63daa6", size = 373297, upload-time = "2025-04-17T00:43:04.189Z" }, + { url = "https://files.pythonhosted.org/packages/3d/89/7519e79e264a5f08653d2446b26d4724b01198a93a74d2e259291d538ab1/yarl-1.20.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:33bb660b390a0554d41f8ebec5cd4475502d84104b27e9b42f5321c5192bfcd1", size = 378771, upload-time = "2025-04-17T00:43:06.609Z" }, + { url = "https://files.pythonhosted.org/packages/3a/58/6c460bbb884abd2917c3eef6f663a4a873f8dc6f498561fc0ad92231c113/yarl-1.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:737e9f171e5a07031cbee5e9180f6ce21a6c599b9d4b2c24d35df20a52fabf4b", size = 375000, upload-time = "2025-04-17T00:43:09.01Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2a/dd7ed1aa23fea996834278d7ff178f215b24324ee527df53d45e34d21d28/yarl-1.20.0-cp312-cp312-win32.whl", hash = "sha256:839de4c574169b6598d47ad61534e6981979ca2c820ccb77bf70f4311dd2cc64", size = 86355, upload-time = "2025-04-17T00:43:11.311Z" }, + { url = "https://files.pythonhosted.org/packages/ca/c6/333fe0338305c0ac1c16d5aa7cc4841208d3252bbe62172e0051006b5445/yarl-1.20.0-cp312-cp312-win_amd64.whl", hash = "sha256:3d7dbbe44b443b0c4aa0971cb07dcb2c2060e4a9bf8d1301140a33a93c98e18c", size = 92904, upload-time = "2025-04-17T00:43:13.087Z" }, + { url = "https://files.pythonhosted.org/packages/0f/6f/514c9bff2900c22a4f10e06297714dbaf98707143b37ff0bcba65a956221/yarl-1.20.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2137810a20b933b1b1b7e5cf06a64c3ed3b4747b0e5d79c9447c00db0e2f752f", size = 145030, upload-time = "2025-04-17T00:43:15.083Z" }, + { url = "https://files.pythonhosted.org/packages/4e/9d/f88da3fa319b8c9c813389bfb3463e8d777c62654c7168e580a13fadff05/yarl-1.20.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:447c5eadd750db8389804030d15f43d30435ed47af1313303ed82a62388176d3", size = 96894, upload-time = "2025-04-17T00:43:17.372Z" }, + { url = "https://files.pythonhosted.org/packages/cd/57/92e83538580a6968b2451d6c89c5579938a7309d4785748e8ad42ddafdce/yarl-1.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42fbe577272c203528d402eec8bf4b2d14fd49ecfec92272334270b850e9cd7d", size = 94457, upload-time = "2025-04-17T00:43:19.431Z" }, + { url = "https://files.pythonhosted.org/packages/e9/ee/7ee43bd4cf82dddd5da97fcaddb6fa541ab81f3ed564c42f146c83ae17ce/yarl-1.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18e321617de4ab170226cd15006a565d0fa0d908f11f724a2c9142d6b2812ab0", size = 343070, upload-time = "2025-04-17T00:43:21.426Z" }, + { url = "https://files.pythonhosted.org/packages/4a/12/b5eccd1109e2097bcc494ba7dc5de156e41cf8309fab437ebb7c2b296ce3/yarl-1.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4345f58719825bba29895011e8e3b545e6e00257abb984f9f27fe923afca2501", size = 337739, upload-time = "2025-04-17T00:43:23.634Z" }, + { url = "https://files.pythonhosted.org/packages/7d/6b/0eade8e49af9fc2585552f63c76fa59ef469c724cc05b29519b19aa3a6d5/yarl-1.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d9b980d7234614bc4674468ab173ed77d678349c860c3af83b1fffb6a837ddc", size = 351338, upload-time = "2025-04-17T00:43:25.695Z" }, + { url = "https://files.pythonhosted.org/packages/45/cb/aaaa75d30087b5183c7b8a07b4fb16ae0682dd149a1719b3a28f54061754/yarl-1.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af4baa8a445977831cbaa91a9a84cc09debb10bc8391f128da2f7bd070fc351d", size = 353636, upload-time = "2025-04-17T00:43:27.876Z" }, + { url = "https://files.pythonhosted.org/packages/98/9d/d9cb39ec68a91ba6e66fa86d97003f58570327d6713833edf7ad6ce9dde5/yarl-1.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:123393db7420e71d6ce40d24885a9e65eb1edefc7a5228db2d62bcab3386a5c0", size = 348061, upload-time = "2025-04-17T00:43:29.788Z" }, + { url = "https://files.pythonhosted.org/packages/72/6b/103940aae893d0cc770b4c36ce80e2ed86fcb863d48ea80a752b8bda9303/yarl-1.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab47acc9332f3de1b39e9b702d9c916af7f02656b2a86a474d9db4e53ef8fd7a", size = 334150, upload-time = "2025-04-17T00:43:31.742Z" }, + { url = "https://files.pythonhosted.org/packages/ef/b2/986bd82aa222c3e6b211a69c9081ba46484cffa9fab2a5235e8d18ca7a27/yarl-1.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4a34c52ed158f89876cba9c600b2c964dfc1ca52ba7b3ab6deb722d1d8be6df2", size = 362207, upload-time = "2025-04-17T00:43:34.099Z" }, + { url = "https://files.pythonhosted.org/packages/14/7c/63f5922437b873795d9422cbe7eb2509d4b540c37ae5548a4bb68fd2c546/yarl-1.20.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:04d8cfb12714158abf2618f792c77bc5c3d8c5f37353e79509608be4f18705c9", size = 361277, upload-time = "2025-04-17T00:43:36.202Z" }, + { url = "https://files.pythonhosted.org/packages/81/83/450938cccf732466953406570bdb42c62b5ffb0ac7ac75a1f267773ab5c8/yarl-1.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7dc63ad0d541c38b6ae2255aaa794434293964677d5c1ec5d0116b0e308031f5", size = 364990, upload-time = "2025-04-17T00:43:38.551Z" }, + { url = "https://files.pythonhosted.org/packages/b4/de/af47d3a47e4a833693b9ec8e87debb20f09d9fdc9139b207b09a3e6cbd5a/yarl-1.20.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d02b591a64e4e6ca18c5e3d925f11b559c763b950184a64cf47d74d7e41877", size = 374684, upload-time = "2025-04-17T00:43:40.481Z" }, + { url = "https://files.pythonhosted.org/packages/62/0b/078bcc2d539f1faffdc7d32cb29a2d7caa65f1a6f7e40795d8485db21851/yarl-1.20.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:95fc9876f917cac7f757df80a5dda9de59d423568460fe75d128c813b9af558e", size = 382599, upload-time = "2025-04-17T00:43:42.463Z" }, + { url = "https://files.pythonhosted.org/packages/74/a9/4fdb1a7899f1fb47fd1371e7ba9e94bff73439ce87099d5dd26d285fffe0/yarl-1.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bb769ae5760cd1c6a712135ee7915f9d43f11d9ef769cb3f75a23e398a92d384", size = 378573, upload-time = "2025-04-17T00:43:44.797Z" }, + { url = "https://files.pythonhosted.org/packages/fd/be/29f5156b7a319e4d2e5b51ce622b4dfb3aa8d8204cd2a8a339340fbfad40/yarl-1.20.0-cp313-cp313-win32.whl", hash = "sha256:70e0c580a0292c7414a1cead1e076c9786f685c1fc4757573d2967689b370e62", size = 86051, upload-time = "2025-04-17T00:43:47.076Z" }, + { url = "https://files.pythonhosted.org/packages/52/56/05fa52c32c301da77ec0b5f63d2d9605946fe29defacb2a7ebd473c23b81/yarl-1.20.0-cp313-cp313-win_amd64.whl", hash = "sha256:4c43030e4b0af775a85be1fa0433119b1565673266a70bf87ef68a9d5ba3174c", size = 92742, upload-time = "2025-04-17T00:43:49.193Z" }, + { url = "https://files.pythonhosted.org/packages/d4/2f/422546794196519152fc2e2f475f0e1d4d094a11995c81a465faf5673ffd/yarl-1.20.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b6c4c3d0d6a0ae9b281e492b1465c72de433b782e6b5001c8e7249e085b69051", size = 163575, upload-time = "2025-04-17T00:43:51.533Z" }, + { url = "https://files.pythonhosted.org/packages/90/fc/67c64ddab6c0b4a169d03c637fb2d2a212b536e1989dec8e7e2c92211b7f/yarl-1.20.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8681700f4e4df891eafa4f69a439a6e7d480d64e52bf460918f58e443bd3da7d", size = 106121, upload-time = "2025-04-17T00:43:53.506Z" }, + { url = "https://files.pythonhosted.org/packages/6d/00/29366b9eba7b6f6baed7d749f12add209b987c4cfbfa418404dbadc0f97c/yarl-1.20.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:84aeb556cb06c00652dbf87c17838eb6d92cfd317799a8092cee0e570ee11229", size = 103815, upload-time = "2025-04-17T00:43:55.41Z" }, + { url = "https://files.pythonhosted.org/packages/28/f4/a2a4c967c8323c03689383dff73396281ced3b35d0ed140580825c826af7/yarl-1.20.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f166eafa78810ddb383e930d62e623d288fb04ec566d1b4790099ae0f31485f1", size = 408231, upload-time = "2025-04-17T00:43:57.825Z" }, + { url = "https://files.pythonhosted.org/packages/0f/a1/66f7ffc0915877d726b70cc7a896ac30b6ac5d1d2760613603b022173635/yarl-1.20.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5d3d6d14754aefc7a458261027a562f024d4f6b8a798adb472277f675857b1eb", size = 390221, upload-time = "2025-04-17T00:44:00.526Z" }, + { url = "https://files.pythonhosted.org/packages/41/15/cc248f0504610283271615e85bf38bc014224122498c2016d13a3a1b8426/yarl-1.20.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a8f64df8ed5d04c51260dbae3cc82e5649834eebea9eadfd829837b8093eb00", size = 411400, upload-time = "2025-04-17T00:44:02.853Z" }, + { url = "https://files.pythonhosted.org/packages/5c/af/f0823d7e092bfb97d24fce6c7269d67fcd1aefade97d0a8189c4452e4d5e/yarl-1.20.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d9949eaf05b4d30e93e4034a7790634bbb41b8be2d07edd26754f2e38e491de", size = 411714, upload-time = "2025-04-17T00:44:04.904Z" }, + { url = "https://files.pythonhosted.org/packages/83/70/be418329eae64b9f1b20ecdaac75d53aef098797d4c2299d82ae6f8e4663/yarl-1.20.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c366b254082d21cc4f08f522ac201d0d83a8b8447ab562732931d31d80eb2a5", size = 404279, upload-time = "2025-04-17T00:44:07.721Z" }, + { url = "https://files.pythonhosted.org/packages/19/f5/52e02f0075f65b4914eb890eea1ba97e6fd91dd821cc33a623aa707b2f67/yarl-1.20.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91bc450c80a2e9685b10e34e41aef3d44ddf99b3a498717938926d05ca493f6a", size = 384044, upload-time = "2025-04-17T00:44:09.708Z" }, + { url = "https://files.pythonhosted.org/packages/6a/36/b0fa25226b03d3f769c68d46170b3e92b00ab3853d73127273ba22474697/yarl-1.20.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9c2aa4387de4bc3a5fe158080757748d16567119bef215bec643716b4fbf53f9", size = 416236, upload-time = "2025-04-17T00:44:11.734Z" }, + { url = "https://files.pythonhosted.org/packages/cb/3a/54c828dd35f6831dfdd5a79e6c6b4302ae2c5feca24232a83cb75132b205/yarl-1.20.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:d2cbca6760a541189cf87ee54ff891e1d9ea6406079c66341008f7ef6ab61145", size = 402034, upload-time = "2025-04-17T00:44:13.975Z" }, + { url = "https://files.pythonhosted.org/packages/10/97/c7bf5fba488f7e049f9ad69c1b8fdfe3daa2e8916b3d321aa049e361a55a/yarl-1.20.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:798a5074e656f06b9fad1a162be5a32da45237ce19d07884d0b67a0aa9d5fdda", size = 407943, upload-time = "2025-04-17T00:44:16.052Z" }, + { url = "https://files.pythonhosted.org/packages/fd/a4/022d2555c1e8fcff08ad7f0f43e4df3aba34f135bff04dd35d5526ce54ab/yarl-1.20.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:f106e75c454288472dbe615accef8248c686958c2e7dd3b8d8ee2669770d020f", size = 423058, upload-time = "2025-04-17T00:44:18.547Z" }, + { url = "https://files.pythonhosted.org/packages/4c/f6/0873a05563e5df29ccf35345a6ae0ac9e66588b41fdb7043a65848f03139/yarl-1.20.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:3b60a86551669c23dc5445010534d2c5d8a4e012163218fc9114e857c0586fdd", size = 423792, upload-time = "2025-04-17T00:44:20.639Z" }, + { url = "https://files.pythonhosted.org/packages/9e/35/43fbbd082708fa42e923f314c24f8277a28483d219e049552e5007a9aaca/yarl-1.20.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3e429857e341d5e8e15806118e0294f8073ba9c4580637e59ab7b238afca836f", size = 422242, upload-time = "2025-04-17T00:44:22.851Z" }, + { url = "https://files.pythonhosted.org/packages/ed/f7/f0f2500cf0c469beb2050b522c7815c575811627e6d3eb9ec7550ddd0bfe/yarl-1.20.0-cp313-cp313t-win32.whl", hash = "sha256:65a4053580fe88a63e8e4056b427224cd01edfb5f951498bfefca4052f0ce0ac", size = 93816, upload-time = "2025-04-17T00:44:25.491Z" }, + { url = "https://files.pythonhosted.org/packages/3f/93/f73b61353b2a699d489e782c3f5998b59f974ec3156a2050a52dfd7e8946/yarl-1.20.0-cp313-cp313t-win_amd64.whl", hash = "sha256:53b2da3a6ca0a541c1ae799c349788d480e5144cac47dba0266c7cb6c76151fe", size = 101093, upload-time = "2025-04-17T00:44:27.418Z" }, + { url = "https://files.pythonhosted.org/packages/ea/1f/70c57b3d7278e94ed22d85e09685d3f0a38ebdd8c5c73b65ba4c0d0fe002/yarl-1.20.0-py3-none-any.whl", hash = "sha256:5d0fe6af927a47a230f31e6004621fd0959eaa915fc62acfafa67ff7229a3124", size = 46124, upload-time = "2025-04-17T00:45:12.199Z" }, +]