Ejemplo n.º 1
0
def additions_for_solution(coin_name: bytes32, puzzle_reveal: Program, solution: Program, max_cost: int) -> List[Coin]:
    """
    Checks the conditions created by CoinSolution and returns the list of all coins created
    """
    err, dic, cost = conditions_dict_for_solution(puzzle_reveal, solution, max_cost)
    if err or dic is None:
        return []
    return created_outputs_for_conditions_dict(dic, coin_name)
Ejemplo n.º 2
0
def additions_for_npc(npc_list: List[NPC]) -> List[Coin]:
    additions: List[Coin] = []

    for npc in npc_list:
        for coin in created_outputs_for_conditions_dict(
                npc.condition_dict, npc.coin_name):
            additions.append(coin)

    return additions
Ejemplo n.º 3
0
    def validate_spend_bundle(
        self,
        spend_bundle: SpendBundle,
        now: CoinTimestamp,
        max_cost: int,
        cost_per_byte: int,
    ) -> int:
        # this should use blockchain consensus code

        program = simple_solution_generator(spend_bundle)
        result: NPCResult = get_name_puzzle_conditions(
            program, max_cost, cost_per_byte=cost_per_byte, mempool_mode=True
        )
        if result.error is not None:
            raise BadSpendBundleError(f"condition validation failure {Err(result.error)}")

        ephemeral_db = dict(self._db)
        for npc in result.npc_list:
            for coin in created_outputs_for_conditions_dict(npc.condition_dict, npc.coin_name):
                name = coin.name()
                ephemeral_db[name] = CoinRecord(
                    coin,
                    uint32(now.height),
                    uint32(0),
                    False,
                    uint64(now.seconds),
                )

        for npc in result.npc_list:
            prev_transaction_block_height = uint32(now.height)
            timestamp = uint64(now.seconds)
            coin_record = ephemeral_db.get(npc.coin_name)
            if coin_record is None:
                raise BadSpendBundleError(f"coin not found for id 0x{npc.coin_name.hex()}")  # noqa
            err = mempool_check_conditions_dict(
                coin_record,
                npc.condition_dict,
                prev_transaction_block_height,
                timestamp,
            )
            if err is not None:
                raise BadSpendBundleError(f"condition validation failure {Err(err)}")

        return 0