There is a good bit going on in this post and Iāve been scurrying around to get most of it ready. It is all far from ready or settled, but I figured Iād put it out there as working code outperforms just talking about it. All of this should be considered very very alpha and if you decide to use it, you should not rely on it as mission-critical and Iād imagine a good bit of your value may be at risk if you just let it sit there.

TLDR: You can add OVS sharing to your Motoko libraries now and have them send cycles to a wrapped cycle ledger to retrieve later.
ICRC-85 - Open Value Share Implementation Standard - Predraft
This is not even a complete draft, but Iām putting it out there for discussion. Most of what is included is optional. Iāve tried to write the motoko parts as that is what Iām familiar with and Iāve tried to pull the examples in the current implementations of OVS that @lastmjs has in Azel, but I probably got it somewhat wrong. Weāll need to add in the Rust and C++ parts(maybe kybra as well?)
This is specific to the IC and doesnāt comment on implementations elsewhere.
Link: ovs-ledger/icrc85.md at main Ā· icdevsorg/ovs-ledger Ā· GitHub
It defines and suggests the following things:
- Shared Custody: Optional - It proposes a scheme and compatibility for transmitting OVS cycle shares to a ledger that wraps the cycles and holds them for retrieval/withdrawal later. The goal here is cycle cost reduction, call count reduction, centralization of statistic gathering for publicity, and showing that this is a viable way to collect value, and proposes a way to secure cycle jacking via namespaces. Basically, you can tell OVS heuristics that youād like your cycle sent to a ledger along with where youād like it stored(a principal(default account), an account, or in a namespace reserved account that only you have access to(more on this later). If you donāt want to use shared custody then you just point to whatever collection canister you want that implements your collection mechanism. The heuristic code should be smart enough to batch up the payments going to same shared custody canister and send those together. The canister mints the wrapped cycles and holds them there in the developerās account. Note: This functionality could be easily added to the āofficialā cycle ledger but for now there is a temporary ledger deployed at q26le-iqaaa-aaaam-actsa-cai. You can also deploy your own or fork it to do something different(more later)
- Azel implementation instructions that shows how to add the openvaluesharing.json file in your project directory, how to override it with an entry in dfx.json and the available settings.
- Motoko implementation. It suggests that we add something to mops(attn @ZenVoich) to make things like the Burned Weight Halving easy to add and sets some coding standards for how to add OVS configurations to you libraries and how to override them from your projects. It proposes a simple import file pattern and suggests a common environment parameter best practice for overriding and configuring your OVS setup (including default behavior if no heuristic is defined) and how to hand control back to a heuristic from you library if the user provides an override.
- Defines the endpoints that heuristics should send cycles to, either
icrc85_deposit_cycles_notify
(oneshot) or icrc85_deposit_cycles
(trusted) and takes a parameter of vec { record{ text; nat; }}
which allows shares to easily be split according to the the share of total nat values in the batch. The inclusion of text can allow for tracking a namespace of the library so that developers can track what libraries they are getting payments for. If it is left blank it just goes to the canister the share is sent to.
- Optional Queries: Defines optional query functions that may be useful for reporting and for looking up the expected account of an unclaimed namespace.
- Block Schemas: Defines a block schema for withdrawing your cycles from the ledger so that the transaction log contains the full details of where to find the transaction on the actual cycles ledger.
- Other Standards: The shared custody solution can also optionally use the ICRC-75(identity standards), ICRC-86(namespace claim standard), and ICRC-84(Deposit/withdraw standard) - All of these standards are drafts and we are a good way from finalizing or even addressing some of them, but they are referenced to spark discussion.
ICRC-86 - Domain Claim Standard and manual implementation
This is also a very early draft and proposes a standard for manually and eventually automatically claiming domains such that others canāt āname jackā. It provides a workflow for claiming a namespace like com.foo.libraries.coollib with the caveat that you need to own the ICANN name fool.com(or have access to its DNS). There is also a suggestion for a non-centralized naming schema.
Link: ovs-ledger/icrc86.md at main Ā· icdevsorg/ovs-ledger Ā· GitHub
The intention here is to allow developers to start broadcasting cycles to some place they know they can retrieve them without having to jump through a bunch of hoops. I can start sending cycles to a shared custody ICRC-85 ledger with the namespace org.icdevs.libraries.killerlib right away and no one but me can claim them. And I donāt have to go through the claim dance until there is enough value there to bother with.
In the current deployed contract, the ICRC-86 claim will issue you a random key to put in your DNS and then ICDevs can approve you to own that namespace. Once claimed you can add a pointer for where you want funds from that namespace to go(more on that later). Eventually, this can be automated via httpoutcalls to query a couple of different DNS registries.
ICRC-84 implementation
@timo has suggested a nice Deposit and Withdrawl standard at ICRC-84 [WIP]: Deposit and Withdrawal Standard for ICRC-1 tokens Ā· Issue #84 Ā· dfinity/ICRC Ā· GitHub which suggests how to standardize depositing and withdrawing tokens from services like DEXs. It may have been overkill to include it, but it was a good excuse to try to implement it. We only use the withdrawl side of the standard since deposits are all done via sending cycles with a standard mint command. You can also withdraw just by burning and weāll send the cycles to the cycles ledger at the from address, but it is nice to have some code to look at that does what Timo is trying to achieve.
ICRC-75 Implementation
We took this opportunity to do the first implementation of the ICRC-75 standard that we have written for the DAOs project. This standard allows you to manage the mapping of a namespace to a list of Principals, Accounts, Values, or sub-lists. When you pair 75 with 86 you get a powerful way to declare and manage lists of things on the IC and we can plug these lists into things like verifiable credentials, jwts, subnet certificates, and other functions as well. We are simply using the standard to map a claimed namespace to an account so that if your OVS implementation sends cycles to org.icdevs.libraries.icrc75, ICDevs can map that namespace to their desired account. To claim an namespace you need to control the ICRC-86 reservable domain.
Link to draft standard: ICEventsWG/draft_proposals_current/icrc75draft.md at main Ā· icdevs/ICEventsWG Ā· GitHub
Link to motoko implementation: GitHub - icdevsorg/icrc75.mo: ICRC-75 for Motoko
OVS Ledger
As mentioned before, this functionality could/may migrate to the actual cycles ledger. In the meantime weāve taken the opportunity to implement a number of experimental ICRCs to test their robustness and usefulness. Weāve deployed an OVS ledger that you can point your libraries heuristic at to collect cycles. You could of course point to your own cycles wallet that has a deposit endpoint, but by using the OVS ledger weāll get community-wide statistics about the volume of cycles weāre distributing via open-source software.
Codebase: GitHub - icdevsorg/ovs-ledger: Open Value Sharing Ledger
Deployment: q26le-iqaaa-aaaam-actsa-cai - https://dashboard.internetcomputer.org/canister/q26le-iqaaa-aaaam-actsa-cai - It is an ICRC1/2/3/4 ledger with the 85/86/75/84 endpoints to provide a robust cycle claim and tracking infrastructure.
ovs-fixed
This is a Motoko implementation of a fixed heuristic that you can use in your libraries if you want a default OVS sharing pathway. This heuristic will let you easily implement something like āSend me 1XDR of cycles a month unless the users calls my functions X number of times and then send me 2XDR a month. If they override this behavior with a different heuristic, notify that heuristic, and if they turn OVS off, just continueā
Link: Mops ⢠Motoko Package Manager
Implementation: You can find an example implementation of the library in the ICRC-75 implementation at icrc75.mo/src/lib.mo at 9218d753b3ebc5cadde0ef19ac5c0ab77fd7eeee Ā· icdevsorg/icrc75.mo Ā· GitHub
(Yes, this means that the OVS Ledger sends itself cycles for use of the ICRC-75 library)

This is all a super long way from being complete and needs further discussion and modification. Jump in and letās discuss.