cosmos-sdk/x/ibc/applications/transfer/keeper/relay_model/denom_record2.tla

115 lines
2.7 KiB
Plaintext

-------------------------- MODULE denom_record2 ----------------------------
(**
The implementation of denomination traces that allows one- or two-step sequences
Represented via records
*)
EXTENDS identifiers
CONSTANT
Denoms
MaxDenomLength == 5
DenomPrefixes == [
port: Identifiers,
channel: Identifiers
]
NullDenomPrefix == [
port |-> NullId,
channel |-> NullId
]
MakeDenomPrefix(port, channel) == [
port |-> port,
channel |-> channel
]
IsValidDenomPrefix(prefix) ==
/\ prefix.port /= NullId
/\ prefix.channel /= NullId
DenomTraces == [
prefix1: DenomPrefixes, \* the most recent prefix
prefix0: DenomPrefixes, \* the deepest prefix
denom: Denoms
]
NullDenomTrace == [
prefix1 |-> NullDenomPrefix,
prefix0 |-> NullDenomPrefix,
denom |-> NullId
]
TraceLen(trace) ==
IF trace.prefix0 = NullDenomPrefix
THEN 1
ELSE IF trace.prefix1 = NullDenomPrefix
THEN 3
ELSE 5
LatestPrefix(trace) ==
IF trace.prefix0 = NullDenomPrefix
THEN NullDenomPrefix
ELSE IF trace.prefix1 = NullDenomPrefix
THEN trace.prefix0
ELSE trace.prefix1
ExtendDenomTrace(port, channel, trace) ==
IF trace.prefix0 = NullDenomPrefix
THEN [
prefix1 |-> NullDenomPrefix,
prefix0 |-> MakeDenomPrefix(port, channel),
denom |-> trace.denom
]
ELSE IF trace.prefix1 = NullDenomPrefix
THEN [
prefix1 |-> MakeDenomPrefix(port, channel),
prefix0 |-> trace.prefix0,
denom |-> trace.denom
]
ELSE NullDenomTrace \* can extend only for two steps
ReduceDenomTrace(trace) ==
IF trace.prefix1 /= NullDenomPrefix
THEN [
prefix1 |-> NullDenomPrefix,
prefix0 |-> trace.prefix0,
denom |-> trace.denom
]
ELSE IF trace.prefix0 /= NullDenomPrefix
THEN [
prefix1 |-> NullDenomPrefix,
prefix0 |-> NullDenomPrefix,
denom |-> trace.denom
]
ELSE NullDenomTrace \* cannot reduce further
GetPort(trace) == LatestPrefix(trace).port
GetChannel(trace) == LatestPrefix(trace).channel
GetDenom(trace) == trace.denom
IsValidDenomTrace(trace) ==
/\ GetDenom(trace) /= NullId
/\ IF IsValidDenomPrefix(trace.prefix1)
THEN IsValidDenomPrefix(trace.prefix0)
ELSE
/\ trace.prefix1 = NullDenomPrefix
/\ (IsValidDenomPrefix(trace.prefix0) \/ trace.prefix0 = NullDenomPrefix)
IsNativeDenomTrace(trace) == LatestPrefix(trace) = NullDenomPrefix /\ GetDenom(trace) /= NullId
IsPrefixedDenomTrace(trace) == LatestPrefix(trace) /= NullDenomPrefix /\ GetDenom(trace) /= NullId
DENOM == INSTANCE denom
DenomTypeOK == DENOM!DenomTypeOK
=============================================================================
\* Modification History
\* Last modified Fri Dec 04 10:38:10 CET 2020 by andrey
\* Created Fri Dec 04 10:22:10 CET 2020 by andrey