diff --git a/bitcoin/psbt.c b/bitcoin/psbt.c index 62e3f3522bd7..8f8e9af1b6a1 100644 --- a/bitcoin/psbt.c +++ b/bitcoin/psbt.c @@ -443,7 +443,7 @@ struct amount_sat psbt_input_get_amount(struct wally_psbt *psbt, } else if (psbt->inputs[in].non_witness_utxo) { int idx = psbt->tx->inputs[in].index; struct wally_tx *prev_tx = psbt->inputs[in].non_witness_utxo; - val.satoshis = prev_tx->outputs[idx].satoshi; /* Raw: type conversion */ + val = amount_sat(prev_tx->outputs[idx].satoshi); } else abort(); diff --git a/bitcoin/test/run-bitcoin_block_from_hex.c b/bitcoin/test/run-bitcoin_block_from_hex.c index aacc5bac47a9..384142ceee3f 100644 --- a/bitcoin/test/run-bitcoin_block_from_hex.c +++ b/bitcoin/test/run-bitcoin_block_from_hex.c @@ -16,6 +16,9 @@ bool amount_asset_is_main(struct amount_asset *asset UNNEEDED) /* Generated stub for amount_asset_to_sat */ struct amount_sat amount_asset_to_sat(struct amount_asset *asset UNNEEDED) { fprintf(stderr, "amount_asset_to_sat called!\n"); abort(); } +/* Generated stub for amount_sat */ +struct amount_sat amount_sat(u64 satoshis UNNEEDED) +{ fprintf(stderr, "amount_sat called!\n"); abort(); } /* Generated stub for amount_sat_add */ bool amount_sat_add(struct amount_sat *val UNNEEDED, struct amount_sat a UNNEEDED, diff --git a/bitcoin/test/run-tx-encode.c b/bitcoin/test/run-tx-encode.c index 6dcb159dac6a..3c67638b735a 100644 --- a/bitcoin/test/run-tx-encode.c +++ b/bitcoin/test/run-tx-encode.c @@ -17,6 +17,9 @@ bool amount_asset_is_main(struct amount_asset *asset UNNEEDED) /* Generated stub for amount_asset_to_sat */ struct amount_sat amount_asset_to_sat(struct amount_asset *asset UNNEEDED) { fprintf(stderr, "amount_asset_to_sat called!\n"); abort(); } +/* Generated stub for amount_sat */ +struct amount_sat amount_sat(u64 satoshis UNNEEDED) +{ fprintf(stderr, "amount_sat called!\n"); abort(); } /* Generated stub for amount_sat_add */ bool amount_sat_add(struct amount_sat *val UNNEEDED, struct amount_sat a UNNEEDED, diff --git a/channeld/full_channel.c b/channeld/full_channel.c index 38fd1602b5a1..dc82534f39c8 100644 --- a/channeld/full_channel.c +++ b/channeld/full_channel.c @@ -85,7 +85,7 @@ static bool balance_ok(const struct balance *balance, { if (balance->msat < 0) return false; - msat->millisatoshis = balance->msat; /* Raw: balance */ + *msat = amount_msat(balance->msat); return true; } diff --git a/cli/test/run-large-input.c b/cli/test/run-large-input.c index e10db714c008..a11611d5577a 100644 --- a/cli/test/run-large-input.c +++ b/cli/test/run-large-input.c @@ -42,6 +42,9 @@ bool amount_asset_is_main(struct amount_asset *asset UNNEEDED) /* Generated stub for amount_asset_to_sat */ struct amount_sat amount_asset_to_sat(struct amount_asset *asset UNNEEDED) { fprintf(stderr, "amount_asset_to_sat called!\n"); abort(); } +/* Generated stub for amount_sat */ +struct amount_sat amount_sat(u64 satoshis UNNEEDED) +{ fprintf(stderr, "amount_sat called!\n"); abort(); } /* Generated stub for amount_sat_add */ bool amount_sat_add(struct amount_sat *val UNNEEDED, struct amount_sat a UNNEEDED, diff --git a/cli/test/run-remove-hint.c b/cli/test/run-remove-hint.c index 1ac21dfa59e3..38f015e6788c 100644 --- a/cli/test/run-remove-hint.c +++ b/cli/test/run-remove-hint.c @@ -45,6 +45,9 @@ bool amount_asset_is_main(struct amount_asset *asset UNNEEDED) /* Generated stub for amount_asset_to_sat */ struct amount_sat amount_asset_to_sat(struct amount_asset *asset UNNEEDED) { fprintf(stderr, "amount_asset_to_sat called!\n"); abort(); } +/* Generated stub for amount_sat */ +struct amount_sat amount_sat(u64 satoshis UNNEEDED) +{ fprintf(stderr, "amount_sat called!\n"); abort(); } /* Generated stub for amount_sat_add */ bool amount_sat_add(struct amount_sat *val UNNEEDED, struct amount_sat a UNNEEDED, diff --git a/closingd/closingd.c b/closingd/closingd.c index 7e65cb8476c9..0fba76606798 100644 --- a/closingd/closingd.c +++ b/closingd/closingd.c @@ -540,17 +540,16 @@ adjust_offer(struct per_peer_state *pps, const struct channel_id *channel_id, * one from our previous proposal. So, if the user requested a * step of 1 satoshi at a time we should just return our end of * the range from this function. */ - amount_msat_from_u64(&step_msat, - (fee_negotiation_step - 1) * MSAT_PER_SAT); + step_msat = amount_msat((fee_negotiation_step - 1) + * MSAT_PER_SAT); } else { /* fee_negotiation_step is e.g. 20 to designate 20% from * range_len (which is in satoshi), so: * range_len * fee_negotiation_step / 100 [sat] * is equivalent to: * range_len * fee_negotiation_step * 10 [msat] */ - amount_msat_from_u64(&step_msat, - range_len.satoshis /* Raw: % calc */ * - fee_negotiation_step * 10); + step_msat = amount_msat(range_len.satoshis /* Raw: % calc */ * + fee_negotiation_step * 10); } step_sat = amount_msat_to_sat_round_down(step_msat); diff --git a/common/amount.c b/common/amount.c index 680499f39a8e..508a0322ef7e 100644 --- a/common/amount.c +++ b/common/amount.c @@ -297,6 +297,18 @@ WARN_UNUSED_RESULT bool amount_msat_add_sat(struct amount_msat *val, return amount_msat_add(val, a, msatb); } +WARN_UNUSED_RESULT bool amount_msat_scale(struct amount_msat *val, + struct amount_msat sat, + double scale) +{ + double scaled = sat.millisatoshis * scale; + + if (scaled > UINT64_MAX) + return false; + val->millisatoshis = scaled; + return true; +} + bool amount_sat_eq(struct amount_sat a, struct amount_sat b) { return a.satoshis == b.satoshis; @@ -401,17 +413,37 @@ bool amount_msat_to_u32(struct amount_msat msat, u32 *millisatoshis) return true; } -void amount_msat_from_u64(struct amount_msat *msat, u64 millisatoshis) +struct amount_msat amount_msat(u64 millisatoshis) { - msat->millisatoshis = millisatoshis; + struct amount_msat msat; + + msat.millisatoshis = millisatoshis; + return msat; } -WARN_UNUSED_RESULT bool amount_msat_from_sat_u64(struct amount_msat *msat, u64 satoshis) +struct amount_sat amount_sat(u64 satoshis) { - if (mul_overflows_u64(satoshis, MSAT_PER_SAT)) - return false; - msat->millisatoshis = satoshis * MSAT_PER_SAT; - return true; + struct amount_sat sat; + + sat.satoshis = satoshis; + return sat; +} + +double amount_msat_ratio(struct amount_msat a, struct amount_msat b) +{ + return (double)a.millisatoshis / b.millisatoshis; +} + +struct amount_msat amount_msat_div(struct amount_msat msat, u64 div) +{ + msat.millisatoshis /= div; + return msat; +} + +struct amount_sat amount_sat_div(struct amount_sat sat, u64 div) +{ + sat.satoshis /= div; + return sat; } bool amount_msat_fee(struct amount_msat *fee, @@ -484,7 +516,7 @@ struct amount_asset amount_sat_to_asset(struct amount_sat *sat, const u8 *asset) assert(33 == sizeof(amt_asset.asset)); memcpy(amt_asset.asset, asset, sizeof(amt_asset.asset)); - amt_asset.value = sat->satoshis; /* Raw: type conversion */ + amt_asset.value = sat->satoshis; return amt_asset; } diff --git a/common/amount.h b/common/amount.h index 3883e6320ff2..6a5f60699dab 100644 --- a/common/amount.h +++ b/common/amount.h @@ -47,6 +47,10 @@ struct amount_asset { #define AMOUNT_SAT(constant) \ ((struct amount_sat){(constant) + AMOUNT_MUST_BE_CONST(constant)}) +/* We do sometimes need to import from raw types, eg. wally or wire fmt */ +struct amount_msat amount_msat(u64 millisatoshis); +struct amount_sat amount_sat(u64 satoshis); + /* You may not always be able to convert satoshis->millisatoshis. */ WARN_UNUSED_RESULT bool amount_sat_to_msat(struct amount_msat *msat, struct amount_sat sat); @@ -76,6 +80,12 @@ WARN_UNUSED_RESULT bool amount_msat_add_sat(struct amount_msat *val, WARN_UNUSED_RESULT bool amount_sat_sub_msat(struct amount_msat *val, struct amount_sat a, struct amount_msat b); +WARN_UNUSED_RESULT bool amount_msat_scale(struct amount_msat *val, + struct amount_msat msat, + double scale); + +struct amount_msat amount_msat_div(struct amount_msat msat, u64 div); +struct amount_sat amount_sat_div(struct amount_sat sat, u64 div); /* Is a == b? */ bool amount_sat_eq(struct amount_sat a, struct amount_sat b); @@ -108,6 +118,9 @@ bool amount_msat_less_eq_sat(struct amount_msat msat, struct amount_sat sat); /* Is msat == sat? */ bool amount_msat_eq_sat(struct amount_msat msat, struct amount_sat sat); +/* a / b */ +double amount_msat_ratio(struct amount_msat a, struct amount_msat b); + /* Check whether this asset is actually the main / fee-paying asset of the * current chain. */ bool amount_asset_is_main(struct amount_asset *asset); @@ -128,10 +141,6 @@ struct amount_sat amount_asset_to_sat(struct amount_asset *asset); WARN_UNUSED_RESULT bool amount_msat_to_u32(struct amount_msat msat, u32 *millisatoshis); -/* Programatically initialize from various types */ -void amount_msat_from_u64(struct amount_msat *msat, u64 millisatoshis); -WARN_UNUSED_RESULT bool amount_msat_from_sat_u64(struct amount_msat *msat, u64 satoshis); - /* Common operation: what is the HTLC fee for given feerate? Can overflow! */ WARN_UNUSED_RESULT bool amount_msat_fee(struct amount_msat *fee, struct amount_msat amt, diff --git a/common/bolt11.c b/common/bolt11.c index 0603488344a4..fb1be40e13d9 100644 --- a/common/bolt11.c +++ b/common/bolt11.c @@ -662,7 +662,7 @@ struct bolt11 *bolt11_decode(const tal_t *ctx, const char *str, "Invalid sub-millisatoshi amount" " '%sp'", amountstr); - b11->msat->millisatoshis = amount * m10 / 10; /* Raw: raw amount multiplier calculation */ + *b11->msat = amount_msat(amount * m10 / 10); } /* BOLT #11: diff --git a/common/onion.c b/common/onion.c index f44bf75e3872..76c5c2c736d8 100644 --- a/common/onion.c +++ b/common/onion.c @@ -326,7 +326,7 @@ struct onion_payload *onion_decode(const tal_t *ctx, if (!tlv->amt_to_forward || !tlv->outgoing_cltv_value) goto fail; - amount_msat_from_u64(&p->amt_to_forward, *tlv->amt_to_forward); + p->amt_to_forward = amount_msat(*tlv->amt_to_forward); p->outgoing_cltv = *tlv->outgoing_cltv_value; /* BOLT #4: @@ -400,8 +400,8 @@ struct onion_payload *onion_decode(const tal_t *ctx, &tlv->payment_data->payment_secret); tal_free(p->total_msat); p->total_msat = tal(p, struct amount_msat); - p->total_msat->millisatoshis /* Raw: tu64 on wire */ - = tlv->payment_data->total_msat; + *p->total_msat + = amount_msat(tlv->payment_data->total_msat); } tal_free(tlv); return p; diff --git a/common/penalty_base.c b/common/penalty_base.c index 30c6d514f9e0..795c9f3047cf 100644 --- a/common/penalty_base.c +++ b/common/penalty_base.c @@ -14,7 +14,7 @@ struct penalty_base *penalty_base_new(const tal_t *ctx, bitcoin_txid(tx, &pbase->txid); pbase->outnum = txout - tx->wtx->outputs; assert(pbase->outnum < tx->wtx->num_outputs); - pbase->amount.satoshis = txout->satoshi; /* Raw: from wally_tx_output */ + pbase->amount = amount_sat(txout->satoshi); return pbase; } diff --git a/common/test/run-bigsize.c b/common/test/run-bigsize.c index 074e796e6560..4a1f511d2c18 100644 --- a/common/test/run-bigsize.c +++ b/common/test/run-bigsize.c @@ -22,6 +22,9 @@ bool amount_asset_is_main(struct amount_asset *asset UNNEEDED) /* Generated stub for amount_asset_to_sat */ struct amount_sat amount_asset_to_sat(struct amount_asset *asset UNNEEDED) { fprintf(stderr, "amount_asset_to_sat called!\n"); abort(); } +/* Generated stub for amount_sat */ +struct amount_sat amount_sat(u64 satoshis UNNEEDED) +{ fprintf(stderr, "amount_sat called!\n"); abort(); } /* Generated stub for amount_sat_add */ bool amount_sat_add(struct amount_sat *val UNNEEDED, struct amount_sat a UNNEEDED, diff --git a/common/test/run-cryptomsg.c b/common/test/run-cryptomsg.c index 36f53de023e0..1f32a2376804 100644 --- a/common/test/run-cryptomsg.c +++ b/common/test/run-cryptomsg.c @@ -17,6 +17,9 @@ bool amount_asset_is_main(struct amount_asset *asset UNNEEDED) /* Generated stub for amount_asset_to_sat */ struct amount_sat amount_asset_to_sat(struct amount_asset *asset UNNEEDED) { fprintf(stderr, "amount_asset_to_sat called!\n"); abort(); } +/* Generated stub for amount_sat */ +struct amount_sat amount_sat(u64 satoshis UNNEEDED) +{ fprintf(stderr, "amount_sat called!\n"); abort(); } /* Generated stub for amount_sat_add */ bool amount_sat_add(struct amount_sat *val UNNEEDED, struct amount_sat a UNNEEDED, diff --git a/common/test/run-derive_basepoints.c b/common/test/run-derive_basepoints.c index d7d529ae0334..ae82af7d9331 100644 --- a/common/test/run-derive_basepoints.c +++ b/common/test/run-derive_basepoints.c @@ -18,6 +18,9 @@ bool amount_asset_is_main(struct amount_asset *asset UNNEEDED) /* Generated stub for amount_asset_to_sat */ struct amount_sat amount_asset_to_sat(struct amount_asset *asset UNNEEDED) { fprintf(stderr, "amount_asset_to_sat called!\n"); abort(); } +/* Generated stub for amount_sat */ +struct amount_sat amount_sat(u64 satoshis UNNEEDED) +{ fprintf(stderr, "amount_sat called!\n"); abort(); } /* Generated stub for amount_sat_add */ bool amount_sat_add(struct amount_sat *val UNNEEDED, struct amount_sat a UNNEEDED, diff --git a/common/test/run-features.c b/common/test/run-features.c index 7cd107f53d23..ea5f7d43c862 100644 --- a/common/test/run-features.c +++ b/common/test/run-features.c @@ -17,6 +17,9 @@ bool amount_asset_is_main(struct amount_asset *asset UNNEEDED) /* Generated stub for amount_asset_to_sat */ struct amount_sat amount_asset_to_sat(struct amount_asset *asset UNNEEDED) { fprintf(stderr, "amount_asset_to_sat called!\n"); abort(); } +/* Generated stub for amount_sat */ +struct amount_sat amount_sat(u64 satoshis UNNEEDED) +{ fprintf(stderr, "amount_sat called!\n"); abort(); } /* Generated stub for amount_sat_add */ bool amount_sat_add(struct amount_sat *val UNNEEDED, struct amount_sat a UNNEEDED, diff --git a/common/test/run-gossip_rcvd_filter.c b/common/test/run-gossip_rcvd_filter.c index a0e742f36919..39a75cc6867c 100644 --- a/common/test/run-gossip_rcvd_filter.c +++ b/common/test/run-gossip_rcvd_filter.c @@ -14,6 +14,9 @@ bool amount_asset_is_main(struct amount_asset *asset UNNEEDED) /* Generated stub for amount_asset_to_sat */ struct amount_sat amount_asset_to_sat(struct amount_asset *asset UNNEEDED) { fprintf(stderr, "amount_asset_to_sat called!\n"); abort(); } +/* Generated stub for amount_sat */ +struct amount_sat amount_sat(u64 satoshis UNNEEDED) +{ fprintf(stderr, "amount_sat called!\n"); abort(); } /* Generated stub for amount_sat_add */ bool amount_sat_add(struct amount_sat *val UNNEEDED, struct amount_sat a UNNEEDED, diff --git a/common/test/run-ip_port_parsing.c b/common/test/run-ip_port_parsing.c index 4ac0ab737171..a9a112def9c9 100644 --- a/common/test/run-ip_port_parsing.c +++ b/common/test/run-ip_port_parsing.c @@ -16,6 +16,9 @@ bool amount_asset_is_main(struct amount_asset *asset UNNEEDED) /* Generated stub for amount_asset_to_sat */ struct amount_sat amount_asset_to_sat(struct amount_asset *asset UNNEEDED) { fprintf(stderr, "amount_asset_to_sat called!\n"); abort(); } +/* Generated stub for amount_sat */ +struct amount_sat amount_sat(u64 satoshis UNNEEDED) +{ fprintf(stderr, "amount_sat called!\n"); abort(); } /* Generated stub for amount_sat_add */ bool amount_sat_add(struct amount_sat *val UNNEEDED, struct amount_sat a UNNEEDED, diff --git a/common/test/run-json_remove.c b/common/test/run-json_remove.c index 7c9c193d1577..cb36d56ee2d3 100644 --- a/common/test/run-json_remove.c +++ b/common/test/run-json_remove.c @@ -14,6 +14,9 @@ bool amount_asset_is_main(struct amount_asset *asset UNNEEDED) /* Generated stub for amount_asset_to_sat */ struct amount_sat amount_asset_to_sat(struct amount_asset *asset UNNEEDED) { fprintf(stderr, "amount_asset_to_sat called!\n"); abort(); } +/* Generated stub for amount_sat */ +struct amount_sat amount_sat(u64 satoshis UNNEEDED) +{ fprintf(stderr, "amount_sat called!\n"); abort(); } /* Generated stub for amount_sat_add */ bool amount_sat_add(struct amount_sat *val UNNEEDED, struct amount_sat a UNNEEDED, diff --git a/common/test/run-key_derive.c b/common/test/run-key_derive.c index 581d147f9640..49caf95d9cbd 100644 --- a/common/test/run-key_derive.c +++ b/common/test/run-key_derive.c @@ -19,6 +19,9 @@ bool amount_asset_is_main(struct amount_asset *asset UNNEEDED) /* Generated stub for amount_asset_to_sat */ struct amount_sat amount_asset_to_sat(struct amount_asset *asset UNNEEDED) { fprintf(stderr, "amount_asset_to_sat called!\n"); abort(); } +/* Generated stub for amount_sat */ +struct amount_sat amount_sat(u64 satoshis UNNEEDED) +{ fprintf(stderr, "amount_sat called!\n"); abort(); } /* Generated stub for amount_sat_add */ bool amount_sat_add(struct amount_sat *val UNNEEDED, struct amount_sat a UNNEEDED, diff --git a/common/test/run-lock.c b/common/test/run-lock.c index 7271f12e033d..3572f9126346 100644 --- a/common/test/run-lock.c +++ b/common/test/run-lock.c @@ -18,6 +18,9 @@ bool amount_asset_is_main(struct amount_asset *asset UNNEEDED) /* Generated stub for amount_asset_to_sat */ struct amount_sat amount_asset_to_sat(struct amount_asset *asset UNNEEDED) { fprintf(stderr, "amount_asset_to_sat called!\n"); abort(); } +/* Generated stub for amount_sat */ +struct amount_sat amount_sat(u64 satoshis UNNEEDED) +{ fprintf(stderr, "amount_sat called!\n"); abort(); } /* Generated stub for amount_sat_add */ bool amount_sat_add(struct amount_sat *val UNNEEDED, struct amount_sat a UNNEEDED, diff --git a/common/test/run-softref.c b/common/test/run-softref.c index acac56416029..0fa9a8aed3f5 100644 --- a/common/test/run-softref.c +++ b/common/test/run-softref.c @@ -15,6 +15,9 @@ bool amount_asset_is_main(struct amount_asset *asset UNNEEDED) /* Generated stub for amount_asset_to_sat */ struct amount_sat amount_asset_to_sat(struct amount_asset *asset UNNEEDED) { fprintf(stderr, "amount_asset_to_sat called!\n"); abort(); } +/* Generated stub for amount_sat */ +struct amount_sat amount_sat(u64 satoshis UNNEEDED) +{ fprintf(stderr, "amount_sat called!\n"); abort(); } /* Generated stub for amount_sat_add */ bool amount_sat_add(struct amount_sat *val UNNEEDED, struct amount_sat a UNNEEDED, diff --git a/common/test/run-sphinx.c b/common/test/run-sphinx.c index baea842a254f..39cc068a9b55 100644 --- a/common/test/run-sphinx.c +++ b/common/test/run-sphinx.c @@ -25,12 +25,15 @@ bool amount_asset_is_main(struct amount_asset *asset UNNEEDED) /* Generated stub for amount_asset_to_sat */ struct amount_sat amount_asset_to_sat(struct amount_asset *asset UNNEEDED) { fprintf(stderr, "amount_asset_to_sat called!\n"); abort(); } +/* Generated stub for amount_msat */ +struct amount_msat amount_msat(u64 millisatoshis UNNEEDED) +{ fprintf(stderr, "amount_msat called!\n"); abort(); } /* Generated stub for amount_msat_eq */ bool amount_msat_eq(struct amount_msat a UNNEEDED, struct amount_msat b UNNEEDED) { fprintf(stderr, "amount_msat_eq called!\n"); abort(); } -/* Generated stub for amount_msat_from_u64 */ -void amount_msat_from_u64(struct amount_msat *msat UNNEEDED, u64 millisatoshis UNNEEDED) -{ fprintf(stderr, "amount_msat_from_u64 called!\n"); abort(); } +/* Generated stub for amount_sat */ +struct amount_sat amount_sat(u64 satoshis UNNEEDED) +{ fprintf(stderr, "amount_sat called!\n"); abort(); } /* Generated stub for amount_sat_add */ bool amount_sat_add(struct amount_sat *val UNNEEDED, struct amount_sat a UNNEEDED, diff --git a/connectd/test/run-initiator-success.c b/connectd/test/run-initiator-success.c index e5488799b2a9..458d9ccfbf18 100644 --- a/connectd/test/run-initiator-success.c +++ b/connectd/test/run-initiator-success.c @@ -21,6 +21,9 @@ bool amount_asset_is_main(struct amount_asset *asset UNNEEDED) /* Generated stub for amount_asset_to_sat */ struct amount_sat amount_asset_to_sat(struct amount_asset *asset UNNEEDED) { fprintf(stderr, "amount_asset_to_sat called!\n"); abort(); } +/* Generated stub for amount_sat */ +struct amount_sat amount_sat(u64 satoshis UNNEEDED) +{ fprintf(stderr, "amount_sat called!\n"); abort(); } /* Generated stub for amount_sat_add */ bool amount_sat_add(struct amount_sat *val UNNEEDED, struct amount_sat a UNNEEDED, diff --git a/connectd/test/run-responder-success.c b/connectd/test/run-responder-success.c index 50254b118cea..9593670f0445 100644 --- a/connectd/test/run-responder-success.c +++ b/connectd/test/run-responder-success.c @@ -21,6 +21,9 @@ bool amount_asset_is_main(struct amount_asset *asset UNNEEDED) /* Generated stub for amount_asset_to_sat */ struct amount_sat amount_asset_to_sat(struct amount_asset *asset UNNEEDED) { fprintf(stderr, "amount_asset_to_sat called!\n"); abort(); } +/* Generated stub for amount_sat */ +struct amount_sat amount_sat(u64 satoshis UNNEEDED) +{ fprintf(stderr, "amount_sat called!\n"); abort(); } /* Generated stub for amount_sat_add */ bool amount_sat_add(struct amount_sat *val UNNEEDED, struct amount_sat a UNNEEDED, diff --git a/devtools/onion.c b/devtools/onion.c index e36f141788ac..b3d242f5c2c1 100644 --- a/devtools/onion.c +++ b/devtools/onion.c @@ -83,7 +83,7 @@ static void do_generate(int argc, char **argv, /* FIXME: support secret and and total_msat */ memset(&scid, i, sizeof(scid)); - amt.millisatoshis = i; /* Raw: test code */ + amt = amount_msat(i); if (i == num_hops - 1) sphinx_add_hop(sp, &path[i], take(onion_final_hop(NULL, diff --git a/gossipd/routing.c b/gossipd/routing.c index f347835f528a..15704a43fb5a 100644 --- a/gossipd/routing.c +++ b/gossipd/routing.c @@ -650,14 +650,13 @@ static WARN_UNUSED_RESULT bool risk_add_fee(struct amount_msat *risk, u32 delay, double riskfactor, u64 riskbias) { - double r; + struct amount_msat riskfee; - /* Won't overflow on add, just lose precision */ - r = (double)riskbias + riskfactor * delay * msat.millisatoshis + risk->millisatoshis; /* Raw: to double */ - if (r > (double)UINT64_MAX) + if (!amount_msat_scale(&riskfee, msat, riskfactor * delay)) return false; - risk->millisatoshis = r; /* Raw: from double */ - return true; + if (!amount_msat_add(&riskfee, riskfee, amount_msat(riskbias))) + return false; + return amount_msat_add(risk, *risk, riskfee); } /* Check that we can fit through this channel's indicated @@ -1209,7 +1208,7 @@ find_shorter_route(const tal_t *ctx, struct routing_state *rstate, * per block delay, which is close enough to zero to not break * this algorithm, but still provide some bias towards * low-delay routes. */ - riskfactor = (double)1.0 / msat.millisatoshis; /* Raw: inversion */ + riskfactor = amount_msat_ratio(AMOUNT_MSAT(1), msat); /* First, figure out if a short route is even possible. * We set the cost function to ignore total, riskbias 1 and riskfactor @@ -2906,7 +2905,7 @@ void remove_all_gossip(struct routing_state *rstate) while ((c = uintmap_first(&rstate->chanmap, &index)) != NULL) { uintmap_del(&rstate->chanmap, index); #if DEVELOPER - c->sat.satoshis = (unsigned long)c; /* Raw: dev-hack */ + c->sat = amount_sat((unsigned long)c); #endif tal_free(c); } diff --git a/gossipd/test/run-bench-find_route.c b/gossipd/test/run-bench-find_route.c index 89c26b483e92..cf7c1acc1845 100644 --- a/gossipd/test/run-bench-find_route.c +++ b/gossipd/test/run-bench-find_route.c @@ -82,9 +82,6 @@ bool nannounce_different(struct gossip_store *gs UNNEEDED, /* Generated stub for notleak_ */ void *notleak_(const void *ptr UNNEEDED, bool plus_children UNNEEDED) { fprintf(stderr, "notleak_ called!\n"); abort(); } -/* Generated stub for onion_type_name */ -const char *onion_type_name(int e UNNEEDED) -{ fprintf(stderr, "onion_type_name called!\n"); abort(); } /* Generated stub for peer_supplied_good_gossip */ void peer_supplied_good_gossip(struct peer *peer UNNEEDED, size_t amount UNNEEDED) { fprintf(stderr, "peer_supplied_good_gossip called!\n"); abort(); } diff --git a/gossipd/test/run-check_channel_announcement.c b/gossipd/test/run-check_channel_announcement.c index 509109f3580b..d49be28f7caa 100644 --- a/gossipd/test/run-check_channel_announcement.c +++ b/gossipd/test/run-check_channel_announcement.c @@ -118,9 +118,6 @@ struct oneshot *new_reltimer_(struct timers *timers UNNEEDED, /* Generated stub for notleak_ */ void *notleak_(const void *ptr UNNEEDED, bool plus_children UNNEEDED) { fprintf(stderr, "notleak_ called!\n"); abort(); } -/* Generated stub for onion_type_name */ -const char *onion_type_name(int e UNNEEDED) -{ fprintf(stderr, "onion_type_name called!\n"); abort(); } /* Generated stub for peer_supplied_good_gossip */ void peer_supplied_good_gossip(struct peer *peer UNNEEDED, size_t amount UNNEEDED) { fprintf(stderr, "peer_supplied_good_gossip called!\n"); abort(); } diff --git a/gossipd/test/run-find_route-specific.c b/gossipd/test/run-find_route-specific.c index 3eaf9dd8095f..26cf9ef6df12 100644 --- a/gossipd/test/run-find_route-specific.c +++ b/gossipd/test/run-find_route-specific.c @@ -69,9 +69,6 @@ bool nannounce_different(struct gossip_store *gs UNNEEDED, /* Generated stub for notleak_ */ void *notleak_(const void *ptr UNNEEDED, bool plus_children UNNEEDED) { fprintf(stderr, "notleak_ called!\n"); abort(); } -/* Generated stub for onion_type_name */ -const char *onion_type_name(int e UNNEEDED) -{ fprintf(stderr, "onion_type_name called!\n"); abort(); } /* Generated stub for peer_supplied_good_gossip */ void peer_supplied_good_gossip(struct peer *peer UNNEEDED, size_t amount UNNEEDED) { fprintf(stderr, "peer_supplied_good_gossip called!\n"); abort(); } diff --git a/gossipd/test/run-find_route.c b/gossipd/test/run-find_route.c index 513e42df3411..7e8af7cba168 100644 --- a/gossipd/test/run-find_route.c +++ b/gossipd/test/run-find_route.c @@ -69,9 +69,6 @@ bool nannounce_different(struct gossip_store *gs UNNEEDED, /* Generated stub for notleak_ */ void *notleak_(const void *ptr UNNEEDED, bool plus_children UNNEEDED) { fprintf(stderr, "notleak_ called!\n"); abort(); } -/* Generated stub for onion_type_name */ -const char *onion_type_name(int e UNNEEDED) -{ fprintf(stderr, "onion_type_name called!\n"); abort(); } /* Generated stub for peer_supplied_good_gossip */ void peer_supplied_good_gossip(struct peer *peer UNNEEDED, size_t amount UNNEEDED) { fprintf(stderr, "peer_supplied_good_gossip called!\n"); abort(); } diff --git a/gossipd/test/run-overlong.c b/gossipd/test/run-overlong.c index 262f70d9ce96..bd5eee9ac78c 100644 --- a/gossipd/test/run-overlong.c +++ b/gossipd/test/run-overlong.c @@ -69,9 +69,6 @@ bool nannounce_different(struct gossip_store *gs UNNEEDED, /* Generated stub for notleak_ */ void *notleak_(const void *ptr UNNEEDED, bool plus_children UNNEEDED) { fprintf(stderr, "notleak_ called!\n"); abort(); } -/* Generated stub for onion_type_name */ -const char *onion_type_name(int e UNNEEDED) -{ fprintf(stderr, "onion_type_name called!\n"); abort(); } /* Generated stub for peer_supplied_good_gossip */ void peer_supplied_good_gossip(struct peer *peer UNNEEDED, size_t amount UNNEEDED) { fprintf(stderr, "peer_supplied_good_gossip called!\n"); abort(); } diff --git a/gossipd/test/run-txout_failure.c b/gossipd/test/run-txout_failure.c index 8ff9712c9ab1..864e4ef5f1e8 100644 --- a/gossipd/test/run-txout_failure.c +++ b/gossipd/test/run-txout_failure.c @@ -79,9 +79,6 @@ bool nannounce_different(struct gossip_store *gs UNNEEDED, /* Generated stub for notleak_ */ void *notleak_(const void *ptr UNNEEDED, bool plus_children UNNEEDED) { fprintf(stderr, "notleak_ called!\n"); abort(); } -/* Generated stub for onion_type_name */ -const char *onion_type_name(int e UNNEEDED) -{ fprintf(stderr, "onion_type_name called!\n"); abort(); } /* Generated stub for peer_supplied_good_gossip */ void peer_supplied_good_gossip(struct peer *peer UNNEEDED, size_t amount UNNEEDED) { fprintf(stderr, "peer_supplied_good_gossip called!\n"); abort(); } diff --git a/lightningd/invoice.c b/lightningd/invoice.c index 08fb5dbfc005..f91fe9386f8f 100644 --- a/lightningd/invoice.c +++ b/lightningd/invoice.c @@ -542,7 +542,7 @@ static struct route_info **select_inchan(const tal_t *ctx, continue; } - excess_frac = (double)excess.millisatoshis / capacity.millisatoshis; /* Raw: double fraction */ + excess_frac = amount_msat_ratio(excess, capacity); sample.route = &inchans[i]; sample.weight = excess_frac; diff --git a/lightningd/opening_control.c b/lightningd/opening_control.c index 8766459f8e90..86a2729baeb4 100644 --- a/lightningd/opening_control.c +++ b/lightningd/opening_control.c @@ -705,8 +705,8 @@ static void channel_config(struct lightningd *ld, *max_to_self_delay = ld->config.locktime_max; /* Take minimal effective capacity from config min_capacity_sat */ - if (!amount_msat_from_sat_u64(min_effective_htlc_capacity, - ld->config.min_capacity_sat)) + if (!amount_sat_to_msat(min_effective_htlc_capacity, + amount_sat(ld->config.min_capacity_sat))) fatal("amount_msat overflow for config.min_capacity_sat"); /* Substract 2 * dust_limit, so fundchannel with min value is possible */ if (!amount_sat_to_msat(&dust_limit, chainparams->dust_limit)) diff --git a/lightningd/test/run-find_my_abspath.c b/lightningd/test/run-find_my_abspath.c index 1e9a73fe9bdc..bff224de408f 100644 --- a/lightningd/test/run-find_my_abspath.c +++ b/lightningd/test/run-find_my_abspath.c @@ -11,10 +11,6 @@ int unused_main(int argc, char *argv[]); /* Generated stub for activate_peers */ void activate_peers(struct lightningd *ld UNNEEDED) { fprintf(stderr, "activate_peers called!\n"); abort(); } -/* Generated stub for add_plugin_dir */ -char *add_plugin_dir(struct plugins *plugins UNNEEDED, const char *dir UNNEEDED, - bool error_ok UNNEEDED) -{ fprintf(stderr, "add_plugin_dir called!\n"); abort(); } /* Generated stub for begin_topology */ void begin_topology(struct chain_topology *topo UNNEEDED) { fprintf(stderr, "begin_topology called!\n"); abort(); } @@ -207,6 +203,7 @@ void plugins_init(struct plugins *plugins UNNEEDED) struct plugins *plugins_new(const tal_t *ctx UNNEEDED, struct log_book *log_book UNNEEDED, struct lightningd *ld UNNEEDED) { fprintf(stderr, "plugins_new called!\n"); abort(); } +/* Generated stub for plugins_set_builtin_plugins_dir */ void plugins_set_builtin_plugins_dir(struct plugins *plugins UNNEEDED, const char *dir UNNEEDED) { fprintf(stderr, "plugins_set_builtin_plugins_dir called!\n"); abort(); } diff --git a/openingd/openingd.c b/openingd/openingd.c index a86e520471b9..c5e78d51845c 100644 --- a/openingd/openingd.c +++ b/openingd/openingd.c @@ -348,8 +348,7 @@ static bool check_config_bounds(struct state *state, /* We always set channel_reserve_satoshis to 1%, rounded down. */ static void set_reserve(struct state *state) { - state->localconf.channel_reserve.satoshis /* Raw: rounding. */ - = state->funding.satoshis / 100; /* Raw: rounding. */ + state->localconf.channel_reserve = amount_sat_div(state->funding, 100); /* BOLT #2: * diff --git a/plugins/libplugin-pay.c b/plugins/libplugin-pay.c index 94861b1c6226..5b6fe84b07b1 100644 --- a/plugins/libplugin-pay.c +++ b/plugins/libplugin-pay.c @@ -2313,8 +2313,8 @@ static void shadow_route_cb(struct shadow_route_data *d, /* Allow shadowroutes to consume up to 1/4th of our budget. */ d->constraints.cltv_budget = p->constraints.cltv_budget / 4; - d->constraints.fee_budget = p->constraints.fee_budget; - d->constraints.fee_budget.millisatoshis /= 4; /* Raw: msat division. */ + d->constraints.fee_budget + = amount_msat_div(p->constraints.fee_budget, 4); if (pseudorand(2) == 0) { return payment_continue(p); @@ -2672,8 +2672,11 @@ static void presplit_cb(struct presplit_mod_data *d, struct payment *p) /* Now adjust the constraints so we don't multiply them * when splitting. */ - multiplier = (double)c->amount.millisatoshis / (double)p->amount.millisatoshis; /* Raw: msat division. */ - c->constraints.fee_budget.millisatoshis *= multiplier; /* Raw: Multiplication */ + multiplier = amount_msat_ratio(c->amount, p->amount); + if (!amount_msat_scale(&c->constraints.fee_budget, + c->constraints.fee_budget, + multiplier)) + abort(); /* multiplier < 1! */ payment_start(c); count++; } @@ -2790,12 +2793,16 @@ static void adaptive_splitter_cb(struct adaptive_split_mod_data *d, struct payme a->amount.millisatoshis = mid; /* Raw: split. */ b->amount.millisatoshis -= mid; /* Raw: split. */ - double multiplier = (double)a->amount.millisatoshis / (double)p->amount.millisatoshis; /* Raw: msat division */ + double multiplier = amount_msat_ratio(a->amount, + p->amount); assert(multiplier >= 0.4 && multiplier < 0.6); /* Adjust constraints since we don't want to double our * fee allowance when we split. */ - a->constraints.fee_budget.millisatoshis = pconstraints->fee_budget.millisatoshis * multiplier; /* Raw: msat multiplication. */ + if (!amount_msat_scale(&a->constraints.fee_budget, + pconstraints->fee_budget, + multiplier)) + abort(); ok = amount_msat_sub(&b->constraints.fee_budget, pconstraints->fee_budget,