123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131(*****************************************************************************)(* *)(* Open Source License *)(* Copyright (c) 2023 Nomadic Labs, <contact@nomadic-labs.com> *)(* *)(* Permission is hereby granted, free of charge, to any person obtaining a *)(* copy of this software and associated documentation files (the "Software"),*)(* to deal in the Software without restriction, including without limitation *)(* the rights to use, copy, modify, merge, publish, distribute, sublicense, *)(* and/or sell copies of the Software, and to permit persons to whom the *)(* Software is furnished to do so, subject to the following conditions: *)(* *)(* The above copyright notice and this permission notice shall be included *)(* in all copies or substantial portions of the Software. *)(* *)(* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR*)(* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *)(* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *)(* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER*)(* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *)(* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *)(* DEALINGS IN THE SOFTWARE. *)(* *)(*****************************************************************************)typestaker=|SingleofContract_repr.t*Signature.public_key_hash|SharedofSignature.public_key_hashletstaker_encoding=letopenData_encodinginletsingle_tag=0inletsingle_encoding=obj2(req"contract"Contract_repr.encoding)(req"delegate"Signature.Public_key_hash.encoding)inletshared_tag=1inletshared_encoding=obj1(req"delegate"Signature.Public_key_hash.encoding)indef~title:"staker"~description:"Abstract notion of staker used in operation receipts, either a single \
staker or all the stakers delegating to some delegate.""staker"@@matching(function|Single(contract,delegate)->matchedsingle_tagsingle_encoding(contract,delegate)|Shareddelegate->matchedshared_tagshared_encodingdelegate)[case~title:"Single"(Tagsingle_tag)single_encoding(function|Single(contract,delegate)->Some(contract,delegate)|_->None)(fun(contract,delegate)->Single(contract,delegate));case~title:"Shared"(Tagshared_tag)shared_encoding(functionShareddelegate->Somedelegate|_->None)(fundelegate->Shareddelegate);]letcompare_stakersasb=match(sa,sb)with|Single(ca,da),Single(cb,db)->Compare.or_else(Contract_repr.comparecacb)(fun()->Signature.Public_key_hash.comparedadb)|Sharedda,Shareddb->Signature.Public_key_hash.comparedadb|Single_,Shared_->-1|Shared_,Single_->1letstaker_delegate=function|Single(_contract,delegate)->delegate|Shareddelegate->delegatetypet={frozen:Tez_repr.t;delegated:Tez_repr.t}letmake~frozen~delegated={frozen;delegated}letget_frozen{frozen;_}=frozenletencoding=letopenData_encodinginconv(fun{frozen;delegated}->(frozen,delegated))(fun(frozen,delegated)->{frozen;delegated})(obj2(req"frozen"Tez_repr.encoding)(req"delegated"Tez_repr.encoding))letzero=make~frozen:Tez_repr.zero~delegated:Tez_repr.zerolet(+?){frozen=f1;delegated=d1}{frozen=f2;delegated=d2}=letopenResult_syntaxinlet*frozen=Tez_repr.(f1+?f2)inlet+delegated=Tez_repr.(d1+?d2)in{frozen;delegated}moduleFull=structtypet={own_frozen:Tez_repr.t;staked_frozen:Tez_repr.t;delegated:Tez_repr.t;}letmake~own_frozen~staked_frozen~delegated={own_frozen;staked_frozen;delegated}letzero=make~own_frozen:Tez_repr.zero~staked_frozen:Tez_repr.zero~delegated:Tez_repr.zeroletencoding=letopenData_encodinginconv(fun{own_frozen;staked_frozen;delegated}->(own_frozen,staked_frozen,delegated))(fun(own_frozen,staked_frozen,delegated)->{own_frozen;staked_frozen;delegated})(obj3(req"own_frozen"Tez_repr.encoding)(req"staked_frozen"Tez_repr.encoding)(req"delegated"Tez_repr.encoding))end