mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-02-21 14:24:09 +01:00
liquidity-ads: pipe through request to funder, update policy
When a request comes through, we forward it over to the funder who uses the currently set policy to figure out how to handle it. Includes small update to the policy engine which decides whether or not to fund a request. Changelog-Experimental: Plugins: `openchannel2` hook now includes optional fields for a channel lease request
This commit is contained in:
parent
3a7b3762a1
commit
f1b7e5fffe
9 changed files with 239 additions and 4 deletions
|
@ -1,5 +1,6 @@
|
|||
#include "config.h"
|
||||
#include <ccan/ccan/mem/mem.h>
|
||||
#include <common/amount.h>
|
||||
#include <common/lease_rates.h>
|
||||
#include <wire/peer_wire.h>
|
||||
|
||||
|
@ -15,3 +16,17 @@ bool lease_rates_empty(struct lease_rates *rates)
|
|||
&& rates->lease_fee_base_sat == 0
|
||||
&& rates->lease_fee_basis == 0;
|
||||
}
|
||||
|
||||
bool lease_rates_set_chan_fee_base_msat(struct lease_rates *rates,
|
||||
struct amount_msat amt)
|
||||
{
|
||||
rates->channel_fee_max_base_msat = amt.millisatoshis; /* Raw: conversion */
|
||||
return rates->channel_fee_max_base_msat == amt.millisatoshis; /* Raw: comparsion */
|
||||
}
|
||||
|
||||
bool lease_rates_set_lease_fee_sat(struct lease_rates *rates,
|
||||
struct amount_sat amt)
|
||||
{
|
||||
rates->lease_fee_base_sat = amt.satoshis; /* Raw: conversion */
|
||||
return rates->lease_fee_base_sat == amt.satoshis; /* Raw: comparsion */
|
||||
}
|
||||
|
|
|
@ -3,7 +3,13 @@
|
|||
#include "config.h"
|
||||
#include <stdbool.h>
|
||||
|
||||
struct amount_msat;
|
||||
struct amount_sat;
|
||||
struct lease_rates;
|
||||
|
||||
bool lease_rates_empty(struct lease_rates *rates);
|
||||
|
||||
WARN_UNUSED_RESULT bool lease_rates_set_chan_fee_base_msat(struct lease_rates *rates, struct amount_msat amt);
|
||||
|
||||
WARN_UNUSED_RESULT bool lease_rates_set_lease_fee_sat(struct lease_rates *rates, struct amount_sat amt);
|
||||
#endif /* LIGHTNING_COMMON_LEASE_RATES_H */
|
||||
|
|
|
@ -1100,7 +1100,10 @@ the v2 protocol, and it has passed basic sanity checks:
|
|||
"max_accepted_htlcs": 483,
|
||||
"channel_flags": 1
|
||||
"locktime": 2453,
|
||||
"channel_max_msat": "16777215000msat"
|
||||
"channel_max_msat": "16777215000msat",
|
||||
"requested_lease_msat": "100000000msat",
|
||||
"lease_blockheight_start": 683990,
|
||||
"node_blockheight": 683990
|
||||
}
|
||||
}
|
||||
```
|
||||
|
@ -1108,6 +1111,10 @@ the v2 protocol, and it has passed basic sanity checks:
|
|||
There may be additional fields, such as `shutdown_scriptpubkey`. You can
|
||||
see the definitions of these fields in [BOLT 2's description of the open_channel message][bolt2-open-channel].
|
||||
|
||||
`requested_lease_msat`, `lease_blockheight_start`, and `node_blockheight` are
|
||||
only present if the opening peer has requested a funding lease,
|
||||
per `option_will_fund`.
|
||||
|
||||
The returned result must contain a `result` member which is either
|
||||
the string `reject` or `continue`. If `reject` and
|
||||
there's a member `error_message`, that member is sent to the peer
|
||||
|
|
|
@ -100,6 +100,7 @@ LIGHTNINGD_COMMON_OBJS := \
|
|||
common/json_helpers.o \
|
||||
common/json_stream.o \
|
||||
common/json_tok.o \
|
||||
common/lease_rates.o \
|
||||
common/memleak.o \
|
||||
common/msg_queue.o \
|
||||
common/node_id.o \
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include <common/htlc.h>
|
||||
#include <common/json_helpers.h>
|
||||
#include <common/json_tok.h>
|
||||
#include <common/lease_rates.h>
|
||||
#include <common/per_peer_state.h>
|
||||
#include <common/psbt_open.h>
|
||||
#include <common/shutdown_scriptpubkey.h>
|
||||
|
@ -244,10 +245,15 @@ struct openchannel2_payload {
|
|||
/* What's the maximum amount of funding
|
||||
* this channel can hold */
|
||||
struct amount_sat channel_max;
|
||||
/* If they've requested funds, this is their request */
|
||||
struct amount_sat requested_lease_amt;
|
||||
u32 lease_blockheight_start;
|
||||
u32 node_blockheight;
|
||||
|
||||
struct amount_sat accepter_funding;
|
||||
struct wally_psbt *psbt;
|
||||
const u8 *our_shutdown_scriptpubkey;
|
||||
struct lease_rates *rates;
|
||||
char *err_msg;
|
||||
};
|
||||
|
||||
|
@ -283,6 +289,14 @@ static void openchannel2_hook_serialize(struct openchannel2_payload *payload,
|
|||
payload->shutdown_scriptpubkey);
|
||||
json_add_amount_sat_only(stream, "channel_max_msat",
|
||||
payload->channel_max);
|
||||
if (!amount_sat_zero(payload->requested_lease_amt)) {
|
||||
json_add_amount_sat_only(stream, "requested_lease_msat",
|
||||
payload->requested_lease_amt);
|
||||
json_add_num(stream, "lease_blockheight_start",
|
||||
payload->lease_blockheight_start);
|
||||
json_add_num(stream, "node_blockheight",
|
||||
payload->node_blockheight);
|
||||
}
|
||||
json_object_end(stream);
|
||||
}
|
||||
|
||||
|
@ -699,6 +713,7 @@ openchannel2_hook_deserialize(struct openchannel2_payload *payload,
|
|||
const jsmntok_t *toks)
|
||||
{
|
||||
const u8 *shutdown_script;
|
||||
const char *err;
|
||||
struct subd *dualopend = payload->dualopend;
|
||||
|
||||
/* If our daemon died, we're done */
|
||||
|
@ -756,6 +771,38 @@ openchannel2_hook_deserialize(struct openchannel2_payload *payload,
|
|||
else
|
||||
payload->our_shutdown_scriptpubkey = shutdown_script;
|
||||
|
||||
|
||||
struct amount_sat sats;
|
||||
struct amount_msat msats;
|
||||
payload->rates = tal(payload, struct lease_rates);
|
||||
err = json_scan(payload, buffer, toks,
|
||||
"{lease_fee_base_msat:%"
|
||||
",lease_fee_basis:%"
|
||||
",channel_fee_max_base_msat:%"
|
||||
",channel_fee_max_proportional_thousandths:%"
|
||||
",funding_weight:%}",
|
||||
JSON_SCAN(json_to_sat, &sats),
|
||||
JSON_SCAN(json_to_u16,
|
||||
&payload->rates->lease_fee_basis),
|
||||
JSON_SCAN(json_to_msat, &msats),
|
||||
JSON_SCAN(json_to_u16,
|
||||
&payload->rates->channel_fee_max_proportional_thousandths),
|
||||
JSON_SCAN(json_to_u16,
|
||||
&payload->rates->funding_weight));
|
||||
|
||||
/* It's possible they didn't send these back! */
|
||||
if (err)
|
||||
payload->rates = tal_free(payload->rates);
|
||||
|
||||
/* Convert to u32s */
|
||||
if (payload->rates &&
|
||||
!lease_rates_set_lease_fee_sat(payload->rates, sats))
|
||||
fatal("Plugin sent overflowing `lease_fee_base_msat`");
|
||||
|
||||
if (payload->rates &&
|
||||
!lease_rates_set_chan_fee_base_msat(payload->rates, msats))
|
||||
fatal("Plugin sent overflowing `channel_fee_max_base_msat`");
|
||||
|
||||
/* Add a serial_id to everything that doesn't have one yet */
|
||||
if (payload->psbt)
|
||||
psbt_add_serials(payload->psbt, TX_ACCEPTER);
|
||||
|
@ -1699,6 +1746,7 @@ static void accepter_got_offer(struct subd *dualopend,
|
|||
* the plugin */
|
||||
payload->feerate_our_min = feerate_min(dualopend->ld, NULL);
|
||||
payload->feerate_our_max = feerate_max(dualopend->ld, NULL);
|
||||
payload->node_blockheight = get_block_height(dualopend->ld->topology);
|
||||
|
||||
payload->channel_max = chainparams->max_funding;
|
||||
if (feature_negotiated(dualopend->ld->our_features,
|
||||
|
|
|
@ -282,6 +282,9 @@ struct open_info {
|
|||
struct amount_sat channel_max;
|
||||
u64 funding_feerate_perkw;
|
||||
u32 locktime;
|
||||
u32 lease_blockheight;
|
||||
u32 node_blockheight;
|
||||
struct amount_sat requested_lease;
|
||||
};
|
||||
|
||||
static struct command_result *
|
||||
|
@ -322,6 +325,11 @@ psbt_funded(struct command *cmd,
|
|||
json_add_amount_msat_only(response, "our_funding_msat",
|
||||
our_funding_msat);
|
||||
|
||||
/* If we're accepting an lease request, *and* they've
|
||||
* requested one, fill in our most recent infos */
|
||||
if (current_policy->rates && !amount_sat_zero(info->requested_lease))
|
||||
json_add_lease_rates(response, current_policy->rates);
|
||||
|
||||
return command_finished(cmd, response);
|
||||
}
|
||||
|
||||
|
@ -419,6 +427,7 @@ listfunds_success(struct command *cmd,
|
|||
info->their_funding,
|
||||
available_funds,
|
||||
info->channel_max,
|
||||
info->requested_lease,
|
||||
&info->our_funding);
|
||||
plugin_log(cmd->plugin, LOG_DBG,
|
||||
"Policy %s returned funding amount of %s. %s",
|
||||
|
@ -531,6 +540,21 @@ json_openchannel2_call(struct command *cmd,
|
|||
err, json_tok_full_len(params),
|
||||
json_tok_full(buf, params));
|
||||
|
||||
err = json_scan(tmpctx, buf, params,
|
||||
"{openchannel2:{"
|
||||
"requested_lease_msat:%"
|
||||
",lease_blockheight_start:%"
|
||||
",node_blockheight:%}}",
|
||||
JSON_SCAN(json_to_sat, &info->requested_lease),
|
||||
JSON_SCAN(json_to_u32, &info->node_blockheight),
|
||||
JSON_SCAN(json_to_u32, &info->lease_blockheight));
|
||||
|
||||
/* These aren't necessarily included */
|
||||
if (err) {
|
||||
info->requested_lease = AMOUNT_SAT(0);
|
||||
info->node_blockheight = 0;
|
||||
info->lease_blockheight = 0;
|
||||
}
|
||||
|
||||
/* If there's no channel_max, it's actually infinity */
|
||||
err = json_scan(tmpctx, buf, params,
|
||||
|
@ -553,6 +577,40 @@ json_openchannel2_call(struct command *cmd,
|
|||
return command_hook_success(cmd);
|
||||
}
|
||||
|
||||
/* Check that their block height isn't too far behind */
|
||||
if (!amount_sat_zero(info->requested_lease)) {
|
||||
u32 upper_bound, lower_bound;
|
||||
|
||||
/* BOLT- #2:
|
||||
* The receiving node:
|
||||
* - MAY fail the negotiation if: ...
|
||||
* - if the `option_will_fund` tlv is present and:
|
||||
* - the `blockheight` is considered too far in the
|
||||
* past or future
|
||||
*/
|
||||
/* We consider 24 hrs too far out */
|
||||
upper_bound = info->node_blockheight + 24 * 6;
|
||||
lower_bound = info->node_blockheight - 24 * 6;
|
||||
|
||||
/* Check overflow */
|
||||
if (upper_bound < info->node_blockheight)
|
||||
upper_bound = -1;
|
||||
if (lower_bound > info->node_blockheight)
|
||||
lower_bound = 0;
|
||||
|
||||
if (upper_bound < info->lease_blockheight
|
||||
|| lower_bound > info->lease_blockheight) {
|
||||
|
||||
plugin_log(cmd->plugin, LOG_DBG,
|
||||
"their blockheight %d is out of"
|
||||
" our bounds (ours is %d)",
|
||||
info->lease_blockheight,
|
||||
info->node_blockheight);
|
||||
|
||||
return command_hook_success(cmd);
|
||||
}
|
||||
}
|
||||
|
||||
/* Figure out what our funds are */
|
||||
req = jsonrpc_request_start(cmd->plugin, cmd,
|
||||
"listfunds",
|
||||
|
|
|
@ -174,12 +174,17 @@ apply_fuzz(u32 fuzz_factor, struct amount_sat val)
|
|||
static struct amount_sat
|
||||
apply_policy(struct funder_policy *policy,
|
||||
struct amount_sat their_funding,
|
||||
struct amount_sat requested_lease,
|
||||
struct amount_sat available_funds)
|
||||
{
|
||||
struct amount_sat our_funding;
|
||||
|
||||
switch (policy->opt) {
|
||||
case MATCH:
|
||||
/* For matches, we use requested funding, if availalbe */
|
||||
if (!amount_sat_zero(requested_lease))
|
||||
their_funding = requested_lease;
|
||||
|
||||
/* if this fails, it implies ludicrous funding offer, *and*
|
||||
* > 100% match. Just Say No, kids. */
|
||||
if (!amount_sat_scale(&our_funding, their_funding,
|
||||
|
@ -207,12 +212,23 @@ calculate_our_funding(struct funder_policy *policy,
|
|||
struct amount_sat their_funding,
|
||||
struct amount_sat available_funds,
|
||||
struct amount_sat channel_max,
|
||||
struct amount_sat requested_lease,
|
||||
struct amount_sat *our_funding)
|
||||
{
|
||||
struct amount_sat avail_channel_space, net_available_funds;
|
||||
|
||||
/* Are we only funding lease requests ? */
|
||||
if (policy->leases_only && amount_sat_zero(requested_lease)) {
|
||||
*our_funding = AMOUNT_SAT(0);
|
||||
return tal_fmt(tmpctx,
|
||||
"Skipping funding open; leases-only=true"
|
||||
" and this open isn't asking for a lease");
|
||||
}
|
||||
|
||||
/* Are we skipping this one? */
|
||||
if (pseudorand(100) >= policy->fund_probability) {
|
||||
if (pseudorand(100) >= policy->fund_probability
|
||||
/* We don't skip lease requests */
|
||||
&& amount_sat_zero(requested_lease)) {
|
||||
*our_funding = AMOUNT_SAT(0);
|
||||
return tal_fmt(tmpctx,
|
||||
"Skipping, failed fund_probability test");
|
||||
|
@ -269,7 +285,10 @@ calculate_our_funding(struct funder_policy *policy,
|
|||
}
|
||||
|
||||
/* What's our amount, given our policy */
|
||||
*our_funding = apply_policy(policy, their_funding, available_funds);
|
||||
*our_funding = apply_policy(policy,
|
||||
their_funding,
|
||||
requested_lease,
|
||||
available_funds);
|
||||
|
||||
/* Don't return an 'error' if we're already at 0 */
|
||||
if (amount_sat_zero(*our_funding))
|
||||
|
|
|
@ -9,7 +9,7 @@ struct node_id;
|
|||
|
||||
/* Policy Options */
|
||||
enum funder_opt {
|
||||
/* Use their_funding as the starting
|
||||
/* Use their_funding/requested_amt as the starting
|
||||
* point for your contribution */
|
||||
MATCH,
|
||||
|
||||
|
@ -96,6 +96,7 @@ calculate_our_funding(struct funder_policy *policy,
|
|||
struct amount_sat their_funding,
|
||||
struct amount_sat available_funds,
|
||||
struct amount_sat channel_max,
|
||||
struct amount_sat lease_request,
|
||||
struct amount_sat *our_funding);
|
||||
|
||||
/* Get the name of this policy option */
|
||||
|
|
|
@ -33,6 +33,7 @@ struct test_case {
|
|||
struct amount_sat their_funds;
|
||||
struct amount_sat available_funds;
|
||||
struct amount_sat channel_max;
|
||||
struct amount_sat lease_request;
|
||||
|
||||
struct funder_policy policy;
|
||||
|
||||
|
@ -46,6 +47,7 @@ struct test_case cases[] = {
|
|||
.their_funds = AMOUNT_SAT(5000),
|
||||
.available_funds = AMOUNT_SAT(100000),
|
||||
.channel_max = AMOUNT_SAT(11000),
|
||||
.lease_request = AMOUNT_SAT(0),
|
||||
.policy = {
|
||||
.opt = FIXED,
|
||||
.mod = 1111,
|
||||
|
@ -56,6 +58,7 @@ struct test_case cases[] = {
|
|||
.fuzz_factor = 0,
|
||||
.reserve_tank = AMOUNT_SAT(0),
|
||||
.fund_probability = 100,
|
||||
.leases_only = false,
|
||||
},
|
||||
|
||||
.exp_our_funds = AMOUNT_SAT(1111),
|
||||
|
@ -66,6 +69,7 @@ struct test_case cases[] = {
|
|||
.their_funds = AMOUNT_SAT(5000),
|
||||
.available_funds = AMOUNT_SAT(500),
|
||||
.channel_max = AMOUNT_SAT(11000),
|
||||
.lease_request = AMOUNT_SAT(0),
|
||||
.policy = {
|
||||
.opt = MATCH,
|
||||
.mod = 0,
|
||||
|
@ -76,6 +80,7 @@ struct test_case cases[] = {
|
|||
.fuzz_factor = 0,
|
||||
.reserve_tank = AMOUNT_SAT(0),
|
||||
.fund_probability = 100,
|
||||
.leases_only = false,
|
||||
},
|
||||
|
||||
.exp_our_funds = AMOUNT_SAT(0),
|
||||
|
@ -86,6 +91,7 @@ struct test_case cases[] = {
|
|||
.their_funds = AMOUNT_SAT(5000),
|
||||
.available_funds = AMOUNT_SAT(6000),
|
||||
.channel_max = AMOUNT_SAT(11000),
|
||||
.lease_request = AMOUNT_SAT(0),
|
||||
.policy = {
|
||||
.opt = MATCH,
|
||||
.mod = 100,
|
||||
|
@ -96,6 +102,7 @@ struct test_case cases[] = {
|
|||
.fuzz_factor = 0,
|
||||
.reserve_tank = AMOUNT_SAT(0),
|
||||
.fund_probability = 100,
|
||||
.leases_only = false,
|
||||
},
|
||||
|
||||
.exp_our_funds = AMOUNT_SAT(5000),
|
||||
|
@ -106,6 +113,7 @@ struct test_case cases[] = {
|
|||
.their_funds = AMOUNT_SAT(2500),
|
||||
.available_funds = AMOUNT_SAT(6000),
|
||||
.channel_max = AMOUNT_SAT(11000),
|
||||
.lease_request = AMOUNT_SAT(0),
|
||||
.policy = {
|
||||
.opt = MATCH,
|
||||
.mod = 200,
|
||||
|
@ -116,6 +124,7 @@ struct test_case cases[] = {
|
|||
.fuzz_factor = 0,
|
||||
.reserve_tank = AMOUNT_SAT(0),
|
||||
.fund_probability = 100,
|
||||
.leases_only = false,
|
||||
},
|
||||
|
||||
.exp_our_funds = AMOUNT_SAT(5000),
|
||||
|
@ -126,6 +135,7 @@ struct test_case cases[] = {
|
|||
.their_funds = AMOUNT_SAT(2500),
|
||||
.available_funds = AMOUNT_SAT(5000),
|
||||
.channel_max = AMOUNT_SAT(11000),
|
||||
.lease_request = AMOUNT_SAT(0),
|
||||
.policy = {
|
||||
.opt = AVAILABLE,
|
||||
.mod = 0,
|
||||
|
@ -136,6 +146,7 @@ struct test_case cases[] = {
|
|||
.fuzz_factor = 0,
|
||||
.reserve_tank = AMOUNT_SAT(0),
|
||||
.fund_probability = 100,
|
||||
.leases_only = false,
|
||||
},
|
||||
|
||||
.exp_our_funds = AMOUNT_SAT(0),
|
||||
|
@ -146,6 +157,7 @@ struct test_case cases[] = {
|
|||
.their_funds = AMOUNT_SAT(2500),
|
||||
.available_funds = AMOUNT_SAT(3000),
|
||||
.channel_max = AMOUNT_SAT(11000),
|
||||
.lease_request = AMOUNT_SAT(0),
|
||||
.policy = {
|
||||
.opt = AVAILABLE,
|
||||
.mod = 50,
|
||||
|
@ -156,6 +168,7 @@ struct test_case cases[] = {
|
|||
.fuzz_factor = 0,
|
||||
.reserve_tank = AMOUNT_SAT(0),
|
||||
.fund_probability = 100,
|
||||
.leases_only = false,
|
||||
},
|
||||
|
||||
.exp_our_funds = AMOUNT_SAT(1500),
|
||||
|
@ -166,6 +179,7 @@ struct test_case cases[] = {
|
|||
.their_funds = AMOUNT_SAT(2500),
|
||||
.available_funds = AMOUNT_SAT(5000),
|
||||
.channel_max = AMOUNT_SAT(11000),
|
||||
.lease_request = AMOUNT_SAT(0),
|
||||
.policy = {
|
||||
.opt = AVAILABLE,
|
||||
.mod = 100,
|
||||
|
@ -176,6 +190,7 @@ struct test_case cases[] = {
|
|||
.fuzz_factor = 0,
|
||||
.reserve_tank = AMOUNT_SAT(0),
|
||||
.fund_probability = 100,
|
||||
.leases_only = false,
|
||||
},
|
||||
|
||||
.exp_our_funds = AMOUNT_SAT(5000),
|
||||
|
@ -198,6 +213,7 @@ struct test_case cases[] = {
|
|||
.fuzz_factor = 0,
|
||||
.reserve_tank = AMOUNT_SAT(0),
|
||||
.fund_probability = 100,
|
||||
.leases_only = false,
|
||||
},
|
||||
|
||||
.exp_our_funds = AMOUNT_SAT(900),
|
||||
|
@ -208,6 +224,7 @@ struct test_case cases[] = {
|
|||
.their_funds = AMOUNT_SAT(5000),
|
||||
.available_funds = AMOUNT_SAT(5000),
|
||||
.channel_max = AMOUNT_SAT(5500),
|
||||
.lease_request = AMOUNT_SAT(0),
|
||||
.policy = {
|
||||
.opt = FIXED,
|
||||
.mod = 1002,
|
||||
|
@ -218,6 +235,7 @@ struct test_case cases[] = {
|
|||
.fuzz_factor = 0,
|
||||
.reserve_tank = AMOUNT_SAT(0),
|
||||
.fund_probability = 100,
|
||||
.leases_only = false,
|
||||
},
|
||||
|
||||
.exp_our_funds = AMOUNT_SAT(500),
|
||||
|
@ -228,6 +246,7 @@ struct test_case cases[] = {
|
|||
.their_funds = AMOUNT_SAT(5000),
|
||||
.available_funds = AMOUNT_SAT(500),
|
||||
.channel_max = AMOUNT_SAT(10000),
|
||||
.lease_request = AMOUNT_SAT(0),
|
||||
.policy = {
|
||||
.opt = FIXED,
|
||||
.mod = 1001,
|
||||
|
@ -238,6 +257,7 @@ struct test_case cases[] = {
|
|||
.fuzz_factor = 0,
|
||||
.reserve_tank = AMOUNT_SAT(0),
|
||||
.fund_probability = 100,
|
||||
.leases_only = false,
|
||||
},
|
||||
|
||||
.exp_our_funds = AMOUNT_SAT(500),
|
||||
|
@ -248,6 +268,7 @@ struct test_case cases[] = {
|
|||
.their_funds = AMOUNT_SAT(5000),
|
||||
.available_funds = AMOUNT_SAT(1000),
|
||||
.channel_max = AMOUNT_SAT(10000),
|
||||
.lease_request = AMOUNT_SAT(0),
|
||||
.policy = {
|
||||
.opt = FIXED,
|
||||
.mod = 999,
|
||||
|
@ -258,6 +279,7 @@ struct test_case cases[] = {
|
|||
.fuzz_factor = 0,
|
||||
.reserve_tank = AMOUNT_SAT(0),
|
||||
.fund_probability = 100,
|
||||
.leases_only = false,
|
||||
},
|
||||
|
||||
.exp_our_funds = AMOUNT_SAT(0),
|
||||
|
@ -268,6 +290,7 @@ struct test_case cases[] = {
|
|||
.their_funds = AMOUNT_SAT(5001),
|
||||
.available_funds = AMOUNT_SAT(5000),
|
||||
.channel_max = AMOUNT_SAT(10000),
|
||||
.lease_request = AMOUNT_SAT(0),
|
||||
.policy = {
|
||||
.opt = FIXED,
|
||||
.mod = 998,
|
||||
|
@ -278,6 +301,7 @@ struct test_case cases[] = {
|
|||
.fuzz_factor = 0,
|
||||
.reserve_tank = AMOUNT_SAT(0),
|
||||
.fund_probability = 100,
|
||||
.leases_only = false,
|
||||
},
|
||||
|
||||
.exp_our_funds = AMOUNT_SAT(0),
|
||||
|
@ -288,6 +312,7 @@ struct test_case cases[] = {
|
|||
.their_funds = AMOUNT_SAT(5000),
|
||||
.available_funds = AMOUNT_SAT(1000),
|
||||
.channel_max = AMOUNT_SAT(10000),
|
||||
.lease_request = AMOUNT_SAT(0),
|
||||
.policy = {
|
||||
.opt = FIXED,
|
||||
.mod = 997,
|
||||
|
@ -298,6 +323,7 @@ struct test_case cases[] = {
|
|||
.fuzz_factor = 0,
|
||||
.reserve_tank = AMOUNT_SAT(100),
|
||||
.fund_probability = 100,
|
||||
.leases_only = false,
|
||||
},
|
||||
|
||||
.exp_our_funds = AMOUNT_SAT(900),
|
||||
|
@ -308,6 +334,7 @@ struct test_case cases[] = {
|
|||
.their_funds = AMOUNT_SAT(5000),
|
||||
.available_funds = AMOUNT_SAT(999),
|
||||
.channel_max = AMOUNT_SAT(10000),
|
||||
.lease_request = AMOUNT_SAT(0),
|
||||
.policy = {
|
||||
.opt = FIXED,
|
||||
.mod = 996,
|
||||
|
@ -318,6 +345,7 @@ struct test_case cases[] = {
|
|||
.fuzz_factor = 0,
|
||||
.reserve_tank = AMOUNT_SAT(1000),
|
||||
.fund_probability = 100,
|
||||
.leases_only = false,
|
||||
},
|
||||
|
||||
.exp_our_funds = AMOUNT_SAT(0),
|
||||
|
@ -328,6 +356,7 @@ struct test_case cases[] = {
|
|||
.their_funds = AMOUNT_SAT(5000),
|
||||
.available_funds = AMOUNT_SAT(5000),
|
||||
.channel_max = AMOUNT_SAT(5000),
|
||||
.lease_request = AMOUNT_SAT(0),
|
||||
.policy = {
|
||||
.opt = FIXED,
|
||||
.mod = 995,
|
||||
|
@ -338,6 +367,7 @@ struct test_case cases[] = {
|
|||
.fuzz_factor = 0,
|
||||
.reserve_tank = AMOUNT_SAT(1000),
|
||||
.fund_probability = 100,
|
||||
.leases_only = false,
|
||||
},
|
||||
|
||||
.exp_our_funds = AMOUNT_SAT(0),
|
||||
|
@ -348,6 +378,7 @@ struct test_case cases[] = {
|
|||
.their_funds = AMOUNT_SAT(5000),
|
||||
.available_funds = AMOUNT_SAT(5000),
|
||||
.channel_max = AMOUNT_SAT(11000),
|
||||
.lease_request = AMOUNT_SAT(0),
|
||||
.policy = {
|
||||
.opt = FIXED,
|
||||
.mod = 988,
|
||||
|
@ -358,6 +389,51 @@ struct test_case cases[] = {
|
|||
.fuzz_factor = 0,
|
||||
.reserve_tank = AMOUNT_SAT(0),
|
||||
.fund_probability = 100,
|
||||
.leases_only = false,
|
||||
},
|
||||
|
||||
.exp_our_funds = AMOUNT_SAT(0),
|
||||
.expect_err = true,
|
||||
},
|
||||
/* By default, use lease request as ceiling */
|
||||
{
|
||||
.their_funds = AMOUNT_SAT(5000),
|
||||
.available_funds = AMOUNT_SAT(100000),
|
||||
.channel_max = AMOUNT_SAT(11000),
|
||||
.lease_request = AMOUNT_SAT(980),
|
||||
.policy = {
|
||||
.opt = MATCH,
|
||||
.mod = 100,
|
||||
.min_their_funding = AMOUNT_SAT(0),
|
||||
.max_their_funding = AMOUNT_SAT(10000),
|
||||
.per_channel_max = AMOUNT_SAT(100000),
|
||||
.per_channel_min = AMOUNT_SAT(0),
|
||||
.fuzz_factor = 0,
|
||||
.reserve_tank = AMOUNT_SAT(0),
|
||||
.fund_probability = 100,
|
||||
.leases_only = false,
|
||||
},
|
||||
|
||||
.exp_our_funds = AMOUNT_SAT(980),
|
||||
.expect_err = false,
|
||||
},
|
||||
/* Only fund lease requests */
|
||||
{
|
||||
.their_funds = AMOUNT_SAT(5000),
|
||||
.available_funds = AMOUNT_SAT(100000),
|
||||
.channel_max = AMOUNT_SAT(11000),
|
||||
.lease_request = AMOUNT_SAT(0),
|
||||
.policy = {
|
||||
.opt = FIXED,
|
||||
.mod = 985,
|
||||
.min_their_funding = AMOUNT_SAT(0),
|
||||
.max_their_funding = AMOUNT_SAT(10000),
|
||||
.per_channel_max = AMOUNT_SAT(100000),
|
||||
.per_channel_min = AMOUNT_SAT(0),
|
||||
.fuzz_factor = 0,
|
||||
.reserve_tank = AMOUNT_SAT(0),
|
||||
.fund_probability = 100,
|
||||
.leases_only = true,
|
||||
},
|
||||
|
||||
.exp_our_funds = AMOUNT_SAT(0),
|
||||
|
@ -380,6 +456,7 @@ static void check_fuzzing(struct test_case fuzzcase)
|
|||
fuzzcase.their_funds,
|
||||
fuzzcase.available_funds,
|
||||
fuzzcase.channel_max,
|
||||
fuzzcase.lease_request,
|
||||
&our_funds);
|
||||
if (amount_sat_greater(our_funds, fuzz_max))
|
||||
fuzz_max = our_funds;
|
||||
|
@ -412,6 +489,7 @@ int main(int argc, const char *argv[])
|
|||
AMOUNT_SAT(50000),
|
||||
AMOUNT_SAT(50000),
|
||||
AMOUNT_SAT(100000),
|
||||
AMOUNT_SAT(0),
|
||||
&our_funds);
|
||||
assert(amount_sat_eq(empty, our_funds));
|
||||
assert(!err);
|
||||
|
@ -421,6 +499,7 @@ int main(int argc, const char *argv[])
|
|||
cases[i].their_funds,
|
||||
cases[i].available_funds,
|
||||
cases[i].channel_max,
|
||||
cases[i].lease_request,
|
||||
&our_funds);
|
||||
if (!amount_sat_eq(cases[i].exp_our_funds, our_funds)) {
|
||||
fprintf(stderr, "FAIL policy: %s. expected %s, got %s\n",
|
||||
|
@ -454,6 +533,7 @@ int main(int argc, const char *argv[])
|
|||
flipcase.their_funds,
|
||||
flipcase.available_funds,
|
||||
flipcase.channel_max,
|
||||
flipcase.lease_request,
|
||||
&our_funds);
|
||||
if (!amount_sat_eq(our_funds, AMOUNT_SAT(0)))
|
||||
flipcount++;
|
||||
|
|
Loading…
Add table
Reference in a new issue