Esempio n. 1
0
def create_contract_v1(body: dict) -> dict:
    """Deploy a new contract on the chain
    Args:
        body: The parsed body, supplied by user. This is used to create a data model
    Returns:
        DTO of the contract at rest which is being created
    """
    # Before anything else, check to see if this chain has too many contracts
    if elasticsearch.get_count(folder=smart_contract_dao.FOLDER) >= MAX_CONTRACT_LIMIT:
        raise exceptions.ContractLimitExceeded(MAX_CONTRACT_LIMIT)
    # Create model and validate fields
    _log.info(f"Creating data model for {body['txn_type']}")
    contract = smart_contract_model.new_contract_from_user(body)

    # Register new trasnsaction type for smart contract
    _log.info("Registering new smart contract transaction type")
    transaction_type_dao.register_smart_contract_transaction_type(contract)

    # Start build task
    try:
        job_processor.begin_task(contract, task_type=smart_contract_model.ContractActions.CREATE)
    except RuntimeError:
        transaction_type_dao.remove_existing_transaction_type(contract.txn_type)
        raise
    return contract.export_as_at_rest()
Esempio n. 2
0
def update_contract_v1(contract_id: str, update: dict) -> dict:
    """Update an existing contract on the chain
    Args:
        contract_id: The contract_id of the contract
        update: The parsed body, supplied by user. This is used to create an update data model
    Returns:
        DTO of the contract at rest which has been updated
    """
    # Get existing model, and check state
    contract = smart_contract_dao.get_contract_by_id(contract_id)
    contract_update = smart_contract_model.new_update_contract(
        update, existing_contract=contract)
    if smart_contract_model.ContractState.is_updatable_state(
            contract.status["state"]):
        raise exceptions.BadStateError(
            f'State {contract.status["state"]} not valid to begin updates')

    # Create and validate update model
    contract_update.start_state = contract.status["state"]

    # Set state to updating
    contract.set_state(smart_contract_model.ContractState.UPDATING)
    contract.save()

    try:
        job_processor.begin_task(
            contract_update,
            task_type=smart_contract_model.ContractActions.UPDATE)
    except RuntimeError:
        contract.set_state(
            state=smart_contract_model.ContractState.ACTIVE,
            msg="Contract update failed: could not start update.")
        contract.save()
        raise
    return contract.export_as_at_rest()
Esempio n. 3
0
def delete_contract_v1(contract_id: str) -> None:
    """Delete a contract
    Args:
        contract_id (str): The contract_id of the contract
    Returns:
        smart contract at rest which was deleted
    """
    _log.info(f"Getting contract {contract_id} to delete")
    contract = smart_contract_dao.get_contract_by_id(contract_id)
    _log.info("Setting delete state..")
    contract.set_state(smart_contract_model.ContractState.DELETING)
    contract.save()

    try:
        job_processor.begin_task(contract, task_type=smart_contract_model.ContractActions.DELETE)
    except RuntimeError:
        _log.exception("Could not begin delete, rolling back state.")
        contract.set_state(state=smart_contract_model.ContractState.ACTIVE, msg="Contract delete failed: could not start deletion")
        contract.save()
        raise
Esempio n. 4
0
def create_contract_v1(body: dict) -> dict:
    """Deploy a new contract on the chain
    Args:
        body: The parsed body, supplied by user. This is used to create a data model
    Returns:
        DTO of the contract at rest which is being created
    """
    # Before anything else, check to see if this chain has too many contracts
    if redisearch.get_document_count(
            redisearch.Indexes.smartcontract.value) >= MAX_CONTRACT_LIMIT:
        raise exceptions.ContractLimitExceeded(MAX_CONTRACT_LIMIT)
    # Create model and validate fields
    _log.info(f"Creating data model for {body['txn_type']}")
    contract = smart_contract_model.new_contract_from_user(body)

    # Check that this transaction type isn't already taken
    try:
        transaction_type_dao.get_registered_transaction_type(contract.txn_type)
        raise exceptions.TransactionTypeConflict(
            f"Transaction type {contract.txn_type} already registered")
    except exceptions.NotFound:
        pass

    # Start build task
    job_processor.begin_task(
        contract, task_type=smart_contract_model.ContractActions.CREATE)
    try:
        # Register new transaction type for smart contract
        _log.info("Registering new smart contract transaction type")
        smart_contract_dao.add_smart_contract_index(contract)
        transaction_type_dao.register_smart_contract_transaction_type(
            contract, body.get("custom_indexes"))
        return contract.export_as_at_rest()
    except Exception:  # Try to cleanup if contract doesn't create successfully
        _log.exception(
            "Error creating contract index or transaction type. Reverting")
        job_processor.begin_task(
            contract, task_type=smart_contract_model.ContractActions.DELETE)
        raise