-
Notifications
You must be signed in to change notification settings - Fork 116
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Improve the description of splits and fees #596
base: main
Are you sure you want to change the base?
Conversation
value/value.md
Outdated
The interval payment calculation is: | ||
A given recipient will receive | ||
``` | ||
(Payment amount) * (Interval payout) * (Interval count) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can payment amount, interval payout, and interval count be defined here? I assume payment amount is the recipient's percentage of the total payment and interval payout * count is the total payment.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good catch! That part should be adjusted.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What do you think?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is it worth making a distinction between intervaled and non-intervaled payments? Is the per-recipient calculation different for them?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The calculation is not different, it's just that Interval count
may not make sense for boosts, so I thought it needs to be at least acknowledged.
I'm not really sure about that part. Open to suggestions on how to better word it. Or if it's necessary at all.
Here's my understanding of the payment calculation. Hopefully I have it right: Recipients are divided into fee recipients (
|
That's exactly right! |
Co-authored-by: Eric P <[email protected]>
Co-authored-by: Eric P <[email protected]>
Co-authored-by: Eric P <[email protected]>
My interpretation was that the split value coming with |
I find it a bit confusing that the |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks! Quite clear overall I'd say. Just a minor comment.
Co-authored-by: Keunes <[email protected]>
Thank you! Merged! |
@joksas I also find this very confusing. Having the What is the problem we are trying to solve here? I read through the discussion in #434 (comment) and it seems that @keunes outlined the splits logic like this:
However this is not how Fountain works - we take our fee on top of the boost - so our logic would look like:
I would strongly suggest that we think carefully around adding this layer of complexity to the spec and I'm still not sure why this change is necessary? Surely the simplest way to reason with splits is that you 'split' the payment based on the ratio of the values? Simple to understand and no complex 'if this then that' logic. Based on all of the above - if we are going to change the language in the spec I would suggest we remove any mention of treating |
The reason we formulated the split mechanics as it is today is the interaction between fees and value time split. Say I use some service to host my show, or have additional functionality like op3 and want to send a 10% split (fee) their way. Then I insert some songs as value time split into my show. While these songs play, my own split is reduced in favor of the split for the owner of the remote item. This works as intended. But if we don't treat fees as special and don't calculate them before all other splits, the op3 split is reduced too. For a show consisting mainly of remote items, that would mean the value sent to services is reduced a lot. I'm not sure this is a side effect the producer expects when using both fees splits for services and remote items for content. Keep in mind that some services can have in their license a fixed percentage split they ask to be sent their way in exchange for the service. My personal idea as a producer is that the percentage I want to send to some service via a fee split stays the same if I use remote items or not. But we can discuss on this if you have different ideas or find a way to obtain the same result in a easier and more intuitive way. |
@francosolerio aah ok thanks for the detailed explanation that makes sense as a rational for doing this - however I still think the complexity it introduces is not worth it. Fountain for example takes a fee split for the podcasters we onboard - and I personally would rather have our fee reduced during value time splits than over-complicate the spec and confuse everyone. Either way - we agree the use case is this: "As a producer I want the percentage I send to some service via a fee split to stay the same if I use remote items or not." My questions to everyone would be:
|
@MerryOscar I agree the My reason for adding all of the splits is it prevents this scenario. Imagine the 'fee=false' are A hill I am willing to die on is I won't ever add The only caveat to that would be if the app decides to take a cut. I could see an argument for adding the app's cut to the top of the boost, almost like a tax, since the podcaster didn't decide which app the listener would use, and one app could decide to take a 20% cut if they wanted to. In that case, the app shouldn't get 20% of what was intended for the podcaster, because the podcaster didn't have a say in that. However, with the splits, the podcaster has complete control of the split amounts, and should be responsible for paying them out of the listeners initial boost amount. |
@francosolerio I also agree that the fee should be the complete percentage as intended by the One issue I've run into using |
@thebells1111 just to be clear - we only add our fountain app fee on top of the boost - not any of the fees in the value block: example boost for 100 sats:
|
this is another great example of the complexity of the we should just add up all the splits and calculate the percentages - simple |
I'm not necessarily opposed to this, even for fees. My only concern is fees are typically used by podcasters to ensure a TLV record is sent to a service that provides them valuable stats, and I don't want to see a fee percentage knocked so low that the TLV record isn't being sent and the podcaster loses out on those stats they want. |
If podcasters want to maintain a certain split at 1% - why can't hosting companies just build this into their splits editing ui instead of pushing this it onto the spec so everyone else has to run complex calculations that inevitably will produce different results in different apps, and require listeners to get out a calculator or spreadsheet to validate? |
I think I agree with basically removing the concept of a "fee" split. In the early days of working out the spec, much of this was envisioning how things would work in the future because there was literally only one client that supported the value tag (Sphinx) and they needed a fee. Then we decided to do the PI API "fee", and it made sense to have that attribute. But, now that we are using the splits as a way to activate third party features, the biggest issue is we can't ever do a sub-1% split, which could become a big problem at much higher totals. If we just remove the "fee" attribute altogether then people can more easily sub-divide what they are wanting to send where. You can still do a 1%. But, you can also do a .5% or something else. Will discuss in the board meeting. |
@daveajones @MerryOscar I would like to hear from Cameron from IPFSPodcasting, @johnspurlock from OP3 and others who provide services relative to P2.0, as removing the fee calculation protection from VTS reduction might create unfavorable conditions for the developement of such services. |
I like the idea of removing the fee concept - a split is a split. If folks want to to use services and want these services to exist in the future, they should give them a proper split (participate in both large and small txns) and not try to come up with ways to give them as little as possible. That's not a proper partnership. |
I think standardizing on one calculation rather than this split percentage/share calculation makes it easier to understand and implement for everyone. It may still be useful to have the 'fee' flag in there purely as a flag to denote fees vs non-fees. Some apps show them differently and it's nice to see how much of my sats are going to the podcasters vs the services/infrastructure. |
I'm actually okay with removing fees as well. My only concern (and this isn't about fees), is if a podcaster has a service at a 1% split, and the remotePercentage is set to 90% with that podcast as a remoteItem, it will lower that service to .9%. That means there's a higher threshold before a TLV record is sent to that service. Maybe it's not a problem worth worrying about and I'm overthinking it, but I'd like some way for the podcasters to be able to say "Hey, this service getting a TLV record is really important to me, because I need the data". |
Another thing we'll have to keep in mind is how to grandfather old valueblocks that were made with |
@thebells1111 If I host my show on IPFS podcasting and decide to send 1% of my income to them (they might actually make it mandatory by license), if 90% of my content is songs with VTS 90% split, the app is actually sending ~0.1%, one tenth of what I what I expected to send. Should the producer calculate and adjust the IPFS split at the end of each show, calculating the effect of each remote item to compensate it and get back to the 1% required? This will make things easier for apps developers (hey, that's me!), but much more obscure and unpredictable for show producers. |
This should probably be in a dedicated discussion thread rather than @joksas 's excellent PR. |
TLDR; (My $0.02) Keep fee=true, but don't change a share to a percentage based on "fee-true". I've always thought the word "percentage" was a typo in the original docs. That all the split numbers were a "share". This says With remote items, fee=true was meant to pay those first before sending (90%) to the remote item. Sending 90% to the remote item comes from all the non-fee channel/item level splits. This way, a 1% split to a fee=true (op3/sf/ipfs) wouldn't be reduced 90% (to 0.1%). If there were a fee=true recipient at the channel level, and nothing for that recipient at the item level, they would still get their fee, and be excluded from the remote item split. OTOH, if they were fee=true at the channel level, but also specified at the item level without fee=true, it's an override without a fee (so they lose 90% to the remote item with all the other non-fee entries). Item level splits override channel level splits. So you don't add them together. Instead use the item level value. This allows the podcaster to override the default (channel) split for a specific item/episode. Explained in the last paragraph here. |
As a developer I'm ok with getting rid of the "fee" concept, that would indeed simplify the calculations. |
I would strongly advise against moving to percentages and making it mandatory to ensure the total is 100. It would make errors unmanageable by the apps and lead to a bad user experience. What should an app do if the splits don't add up to 100?
Mistakes happen, podcasters are human, and all this is new. Podcast hosting provider might provide methods to enforce correctness of the total split sum == 100, but many podcasters code their feed by hand. Considering the split values as shares makes the system much more resistent to all this. In the spec we can suggest to choose shares that add up to 100 to make all the reasoning more intuitive, and the hosting providers can do the same, without making it mandatory. |
Having a simple requirement for percentages to add up to 100 in a way makes human mistakes obvious. Easy to detect. When similar mistakes happen with splits there's no way to detect that. Btw, for splits it would be possible to introduce a (redundant) "splitSum" attribute to make similar check possible. Anyway, I'm absolutely ok with splits. The only thing I would like to avoid is mixing both splits and percentages. This makes the calculations messy and, as we can see now, easy to misinterpret. |
Shares and percentages are functionally equivalent if all shares total to 100, which makes 1 share equal to 1%. People who want to use percentages can enter them in as shares so long as all of their shares total to 100. Shares have the added benefit of always operating on the total amount rather than on an assumed total of 100%. There's never a case where a portion of the total amount is undefined. For instance, how would you express a 1/3 split between three people?
|
OK, had a few weeks of me time to emotionally recover from this thread, and I'm ready to rejoin. Met with @MerryOscar this week, and I now believe that the following approach will cover all use cases, while being sufficiently simple: All splits act like shares. They don't have to add up to 100. Calculations on the player sideFor recipients with splits For example, if recipients
Player feesPlayers are responsible for forwarding listeners payments. Thus players can decide themselves what fraction (or flat amount) they charge and how—this behavior doesn't have to be described in the spec, because players will not be recipients in the feed. Example 1Recipients App P charges 1% of the payment as a fee. Listener sends
Example 2Recipients App Q charges 1% of the payment on top. Listener wants to send a
Other uses of feesIf all the recipients live in a feed, the current concept of fees (i.e., take The only legit use case I can think of right now is the Podcast Index, which too may simulate this behavior using simple splits. Podcast Index use caseWhen players fetch value recipients via the Podcast Index, the Index currently inserts itself as a 1% fee recipient. If the players start ignoring the concept of fees, the Index would receive too much or too little of the payment. For example, if the recipients were
Because this is a very niche use case, I'm proposing that if the Index wants to insert itself for 1%, it can do so by transforming the splits so that it is indeed paid 1%, while the ratios in the original splits are preserved. In this specific case, the Index would transform the splits to
This ensures that the Index gets 1% of the payment, while Importantly, this transformation would only have to be done by the Index. The complexity is hidden from the players. They just use the usual share-based calculation. The philosophy is that if someone wants a more complex use case, they handle the complexity themselves. For Podcast Index specifically, I'd be happy to help @daveajones to implement this transformation. The only disadvantage to this is that if the players expose the splits to the listeners (which I don't think they should do, they should use the percentage abstraction), the creator might be surprised to see different splits than what they set in the feed, even if the end result achieved is the same. Why not require to add up to 100?
Some services need at least 1 sat to work?Some services provide things like analytics by receiving a fraction of each payment. Should there be a way to signal to the players that they should receive at least something? For simplicity, I think we should avoid it at this stage, and leave it to the players to decide how to do the rounding. Some players already ensure that each recipient gets at least 1 sat, which I personally believe is very reasonable. |
Great job @joksas! This feels clear and straightforward. |
No mention of Value Time Split. @joksas do you think that fees to services should be diminished during VTS segments? |
Much better. I think Example 2 showing app fees "on top" are what is used today. Any app fees are paid by the user (10 sats), and the podcast always gets what is specified (1000 sats). Agreed that app fees have nothing to do with the RSS allocation. The reason for fee=true inside the RSS, is for calculating value time splits ("90% goes to the musicians"). Setting "fee=true" means that share comes "off the top" before sending (90%) to the VTS. Here's an example where 100% goes to the Musician. The shares add up to 111. Without VTS, fee=true doesn't mean anything, and everyone gets their share/percentage (90.09% + 9.01% + 0.90% = 100 % above) But when VTS is active, the musician gets 100% of the non-fee splits (90.09% + 9.01% = 99.10%). So... Because PI has fee=true, they get their share (1/111 = 0.9%) before "100%" goes to the musician. If PI didn't have fee=true, the musician would get 100% and the other splits would get nothing. Take a look at the example link to test what happens (you can change variables and it will recalculate). |
I very much agree with @Cameron-IPFSPodcasting's use case, but I honestly think that for now, we should prioritize the simplicity of implementation for the players. At the moment, it's chaos and I would rather have something simple than something with more features but inconsistent across the ecosystem. That would mean that yes, for now, I don't think we should have the concept of fees. In the future, when the ecosystem is more mature, and we see more services and use cases, I can see the spec being adjusted for more advanced use cases. Currently, to ensure that services like OP3 receive at least one sat (for listen-time stats), I think we can encourage (but not require) players to send each recipient at least 1 sat (even if the exact amount is less than 1). Fountain already does that. For services that may have minimum required percentages, for now the creators might simply need to give them a larger split to ensure that they get the required percentage even when the VTS is on. |
These clarifications are based on the discussion #434 (comment)
It is clarified that the meaning of
split
differs depending on whetherfee
isfalse
ortrue
.Three examples are provided:
The new version includes some LaTeX for mathematical expressions (e.g.,$\dfrac{50}{50 + 40 + 10}$ ). GitHub (web version) can successfully render these, but https://podcastindex.org/namespace/1.0 may need to be updated with MathJax or KaTeX. If that's a problem, I can remove LaTeX.