Package: moac-tester
===========Tools for testing moac based applications.Installation------------.. code:: shpip install moac-testerQuick Start-----------.. code:: python>>> from moac_tester import MoacTester>>> t = MoacTester()>>> t.get_accounts()('0xaBbACadABa000000000000000000000000000000','0xaBbACaDaBA000000000000000000000000000001','0xAbbAcaDaBA000000000000000000000000000002','0xabBACadaBA000000000000000000000000000003','0xabbAcADABa000000000000000000000000000004','0xaBBACADABA000000000000000000000000000005','0xaBbaCadaBA000000000000000000000000000006','0xAbbAcAdaBA000000000000000000000000000007','0xaBBAcadabA000000000000000000000000000008','0xABbacaDabA000000000000000000000000000009')>>> t.get_balance('0xaBbACadABa000000000000000000000000000000')1000000000000000000000000>>> t.send_transaction({'from': '0xaBbACadABa000000000000000000000000000000', 'to': '0xaBbACaDaBA000000000000000000000000000001', 'gas': 21000, 'value': 1})'0x11c5118d2e3f77a63c02c4d94d89f8c4965aeb5e5fe55ce2db794048c113780a'>>> t.get_transaction_by_hash('0x11c5118d2e3f77a63c02c4d94d89f8c4965aeb5e5fe55ce2db794048c113780a'){'block_hash': '0x96e041452b6fcbe75ab7126c490293e2823b4814a4d8efa7c49267cfb10d8ddf','v': 27,'data': '0x','from': '0xaBbACadABa000000000000000000000000000000','gas_price': 1,'r': 12345,'hash': '0x11c5118d2e3f77a63c02c4d94d89f8c4965aeb5e5fe55ce2db794048c113780a','to': '0xaBbACaDaBA000000000000000000000000000001','gas': 21000,'nonce': 0,'value': 1,'s': 67890,'block_number': 1,'transaction_index': 0}>>> t.get_transaction_receipt('0x11c5118d2e3f77a63c02c4d94d89f8c4965aeb5e5fe55ce2db794048c113780a'){'block_hash': '0x96e041452b6fcbe75ab7126c490293e2823b4814a4d8efa7c49267cfb10d8ddf','cumulative_gas_used': 21000,'status': 0,'transaction_hash': '0x11c5118d2e3f77a63c02c4d94d89f8c4965aeb5e5fe55ce2db794048c113780a','contract_address': '0xa0Beb7081fDaF3ed157370836A85eeC20CEc9e04','logs': (),'gas_used': 21000,'block_number': 1,'transaction_index': 0}Running the tests~~~~~~~~~~~~~~~~~You can run the tests with:.. code:: shpy.test testsOr you can install ``tox`` to run the full test suite.Releasing~~~~~~~~~Pandoc is required for transforming the markdown README to the properformat to render correctly on pypi.For Debian-like systems:::apt install pandocOr on OSX:.. code:: shbrew install pandocTo release a new version:.. code:: shbumpversion $$VERSION_PART_TO_BUMP$$git push && git push --tagsmake releaseHow to bumpversion^^^^^^^^^^^^^^^^^^The version format for this repo is ``{major}.{minor}.{patch}`` forstable, and ``{major}.{minor}.{patch}-{stage}.{devnum}`` for unstable(``stage`` can be alpha or beta).To issue the next version in line, use bumpversion and specify whichpart to bump, like ``bumpversion minor`` or ``bumpversion devnum``.If you are in a beta version, ``bumpversion stage`` will switch to astable.To issue an unstable version when the current version is stable, specifythe new version explicitly, like``bumpversion --new-version 4.0.0-alpha.1 devnum``Documentation=============Input and output data formats-----------------------------The moac tester library strictly enforces the following input formatsand types.-  Hexidecimal values **must** be text (not byte) strings. The ``0x``prefix is optional.-  Any address which contains mixed-case alpha characters will bevalidated as a checksummed address as specified by`EIP-55 <https://github.com/Moac/EIPs/blob/master/EIPS/eip-55.md>`__-  32-byte hashes **must** be hexidecimal encoded.-  Numeric values **must** be in their integer representation.Similarly, Moac tester ensures that return values conform to similarrules.-  32-byte hashes will be returned in their hexidecimal encodedrepresentation.-  Addresses will be returned in their hexidecimal representation andEIP55 checksummed.-  Numeric values will be returned as integers.Block Numbers-------------Any ``block_number`` parameter will accept the following string values.-  ``'latest'``: for the latest mined block.-  ``'pending'``: for the current un-mined block.-  ``'earliest'``: for the genesis block.Note: These **must** be text strings (not byte strings)``moac_tester.MoacTester``--------------------------API~~~Instantiation~~~~~~~~~~~~~-  ``moac_tester.MoacTester(backend=None, validator=None, normalizer=None, auto_mine_transactions=True, fork_blocks=None)``The ``MoacTester`` object is the sole API entrypoint. Instantiation ofthis object accepts the following parameters.-  ``backend``: The chain backend being used. See the `chainbackends <#backends>`__-  ``validator``: The validator to used. See the`validators <#validation>`__-  ``normalizer``: The normalizer to used. See the`normalizers <#normalization>`__-  ``auto_mine_transactions``: If *truthy* transactions will beautomatically mined at the time they are submitted. See```enable_auto_mine_transactions`` <#api-enable_auto_mine_transactions>`__and```disable_auto_mine_transactions`` <#api-disable_auto_mine_transactions>`__.-  ``fork_blocks``: configures which block numbers the various networkhard fork rules will be activated. See `fork-rules <#fork-rules>`__.. code:: python>>> from moac_tester import MoacTester>>> t = MoacTester()>>> t<moac_tester.main.MoacTester at 0x102255710>Fork Rules~~~~~~~~~~Moac tester uses the Byzantium rules, starting at block 0.Time Travel~~~~~~~~~~~The chain can only time travel forward in time.``MoacTester.time_travel(timestamp)``^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^The ``timestamp`` must be an integer, strictly greater than the currenttimestamp of the latest block.Note: Time traveling will result in a new block being mined.Mining~~~~~~Manually mining blocks can be done with the following API. The``coinbase`` parameter of these methods **must** be a hexidecimalencoded address.``MoacTester.mine_blocks(num_blocks=1, coinbase=None)``^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Mines ``num_blocks`` new blocks, returning an iterable of the newlymined block hashes.``MoacTester.mine_block(coinbase=None)``^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Mines a single new block, returning the mined block's hash.Auto-mining transactions^^^^^^^^^^^^^^^^^^^^^^^^By default all transactions are mined immediately. This means that eachtransaction you send will result in a new block being mined, and thatall blocks will only ever have at most a single transaction. Thisbehavior can be controlled with the following methods.``MoacTester.enable_auto_mine_transactions()``^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Turns on auto-mining of transactions.``MoacTester.disable_auto_mine_transactions()``^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Turns **off** auto-mining of transactions.Accounts~~~~~~~~The following API can be used to interact with account data. The``account`` parameter in these methods **must** be a hexidecimal encodeaddress.``MoacTester.get_accounts()``Returns an iterable of the accounts that the tester knows about. Allaccounts in this list will be EIP55 checksummed... code:: python>>> t.get_accounts()('0xaBbACadABa000000000000000000000000000000','0xaBbACaDaBA000000000000000000000000000001',...'0xABbacaDabA000000000000000000000000000009')``MoacTester.add_account(private_key, password=None)``^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Adds a new account for the given private key. Returns the hex encodedaddress of the added account... code:: python>>> t.add_account('0x58d23b55bc9cdce1f18c2500f40ff4ab7245df9a89505e9b1fa4851f623d241d')'0xdc544d1aa88ff8bbd2f2aec754b1f1e99e1812fd'By default, added accounts are unlocked and do not have a password. Ifyou would like to add an account which has a password, you can supplythe password as the second parameter... code:: python>>> t.add_account('0x58d23b55bc9cdce1f18c2500f40ff4ab7245df9a89505e9b1fa4851f623d241d', 'my-secret')'0xdc544d1aa88ff8bbd2f2aec754b1f1e99e1812fd'``MoacTester.unlock_account(account, password, unlock_seconds=None)``^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Unlocks the given account if the provided password matches.Raises a ``ValidationError`` if:-  The account is not known.-  The password does not match.-  The account was created without a password... code:: python>>> t.unlock_account('0xdc544d1aa88ff8bbd2f2aec754b1f1e99e1812fd', 'my-secret')By default, accounts will be unlocked indefinitely. You can howeverunlock an account for a specified amount of time by providing thedesired duration in seconds... code:: python# unlock for 1 hour.>>> t.unlock_account('0xdc544d1aa88ff8bbd2f2aec754b1f1e99e1812fd', 'my-secret', 60 * 60)``MoacTester.lock_account(account)``^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Locks the provide account.Raises a ``ValidationError`` if:-  The account is not known-  The account does not have a password.``MoacTester.get_balance(account) -> integer``^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Returns the balance, in sha, for the provided account... code:: python>>> t.get_balance('0x82A978B3f5962A5b0957d9ee9eEf472EE55B42F1')1000004999999999999999999``MoacTester.get_nonce(account) -> integer``^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Returns the nonce for the provided account... code:: python>>> t.get_nonce('0x82A978B3f5962A5b0957d9ee9eEf472EE55B42F1')1``MoacTester.get_code(account) -> hex string``^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Returns the code for the given account... code:: python>>> t.get_code('0x82A978B3f5962A5b0957d9ee9eEf472EE55B42F1')"0x"Blocks, Transactions, and Receipts~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~``MoacTester.get_transaction_by_hash(transaction_hash) -> transaction-object``^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Returns the transaction for the given hash, raising a```TransactionNotFound`` <#errors-TransactionNotFound>`__ exception ifthe transaction cannot be found... code:: python>>> t.get_transaction_by_hash('0x140c1da1370a908e4c0f7c6e33bb97182011707c6a9aff954bef1084c8a48b25'){'block_hash': '0x89c03ecb6bbf3ff533b04a663fa98d59c9d985de806d1a9dcafaad7c993ee6e8','block_number': 0,'hash': '0x140c1da1370a908e4c0f7c6e33bb97182011707c6a9aff954bef1084c8a48b25','transaction_index': 0,'from': '0x82A978B3f5962A5b0957d9ee9eEf472EE55B42F1','to': '0x7d577a597B2742b498Cb5Cf0C26cDCD726d39E6e','value': 1,'gas': 21000,'gas_price': 1,'nonce': 0,'data': '0x','v': 27,'r': 114833774457827084417823702749930473879683934597320921824765632039428214735160,'s': 52192522150044217242428968890330558187037131043598164958282684822175843828481}Note: For unmined transaction, ``transaction_index``,``block_number`` and ``block_hash`` will all be ``None``.``MoacTester.get_block_by_number(block_number, full_transactions=False) -> block-object``^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Returns the block for the given ``block_number``. See `blocknumbers <#block-numbers>`__ for named block numbers you can use. If``full_transactions`` is truthy, then the transactions array will bepopulated with full transaction objects as opposed to their hashes.Raises ```BlockNotFound`` <#errors-BlockNotFound>`__ if a block for thegiven number cannot be found... code:: python>>> t.get_block_by_number(1){'difficulty': 131072,'extra_data': '0x0000000000000000000000000000000000000000000000000000000000000000','gas_limit': 999023468,'gas_used': 0,'hash': '0x0f50c8ea0f67ce0b7bff51ae866159edc443bde87de2ab26010a15b777244ddd','logs_bloom': 0,'miner': '0x82A978B3f5962A5b0957d9ee9eEf472EE55B42F1','nonce': '0x0000000000000000','number': 1,'parent_hash': '0x89c03ecb6bbf3ff533b04a663fa98d59c9d985de806d1a9dcafaad7c993ee6e8','sha3_uncles': '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347','size': 472,'state_root': '0xbd92123803c9e71018617ce3dc6cbbdf130973bdbd0e14ff340c57c8a835b74b','timestamp': 1410973360,'total_difficulty': 262144,'transactions': (),'transactions_root': '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421','uncles': ()}``MoacTester.get_block_by_hash(block_hash, full_transactions=True) -> block-object``^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Returns the block for the given ``block_hash``. The``full_transactions`` parameter behaves the same as in```get_block_by_number`` <#api-get_block_by_number>`__.Raises ```BlockNotFound`` <#errors-BlockNotFound>`__ if a block for thegiven hash cannot be found... code:: python>>> t.get_block_by_hash('0x0f50c8ea0f67ce0b7bff51ae866159edc443bde87de2ab26010a15b777244ddd'){'difficulty': 131072,'extra_data': '0x0000000000000000000000000000000000000000000000000000000000000000','gas_limit': 999023468,'gas_used': 0,'hash': '0x0f50c8ea0f67ce0b7bff51ae866159edc443bde87de2ab26010a15b777244ddd','logs_bloom': 0,'miner': '0x82A978B3f5962A5b0957d9ee9eEf472EE55B42F1','nonce': '0x0000000000000000','number': 1,'parent_hash': '0x89c03ecb6bbf3ff533b04a663fa98d59c9d985de806d1a9dcafaad7c993ee6e8','sha3_uncles': '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347','size': 472,'state_root': '0xbd92123803c9e71018617ce3dc6cbbdf130973bdbd0e14ff340c57c8a835b74b','timestamp': 1410973360,'total_difficulty': 262144,'transactions': (),'transactions_root': '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421','uncles': ()}``MoacTester.get_transaction_receipt(transaction_hash)``^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Returns the receipt for the given ``transaction_hash``, raising```TransactionNotFound`` <#errors-TransactionNotFound>`__ if notransaction can be found for the given hash... code:: python>>> t.get_transaction_receipt('0x9a7cc8b7accf54ecb1901bf4d0178f28ca457bb9f9c245692c0ca8fabef08d3b'){'block_hash': '0x878f779d8bb25b25fb78fc16b8d64d70a5961310ef1689571aec632e9424290c','block_number': 2,'contract_address': None,'cumulative_gas_used': 23154,'gas_used': 23154,'logs': ({'address': '0xd6F084Ee15E38c4f7e091f8DD0FE6Fe4a0E203Ef','block_hash': '0x878f779d8bb25b25fb78fc16b8d64d70a5961310ef1689571aec632e9424290c','block_number': 2,'data': '0x','log_index': 0,'topics': ('0xf70fe689e290d8ce2b2a388ac28db36fbb0e16a6d89c6804c461f65a1b40bb15','0x0000000000000000000000000000000000000000000000000000000000003039'),'transaction_hash': '0x9a7cc8b7accf54ecb1901bf4d0178f28ca457bb9f9c245692c0ca8fabef08d3b','transaction_index': 0,'type': 'mined'},),'transaction_hash': '0x9a7cc8b7accf54ecb1901bf4d0178f28ca457bb9f9c245692c0ca8fabef08d3b','transaction_index': 0}-  Receipts for unmined transactions will have all of ``block_hash``,``block_number`` and ``transaction_index`` set to ``None``.-  Receipts for transactions which create a contract will have thecreated contract address in the ``contract_address`` field.Transaction Sending~~~~~~~~~~~~~~~~~~~A transaction is a formatted as a dictionary with the following keys andvalues.-  ``from``: The address of the account sending the transaction(hexidecimal string).-  ``to``: The address of the account the transaction is being sent to.Empty string should be used to trigger contract creation (hexidecimalstring).-  ``gas``: Sets the gas limit for transaction execution (integer).-  ``gas_price``: Sets the price per unit of gas in wei that will bepaid for transaction execution (integer).-  ``value``: The amount of ether in wei that should be sent with thetransaction (integer).-  ``data``: The data for the transaction (hexidecimal string).Methods^^^^^^^``MoacTester.send_transaction(transaction) -> transaction_hash``^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Sends the provided ``transaction`` object, returning the``transaction_hash`` for the sent transaction.Logs and Filters~~~~~~~~~~~~~~~~``MoacTester.create_block_filter() -> integer``^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Creates a new filter for newly mined blocks. Returns the ``filter_id``which can be used to retrieve the block hashes for the mined blocks... code:: python>>> filter_id = t.create_block_filter()>>> t.mine_blocks(3)>>> t.get_only_filter_changes(filter_id)('0x07004287f82c1a7ab15d7b8baa03ac14d7e9167ab74e47e1dc4bd2213dd18431','0x5e3222c506585e1202da08c7231afdc5e472c777c245b822f44f141d335c744a','0x4051c3ba3dcca95da5db1be38e44f5b47fd1a855ba522123e3254fe3f8e271ea')>>> t.mine_blocks(2)>>> t.get_only_filter_changes(filter_id)('0x6649c3a7cb3c7ede3a4fd10ae9dd63775eccdafe39ace5f5a9ae81d360089fba','0x04890a08bca0ed2f1496eb29c5dc7aa66014c85377c6d9d9c2c315f85204b39c')>>> t.get_all_filter_logs(filter_id)('0x07004287f82c1a7ab15d7b8baa03ac14d7e9167ab74e47e1dc4bd2213dd18431','0x5e3222c506585e1202da08c7231afdc5e472c777c245b822f44f141d335c744a','0x4051c3ba3dcca95da5db1be38e44f5b47fd1a855ba522123e3254fe3f8e271ea','0x6649c3a7cb3c7ede3a4fd10ae9dd63775eccdafe39ace5f5a9ae81d360089fba','0x04890a08bca0ed2f1496eb29c5dc7aa66014c85377c6d9d9c2c315f85204b39c')``MoacTester.create_pending_transaction_filter() -> integer``^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Creates a new filter for pending transactions. Returns the ``filter_id``which can be used to retrieve the transaction hashes for the pendingtransactions... code:: python>>> filter_id = t.create_pending_transaction_filter()>>> t.send_transaction({...})'0x07f20bf9586e373ac914a40e99119c4932bee343d89ba852ccfc9af1fd541566'>>> t.send_transaction({...})'0xff85f7751d132b66c03e548e736f870797b0f24f3ed41dfe5fc628eb2cbc3505'>>> t.get_only_filter_changes(filter_id)('0x07f20bf9586e373ac914a40e99119c4932bee343d89ba852ccfc9af1fd541566','0xff85f7751d132b66c03e548e736f870797b0f24f3ed41dfe5fc628eb2cbc3505')>>> t.send_transaction({...})'0xb07801f7e8b1cfa52b64271fa2673c4b8d64cc21cdbc5fde51d5858c94c2d26a'>>> t.get_only_filter_changes(filter_id)('0xb07801f7e8b1cfa52b64271fa2673c4b8d64cc21cdbc5fde51d5858c94c2d26a',)>>> t.get_all_filter_logs(filter_id)('0x07f20bf9586e373ac914a40e99119c4932bee343d89ba852ccfc9af1fd541566','0xff85f7751d132b66c03e548e736f870797b0f24f3ed41dfe5fc628eb2cbc3505','0xb07801f7e8b1cfa52b64271fa2673c4b8d64cc21cdbc5fde51d5858c94c2d26a')``MoacTester.create_log_filter(from_block=None, to_block=None, address=None, topics=None) -> integer``^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Creates a new filter for logs produced by transactions. The parametersfor this function can be used to filter the log entries... code:: python>>> filter_id = t.create_log_filter()>>> t.send_transaction({...})  # something that produces a log entry'0x728bf75fc7d23845f328d2223df7fe9cafc6e7d23792457b625d5b60d2b22b7c'>>> t.send_transaction({...})  # something that produces a log entry'0x63f5b381ffd09940ce22c45a3f4e163bd743851cb6b4f43771fbf0b3c14b2f8a'>>> t.get_only_filter_changes(filter_id)({'address': '0xd6F084Ee15E38c4f7e091f8DD0FE6Fe4a0E203Ef','block_hash': '0x68c0f318388003b652eae334efbed8bd345c469bd0ca77469183fc9693c23e13','block_number': 11,'data': '0x','log_index': 0,'topics': ('0xf70fe689e290d8ce2b2a388ac28db36fbb0e16a6d89c6804c461f65a1b40bb15','0x0000000000000000000000000000000000000000000000000000000000003039'),'transaction_hash': '0x728bf75fc7d23845f328d2223df7fe9cafc6e7d23792457b625d5b60d2b22b7c','transaction_index': 0,'type': 'mined'},{'address': '0xd6F084Ee15E38c4f7e091f8DD0FE6Fe4a0E203Ef','block_hash': '0x07d7e46be6f9ba53ecd4323fb99ec656e652c4b14f4b8e8a244ee7f997464725','block_number': 12,'data': '0x','log_index': 0,'topics': ('0xf70fe689e290d8ce2b2a388ac28db36fbb0e16a6d89c6804c461f65a1b40bb15','0x0000000000000000000000000000000000000000000000000000000000010932'),'transaction_hash': '0x63f5b381ffd09940ce22c45a3f4e163bd743851cb6b4f43771fbf0b3c14b2f8a','transaction_index': 0,'type': 'mined'})See `the filtering guide <#guide-filtering>`__ for detailed informationon how to use filters.``MoacTester.delete_filter(filter_id)``^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Removes the filter for the provide ``filter_id``. If no filter is foundfor the given ``filter_id``, raises```FilterNotFound`` <#errors-FilterNotFound>`__.``MoacTester.get_only_filter_changes(filter_id) -> transaction_hash or block_hash or log_entry``^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Returns all new values for the provided ``filter_id`` that have notpreviously been returned through this API. Raises```FilterNotFound`` <#errors-FilterNotFound>`__ if no filter is foundfor the given ``filter_id``.``MoacTester.get_all_filter_logs(filter_id) -> transaction_hash or block_hash or log_entry``^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Returns all values for the provided ``filter_id``. Raises```FilterNotFound`` <#errors-FilterNotFound>`__ if no filter is foundfor the given ``filter_id``.Snapshots and Resetting~~~~~~~~~~~~~~~~~~~~~~~``MoacTester.take_snapshot() -> snapshot_id``^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Takes a snapshot of the current chain state and returns the snapshot id.``MoacTester.revert_to_snapshot(snapshot_id)``^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Reverts the chain to the chain state associated with the given``snapshot_id``. Raises```SnapshotNotFound`` <#errors-SnapshotNotFound>`__ if no snapshot isknow for the given id.Errors and Exceptions~~~~~~~~~~~~~~~~~~~~~``moac_tester.exceptions.TransactionNotFound``^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Raised in cases where a transaction cannot be found for the providedtransaction hash.``moac_tester.exceptions.BlockNotFound``^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Raised in cases where a block cannot be found for either a providednumber or hash.``moac_tester.exceptions.FilterNotFound``^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Raised in cases where a filter cannot be found for the provided filterid.``moac_tester.exceptions.SnapshotNotFound``^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Raised in cases where a snapshot cannot be found for the providedsnapshot id.Backends--------Moac tester is written using a pluggable backend system.Backend Dependencies~~~~~~~~~~~~~~~~~~~~Moac tester does not install any of the dependencies needed to use thevarious backends by default. You can however install Moac tester withthe necessary dependencies using the following method... code:: bash$ pip install moac-tester[<backend-name>]You should replace ``<backend-name>`` with the name of the desiredtesting backend.Selecting a Backend~~~~~~~~~~~~~~~~~~~You can select which backend in a few different ways.The most direct way is to manually pass in the backend instance you wishto use... code:: python>>> from moac_tester import MoacTester>>> t = MoacTester(backend=MockBackend())Moac tester also supports configuration using the environment variable``Moac_TESTER_CHAIN_BACKEND``. This should be set to the import path forthe backend class you wish to use.Available Backends~~~~~~~~~~~~~~~~~~Moac tester can be used with the following backend.-  MockBackendMockBackend^^^^^^^^^^^This backend has limited functionality. It cannot perform any VMcomputations. It mocks out all of the objects and interactions... code:: python>>> from moac_tester import MockBackend>>> t = MoacTester(MockBackend())Implementing Custom Backends~~~~~~~~~~~~~~~~~~~~~~~~~~~~The base class ``moac_tester.backends.base.BaseChainBackend`` is therecommended base class to begin with if you wish to write your ownbackend.Details on implementation are beyond the scope of this document.Data Formats------------Moac tester uses two formats for data.-  The *normal* format is the data format the is expected as inputarguments to all ``MoacTester`` methods as well as the return typesfrom all method calls.-  The *canonical* format is the data format that is used internally bythe backend class.Moac tester enforces strict validation rules on these formats.Canonical Formats~~~~~~~~~~~~~~~~~The canonical format is intended for low level handling by backends.-  32 byte hashes: ``bytes`` of length 32-  Arbitrary length strings: ``bytes``-  Addresses: ``bytes`` of length 20-  Integers: ``int``-  Array Types: ``tuple``Normal Formats~~~~~~~~~~~~~~The normal format is intended for use by end users.-  32 byte hashes: ``0x`` prefixed hexidecimal encoded text strings (notbyte strings)-  Arbitrary length strings: ``0x`` prefixed hexidecimal encoded textstrings (not byte strings)-  Addresses: ``0x`` prefixed and EIP55 checksummed hexidecimal encodedtext strings (not byte strings)-  Integers: ``int``-  Array Types: ``tuple``Normalization and Validation----------------------------Beware! Here there be dragons... This section of the documentationis only relevant if you intend to build tooling on top of thislibrary.The Moac tester provides strong guarantees that backends can be swappedout seamlessly without effecting the data formats of both the inputarguments and return values. This is accomplished using a two stepprocess of strict *normalization* and *validation*.All inputs to the methods of the ``MoacTester`` are first validated thennormalized to a *canonical* format. Return values are put through thisprocess as well, first validating the data returned by the backend, andthen normalizing it from the *canonical* format to the *normal* formbefore being returned.### NormalizationThe ``MoacTester`` delegates normalization to whatever ``normalizer``was passed in during instantiation. If no value was provided, thedefault normalizer will be used from``moac_tester.normalization.default.DefaultNormalizer``.The specifics of this object are beyong the scope of this document.### ValidationThe ``MoacTester`` delegates validation to whatever ``validator`` waspassed in during instantiation. If no value was provided, the defaultvalidator will be used from``moac_tester.validation.default.DefaultValidator``.The specifics of this object are beyond the scope of this document.Running the tests-----------------You can run the tests with:.. code:: shpy.test testsOr you can install ``tox`` to run the full test suite.Releasing---------Pandoc is required for transforming the markdown README to the properformat to render correctly on pypi.For Debian-like systems:::apt install pandocOr on OSX:.. code:: shbrew install pandocTo release a new version:.. code:: shbumpversion $$VERSION_PART_TO_BUMP$$git push && git push --tagsmake releaseHow to bumpversion~~~~~~~~~~~~~~~~~~The version format for this repo is ``{major}.{minor}.{patch}`` forstable, and ``{major}.{minor}.{patch}-{stage}.{devnum}`` for unstable(``stage`` can be alpha or beta).To issue the next version in line, use bumpversion and specify whichpart to bump, like ``bumpversion minor`` or ``bumpversion devnum``.If you are in a beta version, ``bumpversion stage`` will switch to astable.To issue an unstable version when the current version is stable, specifythe new version explicitly, like``bumpversion --new-version 4.0.0-alpha.1 devnum``Keywords: moacPlatform: UNKNOWNClassifier: Development Status :: 2 - Pre-AlphaClassifier: Intended Audience :: DevelopersClassifier: License :: OSI Approved :: MIT LicenseClassifier: Natural Language :: EnglishClassifier: Programming Language :: Python :: 3Classifier: Programming Language :: Python :: 3.5Classifier: Programming Language :: Python :: 3.6Classifier: Programming Language :: Python :: 3.7