Skip to content

Commit

Permalink
Merge pull request #3 from TjadenFroyda/master
Browse files Browse the repository at this point in the history
Pystratis updates
  • Loading branch information
madrazzl3 committed Oct 20, 2021
2 parents 8b78552 + 6a37cd6 commit 66af1b0
Show file tree
Hide file tree
Showing 150 changed files with 4,257 additions and 20,160 deletions.
27 changes: 25 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,5 +90,28 @@ make html
Thanks goes to [@TjadenFroyda](https://github.com/tjadenfroyda) for his contributions in kickstarting this repository.

# ChangeLog
### Version 1.0.0.x (StratisFullNode release/1.0.9.0)
- Initial pystratis release
### Version 1.1.0.0 (StratisFullNode release/1.1.0.13)
- Added externalapi route and endpoints
- Added blockstore/getutxosetforaddress endpoint
- Added voting/schedulevote-kickmember and voting/polls/tip endpoints
- Added node/rewind and node/datafolder/chain endpoints
- Added federationgateway/transfer and federationgateway/transfers/deletesuspended endpoints
- Added multiple interop endpoints, removed interop/status endpoint
- Added federation/federationatheight and federation/mineratheight endpoints
### Version 1.0.6.0 (StratisFullNode release/1.0.9.6)
- SignalR added to cirrusminernode
### Version 1.0.5.0 (StratisFullNode release/1.0.9.5)
- Added 'retrieve-filtered-utxos' endpoint for coldstaking
### Version 1.0.4.0 (StratisFullNode release/1.0.9.4)
- No API updates for SFN release/1.0.9.4
### Version 1.0.3.0 (StratisFullNode release/1.0.9.3)
- No API updates for SFN release/1.0.9.3
### Version 1.0.2.0 (StratisFullNode release/1.0.9.2)
- Add optional block_height to LocalCallContractTransactionRequest
- Added new node definition (cirrusunity3dnode) with unity3d endpoints
### Version 1.0.1.0 (StratisFullNode release/1.0.9.1)
- Updates for SFN release/1.0.9.1
- Note: wallet.history strax integration test fails due to negative fee returned when address specified.
- Added contract_swagger and dynamic_contract endpoints
### Version 1.0.0.7 (StratisFullNode release/1.0.9.0)
- Initial pystratis release
32 changes: 0 additions & 32 deletions conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -220,38 +220,6 @@ def generate_extprvkey() -> str:
return base58.b58encode(payload_bytes + checksum[:4]).decode('ascii')


@pytest.fixture(scope='package')
def strax_swagger_json() -> dict:
root_dir = os.path.dirname(os.path.abspath(__file__))
file_path = os.path.join(root_dir, 'pystratis/api', 'strax-swagger.json')
with open(file_path, 'r') as f:
return json.load(f)


@pytest.fixture(scope='package')
def cirrus_swagger_json() -> dict:
root_dir = os.path.dirname(os.path.abspath(__file__))
file_path = os.path.join(root_dir, 'pystratis/api', 'cirrus-swagger.json')
with open(file_path, 'r') as f:
return json.load(f)


@pytest.fixture(scope='package')
def interfluxstrax_swagger_json() -> dict:
root_dir = os.path.dirname(os.path.abspath(__file__))
file_path = os.path.join(root_dir, 'pystratis/api', 'interfluxstrax-swagger.json')
with open(file_path, 'r') as f:
return json.load(f)


@pytest.fixture(scope='package')
def interfluxcirrus_swagger_json() -> dict:
root_dir = os.path.dirname(os.path.abspath(__file__))
file_path = os.path.join(root_dir, 'pystratis/api', 'interfluxcirrus-swagger.json')
with open(file_path, 'r') as f:
return json.load(f)


def generate_ethereum_address() -> str:
privatekey = keccak_256(secrets.token_bytes(32)).digest()
privatekey = ecdsa.SigningKey.from_string(privatekey, curve=ecdsa.SECP256k1)
Expand Down
2 changes: 1 addition & 1 deletion doc_build/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
author = 'Tjaden Froyda'

# The full version, including alpha/beta/rc tags
release = '1.0.0.7'
release = '1.1.0.0'


# -- General configuration ---------------------------------------------------
Expand Down
7 changes: 7 additions & 0 deletions doc_build/source/pystratis.api.blockstore.rst
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,13 @@ GetLastBalanceUpdateTransactionModel
.. automodule:: pystratis.api.blockstore.responsemodels.getlastbalanceupdatetransactionmodel
:members:


GetUTXOsForAddressModel
-------------------------------------------------------------------------

.. automodule:: pystratis.api.blockstore.responsemodels.getutxosforaddressmodel
:members:

GetVerboseAddressesBalancesModel
---------------------------------------------------------------------

Expand Down
32 changes: 32 additions & 0 deletions doc_build/source/pystratis.api.contract_swagger.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
ContractSwagger
=============================

ContractSwagger
----------------------------------

.. autoclass:: pystratis.api.contract_swagger.ContractSwagger
:members:

OpenAPIEndpointsModel
---------------------------------------------------------

.. automodule:: pystratis.api.contract_swagger.responsemodels.openapiendpointsmodel
:members:

OpenAPIInfoModel
---------------------------------------------------------

.. automodule:: pystratis.api.contract_swagger.responsemodels.openapiinfomodel
:members:

OpenAPISchemaModel
---------------------------------------------------------

.. automodule:: pystratis.api.contract_swagger.responsemodels.openapischemamodel
:members:

SwaggerEndpointModel
---------------------------------------------------------

.. automodule:: pystratis.api.contract_swagger.responsemodels.swaggerendpointmodel
:members:
8 changes: 8 additions & 0 deletions doc_build/source/pystratis.api.dynamic_contract.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
DynamicContract
======================

DynamicContract
----------------------------------

.. autoclass:: pystratis.api.dynamic_contract.DynamicContract
:members:
8 changes: 8 additions & 0 deletions doc_build/source/pystratis.api.externalapi.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
ExternalAPI
======================

ExternalAPI
----------------------------------

.. autoclass:: pystratis.api.externalapi.ExternalAPI
:members:
4 changes: 2 additions & 2 deletions doc_build/source/pystratis.api.interop.rst
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ ConversionRequestModel
.. automodule:: pystratis.api.interop.responsemodels.conversionrequestmodel
:members:

StatusModel
TransactionResponseModel
---------------------------------------------

.. automodule:: pystratis.api.interop.responsemodels.statusmodel
.. automodule:: pystratis.api.interop.responsemodels.transactionresponsemodel
:members:
20 changes: 20 additions & 0 deletions doc_build/source/pystratis.api.unity3d.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
Unity3D
===================

Unity3D
----------------------------------

.. autoclass:: pystratis.api.unity3d.Unity3D
:members:

GetUTXOModel
-----------------------------------------------------

.. automodule:: pystratis.api.unity3d.responsemodels.getutxomodel
:members:

UTXOModel
-----------------------------------------------------

.. automodule:: pystratis.api.unity3d.responsemodels.utxomodel
:members:
97 changes: 80 additions & 17 deletions integration_tests/cirrus_tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@
from pystratis.core.types import Address, Money, hexstr, uint32, uint64, uint128, uint256, int32, int64
from pystratis.core import SmartContractParameter, SmartContractParameterType
from pystratis.api.global_responsemodels import BuildContractTransactionModel, WalletSendTransactionModel
from pystratis.nodes import CirrusMinerNode, CirrusNode, BaseNode
from pystratis.nodes import CirrusMinerNode, CirrusNode, BaseNode, CirrusUnity3DNode


@pytest.fixture(scope='package', autouse=True)
def initialize_nodes(
start_cirrusminer_regtest_node,
start_cirrus_regtest_node,
cirrusminer_node,
cirrusminer_syncing_node,
cirrusminerunity3d_node,
cirrus_node,
node_creates_a_wallet,
send_a_transaction,
Expand All @@ -33,8 +33,15 @@ def initialize_nodes(

# Start two cirrus nodes on the same regtest network.
cirrusminer_extra_cmd_ops_node_mining = ['-devmode=miner', '-mincoinmaturity=1', '-mindepositconfirmations=1', '-bantime=1']
cirrusminer_extra_cmd_ops_node_syncing = ['-devmode=miner', '-mincoinmaturity=1', '-mindepositconfirmations=1', '-bantime=1',
f'-whitelist=127.0.0.1:{cirrusminer_node.blockchainnetwork.DEFAULT_PORT}']
"""
Cirrusminer doesn't have unityapi enabled at this time. For unity3d testing, requires modifying the following to enable unity3d:
1) src/Stratis.CirrusMinerD/Program.cs (enable unity3d api)
2) src/Stratis.CirrusMinerD/Stratis.CirrusMinerD.csproj (add project reference)
"""
cirrusminer_extra_cmd_ops_node_syncing = ['-devmode=miner', '-mincoinmaturity=1', '-mindepositconfirmations=1', '-bantime=1', '-unityapi_enable=1',
f'-whitelist=127.0.0.1:{cirrusminer_node.blockchainnetwork.DEFAULT_PORT}',
f'-unityapi_apiport={cirrusminerunity3d_node.blockchainnetwork.UNITY3D_PORT}'
]
cirrus_extra_cmd_ops_node_syncing = ['-mincoinmaturity=1', '-mindepositconfirmations=1', '-bantime=1',
f'-whitelist=127.0.0.1:{cirrusminer_node.blockchainnetwork.DEFAULT_PORT}']
start_cirrusminer_regtest_node(cirrusminer_node, extra_cmd_ops=cirrusminer_extra_cmd_ops_node_mining, private_key=get_federation_private_key(0))
Expand All @@ -45,42 +52,40 @@ def initialize_nodes(
if above_height:
break

start_cirrusminer_regtest_node(cirrusminer_syncing_node, extra_cmd_ops=cirrusminer_extra_cmd_ops_node_syncing, private_key=get_federation_private_key(2))
start_cirrusminer_regtest_node(cirrusminerunity3d_node, extra_cmd_ops=cirrusminer_extra_cmd_ops_node_syncing, private_key=get_federation_private_key(2))
start_cirrus_regtest_node(cirrus_node, extra_cmd_ops=cirrus_extra_cmd_ops_node_syncing)

# Check all endpoints
# Check endpoints implemented for cirrusminer and cirrus node.
assert cirrusminer_node.check_all_endpoints_implemented()
assert cirrusminer_syncing_node.check_all_endpoints_implemented()
assert cirrus_node.check_all_endpoints_implemented()

# Set up wallets for the second node. Wallets need to be setup before mining or joining federation
assert node_creates_a_wallet(cirrusminer_syncing_node)
assert node_creates_a_wallet(cirrusminerunity3d_node)

# Connect federation nodes
assert connect_two_nodes(cirrusminer_node, cirrusminer_syncing_node)
assert connect_two_nodes(cirrusminer_node, cirrusminerunity3d_node)
assert wait_and_clear_mempool()

# Transfer the cirrusdev funds to the first node's wallet, balance the funds, and remove cirrusdev wallet from each.
assert transfer_funds_to_test(cirrusminer_node)
assert wait_and_clear_mempool()
assert transfer_funds_to_test(cirrusminer_syncing_node)
assert transfer_funds_to_test(cirrusminerunity3d_node)
assert wait_and_clear_mempool()
assert balance_funds_across_nodes(cirrusminer_node, cirrusminer_syncing_node)
assert balance_funds_across_nodes(cirrusminer_node, cirrusminerunity3d_node)
assert wait_and_clear_mempool()
assert fund_smartcontract_address(cirrusminer_node)
assert wait_and_clear_mempool()
assert fund_smartcontract_address(cirrusminer_syncing_node)
assert fund_smartcontract_address(cirrusminerunity3d_node)
assert wait_and_clear_mempool()
assert make_some_transactions_by_splitting(cirrusminer_node)
assert wait_and_clear_mempool()
assert make_some_transactions_by_splitting(cirrusminer_syncing_node)
assert make_some_transactions_by_splitting(cirrusminerunity3d_node)
assert wait_and_clear_mempool()

yield

# Teardown
assert cirrusminer_node.stop_node()
assert cirrusminer_syncing_node.stop_node()
assert cirrusminerunity3d_node.stop_node()
assert cirrus_node.stop_node()


Expand All @@ -100,12 +105,12 @@ def _get_node_smart_contract_address(node: Union[CirrusMinerNode, CirrusNode]) -

@pytest.fixture(scope='package')
def fund_smartcontract_address(get_node_smart_contract_address, send_a_transaction, get_node_address_with_balance):
def _fund_smartcontract_address(node: Union[CirrusMinerNode, CirrusNode]) -> bool:
def _fund_smartcontract_address(node: Union[CirrusMinerNode, CirrusNode, CirrusUnity3DNode]) -> bool:
sending_address = get_node_address_with_balance(node)
receiving_address = get_node_smart_contract_address(node)
assert send_a_transaction(
node=node, sending_address=sending_address, wallet_name='Test',
receiving_address=receiving_address, amount_to_send=Money(5000), min_confirmations=0
receiving_address=receiving_address, amount_to_send=Money(50), min_confirmations=0
)
return True
return _fund_smartcontract_address
Expand Down Expand Up @@ -182,3 +187,61 @@ def get_smart_contract_address(get_contract_setup_receipt) -> Address:
address = receipt.new_contract_address
assert isinstance(address, Address)
return address


@pytest.fixture(scope='package')
def create_smart_contract_transaction_unity(cirrusminerunity3d_node, apitestcontract_bytecode, get_node_address_with_balance) -> BuildContractTransactionModel:
sending_address = get_node_address_with_balance(cirrusminerunity3d_node)
response = cirrusminerunity3d_node.smart_contracts.build_and_send_create(
wallet_name='Test',
account_name='account 0',
outpoints=None,
amount=Money(0),
fee_amount=Money(0.0001),
password='password',
contract_code=apitestcontract_bytecode,
gas_price=1000,
gas_limit=250000,
sender=sending_address,
parameters=[
SmartContractParameter(value_type=SmartContractParameterType.Boolean, value=True),
SmartContractParameter(value_type=SmartContractParameterType.Byte, value=b'\xff'),
SmartContractParameter(value_type=SmartContractParameterType.Char, value='c'),
SmartContractParameter(value_type=SmartContractParameterType.String, value='Stratis'),
SmartContractParameter(value_type=SmartContractParameterType.UInt32, value=uint32(123)),
SmartContractParameter(value_type=SmartContractParameterType.Int32, value=int32(-123)),
SmartContractParameter(value_type=SmartContractParameterType.UInt64, value=uint64(456)),
SmartContractParameter(value_type=SmartContractParameterType.Int64, value=int64(-456)),
SmartContractParameter(value_type=SmartContractParameterType.Address, value=sending_address),
SmartContractParameter(value_type=SmartContractParameterType.ByteArray, value=bytearray(b'\x04\xa6\xb9')),
SmartContractParameter(value_type=SmartContractParameterType.UInt128, value=uint128(789)),
SmartContractParameter(value_type=SmartContractParameterType.UInt256, value=uint256(987))
]
)
assert isinstance(response, BuildContractTransactionModel)
return response


@pytest.fixture(scope='package')
def get_contract_create_trxid_unity(cirrusminerunity3d_node, create_smart_contract_transaction_unity, wait_and_clear_mempool) -> uint256:
trx = create_smart_contract_transaction_unity
response = cirrusminerunity3d_node.smart_contract_wallet.send_transaction(transaction_hex=trx.hex)
assert isinstance(response, WalletSendTransactionModel)
assert wait_and_clear_mempool()
return response.transaction_id


@pytest.fixture(scope='package')
def get_contract_setup_receipt_unity(cirrusminerunity3d_node, get_contract_create_trxid_unity) -> ReceiptModel:
trxid = get_contract_create_trxid_unity
response = cirrusminerunity3d_node.smart_contracts.receipt(tx_hash=trxid)
assert isinstance(response, ReceiptModel)
return response


@pytest.fixture(scope='package')
def get_smart_contract_address_unity(get_contract_setup_receipt_unity) -> Address:
receipt = get_contract_setup_receipt_unity
address = receipt.new_contract_address
assert isinstance(address, Address)
return address
20 changes: 20 additions & 0 deletions integration_tests/cirrus_tests/test_contract_swagger_endpoints.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import pytest
from pystratis.nodes import CirrusMinerNode
from pystratis.core.types import uint256, hexstr
from pystratis.api.contract_swagger.responsemodels import *


@pytest.mark.integration_test
@pytest.mark.cirrus_integration_test
def test_address(cirrusminer_node: CirrusMinerNode, get_smart_contract_address):
sc_address = get_smart_contract_address
response = cirrusminer_node.contract_swagger.address(address=sc_address)
assert isinstance(response, OpenAPISchemaModel)


@pytest.mark.integration_test
@pytest.mark.cirrus_integration_test
def test_call(cirrusminer_node: CirrusMinerNode, get_smart_contract_address):
sc_address = get_smart_contract_address
cirrusminer_node.contract_swagger(address=sc_address)

0 comments on commit 66af1b0

Please sign in to comment.