mirror of
https://github.com/XRPLF/xrpl-dev-portal.git
synced 2026-10-02 01:47:59 +00:00
Confidential Transfers (JavaScript)
Example code for confidential transfers of Multi-Purpose Tokens (MPTs) on devnet with xrpl.js.
Setup
npm install
Issue an MPT for confidential transfers
node issueConfidentialMPT.js
You should see output like the following:
=== Funding accounts... ===
Issuer address: rUYo6E7vfDVMZcP25CgLD9BaHHXcgsJKzh
Issuer second account address: rGxCNUnGgFvcuWzvLKjbDgc6fUPnMMnTA6
Auditor address: rnZT6WdaKatT18w7F21W4Fx5t6NKKCQhay
=== Generating confidential encryption keypairs... ===
Issuer public encryption key: 020405801A02CF8D46A8DB7FDD9D05E0F3DE200789A6ADA8BB9B564FDD61202E8C
Second account public encryption key: 02357376805F8171E87E047AA9242D12A2A58FE648253AF00172D9E4EE7D157693
Auditor public encryption key: 0226148C99F980861288058AD9667B60C7FAC48A3C80A8F29C5C34EE17D3F39184
=== Creating the MPT issuance ===
MPT issuance ID: 0040F3E77EAD41B00137389821AC6FAF636B0A66C3465FC6
https://devnet.xrpl.org/transactions/469F39961FB541971BC8E9D470F98EC5899EFA3240987F689E05A91CBCDEC7A2
=== Registering the encryption keys... ===
Issuer and auditor encryption keys registered.
https://devnet.xrpl.org/transactions/7C605011B6D97B0A54D56251C14124881E316F012202BC62B0CAED5480CBCC10
=== Authorizing the issuer second account... ===
rGxCNUnGgFvcuWzvLKjbDgc6fUPnMMnTA6 is authorized to hold the MPT.
https://devnet.xrpl.org/transactions/8E104B831C11BCAD07CE82672754DB153249937C0B2B63A8A5A41F831B2CB32C
=== Sending public tokens to the second account... ===
Issuer sent 12000 CTST to rGxCNUnGgFvcuWzvLKjbDgc6fUPnMMnTA6.
https://devnet.xrpl.org/transactions/ACA4B99F2AD9406A7A35F730673CCBBE8BA8783DBBF4F15247C207FD53A645FA
=== Converting public balance to confidential... ===
{
"TransactionType": "ConfidentialMPTConvert",
"Account": "rGxCNUnGgFvcuWzvLKjbDgc6fUPnMMnTA6",
"Sequence": 4256744,
"MPTokenIssuanceID": "0040F3E77EAD41B00137389821AC6FAF636B0A66C3465FC6",
"MPTAmount": "12000",
"HolderEncryptedAmount": "027726DF1DD6A854C8D8FB1C80FAAC9DC49F2F5D0A00379A221645601BB80778EE02E2BE701EF1808646099DB316023B17B7747B3E763F6F794820393B48B797A3C3",
"IssuerEncryptedAmount": "027726DF1DD6A854C8D8FB1C80FAAC9DC49F2F5D0A00379A221645601BB80778EE02419691522D14CB2CA21532234031ECA42F72AD8843C1E91900BCFC9E77F16471",
"BlindingFactor": "D1E2CB6418F77B6F6DE0EDA311A1094A235395EF0970BE3683029349C5EA0817",
"AuditorEncryptedAmount": "027726DF1DD6A854C8D8FB1C80FAAC9DC49F2F5D0A00379A221645601BB80778EE03AD39FB9766388B0B7C7B0D60A44DF29E1706F24FD46AD3F422A27EB3C01178E6",
"HolderEncryptionKey": "02357376805F8171E87E047AA9242D12A2A58FE648253AF00172D9E4EE7D157693",
"ZKProof": "46CD95D5ED13C430CC60014AA57C0047FAA57B8F01339625F8B675FCA61D87992A065E4C2A5961357203E4BCCADBD8A2C06BDF9F38E9DFDF15D9E60A063DDDC3"
}
Converted 12000 CTST into a confidential balance.
https://devnet.xrpl.org/transactions/2C502D168085A9D88C6B90D033D89B3B624AC52D4672C53637CB1A2115F7F994
=== Merging inbox into spending balance... ===
{
"TransactionType": "ConfidentialMPTMergeInbox",
"Account": "rGxCNUnGgFvcuWzvLKjbDgc6fUPnMMnTA6",
"Sequence": 4256745,
"MPTokenIssuanceID": "0040F3E77EAD41B00137389821AC6FAF636B0A66C3465FC6"
}
Inbox merged into the spending balance.
https://devnet.xrpl.org/transactions/8323FAA63FBDD2718ED17DBA40EEB1B9A623BEDE14657C475653A43AFFC37876
=== Decrypting the confidential balance... ===
MPToken entry:
{
"Account": "rGxCNUnGgFvcuWzvLKjbDgc6fUPnMMnTA6",
"AuditorEncryptedBalance": "027726DF1DD6A854C8D8FB1C80FAAC9DC49F2F5D0A00379A221645601BB80778EE03AD39FB9766388B0B7C7B0D60A44DF29E1706F24FD46AD3F422A27EB3C01178E6",
"ConfidentialBalanceInbox": "03DB3D5634E4930E9327C81B4CC0BEC11E32624E2D459460A15F765E9DBBBBE0670304CB4378D3874A8C4572909C12ED4E8085739DFD3A0E8F84616460137C11D0DE",
"ConfidentialBalanceSpending": "020D732F0CEC349909D6BC06558B0B26118174F68372144DAF75C7743797BE64B602B651EE6E495B6A0FDC4DBEEDA0F73DEEC8B99AED0583C52A0A4E3F480C56E8CF",
"ConfidentialBalanceVersion": 1,
"Flags": 0,
"HolderEncryptionKey": "02357376805F8171E87E047AA9242D12A2A58FE648253AF00172D9E4EE7D157693",
"IssuerEncryptedBalance": "027726DF1DD6A854C8D8FB1C80FAAC9DC49F2F5D0A00379A221645601BB80778EE02419691522D14CB2CA21532234031ECA42F72AD8843C1E91900BCFC9E77F16471",
"LedgerEntryType": "MPToken",
"MPTokenIssuanceID": "0040F3E77EAD41B00137389821AC6FAF636B0A66C3465FC6",
"OwnerNode": "0",
"PreviousTxnID": "8323FAA63FBDD2718ED17DBA40EEB1B9A623BEDE14657C475653A43AFFC37876",
"PreviousTxnLgrSeq": 4256754,
"index": "09255ACD7B6DDB9226C4E0C5268552269EE11A316E081DBBA576D550F285945D"
}
Second account reads its balance as: 12000 CTST
Auditor reads the balance as: 12000 CTST
=== Saving accounts and keys to keys.json... ===
Saved keys to file.
Send confidential payments
node sendConfidentialPayments.js
You should see output like the following:
=== Getting accounts... ===
Orchestrator address: rptL6LRWWCSPwRiAVEgxiRUD7bYCmFpEvg
Seller address: r5bPyzNBHjsW1VACE5aXwXvsNx3cgZFw3
Buyer address: rfpYa7E9Xn1o1RahrfPvgQ3N2YfADo1tnf
Auditor address: rBK3NWjKATud4kohpToUYvJDbHG5xPX1fs
=== Merging inbox balance for seller and buyer... ===
r5bPyzNBHjsW1VACE5aXwXvsNx3cgZFw3 holds spendable confidential CTST.
https://devnet.xrpl.org/transactions/D62ACCDB60604D243E97C878A4F4C7CE6BD3FCC3F1C227A38F0B31EB34788CBD
rfpYa7E9Xn1o1RahrfPvgQ3N2YfADo1tnf holds spendable confidential CTUSD.
https://devnet.xrpl.org/transactions/530714162D1B3039980551B9B32287AD4C4E3B912229C09A14E3B1BB6EF71FA4
=== Prepared confidential payments ===
Payment1 (Fund): {
"TransactionType": "ConfidentialMPTSend",
"Account": "r5bPyzNBHjsW1VACE5aXwXvsNx3cgZFw3",
"Sequence": 4254446,
"MPTokenIssuanceID": "0040EAE28C1364B21CDBFEB171F994BE86575AC9583A3A52",
"Destination": "rfpYa7E9Xn1o1RahrfPvgQ3N2YfADo1tnf",
"SenderEncryptedAmount": "039257FA27E48028EAB763A550B779384A71333652C2842D7B8DA72831E583211B02CB3580644AA2A9BB7374C97E03DE2E2DBEA21B75BE53FFB2C3D4BC0563127B41",
"DestinationEncryptedAmount": "039257FA27E48028EAB763A550B779384A71333652C2842D7B8DA72831E583211B025E9BF4E697D111A90FD29E1D68E0E54F7B41A3E300151A54F579F8418E473AAF",
"IssuerEncryptedAmount": "039257FA27E48028EAB763A550B779384A71333652C2842D7B8DA72831E583211B0242012451E9C510C9907463CD83FA3B31DB2A8D207FCACFADF2AB0C53362D140D",
"AmountCommitment": "0337597DB57E7BDDD22080CDF57DEC4325758F32893B179D1BE054567C9C29D17D",
"BalanceCommitment": "0289D086847B1B64C005616025D64B2DEACB4140345E6529C2F5F72AEF36DE100D",
"ZKProof": "5D0A8D520702118BE0CFE1C2B993D7F7F9F7341599A69AE3B0D6B25A0AA0DBF98C49A5E8B875AEC0EBB0B192DA7199BE21C936D64EF6202BD40C4E984181A14BB454312E04BE43D810F7DFB65BE05FE6D7BC8161F47FB812E43B1D6F4320749497573F92CAD4B396E352ABA14FD8F84B2FE8CC28FE2C0197A96AC62EE19205A3AF3218851F0C0A72A2A64DEFA89937C9F437546D9723FB4B5B9F404EC68AD302ACEB03A35210E4B97D19232BE40E3055D905365992B73185C1B12AEBA8DD47810377A4F2DC1CBF7DCD65A224D45AD47D5BCBA745962B00124C83DA8377D939B36003BE6464AE3E06C28E2C4D492629949F7D588FBB83CF9FEBF7FFF9B73E1E55EAC60288CA28D121230CE8F1DDC10631F3456FF0CA28CAC1E155A4610C97CB864F2A630254937E43E9814BE5FD73926F001490EE993E392F8285472EEDE96DD091EF6B86031826DE83F90E24F722A1F797963BA914C508CD8607DDCE330EA230CA186F4D1603FFC618DFB4B442F06D6448042FB9820DA1051537FEE053CF8D0B47698944AE3903A7999CF9D38DE5E44EADEC74BCA0EC1CEFA3EAFD517F61BC3048AB73BC1F96E902F786A7AFCBB2B914621AA0D50513ED29E19C19C098EEC505F6BE0F29EC6B98BB02A25B712444161B21864539894D151C15566E4EA0D35C41B1DA0E74C6816F953903F1023261DAFC02A540DF780231C2090527B428CFE7956AF2988FE4A6E749C82B0296E697A11747A9555A6DF7FFE3183F66AD414489D80D410F4CB307C254FDD937036054D49DFB29D95DACBDA85166769076B6E3D241EEA6FA5B5E3A64734AFEAB6902F4A63A8E2854E7FCA66AAF02E2BBA23E06AA1DBFD17A4D2096D06B5C05AF699C034F7DAF0EFE6395595D5C8480626C9DFAE0C6FF21C0DFA8830A73DA6A315F4E4A0379DB91CEC6E78B44B25AEB7701B7D4C995B6A4F6878F07B67374B2E421089C9E038119F76C40A8B152CCEE7209FAE5092CB9BAF8D6B191EF3E5B565C245DE5789302E9017F98C750AFA5CB73414D88B6330570756C3CF1CC880298C93D1EF78CA8B80309438CE625286E7CDD8F1DDDC9D3DF4ED50DB71B59E7CDF3A7B7CDE411E79387F5452057AEFD11BBCD09AD44A4F9A102BB650D0BE11C685C3BC584817AC7C8F8DB0AF1B5C6864F0222822EC19CF9D72179C9C144B29C0C3C13C45B112E46364256DCADB0A3C8A1E7D646EDCDD28F435C7180B38B2A7513ECB066348B818AB31946AD0E23684EFAD805CA2DA18AB037741E71F78157BDFBB4EB8F3FCE1C25F776D27AFA4C67DA2F79078F4AC83DBE2AA73236F3582CAF57D46CBA739E861DE616",
"AuditorEncryptedAmount": "039257FA27E48028EAB763A550B779384A71333652C2842D7B8DA72831E583211B02CD63DEAB2CF8F88545E062B12CA5DC0BBA729204EDEFA2CA7A52DAE4EDE904B7"
}
Payment2 (Cash): {
"TransactionType": "ConfidentialMPTSend",
"Account": "rfpYa7E9Xn1o1RahrfPvgQ3N2YfADo1tnf",
"Sequence": 4254446,
"MPTokenIssuanceID": "0040EAE38C1364B21CDBFEB171F994BE86575AC9583A3A52",
"Destination": "r5bPyzNBHjsW1VACE5aXwXvsNx3cgZFw3",
"SenderEncryptedAmount": "03A73BF168AAB96D1AFA3FA7552FC882EB5891BDE345A7B0DADD0E7CD75515ADFA03B00E0A2BDAC304D1FD9F9A21C16DFD19C65E5E5133310984A3B6BFE3CEE0CCF3",
"DestinationEncryptedAmount": "03A73BF168AAB96D1AFA3FA7552FC882EB5891BDE345A7B0DADD0E7CD75515ADFA03965AE72EF778EECDAED29C78EC5A879407994ED7F24124F951235D7C66F2F153",
"IssuerEncryptedAmount": "03A73BF168AAB96D1AFA3FA7552FC882EB5891BDE345A7B0DADD0E7CD75515ADFA03E8FABC9F0E4D4E74382B465B08A4CA7F466BD5398D4CD6094EC75E010FCB1AA8",
"AmountCommitment": "03711BCE97E9BAE2967719AAB61DA90564CBEADF5B51E47C157C2BEBCE30BA401A",
"BalanceCommitment": "02DD63E7DDEF18BA720EEA7EF8C962C388493AB05FFA3815DBD310D0E5C6174CA3",
"ZKProof": "60181B73A15BF088A1B9D4B9E6CEF5A62289B695954F99D478812D15EBB33E18868D5D59BEBF48EC99D17D75687DC7B3EC21B883541D44DDAA2DA7356AC1295E126A803141F9EA6DA392EEFDAF3510BB99C717FB75C1EA6900ED7D513A7C06076D9A68AF1F9A4DE412079D920903C1DF0DD4E3150234B05C638E49F3F2303589DAA93F0461DFE89F0478634A80EEFF83CAE670985B0502C01ED81C124C44BF71FCA406CB54F7A676737E2C34449FBA47FBAB9609B957E7B2B2E8AED2761C06B80388325AC0BA6169A20445560D9F76B32405011C2B4F1D3FA1B63BDCE4A38BDFDB02EF87DDA030670C0DFE942BEE8FB8A5644638E049A8BBB6586DBFA1909049FC0003DC11F225788DDB324EA1A327F5C3EB6EE358DFA1D79D44E95869E124495BFCED03C95FEA121A8ED010050A9386AFB21CF39E70A751633AACBD984A07FA1F73C2B202C96ECCD24C1DD030A630674504E8C97E9891BF19BA16FB0B5DD3FD645D25C334039A37A88DB5CA33E7618FD54B3297194CB19CF35A22631F53E7768575DC11307D029AA7260636793CA1DBE361C56B5F3535331DBCAC8ED3C7DB0DF4019F049CE41303494202A9154F005A352DF2DB81A64A4B48CCA20F48045178ABC566BF837BCCE503924205882F19116445C922F4E5E93022A0786C7B7A5016CE469782A2AB6ED2DD02B8FB55780C0C886E13D5CFF2B93048E3BAB65DD055575FE60E09C203E18952D8026D02225B6D5A146477EE7666B5A5D3848CA8A78C2AF6B46C5E62B939F80F33EA038E3757F95AE4A26C7AA20B46B4712E9EA059E1BB4ED96C8B47D9DEC179CCAB4C030E08AB9C1C9CAE14253C970F16CA07E4A2357470C91F05F35F219D992E607187020A5FFDE79CEBC5D35AFB5AC1811DD57571CC853ACBC4CBD7ADD8711340C4EAF902974AF24282D46EF1C84EAAD5FF9CABD04667491272CD80C4919B679615DB839202055C2DA56C98B7C021B3D295D6DDFB1C770E8D6817D8076F48B887B66398331302F174E86017AE11B72F01CFE5BBAF39AA5C1C3245669F61A983099EAAE1703167033809610C4AC7F718DEE478E48A67FB6338351991A8D4C9AAE7C4780A55069A2FFEC207F8C0C54F49CB1287BDAE0D7864C03BA85BED86BFE8155D91241810AA5B243C3D3DA6B5936976CFF8F10364C9551DCDF0DF259AE1BFCC6F26149C3F93376F9ED62450A01F1E47301A749EE6584A3ECE4B8E0ADD33829F98906EE5D24493C7A83A91AD029B112E82485A3FD316788EF12528C94F8D16E31228DDAB261D6901CB1FE677AFA3D816CAE8E6A741D4BED5575788A94D0ED6E91119EF0A6EC2E7",
"AuditorEncryptedAmount": "03A73BF168AAB96D1AFA3FA7552FC882EB5891BDE345A7B0DADD0E7CD75515ADFA0297EE1FF27570F248421B8CAD4CFB51505656002F27A7EBA20E8EB63B9454608A"
}
=== Submit confidential payments in batch... ===
Seller sends CTST to Buyer.
Buyer sends CTUSD to Seller.
Batch transaction hash: 7D8965299D4D181ED070A44DA4BC27CCF07E93869476859F71A906754633DB3A
https://devnet.xrpl.org/transactions/7D8965299D4D181ED070A44DA4BC27CCF07E93869476859F71A906754633DB3A
=== Verifying both payments... ===
Payment 1: tesSUCCESS
https://devnet.xrpl.org/transactions/A13DA1F3A5BB9EE20B89D8AA353D9D2FB9A2347C816AD0E8F9F6E4665B59AF15
Payment 2: tesSUCCESS
https://devnet.xrpl.org/transactions/ECAC137F4AD5EA497D9E04F05569727FBF29E15D3CCC7F0C6F2D00CD98E6E2EC
Payments both successful!
=== Merging settled amounts into spending balance... ===
rfpYa7E9Xn1o1RahrfPvgQ3N2YfADo1tnf can spend the CTST it received.
https://devnet.xrpl.org/transactions/0CE0D14EFEA5767282E5C764D2E287944624D55AF8494F6FE31E3A9F97741644
r5bPyzNBHjsW1VACE5aXwXvsNx3cgZFw3 can spend the CTUSD it received.
https://devnet.xrpl.org/transactions/9F6A0BE7A6D2B490C0C08E4FB10B06DB431179590C6707906375084E0B44B7FF
=== Decrypting balances as each holder... ===
Seller reads its own balance as:
- 900 CTST
- 500 CTUSD
Buyer reads its own balance as:
- 100 CTST
- 99500 CTUSD
=== Decrypting balances and amounts as the auditor... ===
Auditor reads the seller's balance as:
- 900 CTST
- 500 CTUSD
Auditor reads the buyer's balance as:
- 100 CTST
- 99500 CTUSD
Auditor reads the settled amounts as:
- 100 CTST
- 500 CTUSD
Claw back a confidential balance
node clawbackConfidentialMPT.js
You should see output like the following:
=== Getting accounts... ===
Issuer address: r9UCvdvzx3hKv4V3o9W4NT965Mc1o4Vdto
Holder address: rwo2BwUKWv7FXoigbfW8Gms2SoTHTEa89K
Auditor address: rBkqsDHzvkQY7nw9v7ty8kcfu344BtNywk
=== Locking CTUSD for the holder... ===
CTUSD is locked for rwo2BwUKWv7FXoigbfW8Gms2SoTHTEa89K.
https://devnet.xrpl.org/transactions/2F5E9B7ADFD95F2F86F562296A041EEA7FADA106BA56EB07AEBC67B0BAAF3063
=== Reading the confidential supply... ===
Confidential supply before clawback: 900000
=== Clawing back the holder's confidential balance... ===
{
"TransactionType": "ConfidentialMPTClawback",
"Account": "r9UCvdvzx3hKv4V3o9W4NT965Mc1o4Vdto",
"Sequence": 4257269,
"MPTokenIssuanceID": "0040F5ED59F61319D23DA36995362FBA96E1A898CB84C8D7",
"Holder": "rwo2BwUKWv7FXoigbfW8Gms2SoTHTEa89K",
"MPTAmount": "500",
"ZKProof": "2F19A2D039434DFA627F3E5A74E89CBAD81F652612FC3BFA84F3ED6150B1F1D56DF6B260C2CDCF787BA82E353968017C9A1712B25D647B74292C8B538683C148"
}
Clawed back 500 CTUSD from rwo2BwUKWv7FXoigbfW8Gms2SoTHTEa89K.
https://devnet.xrpl.org/transactions/0256198F68EBE04E115F6FCA058F843FEC78131C7D1D27628B96AD0A564C096F
=== Verifying the clawback... ===
MPToken entry:
{
"Account": "rwo2BwUKWv7FXoigbfW8Gms2SoTHTEa89K",
"AuditorEncryptedBalance": "02043C4BEF49A4CC7EF27B7291E404696DCA1DD4B91E5E5EF290C0819BC693C59F03D86E4BC12659A66CC0C0025A7330F3BE2EAD4009FEE7643CA12D0362F81E7D45",
"ConfidentialBalanceInbox": "02043C4BEF49A4CC7EF27B7291E404696DCA1DD4B91E5E5EF290C0819BC693C59F0284554CA8D72088E7A5E130B26084B85DB0A124B72FE4333CCEF275F80E5E5E6F",
"ConfidentialBalanceSpending": "02043C4BEF49A4CC7EF27B7291E404696DCA1DD4B91E5E5EF290C0819BC693C59F0284554CA8D72088E7A5E130B26084B85DB0A124B72FE4333CCEF275F80E5E5E6F",
"ConfidentialBalanceVersion": 1,
"Flags": 1,
"HolderEncryptionKey": "0273A37E32BBC6060DBC1810203029E8605FF7DCD8F3A164A31A8B42C0E3E771AC",
"IssuerEncryptedBalance": "02043C4BEF49A4CC7EF27B7291E404696DCA1DD4B91E5E5EF290C0819BC693C59F0324A5B9332342AB38093B545CF88AB9C52D63F2DE0F6ABA0BBDDE62EAE4DBF53B",
"LedgerEntryType": "MPToken",
"MPTokenIssuanceID": "0040F5ED59F61319D23DA36995362FBA96E1A898CB84C8D7",
"OwnerNode": "0",
"PreviousTxnID": "0256198F68EBE04E115F6FCA058F843FEC78131C7D1D27628B96AD0A564C096F",
"PreviousTxnLgrSeq": 4257295,
"index": "00E8D4B699496AC7979CCB9F7B5BE3EED226137DC753094F0BE17723BA56177B"
}
Holder reads its spending balance as 0 CTUSD.
Holder reads its inbox balance as 0 CTUSD.
Issuer reads the holder's balance as 0 CTUSD.
Auditor reads the holder's balance as 0 CTUSD.
Confidential supply after the clawback: 899500
Total supply in circulation (public + confidential): 899500