-
Notifications
You must be signed in to change notification settings - Fork 1.4k
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
An AML-Compliant Freezable Runes Standard #4209
Conversation
…er versions of ord
I must admit I am somewhat impressed. |
As long as freezability is optional and the default state remains non-freezable, this aligns with Bitcoin’s ethos. Issuers who need compliance can opt in, while others remain unaffected. Seems like a balanced approach. |
First let me say that just in terms of quality, this PR is awesome. We very I have a few qualms which I think prevent merging this PR. Some of them are
Some are less technical:
I think this can't be merged at the moment, so I'm going to close it. Although I think it would be a good idea to open an issue, where this can be discussed In particular, I'm curious if there are any projects which would use this. If |
Thanks, @casey! I really appreciate the detailed feedback and the kind words about the PR. You’ve raised some solid points. I created issue #4213 to continue the discussion and explore potential improvements that could address a few of the technical concerns you raised, like the risk of accidental burning. I’ll also keep this branch updated with master in case the community sees value in merging it—or something like it—in the future. Thanks again for the thoughtful review and encouragement! |
This PR attempts to implement a simple freezable runes standard that would be compliant with anti-money laundering (AML) regulations. The ability to freeze and unfreeze balances is the one missing feature that entities subject to AML need in order to issue securities on Bitcoin using the runes token standard.
The case for securities on Bitcoin
More and more public companies are adopting a Bitcoin Treasury strategy. These companies want to raise capital in bitcoin, but their shares can't trade directly against bitcoin in a permissionless way. If, however, their shares could settle on Bitcoin, they could easily raise bitcoin by issuing new shares, and bitcoin holders could easily invest and divest, without moving through fiat rails or doing KYC. These entities, though, are subject to AML and KYC regulations, meaning they must know who they are issuing securities to, and they must have the ability to freeze balances, if subject to a court order. This applies to stablecoin issuers as well.
I acknowledge that the idea of freezable runes runs counter to the core Bitcoin ethos. If someone doesn’t like the idea of owning assets that can be frozen, they shouldn’t own stock in any public company, but that shouldn’t preclude others from doing so. Companies are already subject to the jurisdiction of their host country, and to invest in their stock is to accept that jurisdiction.
If done properly, a feature that enables freezable runes would pose no risk to existing rune holders, as long as all users know which runes can be frozen, old versions of
ord
recognize freezable rune etchings as cenotaphs, and anyone can clearly see onchain whether a freezable rune is frozen or not.If that’s all it takes for AML-compliant assets to be issued on Bitcoin, I think an official freezable runes standard is worth exploring. The runes standard is already the most transparent and easy to use token standard on Bitcoin, and I think it should be the standard of choice for AML-compliant assets as well.
Proposed Specification
Described below is an overview of how the implemented freezable runes standard works, but it is not a formal specification:
Etchings may contain a “Freezer” tag, which identifies the name of the rune that can freeze and unfreeze balances.
The “Freezer” tag is an even tag, so older versions of
ord
would register the etching as a cenotaph.Runes are frozen and unfrozen by a freeze edict:
An edict freezing runes is integer encoded following
Freeze
tags.An edict unfreezing runes is integer encoded following
Unfreeze
tags.Outpoint IDs are encoded as the block height, the transaction index, and the output of the outpoint to be frozen (or unfrozen).
The
rune_id
is encoded asNone
if the first integer following theFreeze
orUnfreeze
tag is zero. Otherwise, the first two integers encode the Rune ID.Freeze and unfreeze edicts are processed after input runes are unallocated, but before transfer edicts are processed.
A freeze (or unfreeze) edict may only freeze (or unfreeze)
rune_id
if the freezer rune, specified whenrune_id
was etched, is unallocated.If
rune_id
isNone
, a freeze (or unfreeze) edict may freeze (or unfreeze) all runes that are freezable by unallocated runes.A freeze (or unfreeze) edict freezes (or unfreezes) balances at all
outpoints
authorized to be frozen (or unfrozen).A frozen balance is burned if the outpoint is spent while the balance is frozen. This prevents users from trading frozen balances, which would violate AML regulations.
Request for Feedback
I’d appreciate honest feedback on this proposal. Here are a few points I'm especially curious about:
I’d be interested to know if the maintainers are open to exploring this type of proposal. The goal is to enable AML-compliant assets without affecting those who prefer non-freezable runes.
Thanks for taking the time to review this - I’m looking forward to your honest feedback!