Skip to content

[POC] SV weight management fully on-ledger#5567

Draft
jose-velasco-ieu wants to merge 47 commits into
mainfrom
josevelasco/sv-weights
Draft

[POC] SV weight management fully on-ledger#5567
jose-velasco-ieu wants to merge 47 commits into
mainfrom
josevelasco/sv-weights

Conversation

@jose-velasco-ieu

@jose-velasco-ieu jose-velasco-ieu commented May 15, 2026

Copy link
Copy Markdown
Contributor

Summary

This PR adds a Daml draft for the new on-ledger hosted SV weight model. The goal is to represent SV reward weights fully on-ledger, including SV beneficiary distributions. Additionally, a new SV node onboarding flow is implemented.

The actual implementation will consist of two phases:

  • Phase 1: SV weights fully on-ledger, including hosted SV lifecycle management, beneficiary distributions, migration, and V2 reward coupon creation.
  • Phase 2: New SV node onboarding + deprecation of unneeded legacy choices.

Phase 1

TODO

Phase 2

TODO


Pull Request Checklist

Cluster Testing

  • If a cluster test is required, comment /cluster_test on this PR to request it, and ping someone with access to the DA-internal system to approve it.
  • If a hard-migration test is required (from the latest release), comment /hdm_test on this PR to request it, and ping someone with access to the DA-internal system to approve it.
  • If a logical synchronizer upgrade test is required (from canton-3.5), comment /lsu_test on this PR to request it, and ping someone with access to the DA-internal system to approve it.

PR Guidelines

  • Include any change that might be observable by our partners or affect their deployment in the release notes.
  • Specify fixed issues with Fixes #n, and mention issues worked on using #n
  • Include a screenshot for frontend-related PRs - see README or use your favorite screenshot tool

Merge Guidelines

  • Make the git commit message look sensible when squash-merging on GitHub (most likely: just copy your PR description).

Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
Comment thread daml/splice-dso-governance/daml/Splice/DsoRules.daml Outdated
Comment thread daml/splice-dso-governance/daml/Splice/DsoRules.daml Outdated
Comment thread daml/splice-dso-governance/daml/Splice/DsoRules.daml Outdated
Comment thread daml/splice-dso-governance/daml/Splice/DsoRules.daml Outdated
Comment thread daml/splice-dso-governance/daml/Splice/DsoRules.daml Outdated
jose-velasco-ieu and others added 6 commits May 15, 2026 17:02
Co-authored-by: Itai Segall <itai.segall@digitalasset.com>
Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
@jose-velasco-ieu

Copy link
Copy Markdown
Contributor Author

@isegall-da
I've added a Daml test covering the happy path scenario

Comment thread daml/splice-dso-governance-test/daml/Splice/Scripts/TestSvWeights.daml Outdated
Comment thread daml/splice-dso-governance-test/daml/Splice/Scripts/TestSvWeights.daml Outdated
@isegall-da

Copy link
Copy Markdown
Contributor

Thanks @jose-velasco-ieu great work!
I haven't reviewed for corner cases etc., but as a general setup I think this works well now as a PoC, and does exactly what we need.
@moritzkiefer-da can I ask for a review from you as well please?

…hts.daml

Co-authored-by: Itai Segall <itai.segall@digitalasset.com>
Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
Comment thread daml/splice-dso-governance/daml/Splice/DsoRules.daml Outdated
Comment thread daml/splice-dso-governance/daml/Splice/DsoRules.daml Outdated
Comment thread daml/splice-dso-governance/daml/Splice/DsoRules.daml Outdated
Comment thread daml/splice-dso-governance/daml/Splice/DsoRules.daml
Comment thread daml/splice-dso-governance/daml/Splice/DsoRules.daml Outdated
Comment thread daml/splice-dso-governance/daml/Splice/DsoRules.daml Outdated
Comment thread daml/splice-dso-governance/daml/Splice/DsoRules.daml Outdated
Comment thread daml/splice-dso-governance/daml/Splice/DsoRules.daml Outdated
Comment thread daml/splice-dso-governance/daml/Splice/DsoRules.daml
Comment thread daml/splice-dso-governance/daml/Splice/DsoRules.daml Outdated
Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
…vRewardBeneficiaries with empty beneficiaries to the onboard flow of a hosted SV

Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
…ry distribution

Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
Comment thread daml/splice-dso-governance/daml/Splice/DsoRules.daml Outdated
Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
with
newHostedSvParty : Party
newHostedSvName : Text
newHostedSv : Party

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hmm, why did you remove the name? I believe we do want also a human-readable name in addition to the party.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok, I will add it

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

pure DsoRules_UpdateHostedSvWeightResult with newDsoRules
hostedSv <- fetchAndArchive (ForDso with dso) hostedSvCid
newHostedSvCid <- create hostedSv with rewardWeight = newRewardWeight
pure DsoRules_UpdateHostedSvWeightResult with newHostedSvCid

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't we just have a consuming choice in HostedSv controlled by the dso, and call it from here?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok, I will add it

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

Comment thread daml/splice-dso-governance/daml/Splice/DsoRules.daml
Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>

@moritzkiefer-da moritzkiefer-da left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, this looks directionally correct. But I think the vetting assumptions are not gonna work out.

We should aim to keep the property that non-SV node operators do not need to vet dso-governance and instead only need to vet amulet. Right now the way you have set observers this will not work in practice.

I'm also a bit unclear on the trust assumptions. It seems like we may be giving the SV operators a bit too much power here.

-- ^ Voted action to instruct the update of the SV operator for a hosted SV.
| SRARC_AddSvNode DsoRules_AddSvNode
-- ^ Voted action to directly add an SV node.
| SRARC_OffboardSvNode DsoRules_OffboardSvNode

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you added 3 new variants here but did not deprecate SRARC_AddSv, SRARC_offboard_SV and SRARC_ConfirmSvOnboarding. When will we use which of them?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've added some notes like this one:

    -- Note: Deprecate in phase 2
    choice DsoRules_AddSv : DsoRules_AddSvResult

Note that this is just a POC, not a final Daml PR

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note that this is just a POC, not a final Daml PR

That's fine. What I would suggest is to add clear TODOs/FIXME comments for everything you're skipping over at this point.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

deriving (Eq, Show)


-- Note: Implement in phase 1

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe add a TODO or FIXME here. I don't mind these phase comments for this PR but they should be gone in the final implementation.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

-- reward weight percentages. Each beneficiary party must be unique.
where
ensure
unique (map fst beneficiaries)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

any reason not to make this a Map so you don't need the unique assertion?

Asked differently: Is the order significant?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It makes sense

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

&& notElem hostedSv (map fst beneficiaries)

signatory dso
observer hostedSv

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's please add comments in all the places where we add extra observers on why we need them. Generally we should aim to limit them as much as possible to avoid potential vetting issues.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Given your comment

We should aim to keep the property that non-SV node operators do not need to vet dso-governance and instead only need to vet amulet. Right now the way you have set observers this will not work in practice.

I can remove hostedSv as an observer, since it is not necessary: the DSO controls all the flows.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need to keep it as the hostedSv needs to exercise HostedSv_UpdateBeneficiaries

ensure rewardWeight > 0

signatory dso
observer hostedSv

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you make the hostedSv an observer on this, each hostedSv needs to now have vetted the dso packages. Is that a valid assumption? It is definitely not given for how hosted SVs are used through beneficiaries today.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree, I will remove it.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need to keep it as the hostedSv needs to exercise HostedSv_UpdateBeneficiaries

choice HostedSv_UpdateBeneficiaries : HostedSv_UpdateBeneficiariesResult
      with
        newBeneficiaries : Map Party Decimal
      controller hostedSv

Do you think we still need a comment about why we need hostedSv to be an observer?


return DsoRules_OffboardSvResult with ..

-- Note: Implement in phase 2

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

don't really understand the comment if you're already implementing it.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, I will remove all the comments regarding phases.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

svOperator : Party
controller dso
do
require "There is more than one sv node" (Map.size svs > 1)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

related to my comment above on deprecating the other choices, it's not obvious to me how this is different from the other offboard choice

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is just about naming.
@isegall-da requested this

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A whole new choice just for changing the name? @isegall-da that seems pretty questionable to me.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ha? I don't think I requested this.
I only requested that in new choices we are explicit and consistent in naming, and said "unfortunately we cannot fix this in existing choices". Did not mean to suggest that we should reimplement the existing ones for this.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My bad, I misunderstood your suggestion.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

-- ^ The full beneficiary distribution to set.
svOperator : Party
-- ^ The SV node operator hosting the hosted SV whose beneficiary distribution is being managed.
controller svOperator

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so a hosted SV gets unilateral control over the beneficiaries? So if I'm hosting 10 SVs I can just change all their beneficiaries to myself and get their rewards until someone notices? That seems kinda bad. You do have to trust an SV operator for availability so if it's down (malciously or not) you don't mint but giving them the power to just mint everything to themselves seems much worse.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The SV node operator has control over their hosted SV beneficiaries. This was a requirement and trust assumption raised by @isegall-da and @waynecollier-da.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@isegall-da @waynecollier-da can you expand why we want this? It makes sense that each hosted SV can configure their beneficiaries. But the fact that an SV operator can configure the beneficiaries of all SV hosted on them seems super dodgy. The whole point of the on-ledger weights is to have this properly governed and not just fully under the control of the operator. This essentially fully undoes that and the SV operator can again freely chose how it splits the minted rewards for SVs hosted on its node.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AFAICT the requirement was that the hosted SV (not the operator) can change beneficiaries without a vote.
We accepted the trust assumption that "the hosted SV fully trusts the operator anyway, so might as well trust them to set the beneficiaries for them", but I wouldn't call that a requirement.

The problem is that currently we don't plan to have a UI for hosted SVs which is why I thought "just send an email to your operator to do it for you" is acceptable for now.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

More than happy for better ideas how not to require this strong of a trust.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you please confirm this?

HostedSv template will live in splice-amulet, HostedSv_UpdateBeneficiaries is controlled by hostedSv, and HostedSv_UpdateBeneficiaries is exercised directly via the contract.
The rest will be managed via DsoRules.

template HostedSv
  with
    dso : Party
      -- ^ The DSO party.
    hostedSv : Party
      -- ^ The hosted SV party whose reward coupons are created by the SV operator.
    svOperator : Party
      -- ^ The SV node operator party responsible for creating reward coupons for
      -- 'hostedSv'.
    rewardWeight : Int
      -- ^ The hosted SV reward weight. Must be strictly greater than 0.
    hostedSvName : Text
      -- ^ Human-readable name of the hosted SV.
    beneficiaries : [(Party, Decimal)]
      -- ^ Beneficiary parties, excluding 'hostedSv', and their corresponding positive
      -- reward weight percentages. Each beneficiary party must be unique.
  where
    ensure
      rewardWeight > 0
        && unique (map fst beneficiaries)
        && all (> 0.0) (map snd beneficiaries)
        && sum (map snd beneficiaries) <= 1.0
        && notElem hostedSv (map fst beneficiaries)

    signatory dso
    observer hostedSv

    choice HostedSv_UpdateRewardWeight : HostedSv_UpdateRewardWeightResult
      with
        newRewardWeight : Int
      controller dso
      do
        hostedSvCid <- create this with rewardWeight = newRewardWeight
        pure HostedSv_UpdateRewardWeightResult with hostedSvCid

    choice HostedSv_UpdateBeneficiaries : HostedSv_UpdateBeneficiariesResult
      with
        newBeneficiaries : [(Party, Decimal)]
      controller hostedSv
      do
        hostedSvCid <- create this with beneficiaries = newBeneficiaries
        pure HostedSv_UpdateBeneficiariesResult with hostedSvCid

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah I missed the fact that we now also merged the templates. In that case, maybe let's actually keep it in dso-governance. Moving everything seems like a bit of a mess. Let's be clear in the design doc though that this will require changes to the validator app to support configuring it such that it vets dso governance packages.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we now also merged the templates

Sorry, I suggested that yesterday, missed these potential implications.

changes to the validator app to support configuring it

Maybe add a button/checkbox in the same new wallet UI tab that we discussed above that triggers that vetting, something like "enable hosted SV functionality" or some better wording ?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe add a button/checkbox in the same new wallet UI tab that we discussed above that triggers that vetting, something like "enable hosted SV functionality" or some better wording ?

I would just make it a validator config setting. I don't think you want an end user to allow controlling this.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done
I will add a note about that in the design doc.

-- Note: Implement in phase 1
-- Note: Deprecate in phase 2.
--
-- Trust assumption:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why would we trust the SV operator to do that and not make it a vote?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, we might have a temporary vote for the migration.
Please let me know if I should implement that.
cc: @isegall-da

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I honestly don't see a big problem trusting the operators to trigger this once, we can manage this through sv-ops procedures and make it mandatory to comply, this doesn't need to be simultaneous for everyone. But also wouldn't object to a vote if you want to go through the trouble of implementing one.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please let me know how you'd like me to proceed.
@isegall-da @moritzkiefer-da

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The part I somewhat dislike is that we're introducing governed on-ledger state but then the introduction of that state is not done through governance but unilaterally. That just feels a bit fishy to me compared to an explicit step where you vote on it. And given that it's a one-time action the overhead in terms of votes seems irrelevant and maybe even desired as everyone needs to review the state the SV set unilaterally anyway.

So I'd still lean towards the vote. @isegall-da what exactly do you mean by "the trouble of implementing one"? From a Daml perspective this adds very little extra. I guess the UI work does have a bit of overhead?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Or maybe we should modify the existing DsoRules_MigrateHostedSvs choice so that it migrates all hosted SVs.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would be a one-time action for each SV node operator.

sure but that's 13. Not that crazy of a number.

I'd still lean towards a vote but happy to be overruled here.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We'll need to support this vote type everywhere, external explorers will need to parse it, etc.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I also don't feel super strongly against. @jose-velasco-ieu want to be the tie breaker? ;)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In my opinion, as I mentioned in the “trust assumption” section, this just extends the hosted SVs’ trust slightly.
Notice that DsoRules_MigrateHostedSvs checks that the overall weight is not modified.

    -- This is consistent with the current model, where the SV operator already configures
    -- the reward weights and beneficiary distribution in its SV app. Therefore, the SVs
    -- operated by this SV operator already rely on it to use the correct reward
    -- distribution.

Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
…es HostedSv_UpdateBeneficiaries directly)

Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
…(the contract may change when the vote is effective)

Signed-off-by: Jose Velasco <jose.velasco@intellecteu.com>
@waynecollier-da

Copy link
Copy Markdown
Contributor

Let's review and discuss in the Monday governance call. @isegall-da can you put this on the agenda?

@isegall-da

isegall-da commented Jun 13, 2026

Copy link
Copy Markdown
Contributor

Let's review and discuss in the Monday governance call. @isegall-da can you put this on the agenda?

@waynecollier-da Sorry, are you referring to something specific here, or are you proposing a walkthrough of the entire current state?

@waynecollier-da

Copy link
Copy Markdown
Contributor

The question of whether to require all hosted SVs to vet governance changes. My preference would be to avoid doing that, but I don't understand all the tradeoffs just by reading the discussion above.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants