/* Ċ Ġ* ĠCopyright ĠIBM ĠCorp . ĠAll ĠRights ĠReserved . Ċ Ġ* Ċ Ġ* ĠSPDX - License - Identifier : ĠApache - 2 . 0 Ċ Ġ*/ Ċ Ċ package Ġcom . cord a Simple Application . contract Ċ Ċ import Ġcom . cord a Simple Application . state . Asset State Ċ import Ġnet . cord a . core . contracts . Command Data Ċ import Ġnet . cord a . core . contracts . Contract Ċ import Ġnet . cord a . core . contracts . require Single Command Ċ import Ġnet . cord a . core . contracts . require That Ċ import Ġnet . cord a . core . transactions . Ledger Transaction Ċ Ċ /** Ċ Ġ* ĠAn Ġimplementation Ġof Ġa Ġsample Ġasset Ġin ĠC ord a . Ċ Ġ* Ċ Ġ* ĠThis Ġcontract Ġen forces Ġrules Ġregarding Ġthe Ġcreation Ġof Ġa Ġvalid Ġ[ Asset State ], Ġand Ġoperations Ġon Ġ[ Asset State ]. Ċ Ġ* Ċ Ġ* ĠFor Ġa Ġnew Ġ[ Asset State ] Ġto Ġbe Ġissued Ġonto Ġthe Ġledger , Ġa Ġtransaction Ġis Ġrequired Ġwhich Ġtakes : Ċ Ġ* Ġ- ĠZero Ġinput Ġstates . Ċ Ġ* Ġ- ĠOne Ġoutput Ġstate : Ġthe Ġnew Ġ[ Asset State ]. Ċ Ġ* Ġ- ĠAn ĠCreate () Ġcommand Ġwith Ġthe Ġpublic Ġkeys Ġof Ġthe Ġowner Ġof Ġthe Ġasset . Ċ Ġ* Ċ Ġ*/ Ċ class ĠAsset Contract Ġ: ĠContract Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġval ĠID Ġ= Ġ" com . cord a Simple Application . contract . Asset Contract " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġverify () Ġfunction Ġof Ġall Ġthe Ġstates ' Ġcontracts Ġmust Ġnot Ġthrow Ġan Ġexception Ġfor Ġa Ġtransaction Ġto Ġbe ĊĠĠĠĠ Ġ* Ġconsidered Ġvalid . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġverify ( tx : ĠLed ger Transaction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcommand Ġ= Ġtx . commands . require Single Command < Asset Contract . Commands >() ĊĠĠĠĠĠĠĠ Ġwhen Ġ( command . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAsset Contract . Commands . Issue Ġ-> Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGeneric Ġconstraints Ġaround Ġthe Ġf ung ible Ġtoken Ġasset Ġiss u ance Ġtransaction . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" No Ġinputs Ġshould Ġbe Ġconsumed Ġwhen Ġiss uing Ġan Ġasset ." Ġusing Ġ( tx . inputs OfType < Asset State >(). isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Only Ġone Ġoutput Ġstate Ġshould Ġbe Ġcreated ." Ġusing Ġ( tx . outputs OfType < Asset State >(). size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput State Ġ= Ġtx . outputs OfType < Asset State >(). single () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequired Sign ers Ġ= Ġoutput State . participants . map Ġ{ Ġit . own ing Key Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġparticipants Ġmust Ġbe Ġthe Ġsign ers ." Ġusing Ġ( command . sign ers . contains All ( required Sign ers )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAsset Contract . Commands . Delete Ġ-> Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGeneric Ġconstraints Ġaround Ġthe Ġasset Ġdeletion Ġtransaction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Only Ġone Ġinput Ġstate Ġshould Ġbe Ġconsumed Ġwith Ġdeletion Ġof Ġan Ġasset ." Ġusing Ġ( tx . inputs OfType < Asset State >(). size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" No Ġoutput Ġstate Ġshould Ġbe Ġcreated ." Ġusing Ġ( tx . outputs OfType < Asset State >(). isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput State Ġ= Ġtx . inputs OfType < Asset State >() [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequired Sign ers Ġ= ĠlistOf ( input State . owner . own ing Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġasset Ġowner Ġmust Ġbe Ġthe Ġsigner ." Ġusing Ġ( command . sign ers . contains All ( required Sign ers )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAsset Contract . Commands . Merge Ġ-> Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGeneric Ġconstraints Ġaround Ġthe Ġtransaction Ġthat Ġmerge s Ġtwo Ġasset Ġstates Ġinto Ġone ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Two Ġinput Ġstates Ġshould Ġbe Ġconsumed Ġfor Ġmerging ." Ġusing Ġ( tx . inputs OfType < Asset State >(). size Ġ== Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput State 1 Ġ= Ġtx . inputs OfType < Asset State >() [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput State 2 Ġ= Ġtx . inputs OfType < Asset State >() [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Both Ġassets Ġto Ġbe Ġmerged Ġshould Ġbelong Ġto Ġthe Ġsame Ġowner ." Ġusing Ġ( input State 1 . owner Ġ== Ġinput State 2 . owner ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Both Ġassets Ġto Ġbe Ġmerged Ġshould Ġbe Ġof Ġsame Ġtoken Ġtype ." Ġusing Ġ( input State 1 . token Type Ġ== Ġinput State 2 . token Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Only Ġone Ġoutput Ġstate Ġshould Ġbe Ġcreated ." Ġusing Ġ( tx . outputs OfType < Asset State >(). size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmerged State Ġ= Ġtx . outputs OfType < Asset State >(). single () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequired Sign ers Ġ= Ġmerged State . participants . map Ġ{ Ġit . own ing Key Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġparticipants Ġmust Ġbe Ġthe Ġsign ers ." Ġusing Ġ( command . sign ers . contains All ( required Sign ers )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġoutput Ġstate Ġshould Ġbelong Ġto Ġthe Ġsame Ġowner Ġas Ġthe Ġinput Ġstates ." Ġusing Ġ( input State 1 . owner Ġ== Ġmerged State . owner ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġnumber Ġof Ġf ung ible Ġasset Ġtokens Ġbefore Ġand Ġafter Ġmerge Ġshould Ġbe Ġsame ." Ġusing Ġ( input State 1 . quantity Ġ+ Ġinput State 2 . quantity Ġ== Ġmerged State . quantity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġmerged Ġasset Ġtoken Ġtype Ġshould Ġbe Ġsame Ġas Ġthe Ġinput Ġasset Ġtoken Ġtype ." Ġusing Ġ( input State 1 . token Type Ġ== Ġmerged State . token Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAsset Contract . Commands . Split Ġ-> Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGeneric Ġconstraints Ġaround Ġthe Ġtransaction Ġthat Ġsplits Ġan Ġasset Ġstate Ġinto Ġtwo Ġasset Ġstates ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" One Ġinput Ġstate Ġshould Ġbe Ġconsumed Ġfor Ġsplitting ." Ġusing Ġ( tx . inputs OfType < Asset State >(). size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsplit State Ġ= Ġtx . inputs OfType < Asset State >() [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Two Ġoutput Ġstates Ġshould Ġbe Ġcreated ." Ġusing Ġ( tx . outputs OfType < Asset State >(). size Ġ== Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput State 1 Ġ= Ġtx . outputs OfType < Asset State >() [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput State 2 Ġ= Ġtx . outputs OfType < Asset State >() [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Both Ġassets Ġgenerated Ġby Ġsplit Ġshould Ġbelong Ġto Ġthe Ġsame Ġowner ." Ġusing Ġ( output State 1 . owner Ġ== Ġoutput State 2 . owner ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Both Ġassets Ġgenerated Ġby Ġsplit Ġshould Ġof Ġthe Ġsame Ġtoken Ġtype ." Ġusing Ġ( output State 1 . token Type Ġ== Ġoutput State 2 . token Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequired Sign ers Ġ= Ġoutput State 1 . participants . map Ġ{ Ġit . own ing Key Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġparticipants Ġmust Ġbe Ġthe Ġsign ers ." Ġusing Ġ( command . sign ers . contains All ( required Sign ers )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġoutput Ġstates Ġshould Ġbelong Ġto Ġthe Ġsame Ġowner Ġas Ġthe Ġinput Ġstates ." Ġusing Ġ( split State . owner Ġ== Ġoutput State 1 . owner ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġnumber Ġof Ġf ung ible Ġasset Ġtokens Ġbefore Ġand Ġafter Ġsplit Ġshould Ġbe Ġsame ." Ġusing Ġ( split State . quantity Ġ== Ġoutput State 1 . quantity Ġ+ Ġoutput State 2 . quantity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġasset Ġtoken Ġtype Ġto Ġbe Ġsplit Ġshould Ġbe Ġsame Ġas Ġthe Ġoutput Ġassets ' Ġtoken Ġtype ." Ġusing Ġ( split State . token Type Ġ== Ġoutput State 1 . token Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAsset Contract . Commands . Transfer Ġ-> Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGeneric Ġconstraints Ġaround Ġthe Ġtransaction Ġthat Ġtransfers Ġownership Ġof Ġan Ġasset Ġfrom Ġone ĠParty Ġto Ġother ĠParty ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" One Ġinput Ġstate Ġshould Ġbe Ġconsumed Ġfor Ġtrans f erring ." Ġusing Ġ( tx . inputs OfType < Asset State >(). size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput State Ġ= Ġtx . inputs OfType < Asset State >() [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" One Ġoutput Ġstate Ġonly Ġshould Ġbe Ġcreated ." Ġusing Ġ( tx . outputs OfType < Asset State >(). size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput State Ġ= Ġtx . outputs OfType < Asset State >() [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġinput Ġand Ġoutput Ġstates Ġpart Ġof Ġthe Ġtransfer Ġshould Ġhave Ġthe Ġsame Ġquantity ." Ġusing Ġ( input State . quantity Ġ== Ġoutput State . quantity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġinput Ġand Ġoutput Ġstates Ġpart Ġof Ġthe Ġtransfer Ġshould Ġbe Ġof Ġsame Ġtoken Ġtype ." Ġusing Ġ( input State . token Type Ġ== Ġoutput State . token Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġinput Ġand Ġoutput Ġstates Ġpart Ġof Ġthe Ġtransfer Ġshould Ġnot Ġbelong Ġto Ġthe Ġsame Ġowner ." Ġusing Ġ( input State . owner Ġ!= Ġoutput State . owner ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequired Sign ers Ġ= ĠlistOf ( input State . owner . own ing Key , Ġoutput State . owner . own ing Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġowners Ġof Ġthe Ġinput Ġand Ġoutput Ġassets Ġmust Ġbe Ġthe Ġsign ers ." Ġusing Ġ( command . sign ers . contains All ( required Sign ers )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġcontract Ġimplements Ġthe Ġcommands : ĠIssue , ĠDelete , ĠMerge , ĠSplit Ġand ĠTransfer . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinterface ĠCommands Ġ: ĠCommand Data Ġ{ ĊĠĠĠĠĠĠĠ Ġclass ĠIssue Ġ: ĠCommands ĊĠĠĠĠĠĠĠ Ġclass ĠDelete Ġ: ĠCommands ĊĠĠĠĠĠĠĠ Ġclass ĠMerge Ġ: ĠCommands ĊĠĠĠĠĠĠĠ Ġclass ĠSplit Ġ: ĠCommands ĊĠĠĠĠĠĠĠ Ġclass ĠTransfer Ġ: ĠCommands ĊĊĠĠĠĠĠĠĠ Ġ// ĠFlow Ġthat Ġwill Ġread Ġthe Ġtotal Ġf ung ible Ġtoken Ġassets Ġof Ġa Ġgiven Ġtype ĊĠĠĠ Ġ} Ċ } Ċ