mirror of
https://github.com/aljazceru/lightning.git
synced 2026-02-23 15:04:19 +01:00
df: pass lease data back to funder for rbfs
let's let RBFs know about our lease info!
This commit is contained in:
committed by
Christian Decker
parent
d3066ab7f9
commit
85039d4f4e
@@ -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) {
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user