df: pass lease data back to funder for rbfs

let's let RBFs know about our lease info!
This commit is contained in:
niftynei
2022-10-03 21:18:31 -05:00
committed by Christian Decker
parent d3066ab7f9
commit 85039d4f4e
8 changed files with 134 additions and 56 deletions

View File

@@ -272,11 +272,17 @@ struct open_info {
struct node_id id;
struct amount_sat our_funding;
struct amount_sat their_funding;
/* If this is an RBF, we'll have this */
struct amount_sat *their_last_funding;
struct amount_sat *our_last_funding;
struct amount_sat channel_max;
u64 funding_feerate_perkw;
u32 locktime;
u32 lease_blockheight;
u32 node_blockheight;
struct amount_sat requested_lease;
};
@@ -284,6 +290,8 @@ static struct open_info *new_open_info(const tal_t *ctx)
{
struct open_info *info = tal(ctx, struct open_info);
info->their_last_funding = NULL;
info->our_last_funding = NULL;
info->requested_lease = AMOUNT_SAT(0);
info->lease_blockheight = 0;
info->node_blockheight = 0;
@@ -456,6 +464,7 @@ listfunds_success(struct command *cmd,
funding_err = calculate_our_funding(current_policy,
info->id,
info->their_funding,
info->our_last_funding,
available_funds,
info->channel_max,
info->requested_lease,
@@ -572,21 +581,15 @@ 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_msat_as_sats, &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;
}
/* Channel lease info isn't necessarily included, ignore any err */
json_scan(tmpctx, buf, params,
"{openchannel2:{"
"requested_lease_msat:%"
",lease_blockheight_start:%"
",node_blockheight:%}}",
JSON_SCAN(json_to_msat_as_sats, &info->requested_lease),
JSON_SCAN(json_to_u32, &info->lease_blockheight),
JSON_SCAN(json_to_u32, &info->node_blockheight));
/* We don't fund anything that's above or below our feerate */
if (info->funding_feerate_perkw < feerate_our_min
@@ -670,11 +673,15 @@ json_rbf_channel_call(struct command *cmd,
const char *err;
struct out_req *req;
info->their_last_funding = tal(info, struct amount_sat);
info->our_last_funding = tal(info, struct amount_sat);
err = json_scan(tmpctx, buf, params,
"{rbf_channel:"
"{id:%"
",channel_id:%"
",their_last_funding_msat:%"
",their_funding_msat:%"
",our_last_funding_msat:%"
",funding_feerate_per_kw:%"
",feerate_our_max:%"
",feerate_our_min:%"
@@ -682,7 +689,12 @@ json_rbf_channel_call(struct command *cmd,
",channel_max_msat:%}}",
JSON_SCAN(json_to_node_id, &info->id),
JSON_SCAN(json_to_channel_id, &info->cid),
JSON_SCAN(json_to_msat_as_sats, &info->their_funding),
JSON_SCAN(json_to_msat_as_sats,
info->their_last_funding),
JSON_SCAN(json_to_msat_as_sats,
&info->their_funding),
JSON_SCAN(json_to_msat_as_sats,
info->our_last_funding),
JSON_SCAN(json_to_u64, &info->funding_feerate_perkw),
JSON_SCAN(json_to_u64, &feerate_our_max),
JSON_SCAN(json_to_u64, &feerate_our_min),
@@ -695,6 +707,13 @@ json_rbf_channel_call(struct command *cmd,
err, json_tok_full_len(params),
json_tok_full(buf, params));
/* Lease info isn't necessarily included, ignore any err */
/* FIXME: blockheights?? */
json_scan(tmpctx, buf, params,
"{rbf_channel:{"
"requested_lease_msat:%}}",
JSON_SCAN(json_to_msat_as_sats, &info->requested_lease));
/* We don't fund anything that's above or below our feerate */
if (info->funding_feerate_perkw < feerate_our_min
|| info->funding_feerate_perkw > feerate_our_max) {

View File

@@ -208,6 +208,7 @@ const char *
calculate_our_funding(struct funder_policy *policy,
struct node_id id,
struct amount_sat their_funding,
struct amount_sat *our_last_funding,
struct amount_sat available_funds,
struct amount_sat channel_max,
struct amount_sat requested_lease,
@@ -309,6 +310,22 @@ calculate_our_funding(struct funder_policy *policy,
if (amount_sat_greater(*our_funding, net_available_funds))
*our_funding = net_available_funds;
/* Are we putting in less than last time + it's a lease?
* Return an error as a convenience to the buyer */
if (our_last_funding && !amount_sat_zero(requested_lease)) {
if (amount_sat_less(*our_funding, *our_last_funding)
&& amount_sat_less(*our_funding, requested_lease)) {
return tal_fmt(tmpctx, "New amount (%s) is less than"
" last (%s); peer requested a lease (%s)",
type_to_string(tmpctx, struct amount_sat,
our_funding),
type_to_string(tmpctx, struct amount_sat,
our_last_funding),
type_to_string(tmpctx, struct amount_sat,
&requested_lease));
}
}
/* Is our_funding less than our per-channel minimum?
* if so, don't fund */
if (amount_sat_less(*our_funding, policy->per_channel_min)) {

View File

@@ -79,6 +79,7 @@ const char *
calculate_our_funding(struct funder_policy *policy,
struct node_id id,
struct amount_sat their_funding,
struct amount_sat *our_last_funding,
struct amount_sat available_funds,
struct amount_sat channel_max,
struct amount_sat lease_request,

View File

@@ -29,6 +29,7 @@ void towire_node_id(u8 **pptr UNNEEDED, const struct node_id *id UNNEEDED)
struct test_case {
struct amount_sat their_funds;
struct amount_sat available_funds;
struct amount_sat *our_last_funds;
struct amount_sat channel_max;
struct amount_sat lease_request;
@@ -43,6 +44,7 @@ struct test_case cases[] = {
{
.their_funds = AMOUNT_SAT(5000),
.available_funds = AMOUNT_SAT(100000),
.our_last_funds = NULL,
.channel_max = AMOUNT_SAT(11000),
.lease_request = AMOUNT_SAT(0),
.policy = {
@@ -65,6 +67,7 @@ struct test_case cases[] = {
{
.their_funds = AMOUNT_SAT(5000),
.available_funds = AMOUNT_SAT(500),
.our_last_funds = NULL,
.channel_max = AMOUNT_SAT(11000),
.lease_request = AMOUNT_SAT(0),
.policy = {
@@ -87,6 +90,7 @@ struct test_case cases[] = {
{
.their_funds = AMOUNT_SAT(5000),
.available_funds = AMOUNT_SAT(6000),
.our_last_funds = NULL,
.channel_max = AMOUNT_SAT(11000),
.lease_request = AMOUNT_SAT(0),
.policy = {
@@ -109,6 +113,7 @@ struct test_case cases[] = {
{
.their_funds = AMOUNT_SAT(2500),
.available_funds = AMOUNT_SAT(6000),
.our_last_funds = NULL,
.channel_max = AMOUNT_SAT(11000),
.lease_request = AMOUNT_SAT(0),
.policy = {
@@ -131,6 +136,7 @@ struct test_case cases[] = {
{
.their_funds = AMOUNT_SAT(2500),
.available_funds = AMOUNT_SAT(5000),
.our_last_funds = NULL,
.channel_max = AMOUNT_SAT(11000),
.lease_request = AMOUNT_SAT(0),
.policy = {
@@ -153,6 +159,7 @@ struct test_case cases[] = {
{
.their_funds = AMOUNT_SAT(2500),
.available_funds = AMOUNT_SAT(3000),
.our_last_funds = NULL,
.channel_max = AMOUNT_SAT(11000),
.lease_request = AMOUNT_SAT(0),
.policy = {
@@ -175,6 +182,7 @@ struct test_case cases[] = {
{
.their_funds = AMOUNT_SAT(2500),
.available_funds = AMOUNT_SAT(5000),
.our_last_funds = NULL,
.channel_max = AMOUNT_SAT(11000),
.lease_request = AMOUNT_SAT(0),
.policy = {
@@ -197,6 +205,7 @@ struct test_case cases[] = {
{
.their_funds = AMOUNT_SAT(5000),
.available_funds = AMOUNT_SAT(5000),
.our_last_funds = NULL,
.channel_max = AMOUNT_SAT(11000),
.policy = {
.opt = FIXED,
@@ -220,6 +229,7 @@ struct test_case cases[] = {
{
.their_funds = AMOUNT_SAT(5000),
.available_funds = AMOUNT_SAT(5000),
.our_last_funds = NULL,
.channel_max = AMOUNT_SAT(5500),
.lease_request = AMOUNT_SAT(0),
.policy = {
@@ -242,6 +252,7 @@ struct test_case cases[] = {
{
.their_funds = AMOUNT_SAT(5000),
.available_funds = AMOUNT_SAT(500),
.our_last_funds = NULL,
.channel_max = AMOUNT_SAT(10000),
.lease_request = AMOUNT_SAT(0),
.policy = {
@@ -264,6 +275,7 @@ struct test_case cases[] = {
{
.their_funds = AMOUNT_SAT(5000),
.available_funds = AMOUNT_SAT(1000),
.our_last_funds = NULL,
.channel_max = AMOUNT_SAT(10000),
.lease_request = AMOUNT_SAT(0),
.policy = {
@@ -286,6 +298,7 @@ struct test_case cases[] = {
{
.their_funds = AMOUNT_SAT(5001),
.available_funds = AMOUNT_SAT(5000),
.our_last_funds = NULL,
.channel_max = AMOUNT_SAT(10000),
.lease_request = AMOUNT_SAT(0),
.policy = {
@@ -308,6 +321,7 @@ struct test_case cases[] = {
{
.their_funds = AMOUNT_SAT(5000),
.available_funds = AMOUNT_SAT(1000),
.our_last_funds = NULL,
.channel_max = AMOUNT_SAT(10000),
.lease_request = AMOUNT_SAT(0),
.policy = {
@@ -330,6 +344,7 @@ struct test_case cases[] = {
{
.their_funds = AMOUNT_SAT(5000),
.available_funds = AMOUNT_SAT(999),
.our_last_funds = NULL,
.channel_max = AMOUNT_SAT(10000),
.lease_request = AMOUNT_SAT(0),
.policy = {
@@ -352,6 +367,7 @@ struct test_case cases[] = {
{
.their_funds = AMOUNT_SAT(5000),
.available_funds = AMOUNT_SAT(5000),
.our_last_funds = NULL,
.channel_max = AMOUNT_SAT(5000),
.lease_request = AMOUNT_SAT(0),
.policy = {
@@ -374,6 +390,7 @@ struct test_case cases[] = {
{
.their_funds = AMOUNT_SAT(5000),
.available_funds = AMOUNT_SAT(5000),
.our_last_funds = NULL,
.channel_max = AMOUNT_SAT(11000),
.lease_request = AMOUNT_SAT(0),
.policy = {
@@ -396,6 +413,7 @@ struct test_case cases[] = {
{
.their_funds = AMOUNT_SAT(5000),
.available_funds = AMOUNT_SAT(100000),
.our_last_funds = NULL,
.channel_max = AMOUNT_SAT(11000),
.lease_request = AMOUNT_SAT(980),
.policy = {
@@ -418,6 +436,7 @@ struct test_case cases[] = {
{
.their_funds = AMOUNT_SAT(5000),
.available_funds = AMOUNT_SAT(100000),
.our_last_funds = NULL,
.channel_max = AMOUNT_SAT(11000),
.lease_request = AMOUNT_SAT(0),
.policy = {
@@ -451,6 +470,7 @@ static void check_fuzzing(struct test_case fuzzcase)
for (size_t i = 0; i < 100; i++) {
calculate_our_funding(&fuzzcase.policy, id,
fuzzcase.their_funds,
fuzzcase.our_last_funds,
fuzzcase.available_funds,
fuzzcase.channel_max,
fuzzcase.lease_request,
@@ -484,6 +504,7 @@ int main(int argc, const char *argv[])
err = calculate_our_funding(policy, id,
AMOUNT_SAT(50000),
NULL,
AMOUNT_SAT(50000),
AMOUNT_SAT(100000),
AMOUNT_SAT(100000),
@@ -494,6 +515,7 @@ int main(int argc, const char *argv[])
for (i = 0; i < ARRAY_SIZE(cases); i++) {
err = calculate_our_funding(&cases[i].policy, id,
cases[i].their_funds,
cases[i].our_last_funds,
cases[i].available_funds,
cases[i].channel_max,
cases[i].lease_request,
@@ -528,6 +550,7 @@ int main(int argc, const char *argv[])
for (i = 0; i < 100 * flips; i++) {
calculate_our_funding(&flipcase.policy, id,
flipcase.their_funds,
flipcase.our_last_funds,
flipcase.available_funds,
flipcase.channel_max,
flipcase.lease_request,