def standard_token_package(ethpm_spec_dir):
    standard_token_dir = ethpm_spec_dir / "examples" / "standard-token"
    manifest = get_ethpm_spec_manifest("standard-token", "v3.json")
    compiler = get_ethpm_local_manifest("standard-token",
                                        "output_v3.json")["contracts"]
    contracts_dir = standard_token_dir / "contracts"
    return contracts_dir, manifest, compiler
def test_get_contract_factory_with_valid_safe_math_lib_manifest(w3):
    safe_math_lib_manifest = get_ethpm_spec_manifest('safe-math-lib', 'v3.json')
    safe_math_package = w3.pm.get_package_from_manifest(safe_math_lib_manifest)
    safe_math_factory = safe_math_package.get_contract_factory("SafeMathLib")
    tx_hash = safe_math_factory.constructor().transact()
    tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash)
    safe_math_address = tx_receipt.contractAddress
    safe_math_instance = safe_math_package.get_contract_instance("SafeMathLib", safe_math_address)
    assert safe_math_instance.functions.safeAdd(1, 2).call() == 3
def owned_package(ethpm_spec_dir):
    manifest = get_ethpm_spec_manifest("owned", "v3.json")
    # source_id missing `./` prefix in ethpm-spec ("Owned.sol"/"./Owned.sol" though both are valid)
    source_obj = manifest['sources'].pop('Owned.sol')
    updated_manifest = assoc_in(manifest, ['sources', './Owned.sol'],
                                source_obj)

    compiler = get_ethpm_local_manifest("owned", "output_v3.json")["contracts"]
    contracts_dir = ethpm_spec_dir / "examples" / "owned" / "contracts"
    return contracts_dir, updated_manifest, compiler
def tmp_ethpmdir(tmp_path):
    owned_manifest = get_ethpm_spec_manifest("owned", "v3.json")
    ethpmdir = tmp_path / '_ethpm_packages'
    ethpmdir.mkdir()
    owned_dir = ethpmdir / 'owned'
    owned_dir.mkdir()
    manifest = owned_dir / 'manifest.json'
    manifest.touch()
    manifest.write_text(json.dumps(owned_manifest, sort_keys=True, separators=(",", ":")))
    return ethpmdir
def test_get_contract_factory_with_valid_escrow_manifest(w3):
    escrow_manifest = get_ethpm_spec_manifest("escrow", "v3.json")
    escrow_package = w3.pm.get_package_from_manifest(escrow_manifest)
    escrow_factory = escrow_package.get_contract_factory('Escrow')
    assert escrow_factory.needs_bytecode_linking
    safe_send_factory = escrow_package.get_contract_factory('SafeSendLib')
    safe_send_tx_hash = safe_send_factory.constructor().transact()
    safe_send_tx_receipt = w3.eth.wait_for_transaction_receipt(safe_send_tx_hash)
    safe_send_address = safe_send_tx_receipt.contractAddress
    linked_escrow_factory = escrow_factory.link_bytecode({"SafeSendLib": safe_send_address})
    assert linked_escrow_factory.needs_bytecode_linking is False
    escrow_tx_hash = linked_escrow_factory.constructor(w3.eth.accounts[0]).transact()
    escrow_tx_receipt = w3.eth.wait_for_transaction_receipt(escrow_tx_hash)
    escrow_address = escrow_tx_receipt.contractAddress
    escrow_instance = linked_escrow_factory(address=escrow_address)
    assert escrow_instance.functions.sender().call() == w3.eth.accounts[0]
示例#6
0
def test_deployed_escrow_and_safe_send(escrow_manifest, w3):
    # Deploy a SafeSendLib
    safe_send_manifest = get_ethpm_spec_manifest("escrow", "v3.json")
    safe_send_contract_type = safe_send_manifest["contractTypes"][
        "SafeSendLib"]
    SafeSend = w3.eth.contract(
        abi=safe_send_contract_type["abi"],
        bytecode=safe_send_contract_type["deploymentBytecode"]["bytecode"],
    )
    tx_hash = SafeSend.constructor().transact()
    tx_receipt = w3.eth.getTransactionReceipt(tx_hash)
    safe_send_address = to_canonical_address(tx_receipt["contractAddress"])

    EscrowPackage = Package(escrow_manifest, w3)
    EscrowFactory = EscrowPackage.get_contract_factory("Escrow")
    LinkedEscrowFactory = EscrowFactory.link_bytecode(
        {"SafeSendLib": safe_send_address})

    # Deploy an Escrow Contract
    escrow_tx_hash = LinkedEscrowFactory.constructor(
        "0x4F5B11c860b37b68DE6D14Fb7e7b5f18A9A1bdC0").transact()
    escrow_tx_receipt = w3.eth.waitForTransactionReceipt(escrow_tx_hash)
    escrow_address = escrow_tx_receipt.contractAddress

    # Cannot deploy with an unlinked factory
    with pytest.raises(BytecodeLinkingError):
        escrow_tx_hash = EscrowFactory.constructor(
            "0x4F5B11c860b37b68DE6D14Fb7e7b5f18A9A1bdC0").transact()

    # Cannot instantiate a contract instance from an unlinked factory
    with pytest.raises(BytecodeLinkingError):
        EscrowFactory(escrow_address)
    contract_instance = LinkedEscrowFactory(escrow_address)
    assert EscrowFactory.needs_bytecode_linking is True
    assert LinkedEscrowFactory.needs_bytecode_linking is False
    assert isinstance(contract_instance, web3.contract.Contract)
    assert safe_send_address in LinkedEscrowFactory.bytecode
    assert safe_send_address in LinkedEscrowFactory.bytecode_runtime
    assert safe_send_address not in EscrowFactory.bytecode
    assert safe_send_address not in EscrowFactory.bytecode_runtime
示例#7
0
def fetch_manifest(name, version):
    return get_ethpm_spec_manifest(name, version)
示例#8
0
def piper_coin_manifest():
    return get_ethpm_spec_manifest("piper-coin", "v3.json")
示例#9
0
def test_get_contract_factory_raises_insufficient_assets_error(w3):
    insufficient_owned_manifest = get_ethpm_spec_manifest('owned', 'v3.json')
    owned_package = w3.pm.get_package_from_manifest(
        insufficient_owned_manifest)
    with pytest.raises(InsufficientAssetsError):
        owned_package.get_contract_factory('Owned')
示例#10
0
def test_pm_init_with_minimal_manifest(w3):
    owned_manifest = get_ethpm_spec_manifest('owned', 'v3.json')
    pm = w3.pm.get_package_from_manifest(owned_manifest)
    assert pm.name == 'owned'