Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .ci-config/rippled.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,8 @@ TokenEscrow
SingleAssetVault
LendingProtocol
PermissionDelegationV1_1
# Confidential Transfer for MPT (XLS-0096)
ConfidentialTransfer

# This section can be used to simulate various FeeSettings scenarios for rippled node in standalone mode
[voting]
Expand Down
18 changes: 14 additions & 4 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,20 @@ Please check relevant options, delete irrelevant ones.
- [ ] Documentation Updates
- [ ] Release

### Did you update HISTORY.md?

- [ ] Yes
- [ ] No, this change does not impact library users
### Change Checklist

Review all items below and check those impacted by this change.
If an item is not impacted, briefly explain why.

- [ ] Transaction models
- [ ] Ledger entry models
- [ ] Request/RPC method models
- [ ] Binary codec (`definitions.json`, types, etc.)
- [ ] Utility functions
- [ ] Unit tests
- [ ] Integration tests
- [ ] Amendment(s) enabled in CI config (`.ci-config/rippled.cfg`)
- [ ] HISTORY.md if changes impact library users

## Test Plan

Expand Down
185 changes: 185 additions & 0 deletions packages/ripple-binary-codec/src/enums/definitions.json
Original file line number Diff line number Diff line change
Expand Up @@ -850,6 +850,16 @@
"type": "UInt32"
}
],
[
"ConfidentialBalanceVersion",
{
"isSerialized": true,
"isSigningField": true,
"isVLEncoded": false,
"nth": 69,
"type": "UInt32"
}
],
[
"IndexNext",
{
Expand Down Expand Up @@ -1140,6 +1150,16 @@
"type": "UInt64"
}
],
[
"ConfidentialOutstandingAmount",
{
"isSerialized": true,
"isSigningField": true,
"isVLEncoded": false,
"nth": 32,
"type": "UInt64"
}
],
[
"EmailHash",
{
Expand Down Expand Up @@ -2100,6 +2120,166 @@
"type": "Blob"
}
],
[
"ConfidentialBalanceInbox",
{
"isSerialized": true,
"isSigningField": true,
"isVLEncoded": true,
"nth": 32,
"type": "Blob"
}
],
[
"ConfidentialBalanceSpending",
{
"isSerialized": true,
"isSigningField": true,
"isVLEncoded": true,
"nth": 33,
"type": "Blob"
}
],
[
"IssuerEncryptedBalance",
{
"isSerialized": true,
"isSigningField": true,
"isVLEncoded": true,
"nth": 34,
"type": "Blob"
}
],
[
"IssuerElGamalPublicKey",
{
"isSerialized": true,
"isSigningField": true,
"isVLEncoded": true,
"nth": 35,
"type": "Blob"
}
],
[
"HolderElGamalPublicKey",
{
"isSerialized": true,
"isSigningField": true,
"isVLEncoded": true,
"nth": 36,
"type": "Blob"
}
],
[
"ZKProof",
{
"isSerialized": true,
"isSigningField": true,
"isVLEncoded": true,
"nth": 37,
"type": "Blob"
}
],
[
"HolderEncryptedAmount",
{
"isSerialized": true,
"isSigningField": true,
"isVLEncoded": true,
"nth": 38,
"type": "Blob"
}
],
[
"IssuerEncryptedAmount",
{
"isSerialized": true,
"isSigningField": true,
"isVLEncoded": true,
"nth": 39,
"type": "Blob"
}
],
[
"SenderEncryptedAmount",
{
"isSerialized": true,
"isSigningField": true,
"isVLEncoded": true,
"nth": 40,
"type": "Blob"
}
],
[
"DestinationEncryptedAmount",
{
"isSerialized": true,
"isSigningField": true,
"isVLEncoded": true,
"nth": 41,
"type": "Blob"
}
],
[
"AuditorEncryptedBalance",
{
"isSerialized": true,
"isSigningField": true,
"isVLEncoded": true,
"nth": 42,
"type": "Blob"
}
],
[
"AuditorEncryptedAmount",
{
"isSerialized": true,
"isSigningField": true,
"isVLEncoded": true,
"nth": 43,
"type": "Blob"
}
],
[
"AuditorElGamalPublicKey",
{
"isSerialized": true,
"isSigningField": true,
"isVLEncoded": true,
"nth": 44,
"type": "Blob"
}
],
[
"BlindingFactor",
{
"isSerialized": true,
"isSigningField": true,
"isVLEncoded": true,
"nth": 45,
"type": "Blob"
}
],
[
"AmountCommitment",
{
"isSerialized": true,
"isSigningField": true,
"isVLEncoded": true,
"nth": 46,
"type": "Blob"
}
],
[
"BalanceCommitment",
{
"isSerialized": true,
"isSigningField": true,
"isVLEncoded": true,
"nth": 47,
"type": "Blob"
}
],
[
"Account",
{
Expand Down Expand Up @@ -3675,6 +3855,11 @@
"CheckCash": 17,
"CheckCreate": 16,
"Clawback": 30,
"ConfidentialMPTClawback": 89,
"ConfidentialMPTConvert": 85,
"ConfidentialMPTConvertBack": 87,
"ConfidentialMPTMergeInbox": 86,
"ConfidentialMPTSend": 88,
"CredentialAccept": 59,
"CredentialCreate": 58,
"CredentialDelete": 60,
Expand Down
11 changes: 11 additions & 0 deletions packages/xrpl/HISTORY.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,17 @@ Subscribe to [the **xrpl-announce** mailing list](https://groups.google.com/g/xr

## Unreleased

### Added
* Support for `Confidential Transfer for MPT` (XLS-0096):
- New transaction types: `ConfidentialMPTConvert`, `ConfidentialMPTMergeInbox`, `ConfidentialMPTConvertBack`, `ConfidentialMPTSend`, `ConfidentialMPTClawback`
- New fields added to `MPToken` ledger entry: `HolderElGamalPublicKey`, `IssuerEncryptedBalance`, `AuditorEncryptedBalance`, `ConfidentialBalanceInbox`, `ConfidentialBalanceSpending`, `ConfidentialBalanceVersion`
- New fields added to `MPTokenIssuance` ledger entry: `IssuerElGamalPublicKey`, `AuditorElGamalPublicKey`, `ConfidentialOutstandingAmount`, `DomainID`, `MutableFlags`
- New flag `tfMPTCanPrivacy` added to `MPTokenIssuanceCreate`
- New fields added to `MPTokenIssuanceCreate`: `DomainID`, `MutableFlags`
- New fields added to `MPTokenIssuanceSet`: `DomainID`, `MPTokenMetadata`, `TransferFee`, `MutableFlags`, `IssuerElGamalPublicKey`, `AuditorElGamalPublicKey`
- New ledger entry flags: `MPTokenFlags`, `MPTokenIssuanceFlags`
- Binary codec support for confidential transfer fields

## 4.6.0 (2026-02-12)

### Added
Expand Down
46 changes: 46 additions & 0 deletions packages/xrpl/src/models/ledger/MPToken.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,57 @@ import { MPTAmount } from '../common'

import { BaseLedgerEntry, HasPreviousTxnID } from './BaseLedgerEntry'

/**
* Flags for the MPToken ledger entry.
*/
export enum MPTokenFlags {
/**
* If set, indicates that the MPToken holder has authorized this token.
*/
lsfMPTAuthorized = 0x00000002,
}

export interface MPToken extends BaseLedgerEntry, HasPreviousTxnID {
LedgerEntryType: 'MPToken'
MPTokenIssuanceID: string
MPTAmount?: MPTAmount
Flags: number
OwnerNode?: string
LockedAmount?: string

/**
* The holder's ElGamal public key for confidential transfers.
* Required for participating in confidential transfers.
*/
HolderElGamalPublicKey?: string

/**
* Encrypted balance value for issuer tracking purposes.
* This allows the issuer to track confidential balances.
*/
IssuerEncryptedBalance?: string

/**
* Encrypted balance value for auditor tracking purposes (if configured).
* This allows an auditor to track confidential balances.
*/
AuditorEncryptedBalance?: string

/**
* The confidential balance inbox for pending incoming transfers.
* Contains encrypted amounts that have not yet been merged.
*/
ConfidentialBalanceInbox?: string

/**
* The confidential balance available for spending.
* Contains the merged encrypted balance.
*/
ConfidentialBalanceSpending?: string

/**
* Version counter for the confidential balance.
* Incremented with each update to prevent replay attacks.
*/
ConfidentialBalanceVersion?: number
}
Loading
Loading