<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="../../../unit.xsl"?>
<KIVSPEC name="IEINV"><SPECBODY>enrich <a href="../../../specs/IINV-props/export/unit.xml">IINV-props</a> , 
       <a href="../../../specs/IE-mapping/export/unit.xml">IE-mapping</a> , 
       <a href="../../../specs/finite-authentic-names/export/unit.xml">finite-authentic-names</a> with
   
   predicates 
      IEINV : (name → nat) × (name → imessageset) × (name → imessage) × (name → ipaydetailsset) × (name → ipaydetailsset) × tidset × (name → nat) × 
              (name → emessage) × (name → tidset) × (name → epaydetailsset) × tidset × emessageset;
      state-EQ : (name → nat) × (name → imessageset) × (name → ipaydetailsset) × (name → ipaydetailsset) × tidset × (name → nat) × 
                 (name → epaydetailsset) × tidset × emessageset × (name → tidset);
      fresh-EReq-in-inbox : (name → imessageset) × emessageset × (name → tidset);
      fresh-EVal-in-inbox : (name → imessageset) × (name → emessage) × emessageset;
      fresh-EAck-in-inbox : (name → imessageset) × (name → emessage) × emessageset;
   variables 
      inbox, inbox0 : name → imessageset; 
      outbox0 : name → imessage; 
      exLogfrom, exLogfrom0, exLogto, exLogto0 : name → ipaydetailsset; 
      value0 : nat; 
   
   axioms 
      IEINV-def
      : ⊦ 
          IEINV(balance0, inbox0, outbox0, exLogfrom0, exLogto0, ts0, balance, eoutbox, usedTids, eexLog, ts, eether)
        ↔   state-EQ(balance0, inbox0, exLogfrom0, exLogto0, ts0, balance, eexLog, ts, eether, usedTids) ∧ outboxEQ(outbox0, eoutbox) ∧ ts0 = ts
          ∧ fresh-EReq-in-inbox(inbox0, eether, usedTids) ∧ fresh-EVal-in-inbox(inbox0, eoutbox, eether)
          ∧ fresh-EAck-in-inbox(inbox0, eoutbox, eether)
      ;
      state-EQ-def
      : ⊦ 
          state-EQ(balance0, inbox0, exLogfrom0, exLogto0, ts0, balance, eexLog, ts, eether, usedTids)
        ↔ (∀ na. 
              authentic(na)
            →   balance0(na) = balance(na) ∧ inboxInEther(na, inbox0, eether, usedTids) ∧ exLogfrom0(na) = getFromExLog(na, eexLog(na))
              ∧ exLogto0(na) = getToExLog(na, eexLog(na)))
      ;
      fresh-EReq-in-inbox-def
      : ⊦ 
          fresh-EReq-in-inbox(inbox, eether, usedTids)
        ↔ (∀ emsg. 
            emsg ∈ eether ∧ ¬ emsg .tid ∈ usedTids(emsg .from) → isEReq(emsg) ∧ IReq(mkipd(emsg .to, emsg .value, emsg .tid)) ∈ inbox(emsg .from))
      ;
      fresh-EVal-in-inbox-def
      : ⊦ 
          fresh-EVal-in-inbox(inbox, eoutbox, eether)
        ↔ (∀ epd. EVal(epd) ∈ eether ∧ eoutbox(epd .to) = EReq(epd) → IVal(mkipd(epd .from, epd .value, epd .tid)) ∈ inbox(epd .to))
      ;
      fresh-EAck-in-inbox-def
      : ⊦ 
          fresh-EAck-in-inbox(inbox, eoutbox, eether)
        ↔ (∀ epd. EAck(epd) ∈ eether ∧ eoutbox(epd .from) = EVal(epd) → IAck(mkipd(epd .to, epd .value, epd .tid)) ∈ inbox(epd .from))
      ;
   
end enrich</SPECBODY></KIVSPEC>
