ethereum / web3.py

A python interface for interacting with the Ethereum blockchain and ecosystem.
http://web3py.readthedocs.io
MIT License
4.91k stars 1.68k forks source link

OverflowError: Python int too large to convert to C ssize_t #1699

Closed RZeynalov closed 3 years ago

RZeynalov commented 3 years ago
absl-py==0.9.0
asn1crypto==1.3.0
astor==0.8.1
attrs==19.3.0
Automat==0.8.0
base58==2.0.0
bitarray==1.2.2
cached-property==1.5.1
cachetools==4.0.0
certifi==2019.11.28
cffi==1.14.0
chardet==3.0.4
coincurve==13.0.0
constantly==15.1.0
construct==2.9.45
cycler==0.10.0
cytoolz==0.10.1
eth-abi==2.1.1
eth-account==0.5.2
eth-hash==0.2.0
eth-keyfile==0.5.1
eth-keys==0.3.3
eth-rlp==0.1.2
eth-typing==2.2.1
eth-utils==1.9.0
etherscan==0.3.0
flow==0.0.1
future==0.18.2
gast==0.2.2
google-auth==1.11.2
google-auth-oauthlib==0.4.1
google-pasta==0.1.8
grpcio==1.27.2
h5py==2.10.0
hexbytes==0.2.0
hyperlink==19.0.0
ibapi==9.79.1
IbPy2==0.8.0
idna==2.8
importlib-metadata==1.6.0
incremental==17.5.0
ipfshttpclient==0.4.13.2
Js2Py==0.70
jsonschema==3.2.0
Keras-Applications==1.0.8
Keras-Preprocessing==1.1.0
kiwisolver==1.1.0
lru-dict==1.1.6
Markdown==3.2.1
matplotlib==3.1.3
MetaTrader5==5.0.21
multiaddr==0.0.9
mypy-extensions==0.4.3
Naked==0.1.31
netaddr==0.7.19
numpy==1.18.1
oauthlib==3.1.0
opt-einsum==3.1.0
pandas==1.0.1
parsimonious==0.8.1
pbkdf2==1.3
ply==3.11
protobuf==3.10.0
py-ecc==4.0.0
pyasn1==0.4.8
pyasn1-modules==0.2.8
pycparser==2.20
pycryptodome==3.9.7
pycryptodomex==3.9.4
PyHamcrest==1.9.0
pyjsparser==2.7.1
pyparsing==2.4.6
pypiwin32==223
pyrsistent==0.16.0
pysmi==0.3.4
pysnmp==4.4.12
pyTelegramBotAPI==3.7.2
python-dateutil==2.8.1
pytz==2019.3
pywin32==227
PyYAML==5.1.2
repoze.lru==0.7
requests==2.24.0
requests-cache==0.5.2
requests-oauthlib==1.3.0
rlp==1.2.0
rsa==4.0
scipy==1.4.1
six==1.13.0
tensor==0.3.6
tensorboard==2.1.0
tensorflow==2.1.0
tensorflow-estimator==2.1.0
termcolor==1.1.0
toolz==0.10.0
Twisted==19.10.0
typing-extensions==3.7.4.2
tzlocal==2.1
urllib3==1.25.8
varint==1.0.2
web3==5.12.0
websockets==8.1
Werkzeug==1.0.0
wrapt==1.12.0
zipp==3.1.0
zope.interface==4.7.1

What was wrong?

Hi Guyz,

i am trying to run getBidPrice (_quantity) function of setrebalance contract (https://etherscan.io/address/0x19f4a2f8e21915376f1429c26a3a9b9b1db5ff5a#code ) to get bids flow, but i get an error (OverflowError: Python int too large to convert to C ssize_t), i ve tried to modify this function output in ABI in different ways, but with no success. Here the post where there were discussion on this theme: https://github.com/ethereum/web3.py/issues/1634 - but it did not help to fix the issue.

Is anybody know hot to fix this ? Thank you in advance!!!!!

Please include any of the following that are applicable:

import json
from web3 import Web3

infura_url  = 'wss://mainnet.infura.io/ws/v3/[project_id]'

web3 = Web3(Web3.WebsocketProvider(infura_url, websocket_timeout=6000))

address_set_CHADLINK = web3.toChecksumAddress('0x19f4a2f8e21915376f1429c26a3a9b9b1db5ff5a')

abi_CHADLINK = json.loads('[{"constant":true,"inputs":[],"name":"unitShares","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newLiquidator","type":"address"}],"name":"setLiquidator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getUnits","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"entryFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"liquidatorWhiteList","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rebalanceInterval","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rebalanceFailPeriod","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenAddress","type":"address"}],"name":"tokenIsComponent","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"actualizeFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"proposalPeriod","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rebalanceFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"currentSet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"liquidator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_issuer","type":"address"},{"name":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"naturalUnit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"startingCurrentSetAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_rebalanceFeeCalldata","type":"bytes"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rebalanceFeeCalculator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"feeRecipient","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"manager","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"componentWhiteList","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCombinedTokenArrayLength","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"biddingParameters","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"endFailedAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_nextSet","type":"address"},{"name":"_liquidatorData","type":"bytes"}],"name":"startRebalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getCombinedTokenArray","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rebalanceIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"endFailedRebalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"auctionLibrary","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_quantity","type":"uint256"}],"name":"placeBid","outputs":[{"name":"","type":"address[]"},{"name":"","type":"uint256[]"},{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getComponents","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rebalanceStartTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_quantity","type":"uint256"}],"name":"getBidPrice","outputs":[{"name":"","type":"uint256[]"},{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_quantity","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getAuctionPriceParameters","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getBiddingParameters","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"proposalStartTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastRebalanceTimestamp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"factory","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"nextSet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newFeeData","type":"bytes"}],"name":"adjustFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getCombinedNextSetUnits","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SCALE_FACTOR","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newManager","type":"address"}],"name":"setManager","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"auctionPriceParameters","outputs":[{"components":[{"name":"auctionStartTime","type":"uint256"},{"name":"auctionTimeToPivot","type":"uint256"},{"name":"auctionStartPrice","type":"uint256"},{"name":"auctionPivotPrice","type":"uint256"}],"name":"","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newFeeRecipient","type":"address"}],"name":"setFeeRecipient","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newEntryFee","type":"uint256"}],"name":"setEntryFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getFailedAuctionWithdrawComponents","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCombinedCurrentUnits","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"hasBidded","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"core","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rebalanceState","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"settleRebalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"vault","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_addressConfig","type":"address[8]"},{"name":"_uintConfig","type":"uint256[6]"},{"name":"_name","type":"string"},{"name":"_symbol","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"feeRecipient","type":"address"},{"indexed":false,"name":"feeQuantity","type":"uint256"},{"indexed":false,"name":"feePercentage","type":"uint256"},{"indexed":false,"name":"newUnitShares","type":"uint256"}],"name":"IncentiveFeePaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newManager","type":"address"},{"indexed":false,"name":"oldManager","type":"address"}],"name":"NewManagerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newLiquidator","type":"address"},{"indexed":false,"name":"oldLiquidator","type":"address"}],"name":"NewLiquidatorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newEntryFee","type":"uint256"},{"indexed":false,"name":"oldEntryFee","type":"uint256"}],"name":"NewEntryFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newFeeRecipient","type":"address"},{"indexed":false,"name":"oldFeeRecipient","type":"address"}],"name":"NewFeeRecipient","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"feeRecipient","type":"address"},{"indexed":false,"name":"feeQuantity","type":"uint256"}],"name":"EntryFeePaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldSet","type":"address"},{"indexed":false,"name":"newSet","type":"address"},{"indexed":false,"name":"rebalanceIndex","type":"uint256"},{"indexed":false,"name":"currentSetQuantity","type":"uint256"}],"name":"RebalanceStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"feeRecipient","type":"address"},{"indexed":false,"name":"feeQuantity","type":"uint256"},{"indexed":false,"name":"feePercentage","type":"uint256"},{"indexed":false,"name":"rebalanceIndex","type":"uint256"},{"indexed":false,"name":"issueQuantity","type":"uint256"},{"indexed":false,"name":"unitShares","type":"uint256"}],"name":"RebalanceSettled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}]')

contract_CHADLINK = web3.eth.contract(address=address_set_CHADLINK, abi=abi_CHADLINK)

prices = contract_CHADLINK.functions.getBidPrice(1).call()
  File "C:/Users/Zeynalov/PycharmProjects/TEst/filter_test.py", line 62, in <module>
    prices = contract_CHADLINK.functions.getBidPrice(1).call()
  File "C:\Users\Zeynalov\PycharmProjects\TEst\venv\lib\site-packages\web3\contract.py", line 964, in call
    **self.kwargs
  File "C:\Users\Zeynalov\PycharmProjects\TEst\venv\lib\site-packages\web3\contract.py", line 1507, in call_contract_function
    output_data = web3.codec.decode_abi(output_types, return_data)
  File "C:\Users\Zeynalov\AppData\Local\Programs\Python\Python37\lib\site-packages\eth_abi\codec.py", line 181, in decode_abi
    return decoder(stream)
  File "C:\Users\Zeynalov\AppData\Local\Programs\Python\Python37\lib\site-packages\eth_abi\decoding.py", line 127, in __call__
    return self.decode(stream)
  File "C:\Users\Zeynalov\AppData\Local\Programs\Python\Python37\lib\site-packages\eth_utils\functional.py", line 45, in inner
    return callback(fn(*args, **kwargs))
  File "C:\Users\Zeynalov\AppData\Local\Programs\Python\Python37\lib\site-packages\eth_abi\decoding.py", line 173, in decode
    yield decoder(stream)
  File "C:\Users\Zeynalov\AppData\Local\Programs\Python\Python37\lib\site-packages\eth_abi\decoding.py", line 127, in __call__
    return self.decode(stream)
  File "C:\Users\Zeynalov\AppData\Local\Programs\Python\Python37\lib\site-packages\eth_abi\decoding.py", line 144, in decode
    stream.push_frame(start_pos)
  File "C:\Users\Zeynalov\AppData\Local\Programs\Python\Python37\lib\site-packages\eth_abi\decoding.py", line 95, in push_frame
    self.seek_in_frame(0)
  File "C:\Users\Zeynalov\AppData\Local\Programs\Python\Python37\lib\site-packages\eth_abi\decoding.py", line 84, in seek_in_frame
    self.seek(self._total_offset + pos, *args, **kwargs)
OverflowError: Python int too large to convert to C ssize_t

How can it be fixed?

Fill this section in if you know how this could or should be fixed.

pipermerriam commented 3 years ago

Confirming that I can reproduce this, not sure why it is happening yet.

The raw data returned by the call is:

0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000d496e76616c696420737461746500000000000000000000000000000000000000

The expected return type is (uint256[], uint256[])

Some brief futzing didn't yield any valid way to manually decode this return value.

pipermerriam commented 3 years ago

Alright, I think I "some" of what is going on here:

The returned "data" from the call is

0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000d496e76616c696420737461746500000000000000000000000000000000000000

This looks a lot like a transaction with a 4byte prefix. Lookup up this 4byte prefix we get a revers map to Error(string) as the ABI.

Decoding the data, stripping off the first 4 bytes gives us:

In [27]: w3.codec.decode_single('(string)', decode_hex(data)[4:])
Out[27]: ('Invalid state',)

So it appears that this call is throwing an error (revert?), but that web3 is trying to decode this as the return data for the call.

pipermerriam commented 3 years ago

A little more digging:

Removing all of the contract mechanisms and doing this call directly using w3.eth.call:

In [31]: w3.eth.call({'to': address_set_CHADLINK, 'data': decode_hex('0x9b013aee0000000000000000000000000000000000000000000000000000000000000001')})
Out[31]: HexBytes('0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000d496e76616c696420737461746500000000000000000000000000000000000000')
pipermerriam commented 3 years ago

Little more digging. This is using the websockets infura provider. Here is the raw JSON returned by the response:

In [4]: w3.eth.call({'to': address_set_CHADLINK, 'data': decode_hex('0x9b013aee0000000000000000000000000000000000000000000000000000000000000001')})
Out[4]: HexBytes('0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000d496e76616c696420737461746500000000000000000000000000000000000000')

In [5]: w3.manager.provider._last_response
Out[5]: '{"jsonrpc":"2.0","id":0,"result":"0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000d496e76616c696420737461746500000000000000000000000000000000000000"}'

So the JSON-RPC isn't giving us any indication that this call causes a revert. I think we need to do some digging to understand why this is happening and whether the behavior here is defined anywhere since it appears that internally the transaction actually fails, but that something is catching the REVERT message and transmitting it as the result of the eth_call

pipermerriam commented 3 years ago

And one more bit of information.

Using the etherscan web-based contract interface, this is the response I get from whatever API they hit.

{"jsonrpc":"2.0","error":{"code":-32015,"message":"VM execution error.","data":"Reverted 0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000d496e76616c696420737461746500000000000000000000000000000000000000"},"id":4}

Which suggests that either they are using a custom JSON-RPC backend, or that the infura endpoint we are hitting is returning a non-standard response. I'm in the process of re-syncing my geth node after which I'll experiment with whether it provides any different response than infura.

pipermerriam commented 3 years ago

Geth (1.9.15) returns an empty response to this call: aka it returns 0x

update: this may not be accurate, my geth node was not fully synced.

kclowes commented 3 years ago

This should be closed via #1585. Please re-open if not @RZeynalov!