mirror of
https://github.com/aljazceru/lightning.git
synced 2025-12-24 01:24:26 +01:00
funder: make policy a pointer, most places
This commit is contained in:
@@ -35,22 +35,23 @@ char *funding_option(const char *arg, enum funder_opt *opt)
|
||||
}
|
||||
|
||||
const char *funder_policy_desc(const tal_t *ctx,
|
||||
struct funder_policy policy)
|
||||
const struct funder_policy *policy)
|
||||
{
|
||||
if (policy.opt == FIXED) {
|
||||
struct amount_sat amt = amount_sat(policy.mod);
|
||||
if (policy->opt == FIXED) {
|
||||
struct amount_sat amt = amount_sat(policy->mod);
|
||||
return tal_fmt(ctx, "%s (%s)",
|
||||
funder_opt_name(policy.opt),
|
||||
funder_opt_name(policy->opt),
|
||||
type_to_string(ctx, struct amount_sat, &amt));
|
||||
} else
|
||||
return tal_fmt(ctx, "%s (%"PRIu64"%%)",
|
||||
funder_opt_name(policy.opt), policy.mod);
|
||||
funder_opt_name(policy->opt), policy->mod);
|
||||
|
||||
/* FIXME: add in more info? */
|
||||
}
|
||||
|
||||
struct funder_policy
|
||||
new_funder_policy(enum funder_opt opt,
|
||||
struct funder_policy *
|
||||
new_funder_policy(const tal_t *ctx,
|
||||
enum funder_opt opt,
|
||||
u64 policy_mod,
|
||||
struct amount_sat min_their_funding,
|
||||
struct amount_sat max_their_funding,
|
||||
@@ -60,26 +61,27 @@ new_funder_policy(enum funder_opt opt,
|
||||
struct amount_sat reserve_tank,
|
||||
u32 fund_probability)
|
||||
{
|
||||
struct funder_policy policy;
|
||||
struct funder_policy *policy = tal(ctx, struct funder_policy);
|
||||
|
||||
policy.opt = opt;
|
||||
policy.mod = policy_mod;
|
||||
policy.min_their_funding = min_their_funding;
|
||||
policy.max_their_funding = max_their_funding;
|
||||
policy.per_channel_min = per_channel_min;
|
||||
policy.per_channel_max = per_channel_max;
|
||||
policy.fuzz_factor = fuzz_factor;
|
||||
policy.reserve_tank = reserve_tank;
|
||||
policy.fund_probability = fund_probability;
|
||||
policy->opt = opt;
|
||||
policy->mod = policy_mod;
|
||||
policy->min_their_funding = min_their_funding;
|
||||
policy->max_their_funding = max_their_funding;
|
||||
policy->per_channel_min = per_channel_min;
|
||||
policy->per_channel_max = per_channel_max;
|
||||
policy->fuzz_factor = fuzz_factor;
|
||||
policy->reserve_tank = reserve_tank;
|
||||
policy->fund_probability = fund_probability;
|
||||
|
||||
return policy;
|
||||
}
|
||||
|
||||
struct funder_policy
|
||||
default_funder_policy(enum funder_opt policy,
|
||||
struct funder_policy *
|
||||
default_funder_policy(const tal_t *ctx,
|
||||
enum funder_opt policy,
|
||||
u64 policy_mod)
|
||||
{
|
||||
return new_funder_policy(policy, policy_mod,
|
||||
return new_funder_policy(ctx, policy, policy_mod,
|
||||
AMOUNT_SAT(10000),
|
||||
AMOUNT_SAT(UINT_MAX),
|
||||
AMOUNT_SAT(10000),
|
||||
@@ -137,37 +139,37 @@ apply_fuzz(u32 fuzz_factor, struct amount_sat val)
|
||||
}
|
||||
|
||||
static struct amount_sat
|
||||
apply_policy(struct funder_policy policy,
|
||||
apply_policy(struct funder_policy *policy,
|
||||
struct amount_sat their_funding,
|
||||
struct amount_sat available_funds)
|
||||
{
|
||||
struct amount_sat our_funding;
|
||||
|
||||
switch (policy.opt) {
|
||||
switch (policy->opt) {
|
||||
case MATCH:
|
||||
/* if this fails, it implies ludicrous funding offer, *and*
|
||||
* > 100% match. Just Say No, kids. */
|
||||
if (!amount_sat_scale(&our_funding, their_funding,
|
||||
policy.mod / 100.0))
|
||||
policy->mod / 100.0))
|
||||
our_funding = AMOUNT_SAT(0);
|
||||
return our_funding;
|
||||
case AVAILABLE:
|
||||
/* Use the 'available_funds' as the starting
|
||||
* point for your contribution */
|
||||
if (!amount_sat_scale(&our_funding, available_funds,
|
||||
policy.mod / 100.0))
|
||||
policy->mod / 100.0))
|
||||
abort();
|
||||
return our_funding;
|
||||
case FIXED:
|
||||
/* Use a static amount */
|
||||
return amount_sat(policy.mod);
|
||||
return amount_sat(policy->mod);
|
||||
}
|
||||
|
||||
abort();
|
||||
}
|
||||
|
||||
const char *
|
||||
calculate_our_funding(struct funder_policy policy,
|
||||
calculate_our_funding(struct funder_policy *policy,
|
||||
struct node_id id,
|
||||
struct amount_sat their_funding,
|
||||
struct amount_sat available_funds,
|
||||
@@ -177,7 +179,7 @@ calculate_our_funding(struct funder_policy policy,
|
||||
struct amount_sat avail_channel_space, net_available_funds;
|
||||
|
||||
/* Are we skipping this one? */
|
||||
if (pseudorand(100) >= policy.fund_probability) {
|
||||
if (pseudorand(100) >= policy->fund_probability) {
|
||||
*our_funding = AMOUNT_SAT(0);
|
||||
return tal_fmt(tmpctx,
|
||||
"Skipping, failed fund_probability test");
|
||||
@@ -198,7 +200,7 @@ calculate_our_funding(struct funder_policy policy,
|
||||
/* Figure out actual available funds, given our requested
|
||||
* 'reserve_tank' */
|
||||
if (!amount_sat_sub(&net_available_funds, available_funds,
|
||||
policy.reserve_tank)
|
||||
policy->reserve_tank)
|
||||
|| amount_sat_eq(net_available_funds, AMOUNT_SAT(0))) {
|
||||
*our_funding = AMOUNT_SAT(0);
|
||||
return tal_fmt(tmpctx, "Reserve tank too low."
|
||||
@@ -206,11 +208,11 @@ calculate_our_funding(struct funder_policy policy,
|
||||
type_to_string(tmpctx, struct amount_sat,
|
||||
&available_funds),
|
||||
type_to_string(tmpctx, struct amount_sat,
|
||||
&policy.reserve_tank));
|
||||
&policy->reserve_tank));
|
||||
}
|
||||
|
||||
/* Are they funding enough ? */
|
||||
if (amount_sat_less(their_funding, policy.min_their_funding)) {
|
||||
if (amount_sat_less(their_funding, policy->min_their_funding)) {
|
||||
*our_funding = AMOUNT_SAT(0);
|
||||
return tal_fmt(tmpctx, "Peer's funding too little."
|
||||
" their_funding %s,"
|
||||
@@ -218,11 +220,11 @@ calculate_our_funding(struct funder_policy policy,
|
||||
type_to_string(tmpctx, struct amount_sat,
|
||||
&their_funding),
|
||||
type_to_string(tmpctx, struct amount_sat,
|
||||
&policy.min_their_funding));
|
||||
&policy->min_their_funding));
|
||||
}
|
||||
|
||||
/* Are they funding too much ? */
|
||||
if (amount_sat_greater(their_funding, policy.max_their_funding)) {
|
||||
if (amount_sat_greater(their_funding, policy->max_their_funding)) {
|
||||
*our_funding = AMOUNT_SAT(0);
|
||||
return tal_fmt(tmpctx, "Peer's funding too much."
|
||||
" their_funding %s,"
|
||||
@@ -230,7 +232,7 @@ calculate_our_funding(struct funder_policy policy,
|
||||
type_to_string(tmpctx, struct amount_sat,
|
||||
&their_funding),
|
||||
type_to_string(tmpctx, struct amount_sat,
|
||||
&policy.max_their_funding));
|
||||
&policy->max_their_funding));
|
||||
}
|
||||
|
||||
/* What's our amount, given our policy */
|
||||
@@ -241,7 +243,7 @@ calculate_our_funding(struct funder_policy policy,
|
||||
return NULL;
|
||||
|
||||
/* our_funding is probably sane, so let's fuzz this amount a bit */
|
||||
*our_funding = apply_fuzz(policy.fuzz_factor, *our_funding);
|
||||
*our_funding = apply_fuzz(policy->fuzz_factor, *our_funding);
|
||||
|
||||
/* Is our_funding more than we can fit? if so set to avail space */
|
||||
if (amount_sat_greater(*our_funding, avail_channel_space))
|
||||
@@ -249,8 +251,8 @@ calculate_our_funding(struct funder_policy policy,
|
||||
|
||||
/* Is our_funding more than we want to fund in a channel?
|
||||
* if so set at our desired per-channel max */
|
||||
if (amount_sat_greater(*our_funding, policy.per_channel_max))
|
||||
*our_funding = policy.per_channel_max;
|
||||
if (amount_sat_greater(*our_funding, policy->per_channel_max))
|
||||
*our_funding = policy->per_channel_max;
|
||||
|
||||
/* Is our_funding more than we have available? if so
|
||||
* set to max available */
|
||||
@@ -259,7 +261,7 @@ calculate_our_funding(struct funder_policy policy,
|
||||
|
||||
/* Is our_funding less than our per-channel minimum?
|
||||
* if so, don't fund */
|
||||
if (amount_sat_less(*our_funding, policy.per_channel_min)) {
|
||||
if (amount_sat_less(*our_funding, policy->per_channel_min)) {
|
||||
*our_funding = AMOUNT_SAT(0);
|
||||
return tal_fmt(tmpctx, "Can't meet our min channel requirement."
|
||||
" our_funding %s,"
|
||||
@@ -267,7 +269,7 @@ calculate_our_funding(struct funder_policy policy,
|
||||
type_to_string(tmpctx, struct amount_sat,
|
||||
our_funding),
|
||||
type_to_string(tmpctx, struct amount_sat,
|
||||
&policy.per_channel_min));
|
||||
&policy->per_channel_min));
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
||||
Reference in New Issue
Block a user