void special_award (void) { callset_invoke (special_award); switch (system_config.special_award) { case FREE_AWARD_CREDIT: add_credit (); break; case FREE_AWARD_EB: increment_extra_balls (); break; case FREE_AWARD_OFF: break; } #ifdef DEFF_SPECIAL deff_start (DEFF_SPECIAL); #endif #ifdef LEFF_SPECIAL leff_start (LEFF_SPECIAL); #endif knocker_fire (); audit_increment (&system_audits.specials); }
/** Increment the units counter for a particular slot. */ void add_units (U8 n) { csum_area_check (&coin_csum_info); if (credit_count >= price_config.max_credits) return; nvram_add (unit_count, n); if (unit_count >= price_config.units_per_credit) { while (unit_count >= price_config.units_per_credit) { nvram_subtract (unit_count, price_config.units_per_credit); add_credit (); audit_increment (&system_audits.paid_credits); } callset_invoke (add_credits); } else { #ifdef MACHINE_ADD_COIN_SOUND sound_send (MACHINE_ADD_COIN_SOUND); #endif callset_invoke (add_partial_credits); announce_credits (); } csum_area_update (&coin_csum_info); pinio_nvram_lock (); }
/** Give out the award for a single match. */ void match_award (void) { audit_increment (&system_audits.match_credits); add_credit (); knocker_fire (); }
CALLSET_ENTRY (service, sw_escape) { #ifndef CONFIG_BPT if (coin_door_warning_needed ()) return; else if (!in_test) { add_credit (); audit_increment (&system_audits.service_credits); timestamp_update (&system_timestamps.last_service_credit); } #endif }
bool leveldb_common::save_transaction(leveldb_transaction_batch& batch, uint32_t block_height, uint32_t tx_index, const hash_digest& tx_hash, const transaction_type& block_tx) { if (duplicate_exists(tx_hash, block_height, tx_index)) return true; data_chunk tx_data(8 + satoshi_raw_size(block_tx)); // Serialize tx. auto serial = make_serializer(tx_data.begin()); serial.write_4_bytes(block_height); serial.write_4_bytes(tx_index); // Actual tx data. auto end_iter = satoshi_save(block_tx, serial.iterator()); BITCOIN_ASSERT( std::distance(tx_data.begin(), end_iter) == 8 + satoshi_raw_size(block_tx)); // Save tx to leveldb batch.tx.Put(slice(tx_hash), slice(tx_data)); // Add inputs to spends database. // Coinbase inputs do not spend anything. if (!is_coinbase(block_tx)) for (uint32_t input_index = 0; input_index < block_tx.inputs.size(); ++input_index) { const transaction_input_type& input = block_tx.inputs[input_index]; const input_point inpoint{tx_hash, input_index}; if (!mark_spent_outputs(batch.spend, input.previous_output, inpoint)) return false; if (!add_debit(batch.debit, input, {tx_hash, input_index}, block_height)) return false; } // Save address -> output mappings. for (uint32_t output_index = 0; output_index < block_tx.outputs.size(); ++output_index) { const transaction_output_type& output = block_tx.outputs[output_index]; if (!add_credit(batch.credit, output, {tx_hash, output_index}, block_height)) return false; } return true; }
bool leveldb_common::save_transaction(leveldb_transaction_batch& batch, uint32_t block_height, uint32_t tx_index, const hash_digest& tx_hash, const transaction_type& block_tx) { if (is_special_duplicate(block_height, tx_index)) return true; data_chunk tx_data(8 + satoshi_raw_size(block_tx)); // Serialize tx. auto serial = make_serializer(tx_data.begin()); serial.write_4_bytes(block_height); serial.write_4_bytes(tx_index); // Actual tx data. auto end_iter = satoshi_save(block_tx, serial.iterator()); BITCOIN_ASSERT( tx_data.begin() + 8 + satoshi_raw_size(block_tx) == end_iter); // Save tx to leveldb batch.tx.Put(slice(tx_hash), slice(tx_data)); // Add inputs to spends database. // Coinbase inputs do not spend anything. if (!is_coinbase(block_tx)) for (uint32_t input_index = 0; input_index < block_tx.inputs.size(); ++input_index) { const transaction_input_type& input = block_tx.inputs[input_index]; const input_point inpoint{tx_hash, input_index}; if (!mark_spent_outputs(batch.spend, input.previous_output, inpoint)) return false; if (!add_debit(batch.debit, input, {tx_hash, input_index}, block_height)) return false; } // A stack of size 1. Keep the stealth_data from // one iteration to the next. data_chunk stealth_data_store; auto unload_stealth_store = [&]() { return std::move(stealth_data_store); }; // Save address -> output mappings. for (uint32_t output_index = 0; output_index < block_tx.outputs.size(); ++output_index) { const transaction_output_type& output = block_tx.outputs[output_index]; // If a stealth output then skip processing. if (process_stealth_output_info(output, stealth_data_store)) continue; data_chunk stealth_data = unload_stealth_store(); // Try to extract an address. payment_address address; if (!extract(address, output.script)) continue; // Process this output. if (!stealth_data.empty()) add_stealth_info(stealth_data, address, tx_hash, *db_stealth_); if (!add_credit(batch.credit, address, output.value, {tx_hash, output_index}, block_height)) return false; } return true; }