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

115 lines
2.7 KiB
Plaintext
Raw Normal View History

Model-based tests for relay functions of ICS-20 token transfer (#8145) * start on MBT for ICS20: setting and checking bank balances * add bank struct for subtracting banks * reconstruct ibc denominations in the bank * add some static tests with bank changes tracking * small fixes * better error handling * add Jsonatr transform from Apalache conterexample into OnRecvPacket test * add example Apalache CE and transformed test * changed apalache-to-recv-test.json to output arrays instead of records * add datastructures for parsing TLA+ tests * remove accidentally committed code * add conversion from TLA+ structs to Go structs * encode abstract ids into addresses via hashes * first run of auto-generated MBT tests * first run of auto-generated MBT tests: fix ports and channels * fix small inconsistencies * fix mbt_relay_test by not setting the bank balances in every iteration * add test for onTimeoutPacket * add handling of OnRecvAcknowledgement to mbt relay test * add handling of SendTransfer * add relay-test.json * revert manual changes in relay-test.json * fix handling of denominations for SendTransfer * setup two test channels A-B, B-C; fix escrow address encoding * a test for all handlers passing * generalize denom handling to arbitrary length + failing denom test * rename test function * MBT test for unsecrow tokens * add model-based generated tests * add model-based tests (prev commit: addded model) * transformed json tests with jsonatr * modify mbt_relay_test.go to execute all MBT tests * cleanup * move jsonatr transforms into another dir * add MBT_README.md Co-authored-by: Federico Kunze <31522760+fedekunze@users.noreply.github.com>
2020-12-11 09:35:44 -08:00
-------------------------- 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