Off-Chain Micropayments: Prior Work and Design Framework

Summary

In the recent service incentivization MVP proposal, I feel that I have not given enough attention to prior work. This post aims to close this gap. I discuss previous solutions mentioned here and elsewhere that seemed most relevant, and outline potential next steps for our protocol.

Design Goals

Let us revisit our design goals for the service incentivization MVP based on off-chain payments:

  • Security: Prevent trivial fraud; no catastrophic loss from a single session.
  • Unlinkability: Break the link between payment and service provision.
  • Bearer instruments: Possession of a ticket grants service access rights.
  • Efficiency: Support for batch operations; no per-request on-chain transactions.
  • Simplicity: Minimal protocol and contract surface for rapid iteration.
  • Upgradeability: Clear path to improvements.

Note on terminology: in this post, we look through the lens of a marketplace, where payers (or senders) are users of a service, and payees (or receivers) are (service) providers.

Why Off-Chain

Off-chain payments solve problems that even fast, low-fee blockchains cannot escape. High-performance blockchains (L2s, L3s) often rely on centralized sequencers that can censor or reorder transactions. Low or zero fees usually mean someone else is paying the cost. Physical limits, such as the speed of light, constrain how fast truly decentralized consensus can be reached. For these reasons, off-chain interactions make sense even when blockchains are cheap to use.

Unlinkability in a Single-Provider World

We start from a simple one-to-one interaction in the classical client-server model. Multiple clients may exist, but each client-server relation is independent. We will later generalize to a multi-server scenario.

Unlinkability in a single-server setup can be achieved with blind signatures stemming from 1980s Chaumian e-cash. Indeed, it’s a bit strange to refer to these protocols as off-chain as blockchains didn’t exist back then. In any case: the main design goal of these systems was unlinkability.

Unlinkability means de-linking payment from service provision. The framework works as follows. One central server receives payment and provides service. A client pays for a service upfront and receives blinded tickets. The client then uses unblinded tickets to pay the same server. The server cannot correlate a service request with the funding transaction.

Modern zero-knowledge proofs provide richer anonymized condition checking beyond signature verification. A user can prove in zero knowledge that they are eligible for service via proof of payment, proof of membership, or similar mechanisms. RLN exemplifies this approach.

Moving to a Multi-Provider World

Double-spending becomes a key problem in a multi-provider world. A user can request services from several Service Providers and try to spend the same ticket more than once. Blockchains prevent double-spending by keeping a synchronized global state, but as we’re moving off-chain, we must confront double-spending again.

In ZK systems, double-spending is normally prevented with nullifiers. Spending a coin reveals its unique nullifier, invalidating the coin. The nullifier is marked as spent, stopping repeated use.

Purely off-chain payments face a challenge: each nullifier must be checked against a synchronized nullifier set, which means we still need global state synchronization. In a one-to-one client-server setting, no synchronization was required as only one server existed. On each transaction, the server would check the incoming nullifier against its nullifier set and reject potential double-spends.

In a decentralized setting, a blockchain provides global state synchronization but only at the granularity of its finalization time. Until a transaction is finalized, a payer can attempt double-spending. Consequently, payment receivers (Service Providers) can only process one request per finalization window.

This is problematic for latency and granularity. Both sides of a transaction depend on staying in sync. Senders need the current membership set root to generate proofs (as seen in RLN). Receivers need the nullifier set to verify payments.

Payment Channels

Payment channels allow two parties to transact off-chain. A channel opens with an on-chain deposit. Parties sign updated balances as state. Only final settlement requires an on-chain transaction. Double-spend protection comes from the on-chain dispute mechanism. The advantages are low latency and minimal extra security assumptions compared to L1. The main drawback is poor capital efficiency: in a multi-hop path, funds are locked at every hop.

Funds in payment channels are not bearer instruments. A payment state is specific to one channel and cannot simply be transferred between users. In contrast, blinded tickets can be transferred off-band between users before being spent.

There is also linkability concern if a user maintains a direct channel to a provider. Paying via a network is of course possible, but that requires channel liquidity management on the receiver’s end. Moreover, under some conditions, payment paths can be partially reconstructed by intermediary nodes. There is also no zero-knowledge condition checking built in.

Conclusion: native payment channels are not a good fit for our purposes. However, payment channels could serve as a funding rail in the wider design. This isolates channel complexity to the initial funding phase. For example, a user could pay via Lightning to a sponsoring service, receive blinded tickets, then spend those tickets elsewhere off-chain.

Off-Chain Payments and Double-Spend Tolerance

Off-chain payments must deal with the fundamental trade-off: real-time state sync versus double-spend risk. Without global synchronization, a receiver cannot reliably verify a payment. But waiting for global sync increases latency. When double-spending cannot be fully prevented, receivers have to tolerate some risk and punish cheaters later if needed. Punishment mechanisms include reputation loss or slashing deposits. Different architectures mainly vary in how they handle double-spend risks.

Punishing double-spends also costs time and resources. An off-chain ticket payment can only be considered final when the ticket is redeemed. Redeeming each ticket immediately brings back on-chain costs and delays.

Receivers must balance security and efficiency. Redeeming each ticket ASAP gives best security but worst efficiency. Batch redemption optimizes on-chain costs at greater risk of double-spend. Some providers may choose to tolerate some double-spends for better UX or user growth. Serving users without collateral increases risk but could grow the user base.

Nullifier Set Storage

Nullifier set storage is a core problem in off-chain payments. There must be a shared state to verify spent tickets and prevent double-spends.

Centralized storage is simplest. One server acts as the “Mint,” like in classic Chaumian e-cash. This gives unlinkability but not decentralization. A quorum model spreads trust among multiple servers. This improves resilience but enables censorship if a majority colludes. A permissionless consensus network puts the nullifier set on a separate blockchain. But building a new chain with ZK primitives is non-trivial. Smart contracts on existing blockchains can also store the nullifier set, avoiding a single point of failure. This is the preferred approach for our use case.

Double-Spend Punishment: Reputation vs Financial

Double-spend punishment can be handled by reputation or financial penalty. Each option has trade-offs.

Reputation-based punishment bans a user’s ID after cheating. This is easy to implement but vulnerable to Sybil attacks: cheaters can create new identities. Still, banning on reputation costs little, so it is worth applying even if imperfect. Caveat: large-scale spam could bloat the database of banned IDs (might be addressed via Bloom filters).

Financial punishment means collateral is slashed after proven cheating. A user must deposit extra funds up front. Collateral must be in addition to the value of the tickets to ensure cheaters risk some value on top of nominal cost of service. Slashing deters cheating but ties up capital and adds UX friction. Slashing rewards need careful design.

One possible concern is “self-slashing”. If the whistleblower gets the slashed funds, a cheater could report themselves and recover their deposit. Instead, most slashed funds should go to affected Service Providers. For example: 10% to the reporter to incentivize third-party monitoring, and 45% to each of the two affected Service Providers (assuming cross-provider double-spend). If double-spending targets one provider, that provider receives 90%. Incentives and splits need more research.

Conclusion: we should combine reputation bans and financial slashing. Slashing amounts should be adjusted by each service or provider. Further fine-tuning depends on implementation details.

Nullifier Hijacking and Provider-Bound Nullifiers

Nullifier hijacking is a risk in off-chain redemption. If any Service Provider can redeem a given nullifier, attackers can front-run and steal it. The risk applies regardless of where nullifiers are announced (mempool, bulletin board, etc). It is similar to MEV frontrunning: observers exploit an announced but unconfirmed action.

Other ZK systems use binding to defend against hijacking. Zcash separates nullifiers from spend authorization and uses note commitments for recipient binding. ZKAP applies HMACs to tie tickets to client requests. This stops man-in-the-middle hijacking and repurposing tickets in another context.

In our context, eligibility proofs must be provider-bound to prevent ticket hijacking. Provider-binding potentially means smaller anonymity sets. However, on-chain redemption makes provider linkage public in any case (at least without extra anonymization like stealth addresses).

We suggest binding nullifiers to Service Providers at spend time. An alternative approach could be to maintain a unified nullifier set, but with an extra on-chain commit-reveal scheme at redemption time. Further research needed to address concerns such as smart contract spamming with invalid commitments.

Scalability via Probabilistic Payments and Randomness Sources

Off-chain systems increase throughput by minimizing on-chain interactions. The goal is to reduce interactions between users, service providers, and the nullifier set. Every interaction has latency and cost, even without transaction fees.

Probabilistic payments help by reducing the number of on-chain transactions. An unbiased ticket resolution mechanism is required for deciding if a ticket wins. The coin toss protocol is one approach. It uses an interactive flow where two parties commit to and then XOR random values. If the result meets a predefined adjustable target (a-la proof-of-work), the ticket wins.

Abort attacks, which are typical for naive commit-reveal schemes, are not a concern here. If the ticket wins, the receiver has an incentive to follow the protocol to redeem payment. If the ticket loses, no further action is required anyway. The payment receiver will only hurt themselves by withholding their random value on the last step.

Blockhash randomness is a non-interactive alternative to a coin toss. A ticket commits to a future block height. The randomness comes from the last block hash at that height, combined with the ticket hash. A ticket wins if this combined value is below a tunable target. Another, even simpler alternative, derives randomness just from the ticket hash itself, with no external randomness sources. The drawback here is potential “ticket mining” (re-generating a ticket or aborting the protocol depending on an upcoming result).

Finally, Fractional Message Transfer (FMT) is a cryptographic protocol that can replace above-mentioned ticket resolution methods. FMT encrypts messages so the receiver can decrypt only with probability p. If decryption succeeds, the receiver can redeem the ticket. More on FMT’s privacy properties in the next section.

Probabilistic payments require careful ticket management. If tickets in a payment stream share a nullifier, more than one ticket may win by chance. An honest user must never send another ticket derived from the same nullifier until receiving an ACK from the Service Provider.

Unlinkability of Probabilistic Payments

Probabilistic payments produce two outcomes: null-payments and macro-payments. Macro-payments reveal the nullifier on-chain. This makes macro-payments linkable by anyone. However, in honest use, each nullifier appears on-chain only once. A repeated nullifier on-chain signals a double-spend. Compare to Zcash: every transaction reveals its nullifier; consensus mechanism rejects repeated nullifiers as double-spend.

Null-payments have a separate linkability issue. Null-payments do not leave any on-chain trace, so external observers cannot see them. However, in naive coin-toss protocols, the nullifier is revealed to the receiver for all tickets (both winning and losing). This lets the Service Provider link null-payments and macro-payments.

Fractional Message Transfer (FMT) solves null-payments linkability by hiding losing ticket nullifiers. Only winning tickets have their nullifiers revealed. Coin-toss and blockhash methods do not have this property. AFAIK, FMT is the only solution to provide null-payment unlinkability.

Prior Work

MICROPAY1 and Orchid

MICROPAY1 and Orchid enable probabilistic micropayments using a coin-toss protocol. Slashing is used as a penalty for double-spending, enforced by an extra deposit. MICROPAY1 uses Bitcoin multisig and a trusted escrow. Orchid adapts this to Ethereum. Both schemes generate a ticket using random commitments from both parties. The winner is decided by XOR.

DAM (Decentralized Anonymous Micropayments)

DAM provides probabilistic payments with both slashing and unlinkability of null-payments. It is built on DAP and Fractional Message Transfer (FMT). FMT encrypts a message so that the receiver can decrypt it with probability p. If decryption fails, the receiver gains no information. Keys are set so the sender cannot cheat by skewing the winning odds. Only if decryption succeeds does the ticket become spendable on-chain.

The key difference from MICROPAY1 and Orchid is the use of FMT instead of XOR-based coin-toss. FMT ensures nullifiers for losing tickets remain secret, maintaining unlinkability. Fractional Hiding guarantees the receiver only learns payment details if they win. The protocol requires a sufficient slashable deposit to deter cheating. Only winning (macro-payment) tickets appear on-chain, making them double-spend detectable.

Nym and ZK-Nyms

Nym provides anonymous access to mixnets using credentials. Users deposit NYM tokens, present proof to a quorum, and receive a signed credential. Each usage is unlinkable due to credential re-randomization. Nym’s system relies on the Coconut selective disclosure credential scheme (see also: Offline e-cash paper). It supports distributed threshold issuance, public and private attributes, re-randomization, and multiple unlinkable selective attribute revelations.

Credential signatures can be verified without blockchain state sync, but this introduces some trust in the quorum. Double-spend protection comes from blacklisting user IDs and slashing new deposits for offenders. Attackers can circumvent this by changing identities, but this adds friction. There is a local double-spend filter via off-chain Bloom filters. A staking and reward system exists for Service Providers (out of scope for our purposes now).

HOPR

HOPR uses payment channels with probabilistic tickets for a mixnet incentive layer. Randomness for ticket generation is derived from the specific data packet, binding tickets to their respective packets. This design prevents reusing tickets across nodes. HOPR’s architecture centers on path-based payments and onion routing. Each hop in a path is paid via the channel.

This model does not directly apply to our marketplace use case, where services are not always path-based or involve data transfer. Our target is a universal marketplace, not mixnet-only routing. Adapting HOPR’s channel design would make null-payments linkable within each channel. HOPR’s anonymity relies on the underlying onion-routed network; without it, we would need additional mixing methods.

Summary Table

Property DAM Orchid ZKAP Nym HOPR Our Protocol (MVP) Our Protocol (post-MVP)
Who Issues Tickets Self-issue Self-issue Server Quorum Self-issue Self-issue Self-issue
Who Stores Nullifier Set Smart Contract Smart Contract Server Quorum N/A Smart Contract Smart Contract
Probabilistic Payments FMT Coin-toss - N/A Ticket Hash FMT FMT
Providers Multi Multi Single Multi Multi Single Multi
Double-Spend Punishment Slashing Slashing N/A Reputation + Slashing N/A Reputation Reputation + Slashing

Positioning Our Protocol Architecture within Prior Work

Finally, let us position the proposed protocol in the context of design decisions discussed so far.

Let us consider how probabilistic payments apply to our proposed protocol. There are two main interactions:

  • User to Service Provider: The user spends a ticket to get service.
  • Service Provider to TicketRegistry: The provider redeems a ticket for payment.

First, consider the user-to-provider step. Every request requires a separate interaction by definition. We cannot reduce the number of interactions, but we can make each one cheaper. Proof generation is usually expensive. With probabilistic payments, the user generates a zero-knowledge proof once. They then use this proof to generate multiple randomized eligibility proofs (like batching).

Second, look at the provider-to-contract interaction. Each ticket must eventually be redeemed on-chain. With probabilistic payments, only winning tickets (“macro-payments”) go on-chain. There is no need to report losing tickets or update nullifier sets for them.

Overall, probabilistic payments improve efficiency of both interactions in our architecture. For users, they amortize proof generation cost. For providers, they concentrate on-chain fees onto winning tickets only. This improves the trade-off providers face between redeeming immediately vs accumulating non-redeemed tickets for batch redemption with higher double-spend risk.

The proposed architecture can be as follows. Our protocol largely implements the DAM concept to build a multi-provider marketplace with probabilistic payments. Probabilistic tickets use FMT, not centralized coin-toss. No centralized ticket issuer. A smart contract stores nullifiers. Slashing deposits deters double-spend. Waku or similar acts as an optional bulletin board for nullifier pre-sync. Provider reputation is decentralized and deposit-based, inspired by EigenTrust. Compared to Orchid, we swap XOR lottery for FMT ticket resolution. Users self-generate probabilistic tickets with no centralized issuer.

MVP and Post-MVP Improvements

For MVP, we keep it simple. Only one service provider. No probabilistic payments or FMT needed. Providers can detect double-spends locally. Nullifier sync between parties is unnecessary.

After MVP, several upgrades might be implemented.

Nullifier Pre-Sync

Nullifier pre-sync reduces reliance on blockchain sync. A Waku topic can hold nullifier events before on-chain redemption. This setup offers fast, ephemeral nullifier sharing. Waku supports lightweight, peer-to-peer message exchange. Long-term storage is unnecessary since nullifiers eventually go on-chain.

Provider Reputation

Service Provider reputation prevents abuse by providers. A provider might accept payment and refuse service. We counter this with reputation tracking. Local reputation deters serial cheats, as shown in our incentivization PoC. Long-term, aim for decentralized global reputation, like EigenTrust.

Service Discovery

Discovery in P2P networks is how nodes find and connect to each other without central servers. It lets peers locate relevant service providers in a distributed environment. For a marketplace with many services, it is important to efficiently find nodes that offer a given service. Service discovery will be developed for a fully fledged marketplace, as previously discussed.

Open Questions

Nullifier Binding to Service Providers

Should nullifiers be linked to Service Providers at spending time? Does this impact privacy or security? Does the on-chain redemption by providers make this a non-issue? Is there a way to improve this? Binding tickets to providers can be done with HMAC. Smart contracts likely cannot verify HMAC efficiently. Applicability evaluation is needed.

Efficient Multi-Ticket Batch Redemption

Batch redemption reduces receiver costs. Can we redeem multiple tickets in a cryptographically efficient batch? Is it possible to achieve O(log N) or even O(1) redemption complexity? A single invalid (double-spent) ticket can invalidate the whole batch. Larger batches are efficient but fragile to errors. Can pre-checking a nullifier set help before submitting on-chain? Requires a dedicated protocol design discussion.

Time-Lock Puzzles

Time-lock puzzles or VDFs could be added to tickets at spending time. They introduce time delays to help providers detect double-spending. The downside is user experience slowdown. Investigate if this addition is viable or necessary.

5 Likes

Thanks! This really helps summarise the research that’s been done over the previous number of weeks and sets up a strong rationale for some of the design decisions we’ll have to make.

A couple of immediate thoughts:

We touched on this in the Research call, but afaics the fact that these FMT tickets come from the same source/client will still allow inter-ticket linkability within the same client-provider session? Of course, presumably a client can decide to cycle client IDs and there will be no resultant linkability between the different sessions. This is indeed a desirable property, but I’m trying to make sure I understand what exactly we gain by implementing FMT vs. added complexity.

The other utility I understand FMT (or any other probabilistic scheme) gives us, is simpler (but not necessarily fewer) on-chain interactions compared to batch-buying, batch-redemption schemes.

Am I missing any other utility of FMT (or other probabilistic mechanisms) compared to batched micropayment tickets?

I think another protocol-related aspect here is limiting the utility of double spend up to the point of detection/slashing. In other words, using some technique to prevent unbounded double spend with eventual punishment to be the rational decision over honest behaviour. I think DAM uses some simple form of rate-limiting: we could consider RLN here.

Not necessarily what we want, but using a “whitelist” rather than banned list could address some of these concerns - e.g. Semaphore/RLN where only registered members get access to services. Cycling identities wouldn’t be feasible as a new deposit is required for each new ID, no need to track banned IDs, slashing/financial punishment can be combined with such a scheme easily enough, etc.

Good point. I agree that if the service provider knows which user ID it is talking to, it can link the requests. However, if a user either uses multiple IDs, or uses a mixnet or proxy or whatnot to hide its real identity, then requests will be unlinkable. Ensuring cryptographic nullifier unlinkability, AFAIU, is a necessary but insufficient condition for practical request unlinkability.

I think FMT provides also a different (lower?) risk for the provider. Consider this scenario: 1 request per second, each request is worth 1 coin. The provider redeems every 5 seconds. Compare two ways to implement this: with small-value batched payments, and with FMT (or another probabilistic payment mechanism). Incoming ticket values are as follows:

Time 1 2 3 4 5
Batched 1 1 1 1 1
FMT 0 0 0 0 5

Accumulated, non-redeemed value that a provider holds is as follows:

Time 1 2 3 4 5 (before redemption) 5+eps (after redemption)
Batched 1 2 3 4 5 0
FMT 0 0 0 0 5 0

The provider’s risk is proportional to the double-spend risk and to the accumulated, non-redeemed value the provider holds. In case of batched payments, even with efficient batching, the provider, e.g., at time 4, holds nominal non-redeemed value of 4 coins that might be double-spent. With FMT, the accumulated value is zero before a macro-payment comes along, which (nominally) nullifies the risk before time 5 when a macro-payment comes in.

To be fair, the risk is not eliminated, but rather shifted. A cheater can still use the same nullifier to generate FMT-based tickets with different providers and receive services not fully covered by the initial deposit. But then the size of the slashable “security deposit” should be sufficiently high to offset it. In other words: with any system with double-spend tolerance we need to “do justice” from time to time (i.e. detect double-spends and slash or otherwise punish the cheater). Probabilistic payments “concentrate” doing justice around macro-payments only. This simplifies null-payments handling at the cost of higher slashing variance (slashing becomes more rare but more severe).

I think of probabilistic payments as “first-level batching” in terms of redemption cost. We are free to combine it with the “second-level batching” for winning tickets. The best of both worlds.

I agree rate limiting might be necessary, although: are we going to expect RLN memberships from users? This is not yet clear for me: how we combine this with the idea of easing the burden of RLN membership management for users via sponsors etc.

Do you envision whitelisting as provider-specific or global for the whole system?

For the DAM scheme, smart contract store the nullifier set, double spend are slashed and its a multi provider scheme. AFAIU

We can also later impl. the same ticket recycling as the DAM scheme so that provider cannot withhold tickets.

That’s an interesting angle I’ve not thought off yet. :thinking:

Corrected. Thanks for catching this!

1 Like

This is a strong write-up and correctly frames the core tensions/tradeoffs. This part is quite similar to what I was trying to write as well but glad to see it detailed nicely. Some comments / questions on specific parts below before I give my thoughts about the proposed protocol.

This and Composability (what existing implementations and protocols can we try to use/re-use; and also benefit from the research and developments that happen with them in future) are something that I have been focusing heavily recently as my belief is that our goal for service incentivization is rather simplistic - “pay one provider per service request privately with permissionless/censorship-resistant properties”.

Small terminology fix: Correct me if I am wrong, in ZK note systems the nullifier is just a one-time spent marker, not the value-bearing object. What we want to bind is the spend authority / note to the provider (e.g., include providerAddress in the committed data and constrain it in the spend proof), so only the intended provider can redeem. On-chain, this is a standard hash check; no HMAC needed. This keeps anti-hijacking while staying EVM-friendly. This applies where we talk about nullifier redemption and I think note redemption might be more appropriate to use.

It is true that the sequencer/DA drawbacks in modern stacks are real trade-offs, but they’re steadily being mitigated (permissionless fault proofs, shared sequencers, sovereign rollups, Alt-DA) along with other developments in further scalability like preconfirmations etc, and these ecosystems already secure billions in TVL today so are already too big to fail even without the mitigations. Even that theoretical risk is specifically very low for our use-case as we would only deal with payments of smaller value.

This is true for pure Lightning style or 1:1 payment channels without an additional actor, but the presence of an actor like payment nodes would allow being able to pay any provider (as channel is maintained only with payment nodes), and double spend protection with slashing and disputes. Just worth a note for our analysis of payment channels.

Trying to clarify whether ‘on-chain’ or ‘smart contract’ - In this proposal, will we use an EVM-based L1/L2 or a privacy L1 like Zcash or our own privacy chain ? If an EVM like Ethereum or Arbitrum, would the user deposits for funding & slashing collateral; and the provider redemption has privacy/identity leakage?

Overall Thoughts about DAM + other pieces in this approach:
I think this is theoretically a strong approach that is suitable for most of our goals and offers stronger privacy guarantees (if user deposits and provider redemptions are private as well). But my biggest concern with this approach is the complexity and whether this will be an over-engineering for our simplistic problem of incentivizing providers and which is rather a relatively smaller part of Waku as a whole. I think there are a lot of moving parts that this needs, eventually if not at MVP-stage: FMT, nullifier & note management, collateral & slashing, reputation, privacy ledger, pre-sync. This also brings us some drawbacks that we discussed earlier in the post such as capital efficiency (for slashing collateral). I wonder if we are using techniques like reputation & slashing, what additional benefits we are getting with DAM over other approaches.

I might be heavily biased in this but I think privacy-oriented chains like Aztec with time/bandwidth-metered streams, or app-chains/L3s with privacy, reputation, pre-confirmations (so we tackle latency of finalization and not let that delay the service provided) layered on top of it might be more suitable for us and simplistic for an initial deployment. We will also benefit from all the future developments that happen in the ecosystem in privacy and scalability as these are areas where heavy research is going on.

I also did not find any implementations - academic or real world of DAM (and FMT). I tried looking at the citations and they seem to be mostly academic. Implementing FMT from scratch seems to be non-trivial crypto: CCA-secure PKE/KEM + careful randomness handling, constant-time implementations, that needs much time and efforts to design, research and do third party audits (since these deal with users funds and we are not re-using any existing audited implementations). I think all the future developments on this would also have to handled by us. The scope to me seems as much as what an entire project could be based on and I am curious to know if it is right for service incentivization in Waku. There might also be attacks we do not foresee like the one for DAM which was highlighted in this paper. I believe this has good potential for us and others with our similar goals and maybe this is what we want too, but just trying to clarify our expectations of time & resources for service incentivization from @haelius @fryorcraken

2 Likes

I would also like for @haelius and @fryorcraken to reassess our goal. Keeping in mind the Logos re-org and the sunk cost fallacy. Aborting should always be an option. If we choose to continue it will be a multi-years endeavor for multiple CCs.

edit:

With a private L2 we can already pay privately. The only gain would be efficiency and “offchainness”. Is it worth it?