From 5f3ec56ca8653605deb40c09560de94cb1b8b842 Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Tue, 15 Oct 2024 14:55:01 -0500 Subject: [PATCH 01/41] Added -I to kompile command. Path can be improved. --- Makefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 5f5a392..35a178b 100644 --- a/Makefile +++ b/Makefile @@ -8,6 +8,8 @@ SEMANTICS_FILE_NAME = solidity SEMANTICS_FILE = $(SEMANTICS_FILE_NAME).md MAIN_MODULE = SOLIDITY OUTPUT_DIR = out +ULMDIR = ../ulm +ULMINCLUDE = $(ULMDIR)/kllvm UNISWAP_PARAMS = $(EXAMPLES_DIR)/swaps/UniswapV2Swap.sol 2>&1 1>$(OUTPUT_DIR)/uniswap.ast UNISWAPRN_PARAMS = $(EXAMPLES_DIR)/swaps/UniswapV2SwapRenamed.sol 2>&1 1>$(OUTPUT_DIR)/uniswaprn.ast @@ -23,7 +25,7 @@ TRANSACTIONS = $(shell find $(TRANSACTIONS_DIR) -name "*.txn") EXAMPLE_TESTS = $(patsubst %.txn, %.out, $(TRANSACTIONS)) build: $(SEMANTICS_DIR)/$(SEMANTICS_FILE) - kompile $(SEMANTICS_DIR)/$(SEMANTICS_FILE) --main-module $(MAIN_MODULE) --gen-glr-bison-parser -O2 --heuristic pbaL + kompile $(SEMANTICS_DIR)/$(SEMANTICS_FILE) --main-module $(MAIN_MODULE) -I $(ULMINCLUDE) --gen-glr-bison-parser -O2 --heuristic pbaL clean: test-clean rm -Rf $(SEMANTICS_FILE_NAME)-kompiled From f27009f2b59758cd24b06ca8b3141facafa24d1d Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Tue, 15 Oct 2024 14:56:06 -0500 Subject: [PATCH 02/41] Add and update status cell. --- src/expression.md | 6 ++++++ src/solidity.md | 3 +++ 2 files changed, 9 insertions(+) diff --git a/src/expression.md b/src/expression.md index dc51f80..ce4a7ef 100644 --- a/src/expression.md +++ b/src/expression.md @@ -5,6 +5,7 @@ module SOLIDITY-EXPRESSION imports SOLIDITY-CONFIGURATION imports INT + imports ULM // new contract rule new X:Id ( ARGS ) ~> K => bind(S, PARAMS, TYPES, ARGS, .List, .List) ~> List2Statements(INIT) ~> BODY ~> return v(ADDR, X) ; @@ -341,6 +342,11 @@ module SOLIDITY-EXPRESSION syntax Id ::= "require" [token] | "assert" [token] rule require(v(true, bool), _) => void rule assert(v(true, bool)) => void + rule require(v(false, bool), _) => STUCK ... + _ => EVMC_REVERT + rule assert(v(false, bool)) => STUCK ... + _ => EVMC_FAILURE + syntax KItem ::= "STUCK" // ternary expression rule v(true, bool) ? X : _ => X diff --git a/src/solidity.md b/src/solidity.md index d669866..7fb61ba 100644 --- a/src/solidity.md +++ b/src/solidity.md @@ -8,10 +8,12 @@ requires "transaction.md" requires "expression.md" requires "statement.md" requires "uniswap-summaries.md" +requires "ulm.k" module SOLIDITY-CONFIGURATION imports SOLIDITY-DATA imports SOLIDITY-SYNTAX + imports ULM syntax Id ::= "Id" [token] @@ -80,6 +82,7 @@ module SOLIDITY-CONFIGURATION 2p160 + EVMC_SUCCESS From fe3b1ec2106cb8bba907e39323251fcfdde6e138 Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Tue, 15 Oct 2024 15:21:58 -0500 Subject: [PATCH 03/41] getStatus implementation --- src/solidity.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/solidity.md b/src/solidity.md index 7fb61ba..c105b87 100644 --- a/src/solidity.md +++ b/src/solidity.md @@ -89,6 +89,21 @@ module SOLIDITY-CONFIGURATION endmodule ``` +```k +module SOLIDITY-ULM-SIGNATURE-IMPLEMENTATION + imports SOLIDITY-CONFIGURATION + imports INT + imports ULM-SIGNATURE + + rule getStatus(... + ... + STATUS:Int + ... + ...) => STATUS + +endmodule +``` + ```k module SOLIDITY-DATA-SYNTAX imports MINT-SYNTAX From 5042be9004ff45f5bb84c40cd192f77bad2ed3b1 Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Tue, 15 Oct 2024 15:53:58 -0500 Subject: [PATCH 04/41] getOutput implementation --- src/solidity.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/solidity.md b/src/solidity.md index c105b87..2de889e 100644 --- a/src/solidity.md +++ b/src/solidity.md @@ -93,6 +93,7 @@ endmodule module SOLIDITY-ULM-SIGNATURE-IMPLEMENTATION imports SOLIDITY-CONFIGURATION imports INT + imports BYTES imports ULM-SIGNATURE rule getStatus(... @@ -101,6 +102,19 @@ module SOLIDITY-ULM-SIGNATURE-IMPLEMENTATION ... ...) => STATUS + // getOutput gets the output from the top of the K cell (as expected after + // completion of the return statement) and encodes it to Bytes. + // We currently handle the encoding of return values of types uint256 and bool. + rule getOutput(... + v(V:MInt{256}, uint256) ... + ...) => Int2Bytes(32, MInt2Unsigned(V), BE) + rule getOutput(... + v(true, bool) ... + ...) => Int2Bytes(32, 1, BE) + rule getOutput(... + v(false, bool) ... + ...) => Int2Bytes(32, 0, BE) + endmodule ``` From 8d08b63eb5d1d35a627986027eaadfcdfe5036ac Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Tue, 15 Oct 2024 16:21:03 -0500 Subject: [PATCH 05/41] getGasLeft implementation --- src/solidity.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/solidity.md b/src/solidity.md index 2de889e..8c6d5ec 100644 --- a/src/solidity.md +++ b/src/solidity.md @@ -83,6 +83,7 @@ module SOLIDITY-CONFIGURATION 2p160 EVMC_SUCCESS + $GAS:Int @@ -115,6 +116,17 @@ module SOLIDITY-ULM-SIGNATURE-IMPLEMENTATION v(false, bool) ... ...) => Int2Bytes(32, 0, BE) + // getGasLeft returns the amount of gas left by reading it from the cell . + // The semantics currently initialize the gas by reading the appropriate ULM + // configuration variable, but do not update it as the computations are performed. + // I.e., this function is always going to return the exact amount of gas that was + // provided to begin with. + rule getGasLeft(... + ... + GASLEFT:Int + ... + ...) => GASLEFT + endmodule ``` From eb2ed9c0f958e36fb93e5094833137f6b547f14b Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Wed, 16 Oct 2024 12:37:37 -0500 Subject: [PATCH 06/41] Edit Makefile, to link with hooks implementation to remove warnings. --- Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 35a178b..aeffd60 100644 --- a/Makefile +++ b/Makefile @@ -10,6 +10,7 @@ MAIN_MODULE = SOLIDITY OUTPUT_DIR = out ULMDIR = ../ulm ULMINCLUDE = $(ULMDIR)/kllvm +CFLAGS = -ccopt -L$(ULMINCLUDE) -ccopt -lulmkllvm UNISWAP_PARAMS = $(EXAMPLES_DIR)/swaps/UniswapV2Swap.sol 2>&1 1>$(OUTPUT_DIR)/uniswap.ast UNISWAPRN_PARAMS = $(EXAMPLES_DIR)/swaps/UniswapV2SwapRenamed.sol 2>&1 1>$(OUTPUT_DIR)/uniswaprn.ast @@ -25,7 +26,7 @@ TRANSACTIONS = $(shell find $(TRANSACTIONS_DIR) -name "*.txn") EXAMPLE_TESTS = $(patsubst %.txn, %.out, $(TRANSACTIONS)) build: $(SEMANTICS_DIR)/$(SEMANTICS_FILE) - kompile $(SEMANTICS_DIR)/$(SEMANTICS_FILE) --main-module $(MAIN_MODULE) -I $(ULMINCLUDE) --gen-glr-bison-parser -O2 --heuristic pbaL + kompile $(SEMANTICS_DIR)/$(SEMANTICS_FILE) --main-module $(MAIN_MODULE) --hook-namespaces 'ULM' -I $(ULMINCLUDE) $(CFLAGS) --gen-glr-bison-parser -O2 --heuristic pbaL clean: test-clean rm -Rf $(SEMANTICS_FILE_NAME)-kompiled From 22b1944ffdb7101921abe3e31b18f57d68a81bed Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Wed, 16 Oct 2024 20:03:06 -0500 Subject: [PATCH 07/41] Address schema using Int to access contract storage. --- src/contract.md | 9 +++++++++ src/expression.md | 29 +++++++++++++++++++++++++---- src/solidity.md | 40 +++++++++++++++++++++++++++++++++++++--- 3 files changed, 71 insertions(+), 7 deletions(-) diff --git a/src/contract.md b/src/contract.md index c4fc5b8..b87eccf 100644 --- a/src/contract.md +++ b/src/contract.md @@ -3,6 +3,7 @@ ```k module SOLIDITY-CONTRACT imports SOLIDITY-CONFIGURATION + imports SOLIDITY-UTILS-SYNTAX rule contract X:Id { Body } => Body ... _ => X @@ -75,6 +76,8 @@ module SOLIDITY-CONTRACT C C Env => Env [ X <- T ] + A => A +Int addressRangeSize(T) + B => B [ X <- A ] .Bag => X @@ -113,11 +116,15 @@ module SOLIDITY-CONTRACT C C Env => Env [ X <- T ] + A => A +Int addressRangeSize(T) + B => B [ X <- A ] rule T:TypeName public X:Id = E ; => .K ... C C Env => Env [ X <- T ] + A => A +Int addressRangeSize(T) + B => B [ X <- A ] ... .List => ListItem(X = E;) .Bag => @@ -137,6 +144,8 @@ module SOLIDITY-CONTRACT C C Env => Env [ X <- T ] + A => A +Int addressRangeSize(T) + B => B [ X <- A ] ... .List => ListItem(X = E;) rule event X ( EventParams ) ; => .K ... diff --git a/src/expression.md b/src/expression.md index ce4a7ef..dc9b8f7 100644 --- a/src/expression.md +++ b/src/expression.md @@ -4,8 +4,10 @@ module SOLIDITY-EXPRESSION imports SOLIDITY-CONFIGURATION + imports SOLIDITY-UTILS-SYNTAX imports INT imports ULM + imports K-EQUAL // new contract rule new X:Id ( ARGS ) ~> K => bind(S, PARAMS, TYPES, ARGS, .List, .List) ~> List2Statements(INIT) ~> BODY ~> return v(ADDR, X) ; @@ -73,8 +75,9 @@ module SOLIDITY-EXPRESSION TYPE TYPE ... X |-> LT + ... X |-> A ... THIS - S => S [ X <- convert(V, RT, LT) ] + S => S [ A <- convert(V, RT, LT) ] // literal assignment to local variable rule X:Id = N:Int => X = v(convert(N, LT), LT) ... @@ -99,8 +102,9 @@ module SOLIDITY-EXPRESSION TYPE TYPE ... X |-> T ... + ... X |-> A ... THIS - S => S [ X <- write({S [ X ] orDefault .Map}:>Value, L ListItem(convert(Key, RT1, LT1)), convert(V, RT, T2), T) ] + S => S [ A +Int computeStorageOffset(L ListItem(convert(Key, RT1, LT1)), T, 0) <- convert(V, RT, T2) ] syntax Value ::= write(Value, List, Value, TypeName) [function] rule write(_, .List, V, _) => V @@ -120,11 +124,12 @@ module SOLIDITY-EXPRESSION TYPE // state variable lookup - rule X:Id => v({S[X] orDefault default(T)}:>Value, T) ... + rule X:Id => v({S[A] orDefault default(T)}:>Value, T) ... THIS TYPE TYPE ... X |-> T ... + ... X |-> A ... THIS S requires notBool isAggregateType(T) @@ -152,11 +157,12 @@ module SOLIDITY-EXPRESSION rule lv(I:Int, L, T []) [ v(Idx:MInt{256}, _) ] => v(read(V, L ListItem(MInt2Unsigned(Idx)), T[]), T) ... _ [ I <- V ] requires notBool isAggregateType(T) - rule lv(X:Id, L, mapping(T1:ElementaryTypeName _ => T2)) [ v(Key, RT) ] => v(read({S [ X ] orDefault .Map}:>Value, L ListItem(convert(Key, RT, T1)), T), T2) ... + rule lv(X:Id, L, mapping(T1:ElementaryTypeName _ => T2)) [ v(Key, RT) ] => v({S[A +Int computeStorageOffset(L ListItem(convert(Key, RT, T1)), T, 0)] orDefault default(T2)}:>Value, T2) ... THIS TYPE TYPE ... X |-> T ... + ... X |-> A ... THIS S requires notBool isAggregateType(T2) @@ -168,6 +174,21 @@ module SOLIDITY-EXPRESSION rule lv(R, L, mapping(T1:ElementaryTypeName _ => T2)) [ v(V, RT) ] => lv(R, L ListItem(convert(V, RT, T1)), T2) ... requires isAggregateType(T2) + syntax Int ::= computeStorageOffset(List, TypeName, Int) [function] + rule computeStorageOffset(.List, _, Acc) => Acc + rule computeStorageOffset(ListItem(K:MInt{8}) L, mapping(uint8 _ => T2 _), Acc) => + computeStorageOffset(L, T2, Acc *Int range(uint8) +Int MInt2Unsigned(K)) + rule computeStorageOffset(ListItem(K:MInt{32}) L, mapping(uint32 _ => T2 _), Acc) => + computeStorageOffset(L, T2, Acc *Int range(uint32) +Int MInt2Unsigned(K)) + rule computeStorageOffset(ListItem(K:MInt{112}) L, mapping(uint112 _ => T2 _), Acc) => + computeStorageOffset(L, T2, Acc *Int range(uint112) +Int MInt2Unsigned(K)) + rule computeStorageOffset(ListItem(K:MInt{256}) L, mapping(uint256 _ => T2 _), Acc) => + computeStorageOffset(L, T2, Acc *Int range(uint256) +Int MInt2Unsigned(K)) + rule computeStorageOffset(ListItem(K:MInt{160}) L, mapping(address _ => T2 _), Acc) => + computeStorageOffset(L, T2, Acc *Int range(address) +Int MInt2Unsigned(K)) + rule computeStorageOffset(ListItem(K:Bool) L, mapping(bool _ => T2 _), Acc) => + computeStorageOffset(L, T2, Acc *Int range(bool) +Int #if K #then 1 #else 0 #fi) + syntax Value ::= read(Value, List, TypeName) [function] rule read(V, .List, _) => V rule read(L1:List, ListItem(I:Int) L2, T[]) => read({L1 [ I ]}:>Value, L2, T) diff --git a/src/solidity.md b/src/solidity.md index 8c6d5ec..00f87ee 100644 --- a/src/solidity.md +++ b/src/solidity.md @@ -7,7 +7,6 @@ requires "contract.md" requires "transaction.md" requires "expression.md" requires "statement.md" -requires "uniswap-summaries.md" requires "ulm.k" module SOLIDITY-CONFIGURATION @@ -39,6 +38,8 @@ module SOLIDITY-CONFIGURATION Id .Map + 0:Int + .Map .List @@ -217,6 +218,40 @@ module SOLIDITY-DATA endmodule ``` +```k +module SOLIDITY-UTILS-SYNTAX + imports SOLIDITY-SYNTAX + imports INT-SYNTAX + + syntax Int ::= addressRangeSize(TypeName) [function] + syntax Int ::= range(ElementaryTypeName) [function] +endmodule +``` + +```k +module SOLIDITY-UTILS + imports SOLIDITY-UTILS-SYNTAX + imports SOLIDITY-DATA + imports INT + imports BOOL + +// This address schema is limited to supporting the state variables found in +// UniSwapV2Swap.sol, i.e. stae variables or primitive types, and mappings/double +// mappins with only primitive types as keys. We do not currently support array +// state variables with this address assignment schema. + rule addressRangeSize(mapping(T1:ElementaryTypeName _ => T2 _)) => range(T1) *Int addressRangeSize(T2) + rule addressRangeSize(T) => 1 + requires notBool isAggregateType(T) + rule range(uint8) => 2 ^Int 8 + rule range(uint32) => 2 ^Int 32 + rule range(uint112) => 2 ^Int 112 + rule range(uint256) => 2 ^Int 256 + rule range(address) => 2 ^Int 160 + rule range(bool) => 2 + +endmodule +``` + ```k module SOLIDITY imports SOLIDITY-CONFIGURATION @@ -225,10 +260,9 @@ module SOLIDITY imports SOLIDITY-TRANSACTION imports SOLIDITY-EXPRESSION imports SOLIDITY-STATEMENT - imports SOLIDITY-UNISWAP-SUMMARIES + imports SOLIDITY-UTILS rule _:PragmaDefinition Ss:SourceUnits => Ss ... - false rule S:SourceUnit Ss:SourceUnits => S ~> Ss rule .SourceUnits => .K rule C:ContractBodyElement Cc:ContractBodyElements => C ~> Cc From c414af5e2a136713b9a12cbbcfe8d1e1f161eb9b Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Thu, 17 Oct 2024 15:08:50 -0500 Subject: [PATCH 08/41] Changed contract storage, to store Int as values. --- src/expression.md | 145 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 138 insertions(+), 7 deletions(-) diff --git a/src/expression.md b/src/expression.md index dc9b8f7..8893b8f 100644 --- a/src/expression.md +++ b/src/expression.md @@ -74,10 +74,64 @@ module SOLIDITY-EXPRESSION THIS TYPE TYPE - ... X |-> LT + ... X |-> (uint8 #as LT) + ... X |-> A ... + THIS + S => S [ A <- MInt2Unsigned({convert(V, RT, LT)}:>MInt{8}) ] + + rule X:Id = v(V, RT) => v(convert(V, RT, LT), LT) ... + THIS + TYPE + TYPE + ... X |-> (uint32 #as LT) ... X |-> A ... THIS - S => S [ A <- convert(V, RT, LT) ] + S => S [ A <- MInt2Unsigned({convert(V, RT, LT)}:>MInt{32}) ] + + rule X:Id = v(V, RT) => v(convert(V, RT, LT), LT) ... + THIS + TYPE + TYPE + ... X |-> (uint112 #as LT) + ... X |-> A ... + THIS + S => S [ A <- MInt2Unsigned({convert(V, RT, LT)}:>MInt{112}) ] + + rule X:Id = v(V, RT) => v(convert(V, RT, LT), LT) ... + THIS + TYPE + TYPE + ... X |-> (uint256 #as LT) + ... X |-> A ... + THIS + S => S [ A <- MInt2Unsigned({convert(V, RT, LT)}:>MInt{256}) ] + + rule X:Id = v(V, RT) => v(convert(V, RT, LT), LT) ... + THIS + TYPE + TYPE + ... X |-> (address #as LT) + ... X |-> A ... + THIS + S => S [ A <- MInt2Unsigned({convert(V, RT, LT)}:>MInt{160}) ] + + rule X:Id = v(V, RT) => v(convert(V, RT, LT), LT) ... + THIS + TYPE + TYPE + ... X |-> (bool #as LT) + ... X |-> A ... + THIS + S => S [ A <- #if V #then 1 #else 0 #fi ] + + rule X:Id = v(V, RT) => v(convert(V, RT, LT), LT) ... + THIS + TYPE + TYPE + ... X |-> LT:Id + ... X |-> A ... + THIS + S => S [ A <- MInt2Unsigned({convert(V, RT, LT)}:>MInt{160}) ] // literal assignment to local variable rule X:Id = N:Int => X = v(convert(N, LT), LT) ... @@ -97,14 +151,22 @@ module SOLIDITY-EXPRESSION S => S [ I <- write({S [ I ]}:>Value, L ListItem(Idx), convert(V, RT, LT), LT[]) ] rule lv(I:Int, L, LT []) [ v(Idx:MInt{256}, _) ] = v(V, RT) => v(convert(V, RT, LT), LT) ... S => S [ I <- write({S [ I ]}:>Value, L ListItem(MInt2Unsigned(Idx)), convert(V, RT, LT), LT[]) ] - rule lv(X:Id, L, mapping(LT1:ElementaryTypeName _ => T2)) [ v(Key, RT1) ] = v(V, RT) => v(convert(V, RT, T2), T2) ... + rule lv(X:Id, L, mapping(LT1:ElementaryTypeName _ => (uint256 #as T2))) [ v(Key, RT1) ] = v(V, RT) => v(convert(V, RT, T2), T2) ... THIS TYPE TYPE ... X |-> T ... ... X |-> A ... THIS - S => S [ A +Int computeStorageOffset(L ListItem(convert(Key, RT1, LT1)), T, 0) <- convert(V, RT, T2) ] + S => S [ A +Int computeStorageOffset(L ListItem(convert(Key, RT1, LT1)), T, 0) <- MInt2Unsigned({convert(V, RT, T2)}:>MInt{256}) ] + rule lv(X:Id, L, mapping(LT1:ElementaryTypeName _ => (address #as T2))) [ v(Key, RT1) ] = v(V, RT) => v(convert(V, RT, T2), T2) ... + THIS + TYPE + TYPE + ... X |-> T ... + ... X |-> A ... + THIS + S => S [ A +Int computeStorageOffset(L ListItem(convert(Key, RT1, LT1)), T, 0) <- MInt2Unsigned({convert(V, RT, T2)}:>MInt{160}) ] syntax Value ::= write(Value, List, Value, TypeName) [function] rule write(_, .List, V, _) => V @@ -124,11 +186,71 @@ module SOLIDITY-EXPRESSION TYPE // state variable lookup - rule X:Id => v({S[A] orDefault default(T)}:>Value, T) ... + rule X:Id => v(Int2MInt({S[A] orDefault 0}:>Int)::MInt{8}, T) ... THIS TYPE TYPE - ... X |-> T ... + ... X |-> (uint8 #as T) ... + ... X |-> A ... + THIS + S + requires notBool isAggregateType(T) + + rule X:Id => v(Int2MInt({S[A] orDefault 0}:>Int)::MInt{32}, T) ... + THIS + TYPE + TYPE + ... X |-> (uint32 #as T) ... + ... X |-> A ... + THIS + S + requires notBool isAggregateType(T) + + rule X:Id => v(Int2MInt({S[A] orDefault 0}:>Int)::MInt{112}, T) ... + THIS + TYPE + TYPE + ... X |-> (uint112 #as T) ... + ... X |-> A ... + THIS + S + requires notBool isAggregateType(T) + + rule X:Id => v(Int2MInt({S[A] orDefault 0}:>Int)::MInt{256}, T) ... + THIS + TYPE + TYPE + ... X |-> (uint256 #as T) ... + ... X |-> A ... + THIS + S + requires notBool isAggregateType(T) + + rule X:Id => v(Int2MInt({S[A] orDefault 0}:>Int)::MInt{160}, T) ... + THIS + TYPE + TYPE + ... X |-> (address #as T) ... + ... X |-> A ... + THIS + S + requires notBool isAggregateType(T) + + rule X:Id => v(#if {S[A] orDefault 0}:>Int =/=Int 0 #then true #else false #fi, T) ... + THIS + TYPE + TYPE + ... X |-> (bool #as T) ... + ... X |-> A ... + THIS + S + requires notBool isAggregateType(T) + + rule X:Id => v(Int2MInt({S[A] orDefault 0}:>Int)::MInt{160}, T) ... + THIS + TYPE + TYPE + ... X |-> T:Id ... ... X |-> A ... THIS S @@ -157,7 +279,16 @@ module SOLIDITY-EXPRESSION rule lv(I:Int, L, T []) [ v(Idx:MInt{256}, _) ] => v(read(V, L ListItem(MInt2Unsigned(Idx)), T[]), T) ... _ [ I <- V ] requires notBool isAggregateType(T) - rule lv(X:Id, L, mapping(T1:ElementaryTypeName _ => T2)) [ v(Key, RT) ] => v({S[A +Int computeStorageOffset(L ListItem(convert(Key, RT, T1)), T, 0)] orDefault default(T2)}:>Value, T2) ... + rule lv(X:Id, L, mapping(T1:ElementaryTypeName _ => (uint256 #as T2))) [ v(Key, RT) ] => v(Int2MInt({S[A +Int computeStorageOffset(L ListItem(convert(Key, RT, T1)), T, 0)] orDefault 0}:>Int)::MInt{256}, T2) ... + THIS + TYPE + TYPE + ... X |-> T ... + ... X |-> A ... + THIS + S + requires notBool isAggregateType(T2) + rule lv(X:Id, L, mapping(T1:ElementaryTypeName _ => (address #as T2))) [ v(Key, RT) ] => v(Int2MInt({S[A +Int computeStorageOffset(L ListItem(convert(Key, RT, T1)), T, 0)] orDefault 0}:>Int)::MInt{160}, T2) ... THIS TYPE TYPE From 4053b787586e246d0218e32b583d18f14bedd68d Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Thu, 17 Oct 2024 17:13:03 -0500 Subject: [PATCH 09/41] Used keccak256 to compute storage indices instead. --- Makefile | 6 ++++-- src/contract.md | 9 ++++----- src/expression.md | 44 +++++++++++++++++++++----------------------- src/solidity.md | 35 ----------------------------------- 4 files changed, 29 insertions(+), 65 deletions(-) diff --git a/Makefile b/Makefile index aeffd60..0625316 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,9 @@ MAIN_MODULE = SOLIDITY OUTPUT_DIR = out ULMDIR = ../ulm ULMINCLUDE = $(ULMDIR)/kllvm -CFLAGS = -ccopt -L$(ULMINCLUDE) -ccopt -lulmkllvm +EVMDIR = ../evm-semantics +KRYPTOINCLUDE = $(EVMDIR)/kevm-pyk/src/kevm_pyk/kproj/plugin +CFLAGS = -ccopt -std=c++17 -ccopt -lssl -ccopt -lcrypto -ccopt -lsecp256k1 -ccopt $(EVMDIR)/krypto.a -ccopt -L$(ULMINCLUDE) -ccopt -lulmkllvm UNISWAP_PARAMS = $(EXAMPLES_DIR)/swaps/UniswapV2Swap.sol 2>&1 1>$(OUTPUT_DIR)/uniswap.ast UNISWAPRN_PARAMS = $(EXAMPLES_DIR)/swaps/UniswapV2SwapRenamed.sol 2>&1 1>$(OUTPUT_DIR)/uniswaprn.ast @@ -26,7 +28,7 @@ TRANSACTIONS = $(shell find $(TRANSACTIONS_DIR) -name "*.txn") EXAMPLE_TESTS = $(patsubst %.txn, %.out, $(TRANSACTIONS)) build: $(SEMANTICS_DIR)/$(SEMANTICS_FILE) - kompile $(SEMANTICS_DIR)/$(SEMANTICS_FILE) --main-module $(MAIN_MODULE) --hook-namespaces 'ULM' -I $(ULMINCLUDE) $(CFLAGS) --gen-glr-bison-parser -O2 --heuristic pbaL + kompile $(SEMANTICS_DIR)/$(SEMANTICS_FILE) --main-module $(MAIN_MODULE) --hook-namespaces 'ULM KRYPTO' -I $(ULMINCLUDE) -I $(KRYPTOINCLUDE) $(CFLAGS) --gen-glr-bison-parser -O2 --heuristic pbaL clean: test-clean rm -Rf $(SEMANTICS_FILE_NAME)-kompiled diff --git a/src/contract.md b/src/contract.md index b87eccf..e57f306 100644 --- a/src/contract.md +++ b/src/contract.md @@ -3,7 +3,6 @@ ```k module SOLIDITY-CONTRACT imports SOLIDITY-CONFIGURATION - imports SOLIDITY-UTILS-SYNTAX rule contract X:Id { Body } => Body ... _ => X @@ -76,7 +75,7 @@ module SOLIDITY-CONTRACT C C Env => Env [ X <- T ] - A => A +Int addressRangeSize(T) + A => A +Int 1 B => B [ X <- A ] .Bag => @@ -116,14 +115,14 @@ module SOLIDITY-CONTRACT C C Env => Env [ X <- T ] - A => A +Int addressRangeSize(T) + A => A +Int 1 B => B [ X <- A ] rule T:TypeName public X:Id = E ; => .K ... C C Env => Env [ X <- T ] - A => A +Int addressRangeSize(T) + A => A +Int 1 B => B [ X <- A ] ... .List => ListItem(X = E;) @@ -144,7 +143,7 @@ module SOLIDITY-CONTRACT C C Env => Env [ X <- T ] - A => A +Int addressRangeSize(T) + A => A +Int 1 B => B [ X <- A ] ... .List => ListItem(X = E;) diff --git a/src/expression.md b/src/expression.md index 8893b8f..eaf1bb6 100644 --- a/src/expression.md +++ b/src/expression.md @@ -1,13 +1,15 @@ # Solidity expressions ```k +requires "plugin/krypto.md" module SOLIDITY-EXPRESSION imports SOLIDITY-CONFIGURATION - imports SOLIDITY-UTILS-SYNTAX imports INT imports ULM + imports BYTES imports K-EQUAL + imports KRYPTO // new contract rule new X:Id ( ARGS ) ~> K => bind(S, PARAMS, TYPES, ARGS, .List, .List) ~> List2Statements(INIT) ~> BODY ~> return v(ADDR, X) ; @@ -155,18 +157,16 @@ module SOLIDITY-EXPRESSION THIS TYPE TYPE - ... X |-> T ... ... X |-> A ... THIS - S => S [ A +Int computeStorageOffset(L ListItem(convert(Key, RT1, LT1)), T, 0) <- MInt2Unsigned({convert(V, RT, T2)}:>MInt{256}) ] + S => S [ computeStorageIndex(L ListItem(convert(Key, RT1, LT1)), A) <- MInt2Unsigned({convert(V, RT, T2)}:>MInt{256}) ] rule lv(X:Id, L, mapping(LT1:ElementaryTypeName _ => (address #as T2))) [ v(Key, RT1) ] = v(V, RT) => v(convert(V, RT, T2), T2) ... THIS TYPE TYPE - ... X |-> T ... ... X |-> A ... THIS - S => S [ A +Int computeStorageOffset(L ListItem(convert(Key, RT1, LT1)), T, 0) <- MInt2Unsigned({convert(V, RT, T2)}:>MInt{160}) ] + S => S [ computeStorageIndex(L ListItem(convert(Key, RT1, LT1)), A) <- MInt2Unsigned({convert(V, RT, T2)}:>MInt{160}) ] syntax Value ::= write(Value, List, Value, TypeName) [function] rule write(_, .List, V, _) => V @@ -279,20 +279,18 @@ module SOLIDITY-EXPRESSION rule lv(I:Int, L, T []) [ v(Idx:MInt{256}, _) ] => v(read(V, L ListItem(MInt2Unsigned(Idx)), T[]), T) ... _ [ I <- V ] requires notBool isAggregateType(T) - rule lv(X:Id, L, mapping(T1:ElementaryTypeName _ => (uint256 #as T2))) [ v(Key, RT) ] => v(Int2MInt({S[A +Int computeStorageOffset(L ListItem(convert(Key, RT, T1)), T, 0)] orDefault 0}:>Int)::MInt{256}, T2) ... + rule lv(X:Id, L, mapping(T1:ElementaryTypeName _ => (uint256 #as T2))) [ v(Key, RT) ] => v(Int2MInt({S[computeStorageIndex(L ListItem(convert(Key, RT, T1)), A)] orDefault 0}:>Int)::MInt{256}, T2) ... THIS TYPE TYPE - ... X |-> T ... ... X |-> A ... THIS S requires notBool isAggregateType(T2) - rule lv(X:Id, L, mapping(T1:ElementaryTypeName _ => (address #as T2))) [ v(Key, RT) ] => v(Int2MInt({S[A +Int computeStorageOffset(L ListItem(convert(Key, RT, T1)), T, 0)] orDefault 0}:>Int)::MInt{160}, T2) ... + rule lv(X:Id, L, mapping(T1:ElementaryTypeName _ => (address #as T2))) [ v(Key, RT) ] => v(Int2MInt({S[computeStorageIndex(L ListItem(convert(Key, RT, T1)), A)] orDefault 0}:>Int)::MInt{160}, T2) ... THIS TYPE TYPE - ... X |-> T ... ... X |-> A ... THIS S @@ -305,20 +303,20 @@ module SOLIDITY-EXPRESSION rule lv(R, L, mapping(T1:ElementaryTypeName _ => T2)) [ v(V, RT) ] => lv(R, L ListItem(convert(V, RT, T1)), T2) ... requires isAggregateType(T2) - syntax Int ::= computeStorageOffset(List, TypeName, Int) [function] - rule computeStorageOffset(.List, _, Acc) => Acc - rule computeStorageOffset(ListItem(K:MInt{8}) L, mapping(uint8 _ => T2 _), Acc) => - computeStorageOffset(L, T2, Acc *Int range(uint8) +Int MInt2Unsigned(K)) - rule computeStorageOffset(ListItem(K:MInt{32}) L, mapping(uint32 _ => T2 _), Acc) => - computeStorageOffset(L, T2, Acc *Int range(uint32) +Int MInt2Unsigned(K)) - rule computeStorageOffset(ListItem(K:MInt{112}) L, mapping(uint112 _ => T2 _), Acc) => - computeStorageOffset(L, T2, Acc *Int range(uint112) +Int MInt2Unsigned(K)) - rule computeStorageOffset(ListItem(K:MInt{256}) L, mapping(uint256 _ => T2 _), Acc) => - computeStorageOffset(L, T2, Acc *Int range(uint256) +Int MInt2Unsigned(K)) - rule computeStorageOffset(ListItem(K:MInt{160}) L, mapping(address _ => T2 _), Acc) => - computeStorageOffset(L, T2, Acc *Int range(address) +Int MInt2Unsigned(K)) - rule computeStorageOffset(ListItem(K:Bool) L, mapping(bool _ => T2 _), Acc) => - computeStorageOffset(L, T2, Acc *Int range(bool) +Int #if K #then 1 #else 0 #fi) + syntax Int ::= computeStorageIndex(List, Int) [function] + rule computeStorageIndex(.List, N) => N + rule computeStorageIndex(ListItem(K:MInt{8}) L, N) => + computeStorageIndex(L, Bytes2Int(Keccak256raw(Int2Bytes(32, N, BE) +Bytes Int2Bytes(32, MInt2Unsigned(K), BE)), BE, Unsigned)) + rule computeStorageIndex(ListItem(K:MInt{32}) L, N) => + computeStorageIndex(L, Bytes2Int(Keccak256raw(Int2Bytes(32, N, BE) +Bytes Int2Bytes(32, MInt2Unsigned(K), BE)), BE, Unsigned)) + rule computeStorageIndex(ListItem(K:MInt{112}) L, N) => + computeStorageIndex(L, Bytes2Int(Keccak256raw(Int2Bytes(32, N, BE) +Bytes Int2Bytes(32, MInt2Unsigned(K), BE)), BE, Unsigned)) + rule computeStorageIndex(ListItem(K:MInt{160}) L, N) => + computeStorageIndex(L, Bytes2Int(Keccak256raw(Int2Bytes(32, N, BE) +Bytes Int2Bytes(32, MInt2Unsigned(K), BE)), BE, Unsigned)) + rule computeStorageIndex(ListItem(K:MInt{256}) L, N) => + computeStorageIndex(L, Bytes2Int(Keccak256raw(Int2Bytes(32, N, BE) +Bytes Int2Bytes(32, MInt2Unsigned(K), BE)), BE, Unsigned)) + rule computeStorageIndex(ListItem(K:Bool) L, N) => + computeStorageIndex(L, Bytes2Int(Keccak256raw(Int2Bytes(32, N, BE) +Bytes Int2Bytes(32, #if K #then 1 #else 0 #fi, BE)), BE, Unsigned)) syntax Value ::= read(Value, List, TypeName) [function] rule read(V, .List, _) => V diff --git a/src/solidity.md b/src/solidity.md index 00f87ee..ab0799a 100644 --- a/src/solidity.md +++ b/src/solidity.md @@ -218,40 +218,6 @@ module SOLIDITY-DATA endmodule ``` -```k -module SOLIDITY-UTILS-SYNTAX - imports SOLIDITY-SYNTAX - imports INT-SYNTAX - - syntax Int ::= addressRangeSize(TypeName) [function] - syntax Int ::= range(ElementaryTypeName) [function] -endmodule -``` - -```k -module SOLIDITY-UTILS - imports SOLIDITY-UTILS-SYNTAX - imports SOLIDITY-DATA - imports INT - imports BOOL - -// This address schema is limited to supporting the state variables found in -// UniSwapV2Swap.sol, i.e. stae variables or primitive types, and mappings/double -// mappins with only primitive types as keys. We do not currently support array -// state variables with this address assignment schema. - rule addressRangeSize(mapping(T1:ElementaryTypeName _ => T2 _)) => range(T1) *Int addressRangeSize(T2) - rule addressRangeSize(T) => 1 - requires notBool isAggregateType(T) - rule range(uint8) => 2 ^Int 8 - rule range(uint32) => 2 ^Int 32 - rule range(uint112) => 2 ^Int 112 - rule range(uint256) => 2 ^Int 256 - rule range(address) => 2 ^Int 160 - rule range(bool) => 2 - -endmodule -``` - ```k module SOLIDITY imports SOLIDITY-CONFIGURATION @@ -260,7 +226,6 @@ module SOLIDITY imports SOLIDITY-TRANSACTION imports SOLIDITY-EXPRESSION imports SOLIDITY-STATEMENT - imports SOLIDITY-UTILS rule _:PragmaDefinition Ss:SourceUnits => Ss ... rule S:SourceUnit Ss:SourceUnits => S ~> Ss From 7040cc83961f8dc7777568479a9b0166c4dd75d6 Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Thu, 17 Oct 2024 19:04:15 -0500 Subject: [PATCH 10/41] Used ULM interface for state variable assignment and lookup. --- src/expression.md | 90 ++++++++++------------------------------------- 1 file changed, 18 insertions(+), 72 deletions(-) diff --git a/src/expression.md b/src/expression.md index eaf1bb6..015883b 100644 --- a/src/expression.md +++ b/src/expression.md @@ -72,68 +72,47 @@ module SOLIDITY-EXPRESSION ... X |-> LT // assignment to state variable - rule X:Id = v(V, RT) => v(convert(V, RT, LT), LT) ... - THIS + rule X:Id = v(V, RT) => SetAccountStorage(A, MInt2Unsigned({convert(V, RT, LT)}:>MInt{8})) ~> v(convert(V, RT, LT), LT) ... TYPE TYPE ... X |-> (uint8 #as LT) ... X |-> A ... - THIS - S => S [ A <- MInt2Unsigned({convert(V, RT, LT)}:>MInt{8}) ] - rule X:Id = v(V, RT) => v(convert(V, RT, LT), LT) ... - THIS + rule X:Id = v(V, RT) => SetAccountStorage(A, MInt2Unsigned({convert(V, RT, LT)}:>MInt{32})) ~> v(convert(V, RT, LT), LT) ... TYPE TYPE ... X |-> (uint32 #as LT) ... X |-> A ... - THIS - S => S [ A <- MInt2Unsigned({convert(V, RT, LT)}:>MInt{32}) ] - rule X:Id = v(V, RT) => v(convert(V, RT, LT), LT) ... - THIS + rule X:Id = v(V, RT) => SetAccountStorage(A, MInt2Unsigned({convert(V, RT, LT)}:>MInt{112})) ~> v(convert(V, RT, LT), LT) ... TYPE TYPE ... X |-> (uint112 #as LT) ... X |-> A ... - THIS - S => S [ A <- MInt2Unsigned({convert(V, RT, LT)}:>MInt{112}) ] - rule X:Id = v(V, RT) => v(convert(V, RT, LT), LT) ... - THIS + rule X:Id = v(V, RT) => SetAccountStorage(A, MInt2Unsigned({convert(V, RT, LT)}:>MInt{256})) ~> v(convert(V, RT, LT), LT) ... TYPE TYPE ... X |-> (uint256 #as LT) ... X |-> A ... - THIS - S => S [ A <- MInt2Unsigned({convert(V, RT, LT)}:>MInt{256}) ] - rule X:Id = v(V, RT) => v(convert(V, RT, LT), LT) ... - THIS + rule X:Id = v(V, RT) => SetAccountStorage(A, MInt2Unsigned({convert(V, RT, LT)}:>MInt{160})) ~> v(convert(V, RT, LT), LT) ... TYPE TYPE ... X |-> (address #as LT) ... X |-> A ... - THIS - S => S [ A <- MInt2Unsigned({convert(V, RT, LT)}:>MInt{160}) ] - rule X:Id = v(V, RT) => v(convert(V, RT, LT), LT) ... - THIS + rule X:Id = v(V, RT) => SetAccountStorage(A, #if V #then 1 #else 0 #fi) ~> v(convert(V, RT, LT), LT) ... TYPE TYPE ... X |-> (bool #as LT) ... X |-> A ... - THIS - S => S [ A <- #if V #then 1 #else 0 #fi ] - rule X:Id = v(V, RT) => v(convert(V, RT, LT), LT) ... - THIS + rule X:Id = v(V, RT) => SetAccountStorage(A, MInt2Unsigned({convert(V, RT, LT)}:>MInt{160})) ~> v(convert(V, RT, LT), LT) ... TYPE TYPE ... X |-> LT:Id ... X |-> A ... - THIS - S => S [ A <- MInt2Unsigned({convert(V, RT, LT)}:>MInt{160}) ] // literal assignment to local variable rule X:Id = N:Int => X = v(convert(N, LT), LT) ... @@ -153,20 +132,14 @@ module SOLIDITY-EXPRESSION S => S [ I <- write({S [ I ]}:>Value, L ListItem(Idx), convert(V, RT, LT), LT[]) ] rule lv(I:Int, L, LT []) [ v(Idx:MInt{256}, _) ] = v(V, RT) => v(convert(V, RT, LT), LT) ... S => S [ I <- write({S [ I ]}:>Value, L ListItem(MInt2Unsigned(Idx)), convert(V, RT, LT), LT[]) ] - rule lv(X:Id, L, mapping(LT1:ElementaryTypeName _ => (uint256 #as T2))) [ v(Key, RT1) ] = v(V, RT) => v(convert(V, RT, T2), T2) ... - THIS + rule lv(X:Id, L, mapping(LT1:ElementaryTypeName _ => (uint256 #as T2))) [ v(Key, RT1) ] = v(V, RT) => SetAccountStorage(computeStorageIndex(L ListItem(convert(Key, RT1, LT1)), A), MInt2Unsigned({convert(V, RT, T2)}:>MInt{256})) ~> v(convert(V, RT, T2), T2) ... TYPE TYPE ... X |-> A ... - THIS - S => S [ computeStorageIndex(L ListItem(convert(Key, RT1, LT1)), A) <- MInt2Unsigned({convert(V, RT, T2)}:>MInt{256}) ] - rule lv(X:Id, L, mapping(LT1:ElementaryTypeName _ => (address #as T2))) [ v(Key, RT1) ] = v(V, RT) => v(convert(V, RT, T2), T2) ... - THIS + rule lv(X:Id, L, mapping(LT1:ElementaryTypeName _ => (address #as T2))) [ v(Key, RT1) ] = v(V, RT) => SetAccountStorage(computeStorageIndex(L ListItem(convert(Key, RT1, LT1)), A), MInt2Unsigned({convert(V, RT, T2)}:>MInt{160})) ~> v(convert(V, RT, T2), T2) ... TYPE TYPE ... X |-> A ... - THIS - S => S [ computeStorageIndex(L ListItem(convert(Key, RT1, LT1)), A) <- MInt2Unsigned({convert(V, RT, T2)}:>MInt{160}) ] syntax Value ::= write(Value, List, Value, TypeName) [function] rule write(_, .List, V, _) => V @@ -186,74 +159,53 @@ module SOLIDITY-EXPRESSION TYPE // state variable lookup - rule X:Id => v(Int2MInt({S[A] orDefault 0}:>Int)::MInt{8}, T) ... - THIS + rule X:Id => v(Int2MInt(GetAccountStorage(A))::MInt{8}, T) ... TYPE TYPE ... X |-> (uint8 #as T) ... ... X |-> A ... - THIS - S requires notBool isAggregateType(T) - rule X:Id => v(Int2MInt({S[A] orDefault 0}:>Int)::MInt{32}, T) ... - THIS + rule X:Id => v(Int2MInt(GetAccountStorage(A))::MInt{32}, T) ... TYPE TYPE ... X |-> (uint32 #as T) ... ... X |-> A ... - THIS - S requires notBool isAggregateType(T) - rule X:Id => v(Int2MInt({S[A] orDefault 0}:>Int)::MInt{112}, T) ... - THIS + rule X:Id => v(Int2MInt(GetAccountStorage(A))::MInt{112}, T) ... TYPE TYPE ... X |-> (uint112 #as T) ... ... X |-> A ... - THIS - S requires notBool isAggregateType(T) - rule X:Id => v(Int2MInt({S[A] orDefault 0}:>Int)::MInt{256}, T) ... - THIS + rule X:Id => v(Int2MInt(GetAccountStorage(A))::MInt{256}, T) ... TYPE TYPE ... X |-> (uint256 #as T) ... ... X |-> A ... - THIS - S requires notBool isAggregateType(T) - rule X:Id => v(Int2MInt({S[A] orDefault 0}:>Int)::MInt{160}, T) ... - THIS + rule X:Id => v(Int2MInt(GetAccountStorage(A))::MInt{160}, T) ... TYPE TYPE ... X |-> (address #as T) ... ... X |-> A ... - THIS - S requires notBool isAggregateType(T) - rule X:Id => v(#if {S[A] orDefault 0}:>Int =/=Int 0 #then true #else false #fi, T) ... - THIS + rule X:Id => v(#if GetAccountStorage(A) =/=Int 0 #then true #else false #fi, T) ... TYPE TYPE ... X |-> (bool #as T) ... ... X |-> A ... - THIS - S requires notBool isAggregateType(T) - rule X:Id => v(Int2MInt({S[A] orDefault 0}:>Int)::MInt{160}, T) ... - THIS + rule X:Id => v(Int2MInt(GetAccountStorage(A))::MInt{160}, T) ... TYPE TYPE ... X |-> T:Id ... ... X |-> A ... - THIS - S requires notBool isAggregateType(T) rule X:Id => lv(X, .List, T) ... @@ -279,21 +231,15 @@ module SOLIDITY-EXPRESSION rule lv(I:Int, L, T []) [ v(Idx:MInt{256}, _) ] => v(read(V, L ListItem(MInt2Unsigned(Idx)), T[]), T) ... _ [ I <- V ] requires notBool isAggregateType(T) - rule lv(X:Id, L, mapping(T1:ElementaryTypeName _ => (uint256 #as T2))) [ v(Key, RT) ] => v(Int2MInt({S[computeStorageIndex(L ListItem(convert(Key, RT, T1)), A)] orDefault 0}:>Int)::MInt{256}, T2) ... - THIS + rule lv(X:Id, L, mapping(T1:ElementaryTypeName _ => (uint256 #as T2))) [ v(Key, RT) ] => v(Int2MInt(GetAccountStorage(computeStorageIndex(L ListItem(convert(Key, RT, T1)), A)))::MInt{256}, T2) ... TYPE TYPE ... X |-> A ... - THIS - S requires notBool isAggregateType(T2) - rule lv(X:Id, L, mapping(T1:ElementaryTypeName _ => (address #as T2))) [ v(Key, RT) ] => v(Int2MInt({S[computeStorageIndex(L ListItem(convert(Key, RT, T1)), A)] orDefault 0}:>Int)::MInt{160}, T2) ... - THIS + rule lv(X:Id, L, mapping(T1:ElementaryTypeName _ => (address #as T2))) [ v(Key, RT) ] => v(Int2MInt(GetAccountStorage(computeStorageIndex(L ListItem(convert(Key, RT, T1)), A)))::MInt{160}, T2) ... TYPE TYPE ... X |-> A ... - THIS - S requires notBool isAggregateType(T2) rule lv(R, L, T []) [ Idx:Int ] => lv(R, L ListItem(Idx), T) ... From 8f64feb38ebe4e03f355eea18a3de996f3b280df Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Thu, 17 Oct 2024 21:09:40 -0500 Subject: [PATCH 11/41] Removed contract-storage cell. --- src/solidity.md | 1 - 1 file changed, 1 deletion(-) diff --git a/src/solidity.md b/src/solidity.md index ab0799a..b66946f 100644 --- a/src/solidity.md +++ b/src/solidity.md @@ -79,7 +79,6 @@ module SOLIDITY-CONFIGURATION 0p160 Id - .Map 2p160 From 1b466e5f12a3e1dea963a369285ea98d3169dcfc Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Fri, 18 Oct 2024 16:56:06 -0500 Subject: [PATCH 12/41] Function selector computation. --- src/contract.md | 83 +++++++++++++++++++++++++++++++++++++++++++++++ src/expression.md | 2 -- src/solidity.md | 3 ++ 3 files changed, 86 insertions(+), 2 deletions(-) diff --git a/src/contract.md b/src/contract.md index e57f306..3f2b7f9 100644 --- a/src/contract.md +++ b/src/contract.md @@ -3,6 +3,8 @@ ```k module SOLIDITY-CONTRACT imports SOLIDITY-CONFIGURATION + imports SOLIDITY-FUNCTION-SELECTORS-SYNTAX + imports K-EQUAL rule contract X:Id { Body } => Body ... _ => X @@ -14,6 +16,7 @@ module SOLIDITY-CONTRACT rule function X ( Params ) F:FunctionSpecifiers { Body } => .K ... C C + Sel => Sel[ functionSelector(X, getTypes(Params)) <- X ] .Bag => X @@ -26,10 +29,28 @@ module SOLIDITY-CONTRACT ... + requires getVisibility(F) ==K public orBool getVisibility(F) ==K external + + rule function X ( Params ) F:FunctionSpecifiers { Body } => .K ... + C + C + + .Bag => + X + getVisibility(F) + getPayable(F) + getTypes(Params) + getNames(Params) + Body + ... + + ... + [owise] rule function X ( Params ) F:FunctionSpecifiers returns ( Rets ) { Body } => .K ... C C + Sel => Sel[ functionSelector(X, getTypes(Params)) <- X ] .Bag => X @@ -44,6 +65,25 @@ module SOLIDITY-CONTRACT ... + requires getVisibility(F) ==K public orBool getVisibility(F) ==K external + + rule function X ( Params ) F:FunctionSpecifiers returns ( Rets ) { Body } => .K ... + C + C + + .Bag => + X + getVisibility(F) + getPayable(F) + getTypes(Params) + getNames(Params) + getTypes(Rets) + getNames(Rets) + Body + ... + + ... + [owise] syntax VisibilitySpecifier ::= getVisibility(FunctionSpecifiers) [function] rule getVisibility(private _) => private @@ -74,6 +114,7 @@ module SOLIDITY-CONTRACT rule T:TypeName public X:Id ; => .K ... C C + Sel => Sel[ functionSelector(X, accessorTypes(T)) <- X ] Env => Env [ X <- T ] A => A +Int 1 B => B [ X <- A ] @@ -121,6 +162,7 @@ module SOLIDITY-CONTRACT rule T:TypeName public X:Id = E ; => .K ... C C + Sel => Sel[ functionSelector(X, accessorTypes(T)) <- X ] Env => Env [ X <- T ] A => A +Int 1 B => B [ X <- A ] @@ -163,3 +205,44 @@ module SOLIDITY-CONTRACT endmodule ``` + +```k +module SOLIDITY-FUNCTION-SELECTORS + imports SOLIDITY-FUNCTION-SELECTORS-SYNTAX + imports BYTES + imports K-EQUAL + imports KRYPTO + +// The following rules to create function selectors have been adapted from SIMPLE. +// Converts a type to the corresponding string that would represent it +// in a function selector according to the EVM ABI. +// We only handle types as needed for the demo for now, and the rest are not tested. + syntax String ::= typeName2String(TypeName) [function] + rule typeName2String(uint256) => "uint256" + rule typeName2String(uint112) => "uint112" + rule typeName2String(uint32) => "uint32" + rule typeName2String(uint8) => "uint8" + rule typeName2String(address) => "address" + rule typeName2String(bool) => "bool" + rule typeName2String(T[]) => typeName2String(T) +String "[]" + + syntax String ::= functionSignature(Id, List) [function] + | functionSignatureParams(List, String, Bool) [function] + rule functionSignature(F:Id, Ps:List) + => functionSignatureParams(Ps, Id2String(F) +String "(", false) + rule functionSignatureParams(.List, Sig:String, _:Bool) => Sig +String ")" + rule functionSignatureParams(ListItem(T) Ps, Sig:String, AddComma:Bool) + => functionSignatureParams(Ps, (#if AddComma #then Sig +String "," #else Sig #fi) +String typeName2String(T), true) + + rule functionSelector(F:Id, Ps:List) + => Bytes2String(substrBytes(Keccak256raw(String2Bytes(functionSignature(F, Ps))), 0, 4)) + +endmodule +``` + +```k +module SOLIDITY-FUNCTION-SELECTORS-SYNTAX + imports SOLIDITY-DATA + syntax String ::= functionSelector(Id, List) [function] +endmodule +``` diff --git a/src/expression.md b/src/expression.md index 015883b..496f7d4 100644 --- a/src/expression.md +++ b/src/expression.md @@ -1,8 +1,6 @@ # Solidity expressions ```k -requires "plugin/krypto.md" - module SOLIDITY-EXPRESSION imports SOLIDITY-CONFIGURATION imports INT diff --git a/src/solidity.md b/src/solidity.md index b66946f..1ddc87d 100644 --- a/src/solidity.md +++ b/src/solidity.md @@ -8,6 +8,7 @@ requires "transaction.md" requires "expression.md" requires "statement.md" requires "ulm.k" +requires "plugin/krypto.md" module SOLIDITY-CONFIGURATION imports SOLIDITY-DATA @@ -41,6 +42,7 @@ module SOLIDITY-CONFIGURATION 0:Int .Map .List + .Map Id @@ -225,6 +227,7 @@ module SOLIDITY imports SOLIDITY-TRANSACTION imports SOLIDITY-EXPRESSION imports SOLIDITY-STATEMENT + imports SOLIDITY-FUNCTION-SELECTORS rule _:PragmaDefinition Ss:SourceUnits => Ss ... rule S:SourceUnit Ss:SourceUnits => S ~> Ss From 354d464f41f4398482ef4f884a2f4b544ce8837c Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Fri, 18 Oct 2024 20:08:49 -0500 Subject: [PATCH 13/41] K cell initial configutation for $CREATE=FALSE. --- src/solidity-syntax.md | 3 +++ src/solidity.md | 49 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/src/solidity-syntax.md b/src/solidity-syntax.md index 25c8fce..a8cd82a 100644 --- a/src/solidity-syntax.md +++ b/src/solidity-syntax.md @@ -14,6 +14,7 @@ We use `bool`, `string` and `id` modules, `int`s are defined in a custom way due imports BOOL-SYNTAX imports STRING-SYNTAX imports ID-SYNTAX + imports BYTES-SYNTAX syntax KResult ``` @@ -67,6 +68,8 @@ Parsing starts from `Program` rule. A program is a pragma definition followed by ```k syntax Program ::= PragmaDefinition SourceUnits + | decodeProgram(Bytes) [function, hook(ULM.decode)] + ``` diff --git a/src/solidity.md b/src/solidity.md index 1ddc87d..99c893f 100644 --- a/src/solidity.md +++ b/src/solidity.md @@ -13,13 +13,15 @@ requires "plugin/krypto.md" module SOLIDITY-CONFIGURATION imports SOLIDITY-DATA imports SOLIDITY-SYNTAX + imports BYTES + imports K-EQUAL imports ULM syntax Id ::= "Id" [token] configuration - $PGM:Program ~> $TXN:Transactions + decodeProgram($PGM:Bytes) ~> execute($CREATE:Bool, #if $CREATE:Bool #then $PGM:Bytes #else CallData() #fi) $ISUNISWAP:Bool Id @@ -89,6 +91,51 @@ module SOLIDITY-CONFIGURATION + syntax KItem ::= execute(Bool, Bytes) + + // The active contract should be the last one in the list of contracts as + // decoded by the provided $PGM. + rule execute(false, B) => + #let Sel = Bytes2String(substrBytes(B, 0, 4)) #in + #let ARGS::CallArgumentList = decodeArgs(substrBytes(B, 4, lengthBytes(B)), ParamTypes) #in + F ( ARGS ) + + TYPE + TYPE + ... Sel |-> F:Id ... + F + ParamTypes + + syntax TypedVal ::= decodeArg(Bytes, Int, ElementaryTypeName) [function] + rule decodeArg(B:Bytes, I:Int, uint256) => + v(Int2MInt(Bytes2Int(substrBytes(B, I, I +Int 32), BE, Unsigned))::MInt{256}, uint256) + rule decodeArg(B:Bytes, I:Int, uint112) => + v(Int2MInt(Bytes2Int(substrBytes(B, I, I +Int 32), BE, Unsigned))::MInt{112}, uint256) + rule decodeArg(B:Bytes, I:Int, uint32) => + v(Int2MInt(Bytes2Int(substrBytes(B, I, I +Int 32), BE, Unsigned))::MInt{32}, uint256) + rule decodeArg(B:Bytes, I:Int, uint8) => + v(Int2MInt(Bytes2Int(substrBytes(B, I, I +Int 32), BE, Unsigned))::MInt{8}, uint256) + rule decodeArg(B:Bytes, I:Int, address) => + v(Int2MInt(Bytes2Int(substrBytes(B, I, I +Int 32), BE, Unsigned))::MInt{160}, uint256) + rule decodeArg(B:Bytes, I:Int, bool) => + v(#if Bytes2Int(substrBytes(B, I, I +Int 32), BE, Unsigned) =/=Int 0 #then true #else false #fi, bool) + + syntax TypedVals ::= decodeArgs(Bytes, List) [function] + | decodeArgs(Bytes, Int, List, TypedVals) [function] + rule decodeArgs(B:Bytes, TL:List) => decodeArgs(B, 0, TL, .TypedVals) + rule decodeArgs(B:Bytes, I:Int, .List, TVs:TypedVals) => reverseTypedVals(TVs) + requires I ==Int lengthBytes(B) + rule decodeArgs(B:Bytes, I:Int, ListItem(T:ElementaryTypeName) Ts, TVs:TypedVals) => + decodeArgs(B, I +Int 32, Ts, (decodeArg(B, I, T), TVs)) + requires I >=Int 0 andBool I +Int 32 <=Int lengthBytes(B) + + syntax TypedVals ::= reverseTypedVals(TypedVals) [function] + | reverseTypedVals(TypedVals, TypedVals) [function] + rule reverseTypedVals(TVs:TypedVals) => reverseTypedVals(TVs, .TypedVals) + rule reverseTypedVals(.TypedVals, TVs:TypedVals) => TVs + rule reverseTypedVals((TV, TVs):TypedVals, TVs':TypedVals) => + reverseTypedVals(TVs, (TV, TVs')) + endmodule ``` From 9ee3d761aa0c1a07fd0191d58c6236474a9f1b4e Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Sun, 20 Oct 2024 12:46:51 -0500 Subject: [PATCH 14/41] Execute for $CREATE=True --- src/expression.md | 4 ---- src/solidity.md | 15 +++++++++++++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/expression.md b/src/expression.md index 496f7d4..e6f0b90 100644 --- a/src/expression.md +++ b/src/expression.md @@ -470,10 +470,6 @@ module SOLIDITY-EXPRESSION rule DecimalString2Int(S) => String2Int(replaceAll(substrString(S, 0, findChar(S, "eE", 0)), "_", "")) *Int 10 ^Int String2Int(replaceAll(substrString(S, findChar(S, "eE", 0) +Int 1, lengthString(S)), "_", "")) requires findChar(S, ".", 0) ==Int -1 [owise] - syntax Statements ::= List2Statements(List) [function] - rule List2Statements(.List) => .Statements - rule List2Statements(ListItem(S) L) => S List2Statements(L) - syntax KItem ::= var(Int, TypeName) syntax KItem ::= bind(List, List, List, CallArgumentList, List, List) diff --git a/src/solidity.md b/src/solidity.md index 99c893f..398ddbe 100644 --- a/src/solidity.md +++ b/src/solidity.md @@ -93,6 +93,21 @@ module SOLIDITY-CONFIGURATION syntax KItem ::= execute(Bool, Bytes) + // The active contract should be the last one in the list of contracts as + // decoded by the provided $PGM. + rule execute(true, B) => List2Statements(INIT) ~> B + TYPE + TYPE + INIT + _ => TYPE + _ => constructor + _ => .Map + _ => .List + + syntax Statements ::= List2Statements(List) [function] + rule List2Statements(.List) => .Statements + rule List2Statements(ListItem(S) L) => S List2Statements(L) + // The active contract should be the last one in the list of contracts as // decoded by the provided $PGM. rule execute(false, B) => From 82f3cdd6999ced073961cd4b92a8b66c9e12c3e0 Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Sun, 20 Oct 2024 13:01:05 -0500 Subject: [PATCH 15/41] Removed . Commented out rules for new, external call, and transactions (create,txn) - not needed for Mock contracts of demo. --- src/expression.md | 174 ++++++++++++++++++++++----------------------- src/solidity.md | 6 -- src/transaction.md | 138 +++++++++++++++++------------------ 3 files changed, 156 insertions(+), 162 deletions(-) diff --git a/src/expression.md b/src/expression.md index e6f0b90..0dcfebc 100644 --- a/src/expression.md +++ b/src/expression.md @@ -9,53 +9,53 @@ module SOLIDITY-EXPRESSION imports K-EQUAL imports KRYPTO - // new contract - rule new X:Id ( ARGS ) ~> K => bind(S, PARAMS, TYPES, ARGS, .List, .List) ~> List2Statements(INIT) ~> BODY ~> return v(ADDR, X) ; - FROM => THIS - VALUE => 0p256 - THIS => ADDR - TYPE => X - E => .Map - S => .List - FUNC => constructor - ... .List => ListItem(frame(K, E, S, FROM, TYPE, VALUE, FUNC)) - X - INIT - constructor - PARAMS - TYPES - BODY - - .Bag => - ADDR - X - ... - - ... - - ADDR => ADDR +MInt 1p160 - requires isKResult(ARGS) - - rule new X:Id ( .TypedVals ) ~> K => List2Statements(INIT) ~> return v(ADDR, X) ; - FROM => THIS - VALUE => 0p256 - THIS => ADDR - TYPE => X - E => .Map - S => .List - FUNC => constructor - ... .List => ListItem(frame(K, E, S, FROM, TYPE, VALUE, FUNC)) - X - INIT - - .Bag => - ADDR - X - ... - - ... - - ADDR => ADDR +MInt 1p160 +// // new contract +// rule new X:Id ( ARGS ) ~> K => bind(S, PARAMS, TYPES, ARGS, .List, .List) ~> List2Statements(INIT) ~> BODY ~> return v(ADDR, X) ; +// FROM => THIS +// VALUE => 0p256 +// THIS => ADDR +// TYPE => X +// E => .Map +// S => .List +// FUNC => constructor +// ... .List => ListItem(frame(K, E, S, FROM, TYPE, VALUE, FUNC)) +// X +// INIT +// constructor +// PARAMS +// TYPES +// BODY +// +// .Bag => +// ADDR +// X +// ... +// +// ... +// +// ADDR => ADDR +MInt 1p160 +// requires isKResult(ARGS) + +// rule new X:Id ( .TypedVals ) ~> K => List2Statements(INIT) ~> return v(ADDR, X) ; +// FROM => THIS +// VALUE => 0p256 +// THIS => ADDR +// TYPE => X +// E => .Map +// S => .List +// FUNC => constructor +// ... .List => ListItem(frame(K, E, S, FROM, TYPE, VALUE, FUNC)) +// X +// INIT +// +// .Bag => +// ADDR +// X +// ... +// +// ... +// +// ADDR => ADDR +MInt 1p160 // new array rule new T[](Len:Int) => lv(size(S), .List, T[]) ... @@ -272,49 +272,49 @@ module SOLIDITY-EXPRESSION rule lv(I:Int, .List, T) . length => v(Int2MInt(size({read(V, .List, T)}:>List))::MInt{256}, uint) ... _ [ I <- V ] - // external call - rule v(ADDR, _) . F:Id ( ARGS ) ~> K => bind(S, PARAMS, TYPES, ARGS, RETTYPES, RETNAMES) ~> BODY ~> return retval(RETNAMES); - FROM => THIS - VALUE => 0p256 - THIS => ADDR - TYPE => TYPE' - E => .Map - S => .List - FUNC => F - ... .List => ListItem(frame(K, E, S, FROM, TYPE, VALUE, FUNC)) - TYPE' - F - PARAMS - TYPES - RETTYPES - RETNAMES - BODY - ADDR - TYPE' - requires isKResult(ARGS) +// // external call +// rule v(ADDR, _) . F:Id ( ARGS ) ~> K => bind(S, PARAMS, TYPES, ARGS, RETTYPES, RETNAMES) ~> BODY ~> return retval(RETNAMES); +// FROM => THIS +// VALUE => 0p256 +// THIS => ADDR +// TYPE => TYPE' +// E => .Map +// S => .List +// FUNC => F +// ... .List => ListItem(frame(K, E, S, FROM, TYPE, VALUE, FUNC)) +// TYPE' +// F +// PARAMS +// TYPES +// RETTYPES +// RETNAMES +// BODY +// ADDR +// TYPE' +// requires isKResult(ARGS) syntax Id ::= "value" [token] - rule v(ADDR, TYPE') . F:Id { value: v(VALUE', uint256) } ( ARGS ) ~> K => bind(S, PARAMS, TYPES, ARGS, RETTYPES, RETNAMES) ~> BODY ~> return retval(RETNAMES); - FROM => THIS - VALUE => VALUE' - THIS => ADDR - TYPE => TYPE' - E => .Map - S => .List - FUNC => F - ... .List => ListItem(frame(K, E, S, FROM, TYPE, VALUE, FUNC)) - TYPE' - F - PAYABLE - PARAMS - TYPES - RETTYPES - RETNAMES - BODY - ADDR - TYPE' - requires isKResult(ARGS) andBool (PAYABLE orBool VALUE' ==MInt 0p256) +// rule v(ADDR, TYPE') . F:Id { value: v(VALUE', uint256) } ( ARGS ) ~> K => bind(S, PARAMS, TYPES, ARGS, RETTYPES, RETNAMES) ~> BODY ~> return retval(RETNAMES); +// FROM => THIS +// VALUE => VALUE' +// THIS => ADDR +// TYPE => TYPE' +// E => .Map +// S => .List +// FUNC => F +// ... .List => ListItem(frame(K, E, S, FROM, TYPE, VALUE, FUNC)) +// TYPE' +// F +// PAYABLE +// PARAMS +// TYPES +// RETTYPES +// RETNAMES +// BODY +// ADDR +// TYPE' +// requires isKResult(ARGS) andBool (PAYABLE orBool VALUE' ==MInt 0p256) // internal call rule F:Id ( ARGS ) ~> K => bind(S, PARAMS, TYPES, ARGS, RETTYPES, RETNAMES) ~> BODY ~> return retval(RETNAMES); diff --git a/src/solidity.md b/src/solidity.md index 398ddbe..e7ea8d4 100644 --- a/src/solidity.md +++ b/src/solidity.md @@ -79,12 +79,6 @@ module SOLIDITY-CONFIGURATION .List Id .List - - - 0p160 - Id - - 2p160 EVMC_SUCCESS $GAS:Int diff --git a/src/transaction.md b/src/transaction.md index 1ff8a57..b7d4e96 100644 --- a/src/transaction.md +++ b/src/transaction.md @@ -7,80 +7,80 @@ module SOLIDITY-TRANSACTION imports INT imports private SOLIDITY-EXPRESSION - rule create(FROM, VALUE, NOW, CTOR, ARGS) => bind(.List, PARAMS, TYPES, ARGS, .List, .List) ~> List2Statements(INIT) ~> BODY ... - _ => Int2MInt(Number2Int(FROM)) - _ => Int2MInt(Number2Int(VALUE)) - _ => Int2MInt(Number2Int(FROM)) - _ => Int2MInt(Number2Int(NOW)) - _ => ADDR - _ => CTOR - _ => .Map - _ => .List - _ => constructor - CTOR - INIT - constructor - PARAMS - TYPES - BODY - - .Bag => - ADDR - CTOR - ... - - ... - - ADDR => ADDR +MInt 1p160 - requires isKResult(ARGS) +// rule create(FROM, VALUE, NOW, CTOR, ARGS) => bind(.List, PARAMS, TYPES, ARGS, .List, .List) ~> List2Statements(INIT) ~> BODY ... +// _ => Int2MInt(Number2Int(FROM)) +// _ => Int2MInt(Number2Int(VALUE)) +// _ => Int2MInt(Number2Int(FROM)) +// _ => Int2MInt(Number2Int(NOW)) +// _ => ADDR +// _ => CTOR +// _ => .Map +// _ => .List +// _ => constructor +// CTOR +// INIT +// constructor +// PARAMS +// TYPES +// BODY +// +// .Bag => +// ADDR +// CTOR +// ... +// +// ... +// +// ADDR => ADDR +MInt 1p160 +// requires isKResult(ARGS) - rule create(FROM, VALUE, NOW, CTOR, .TypedVals) => List2Statements(INIT) ... - _ => Int2MInt(Number2Int(FROM)) - _ => Int2MInt(Number2Int(VALUE)) - _ => Int2MInt(Number2Int(FROM)) - _ => Int2MInt(Number2Int(NOW)) - _ => ADDR - _ => CTOR - _ => .Map - _ => .List - _ => constructor - CTOR - INIT - - .Bag => - ADDR - CTOR - ... - - ... - - ADDR => ADDR +MInt 1p160 - [owise] +// rule create(FROM, VALUE, NOW, CTOR, .TypedVals) => List2Statements(INIT) ... +// _ => Int2MInt(Number2Int(FROM)) +// _ => Int2MInt(Number2Int(VALUE)) +// _ => Int2MInt(Number2Int(FROM)) +// _ => Int2MInt(Number2Int(NOW)) +// _ => ADDR +// _ => CTOR +// _ => .Map +// _ => .List +// _ => constructor +// CTOR +// INIT +// +// .Bag => +// ADDR +// CTOR +// ... +// +// ... +// +// ADDR => ADDR +MInt 1p160 +// [owise] syntax Transaction ::= txn(from: Decimal, to: MInt{160}, value: Decimal, timestamp: Decimal, func: Id, args: CallArgumentList) rule txn(FROM, TO, VALUE, NOW, FUNC, ARGS) => txn(FROM, Int2MInt(Number2Int(TO)), VALUE, NOW, FUNC, ARGS) - rule txn(FROM, TO, VALUE, NOW, FUNC, ARGS) => bind(.List, PARAMS, TYPES, ARGS, .List, .List) ~> BODY ... - _ => Int2MInt(Number2Int(FROM)) - _ => Int2MInt(Number2Int(VALUE)) - _ => Int2MInt(Number2Int(FROM)) - _ => Int2MInt(Number2Int(NOW)) - _ => TO - _ => TYPE - _ => .Map - _ => .List - _ => FUNC - - TO - TYPE - ... - - TYPE - FUNC - PARAMS - TYPES - BODY - requires isKResult(ARGS) +// rule txn(FROM, TO, VALUE, NOW, FUNC, ARGS) => bind(.List, PARAMS, TYPES, ARGS, .List, .List) ~> BODY ... +// _ => Int2MInt(Number2Int(FROM)) +// _ => Int2MInt(Number2Int(VALUE)) +// _ => Int2MInt(Number2Int(FROM)) +// _ => Int2MInt(Number2Int(NOW)) +// _ => TO +// _ => TYPE +// _ => .Map +// _ => .List +// _ => FUNC +// +// TO +// TYPE +// ... +// +// TYPE +// FUNC +// PARAMS +// TYPES +// BODY +// requires isKResult(ARGS) syntax KItem ::= freezerTransactionCreate(Decimal, Decimal, Decimal, Id) | freezerTransactionTxn(Decimal, MInt{160}, Decimal, Decimal, Id) From 32f492a8fe0f3b451f964d7f6a5da80f41154725 Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Sun, 20 Oct 2024 13:28:12 -0500 Subject: [PATCH 16/41] Used ULM interface to set up initial configuration. --- src/solidity.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/solidity.md b/src/solidity.md index e7ea8d4..34db503 100644 --- a/src/solidity.md +++ b/src/solidity.md @@ -69,11 +69,11 @@ module SOLIDITY-CONFIGURATION - 0p160 - 0p256 - 0p160 - 0p256 - 0p160 + Int2MInt(Caller())::MInt{160} + Int2MInt(CallValue())::MInt{256} + Int2MInt(Origin())::MInt{160} + Int2MInt(BlockTimestamp())::MInt{256} + Int2MInt($ACCTCODE:Int)::MInt{160} Id .Map .List From 2557f0598b2f82bddef56f20cef7d91f0cd52c69 Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Sun, 20 Oct 2024 13:34:42 -0500 Subject: [PATCH 17/41] Removed (now unused) summarize and next-address cells. --- src/solidity.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/solidity.md b/src/solidity.md index 34db503..f748a72 100644 --- a/src/solidity.md +++ b/src/solidity.md @@ -22,7 +22,6 @@ module SOLIDITY-CONFIGURATION configuration decodeProgram($PGM:Bytes) ~> execute($CREATE:Bool, #if $CREATE:Bool #then $PGM:Bytes #else CallData() #fi) - $ISUNISWAP:Bool Id @@ -79,7 +78,6 @@ module SOLIDITY-CONFIGURATION .List Id .List - 2p160 EVMC_SUCCESS $GAS:Int From 3efe81642c5b9352d6cf4724b927e67626aaf8f1 Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Mon, 21 Oct 2024 15:03:39 -0500 Subject: [PATCH 18/41] Added event logging using ULM interface. --- src/contract.md | 4 ++-- src/statement.md | 53 +++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/src/contract.md b/src/contract.md index 3f2b7f9..2ac585b 100644 --- a/src/contract.md +++ b/src/contract.md @@ -226,8 +226,7 @@ module SOLIDITY-FUNCTION-SELECTORS rule typeName2String(bool) => "bool" rule typeName2String(T[]) => typeName2String(T) +String "[]" - syntax String ::= functionSignature(Id, List) [function] - | functionSignatureParams(List, String, Bool) [function] + syntax String ::= functionSignatureParams(List, String, Bool) [function] rule functionSignature(F:Id, Ps:List) => functionSignatureParams(Ps, Id2String(F) +String "(", false) rule functionSignatureParams(.List, Sig:String, _:Bool) => Sig +String ")" @@ -243,6 +242,7 @@ endmodule ```k module SOLIDITY-FUNCTION-SELECTORS-SYNTAX imports SOLIDITY-DATA + syntax String ::= functionSignature(Id, List) [function] syntax String ::= functionSelector(Id, List) [function] endmodule ``` diff --git a/src/statement.md b/src/statement.md index a5495c2..f09a09a 100644 --- a/src/statement.md +++ b/src/statement.md @@ -4,6 +4,7 @@ module SOLIDITY-STATEMENT imports SOLIDITY-CONFIGURATION + imports SOLIDITY-FUNCTION-SELECTORS-SYNTAX imports private SOLIDITY-EXPRESSION imports private STRING-BUFFER imports private K-IO @@ -56,10 +57,60 @@ module SOLIDITY-STATEMENT E => E [ X <- var(size(S), T) ] S => S ListItem(default(T)) + // This function processes the event arguments, and returns + // - a list containing the Int values of all indexed arguments in order + // - a Bytes that is the concatenation of the values of all non indexed arguments in order + syntax EventInfo ::= eventInfo(List, Bytes) + syntax EventInfo ::= processEventArguments(CallArgumentList, Set) [function] + | processEventArguments(CallArgumentList, Set, Int, List, Bytes) [function] + rule processEventArguments(ARGS:CallArgumentList, S:Set) => processEventArguments(ARGS, S, 0, .List, .Bytes) + rule processEventArguments(.CallArgumentList, _, _, L, B) => eventInfo(reverseList(L), B) + rule processEventArguments((v(V:MInt{160}, _), ARGS):CallArgumentList, SetItem(ArgNo) S:Set, ArgNo:Int, L:List, B:Bytes) => + processEventArguments(ARGS, S, ArgNo +Int 1, ListItem(MInt2Unsigned(V)) L, B) + rule processEventArguments((v(V:MInt{256}, _), ARGS):CallArgumentList, SetItem(ArgNo) S:Set, ArgNo:Int, L:List, B:Bytes) => + processEventArguments(ARGS, S, ArgNo +Int 1, ListItem(MInt2Unsigned(V)) L, B) + rule processEventArguments((v(V:MInt{160}, _), ARGS):CallArgumentList, S:Set, ArgNo:Int, L:List, B:Bytes) => + processEventArguments(ARGS, S, ArgNo +Int 1, L, B +Bytes Int2Bytes(32, MInt2Unsigned(V), BE)) [owise] + rule processEventArguments((v(V:MInt{256}, _), ARGS):CallArgumentList, S:Set, ArgNo:Int, L:List, B:Bytes) => + processEventArguments(ARGS, S, ArgNo +Int 1, L, B +Bytes Int2Bytes(32, MInt2Unsigned(V), BE)) [owise] + + syntax List ::= reverseList(List) [function] + | reverseList(List, List) [function] + rule reverseList(L:List) => reverseList(L, .List) + rule reverseList(.List, L:List) => L + rule reverseList(ListItem(X) L, L':List) => reverseList(L, ListItem(X) L') + + // For the demo, we do not need to handle anonymous events. + // topic[0] is the keccak hash of the event name + argument canonical type names. + syntax String ::= eventSignature(Id, List) [function] + rule eventSignature(F:Id, Ps:List) => functionSignature(F, Ps) + // emit statement - rule emit X:Id ( ARGS ) ; => discard(Event2String(ARGS, ((.StringBuffer +String Id2String(X)) +String "("))) ... + rule emit X:Id ( ARGS ) ; => + #let Topic0 = Bytes2Int(Keccak256raw(String2Bytes(eventSignature(X, ARGTYPES))), BE, Unsigned) #in + #let eventInfo(IndexedArgs:List, NonIndexedArgs:Bytes) = processEventArguments(ARGS, INDEXED) #in + #if size(IndexedArgs) ==Int 0 #then + Log1(Topic0, NonIndexedArgs) + #else #if size(IndexedArgs) ==Int 1 #then + Log2(Topic0, {IndexedArgs[0]}:>Int, NonIndexedArgs) + #else #if size(IndexedArgs) ==Int 2 #then + Log3(Topic0, {IndexedArgs[0]}:>Int, {IndexedArgs[1]}:>Int, NonIndexedArgs) + #else #if size(IndexedArgs) ==Int 3 #then + Log4(Topic0, {IndexedArgs[0]}:>Int, {IndexedArgs[1]}:>Int, {IndexedArgs[2]}:>Int, NonIndexedArgs) + #else .K + #fi #fi #fi #fi + ... + TYPE + TYPE + X + ARGTYPES + INDEXED requires isKResult(ARGS) +// // emit statement +// rule emit X:Id ( ARGS ) ; => discard(Event2String(ARGS, ((.StringBuffer +String Id2String(X)) +String "("))) ... +// requires isKResult(ARGS) + syntax String ::= Event2String(CallArgumentList, StringBuffer) [function] rule Event2String(.CallArgumentList, SB) => StringBuffer2String(SB +String ")") rule Event2String(v(V:MInt{112}, _), SB) => Event2String(.CallArgumentList, SB +String Int2String(MInt2Unsigned(V))) From 4629da435a024a66b4048ca22f07f55de93e9604 Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Tue, 22 Oct 2024 14:53:49 -0500 Subject: [PATCH 19/41] Bug fix: TypedVal with correct TypeName in decodeArgs. --- src/solidity.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/solidity.md b/src/solidity.md index f748a72..d28a438 100644 --- a/src/solidity.md +++ b/src/solidity.md @@ -117,13 +117,13 @@ module SOLIDITY-CONFIGURATION rule decodeArg(B:Bytes, I:Int, uint256) => v(Int2MInt(Bytes2Int(substrBytes(B, I, I +Int 32), BE, Unsigned))::MInt{256}, uint256) rule decodeArg(B:Bytes, I:Int, uint112) => - v(Int2MInt(Bytes2Int(substrBytes(B, I, I +Int 32), BE, Unsigned))::MInt{112}, uint256) + v(Int2MInt(Bytes2Int(substrBytes(B, I, I +Int 32), BE, Unsigned))::MInt{112}, uint112) rule decodeArg(B:Bytes, I:Int, uint32) => - v(Int2MInt(Bytes2Int(substrBytes(B, I, I +Int 32), BE, Unsigned))::MInt{32}, uint256) + v(Int2MInt(Bytes2Int(substrBytes(B, I, I +Int 32), BE, Unsigned))::MInt{32}, uint32) rule decodeArg(B:Bytes, I:Int, uint8) => - v(Int2MInt(Bytes2Int(substrBytes(B, I, I +Int 32), BE, Unsigned))::MInt{8}, uint256) + v(Int2MInt(Bytes2Int(substrBytes(B, I, I +Int 32), BE, Unsigned))::MInt{8}, uint8) rule decodeArg(B:Bytes, I:Int, address) => - v(Int2MInt(Bytes2Int(substrBytes(B, I, I +Int 32), BE, Unsigned))::MInt{160}, uint256) + v(Int2MInt(Bytes2Int(substrBytes(B, I, I +Int 32), BE, Unsigned))::MInt{160}, address) rule decodeArg(B:Bytes, I:Int, bool) => v(#if Bytes2Int(substrBytes(B, I, I +Int 32), BE, Unsigned) =/=Int 0 #then true #else false #fi, bool) From 69ac439093e62744dff2289e89f8fe307d2e4ff6 Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Fri, 25 Oct 2024 15:10:12 -0500 Subject: [PATCH 20/41] Added inputs as needed for the demo's Mock contracts. - .sol: The source used to generate the input. It contains the corresponding {WETH, DAI, USDC}Mock contract. - .kore: The generated Kore term (of Program sort). - .kore.bin: The Kore converted to bytes and prepended with the language prefix ksol. --- test/demo-contracts/UniswapV2Swap.DAI.kore | 1 + .../demo-contracts/UniswapV2Swap.DAI.kore.bin | 1 + test/demo-contracts/UniswapV2Swap.DAI.sol | 71 ++++++++++++ test/demo-contracts/UniswapV2Swap.USDC.kore | 1 + .../UniswapV2Swap.USDC.kore.bin | 1 + test/demo-contracts/UniswapV2Swap.USDC.sol | 101 ++++++++++++++++++ test/demo-contracts/UniswapV2Swap.WETH.kore | 1 + .../UniswapV2Swap.WETH.kore.bin | 1 + test/demo-contracts/UniswapV2Swap.WETH.sol | 85 +++++++++++++++ 9 files changed, 263 insertions(+) create mode 100644 test/demo-contracts/UniswapV2Swap.DAI.kore create mode 100644 test/demo-contracts/UniswapV2Swap.DAI.kore.bin create mode 100644 test/demo-contracts/UniswapV2Swap.DAI.sol create mode 100644 test/demo-contracts/UniswapV2Swap.USDC.kore create mode 100644 test/demo-contracts/UniswapV2Swap.USDC.kore.bin create mode 100644 test/demo-contracts/UniswapV2Swap.USDC.sol create mode 100644 test/demo-contracts/UniswapV2Swap.WETH.kore create mode 100644 test/demo-contracts/UniswapV2Swap.WETH.kore.bin create mode 100644 test/demo-contracts/UniswapV2Swap.WETH.sol diff --git a/test/demo-contracts/UniswapV2Swap.DAI.kore b/test/demo-contracts/UniswapV2Swap.DAI.kore new file mode 100644 index 0000000..6a8ef56 --- /dev/null +++ b/test/demo-contracts/UniswapV2Swap.DAI.kore @@ -0,0 +1 @@ +Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Program'Unds'PragmaDefinition'Unds'SourceUnits{}(\dv{SortPragmaDefinition{}}("pragma solidity ^0.8.24;"),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'SourceUnits'Unds'SourceUnit'Unds'SourceUnits{}(inj{SortContractDefinition{}, SortSourceUnit{}}(Lblcontract'UndsLBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'ContractDefinition'Unds'Id'Unds'ContractBodyElements{}(\dv{SortId{}}("DAIMock"),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortStateVariableDeclaration{}, SortContractBodyElement{}}(Lbl'UndsUndsUndsEqlsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'StateVariableDeclaration'Unds'TypeName'Unds'VisibilitySpecifier'Unds'Id'Unds'Expression{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lblprivate'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}(),\dv{SortId{}}("UINT_MAX"),inj{SortHexNumber{}, SortExpression{}}(\dv{SortHexNumber{}}("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortStateVariableDeclaration{}, SortContractBodyElement{}}(Lbl'UndsUndsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'StateVariableDeclaration'Unds'TypeName'Unds'VisibilitySpecifier'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lblpublic'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}(),\dv{SortId{}}("totalSupply"))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortStateVariableDeclaration{}, SortContractBodyElement{}}(Lbl'UndsUndsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'StateVariableDeclaration'Unds'TypeName'Unds'VisibilitySpecifier'Unds'Id{}(inj{SortMappingType{}, SortTypeName{}}(Lblmapping'LParUndsUndsEqls-GT-UndsUndsRParUnds'SOLIDITY-SYNTAX'Unds'MappingType'Unds'MappingKeyType'Unds'OptionalIdentifier'Unds'TypeName'Unds'OptionalIdentifier{}(inj{SortElementaryTypeName{}, SortMappingKeyType{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Unds'SOLIDITY-SYNTAX'Unds'OptionalIdentifier{}(),inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Unds'SOLIDITY-SYNTAX'Unds'OptionalIdentifier{}())),Lblpublic'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}(),\dv{SortId{}}("balanceOf"))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortStateVariableDeclaration{}, SortContractBodyElement{}}(Lbl'UndsUndsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'StateVariableDeclaration'Unds'TypeName'Unds'VisibilitySpecifier'Unds'Id{}(inj{SortMappingType{}, SortTypeName{}}(Lblmapping'LParUndsUndsEqls-GT-UndsUndsRParUnds'SOLIDITY-SYNTAX'Unds'MappingType'Unds'MappingKeyType'Unds'OptionalIdentifier'Unds'TypeName'Unds'OptionalIdentifier{}(inj{SortElementaryTypeName{}, SortMappingKeyType{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Unds'SOLIDITY-SYNTAX'Unds'OptionalIdentifier{}(),inj{SortMappingType{}, SortTypeName{}}(Lblmapping'LParUndsUndsEqls-GT-UndsUndsRParUnds'SOLIDITY-SYNTAX'Unds'MappingType'Unds'MappingKeyType'Unds'OptionalIdentifier'Unds'TypeName'Unds'OptionalIdentifier{}(inj{SortElementaryTypeName{}, SortMappingKeyType{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Unds'SOLIDITY-SYNTAX'Unds'OptionalIdentifier{}(),inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Unds'SOLIDITY-SYNTAX'Unds'OptionalIdentifier{}())),Lbl'Unds'SOLIDITY-SYNTAX'Unds'OptionalIdentifier{}())),Lblpublic'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}(),\dv{SortId{}}("allowance"))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortEventDefinition{}, SortContractBodyElement{}}(Lblevent'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EventDefinition'Unds'Id'Unds'EventParameters{}(\dv{SortId{}}("Approval"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'Unds'indexed'UndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("src")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'Unds'indexed'UndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("guy")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("wad")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters'QuotRBraUnds'EventParameters{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortEventDefinition{}, SortContractBodyElement{}}(Lblevent'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EventDefinition'Unds'Id'Unds'EventParameters{}(\dv{SortId{}}("Transfer"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'Unds'indexed'UndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("src")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'Unds'indexed'UndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("dst")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("wad")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters'QuotRBraUnds'EventParameters{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'ReturnSpecifier'Unds'FunctionBody{}(\dv{SortId{}}("decimals"),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}(),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblexternal'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),Lblreturns'LParUndsRParUnds'SOLIDITY-SYNTAX'Unds'ReturnSpecifier'Unds'ParameterList{}(Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(inj{SortElementaryTypeName{}, SortParameter{}}(Lbluint8'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortReturnStatement{}, SortStatement{}}(Lblreturn'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ReturnStatement'Unds'Expression{}(inj{SortDecimal{}, SortExpression{}}(\dv{SortDecimal{}}("18")))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'FunctionBody{}(\dv{SortId{}}("mint"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("usr")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("wad")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblpublic'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("usr"))),Lbl'UndsPlusUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("usr"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("wad")))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("totalSupply")),Lbl'UndsPlusUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("totalSupply")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("wad")))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortEmitStatement{}, SortStatement{}}(Lblemit'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EmitStatement'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("Transfer")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortElementaryTypeName{}, SortExpression{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortDecimal{}, SortExpression{}}(\dv{SortDecimal{}}("0")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}())),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("usr")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("wad")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'FunctionBody{}(\dv{SortId{}}("mintOnDeposit"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("usr")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("wad")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblpublic'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("mint")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("usr")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("wad")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'FunctionBody{}(\dv{SortId{}}("burn"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("usr")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("wad")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblpublic'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortIfStatement{}, SortStatement{}}(Lblif'LParUndsRParUndsUnds'SOLIDITY-SYNTAX'Unds'IfStatement'Unds'Expression'Unds'Statement{}(Lbl'Unds-GT-EqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("usr"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("wad"))),inj{SortBlock{}, SortStatement{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("usr"))),Lbl'Unds'-'UndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("usr"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("wad")))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("totalSupply")),Lbl'Unds'-'UndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("totalSupply")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("wad")))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}())))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'ReturnSpecifier'Unds'FunctionBody{}(\dv{SortId{}}("approve"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("usr")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("wad")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblexternal'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),Lblreturns'LParUndsRParUnds'SOLIDITY-SYNTAX'Unds'ReturnSpecifier'Unds'ParameterList{}(Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(inj{SortElementaryTypeName{}, SortParameter{}}(Lblbool'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("allowance")),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("usr"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("wad"))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortEmitStatement{}, SortStatement{}}(Lblemit'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EmitStatement'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("Approval")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("usr")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("wad")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortReturnStatement{}, SortStatement{}}(Lblreturn'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ReturnStatement'Unds'Expression{}(inj{SortBool{}, SortExpression{}}(\dv{SortBool{}}("true")))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'ReturnSpecifier'Unds'FunctionBody{}(\dv{SortId{}}("transfer"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("dst")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("wad")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblpublic'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),Lblreturns'LParUndsRParUnds'SOLIDITY-SYNTAX'Unds'ReturnSpecifier'Unds'ParameterList{}(Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(inj{SortElementaryTypeName{}, SortParameter{}}(Lblbool'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortReturnStatement{}, SortStatement{}}(Lblreturn'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ReturnStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("transferFrom")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("dst")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("wad")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}())))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'ReturnSpecifier'Unds'FunctionBody{}(\dv{SortId{}}("transferFrom"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("src")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("dst")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("wad")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}()))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblpublic'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),Lblreturns'LParUndsRParUnds'SOLIDITY-SYNTAX'Unds'ReturnSpecifier'Unds'ParameterList{}(Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(inj{SortElementaryTypeName{}, SortParameter{}}(Lblbool'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("require")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'Unds-GT-EqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("src"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("wad"))),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("Dai/insufficient-balance")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortIfStatement{}, SortStatement{}}(Lblif'LParUndsRParUndsUnds'SOLIDITY-SYNTAX'Unds'IfStatement'Unds'Expression'Unds'Statement{}(Lbl'UndsAnd-And-UndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsBangEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("src")),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender"))),Lbl'UndsBangEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("allowance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("src"))),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("UINT_MAX")))),inj{SortBlock{}, SortStatement{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("require")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'Unds-GT-EqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("allowance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("src"))),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("wad"))),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("Dai/insufficient-allowance")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("allowance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("src"))),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender"))),Lbl'Unds'-'UndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("allowance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("src"))),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("wad")))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}())))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("src"))),Lbl'Unds'-'UndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("src"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("wad")))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("dst"))),Lbl'UndsPlusUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("dst"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("wad")))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortEmitStatement{}, SortStatement{}}(Lblemit'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EmitStatement'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("Transfer")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("src")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("dst")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("wad")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortReturnStatement{}, SortStatement{}}(Lblreturn'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ReturnStatement'Unds'Expression{}(inj{SortBool{}, SortExpression{}}(\dv{SortBool{}}("true")))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}())))))))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'FunctionBody{}(\dv{SortId{}}("safeTransferFrom"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("from")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("to")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}()))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblexternal'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("transferFrom")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}())))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements'QuotRBraUnds'ContractBodyElements{}())))))))))))))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'SourceUnits'Unds'SourceUnit'Unds'SourceUnits'QuotRBraUnds'SourceUnits{}())) \ No newline at end of file diff --git a/test/demo-contracts/UniswapV2Swap.DAI.kore.bin b/test/demo-contracts/UniswapV2Swap.DAI.kore.bin new file mode 100644 index 0000000..772edee --- /dev/null +++ b/test/demo-contracts/UniswapV2Swap.DAI.kore.bin @@ -0,0 +1 @@ +6B736F6C016B0100000180060000001800000000000000707261676D6120736F6C6964697479205E302E382E32343B00016C0100000179050000010A02000001120600000007000000000000004441494D6F636B00016401000001300500000170010000018005000001FD04000001D9030000011206000000080000000000000055494E545F4D41580001BF050000018E06000000420000000000000030786666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666600016401000001300500000171010000018005000001FD04000001CE0400000112060000000B00000000000000746F74616C537570706C7900016401000001300500000171010000018D050000019B0300000180050000010002000001DA000000018005000001FD04000001DA00000001CE040000011206000000090000000000000062616C616E63654F6600016401000001300500000171010000018D050000019B0300000180050000010002000001DA000000018D050000019B0300000180050000010002000001DA000000018005000001FD04000001DA00000001DA00000001CE0400000112060000000900000000000000616C6C6F77616E636500016401000001D0050000011E0200000112060000000800000000000000417070726F76616C00011601000001E400000001800500000100020000011206000000030000000000000073726300011601000001E40000000180050000010002000001120600000003000000000000006775790001160100000166010000018005000001FD04000001120600000003000000000000007761640001BD000000016401000001D0050000011E02000001120600000008000000000000005472616E7366657200011601000001E400000001800500000100020000011206000000030000000000000073726300011601000001E40000000180050000010002000001120600000003000000000000006473740001160100000166010000018005000001FD04000001120600000003000000000000007761640001BD000000016401000001CF05000001630200000112060000000800000000000000646563696D616C730001C000000001670100000159050000012302000001C200000001DA0400000119010000018005000001FF04000001C0000000016505000001AB000000016D010000019E05000001D9040000013E050000018C06000000020000000000000031380001C4000000016401000001CF050000016202000001120600000004000000000000006D696E74000119010000016A010000018005000001000200000112060000000300000000000000757372000119010000016A010000018005000001FD04000001120600000003000000000000007761640001C00000000167010000015905000001CE04000001C2000000016505000001AB000000016D0100000199050000014F010000012E01000001360100000158050000011206000000090000000000000062616C616E63654F66000158050000011206000000030000000000000075737200014D01000001360100000158050000011206000000090000000000000062616C616E63654F660001580500000112060000000300000000000000757372000158050000011206000000030000000000000077616400016D0100000199050000014F010000012E01000001580500000112060000000B00000000000000746F74616C537570706C7900014D01000001580500000112060000000B00000000000000746F74616C537570706C79000158050000011206000000030000000000000077616400016D01000001B50500000118020000015805000001120600000008000000000000005472616E736665720001140100000130010000018005000001000200000114010000013E050000018C0600000001000000000000003000016605000001B90000000114010000015805000001120600000003000000000000007573720001140100000158050000011206000000030000000000000077616400016605000001B900000001C4000000016401000001CF05000001620200000112060000000D000000000000006D696E744F6E4465706F736974000119010000016A010000018005000001000200000112060000000300000000000000757372000119010000016A010000018005000001FD04000001120600000003000000000000007761640001C00000000167010000015905000001CE04000001C2000000016505000001AB000000016D0100000199050000014F0100000130010000015805000001120600000004000000000000006D696E74000114010000015805000001120600000003000000000000007573720001140100000158050000011206000000030000000000000077616400016605000001B900000001C4000000016401000001CF050000016202000001120600000004000000000000006275726E000119010000016A010000018005000001000200000112060000000300000000000000757372000119010000016A010000018005000001FD04000001120600000003000000000000007761640001C00000000167010000015905000001CE04000001C2000000016505000001AB000000016D01000001D1050000017802000001F900000001360100000158050000011206000000090000000000000062616C616E63654F660001580500000112060000000300000000000000757372000158050000011206000000030000000000000077616400016505000001AB000000016D0100000199050000014F010000012E01000001360100000158050000011206000000090000000000000062616C616E63654F6600015805000001120600000003000000000000007573720001CA00000001360100000158050000011206000000090000000000000062616C616E63654F660001580500000112060000000300000000000000757372000158050000011206000000030000000000000077616400016D0100000199050000014F010000012E01000001580500000112060000000B00000000000000746F74616C537570706C790001CA00000001580500000112060000000B00000000000000746F74616C537570706C7900015805000001120600000003000000000000007761640001C400000001C4000000016401000001CF05000001630200000112060000000700000000000000617070726F7665000119010000016A010000018005000001000200000112060000000300000000000000757372000119010000016A010000018005000001FD04000001120600000003000000000000007761640001C000000001670100000159050000012302000001C200000001DA04000001190100000180050000010402000001C0000000016505000001AB000000016D0100000199050000014F010000012E0100000136010000013601000001580500000112060000000900000000000000616C6C6F77616E6365000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E6465720001580500000112060000000300000000000000757372000158050000011206000000030000000000000077616400016D01000001B5050000011802000001580500000112060000000800000000000000417070726F76616C0001140100000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E646572000114010000015805000001120600000003000000000000007573720001140100000158050000011206000000030000000000000077616400016605000001B9000000016D010000019E05000001D904000001770500000126060000000400000000000000747275650001C4000000016401000001CF050000016302000001120600000008000000000000007472616E73666572000119010000016A010000018005000001000200000112060000000300000000000000647374000119010000016A010000018005000001FD04000001120600000003000000000000007761640001C00000000167010000015905000001CE04000001C200000001DA04000001190100000180050000010402000001C0000000016505000001AB000000016D010000019E05000001D9040000013001000001580500000112060000000C000000000000007472616E7366657246726F6D0001140100000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E646572000114010000015805000001120600000003000000000000006473740001140100000158050000011206000000030000000000000077616400016605000001B900000001C4000000016401000001CF05000001630200000112060000000C000000000000007472616E7366657246726F6D000119010000016A010000018005000001000200000112060000000300000000000000737263000119010000016A010000018005000001000200000112060000000300000000000000647374000119010000016A010000018005000001FD04000001120600000003000000000000007761640001C00000000167010000015905000001CE04000001C200000001DA04000001190100000180050000010402000001C0000000016505000001AB000000016D0100000199050000014F0100000130010000015805000001120600000007000000000000007265717569726500011401000001F900000001360100000158050000011206000000090000000000000062616C616E63654F6600015805000001120600000003000000000000007372630001580500000112060000000300000000000000776164000166050000011201000001C705000001610600000018000000000000004461692F696E73756666696369656E742D62616C616E63650001B9000000016D01000001D10500000178020000010F010000011001000001580500000112060000000300000000000000737263000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E6465720001100100000136010000013601000001580500000112060000000900000000000000616C6C6F77616E63650001580500000112060000000300000000000000737263000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E646572000158050000011206000000080000000000000055494E545F4D415800016505000001AB000000016D0100000199050000014F0100000130010000015805000001120600000007000000000000007265717569726500011401000001F90000000136010000013601000001580500000112060000000900000000000000616C6C6F77616E63650001580500000112060000000300000000000000737263000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E6465720001580500000112060000000300000000000000776164000166050000011201000001C70500000161060000001A000000000000004461692F696E73756666696369656E742D616C6C6F77616E63650001B9000000016D0100000199050000014F010000012E0100000136010000013601000001580500000112060000000900000000000000616C6C6F77616E63650001580500000112060000000300000000000000737263000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E6465720001CA0000000136010000013601000001580500000112060000000900000000000000616C6C6F77616E63650001580500000112060000000300000000000000737263000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E64657200015805000001120600000003000000000000007761640001C4000000016D0100000199050000014F010000012E01000001360100000158050000011206000000090000000000000062616C616E63654F6600015805000001120600000003000000000000007372630001CA00000001360100000158050000011206000000090000000000000062616C616E63654F660001580500000112060000000300000000000000737263000158050000011206000000030000000000000077616400016D0100000199050000014F010000012E01000001360100000158050000011206000000090000000000000062616C616E63654F66000158050000011206000000030000000000000064737400014D01000001360100000158050000011206000000090000000000000062616C616E63654F660001580500000112060000000300000000000000647374000158050000011206000000030000000000000077616400016D01000001B50500000118020000015805000001120600000008000000000000005472616E7366657200011401000001580500000112060000000300000000000000737263000114010000015805000001120600000003000000000000006473740001140100000158050000011206000000030000000000000077616400016605000001B9000000016D010000019E05000001D904000001770500000126060000000400000000000000747275650001C4000000016401000001CF05000001620200000112060000001000000000000000736166655472616E7366657246726F6D000119010000016A01000001800500000100020000011206000000040000000000000066726F6D000119010000016A010000018005000001000200000112060000000200000000000000746F000119010000016A010000018005000001FD040000011206000000050000000000000076616C75650001C000000001670100000159050000012302000001C2000000016505000001AB000000016D0100000199050000014F010000013001000001580500000112060000000C000000000000007472616E7366657246726F6D0001140100000158050000011206000000040000000000000066726F6D00011401000001580500000112060000000200000000000000746F0001140100000158050000011206000000050000000000000076616C756500016605000001B900000001C400000001C100000001C3000000 diff --git a/test/demo-contracts/UniswapV2Swap.DAI.sol b/test/demo-contracts/UniswapV2Swap.DAI.sol new file mode 100644 index 0000000..9415a6d --- /dev/null +++ b/test/demo-contracts/UniswapV2Swap.DAI.sol @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: MIT + +// The source code of this contract uses the following contracts +// UniswapV2SwapExamples: https://solidity-by-example.org/defi/uniswap-v2/ + +pragma solidity ^0.8.24; + +contract DAIMock { + + uint private UINT_MAX = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; + + uint256 public totalSupply; + + mapping (address => uint) public balanceOf; + mapping (address => mapping (address => uint)) public allowance; + + event Approval(address indexed src, address indexed guy, uint wad); + event Transfer(address indexed src, address indexed dst, uint wad); + + function decimals() external returns (uint8) { + return 18; + } + + function mint(address usr, uint wad) public { + balanceOf[usr] = balanceOf[usr] + wad; + totalSupply = totalSupply + wad; + emit Transfer(address(0), usr, wad); + } + + function mintOnDeposit(address usr, uint wad) public { + mint(usr, wad); + } + + function burn(address usr, uint wad) public { + if(balanceOf[usr] >= wad){ + balanceOf[usr] = balanceOf[usr] - wad; + totalSupply = totalSupply - wad; + } + } + + function approve(address usr, uint wad) external returns (bool) { + allowance[msg.sender][usr] = wad; + emit Approval(msg.sender, usr, wad); + return true; + } + + + function transfer(address dst, uint wad) public returns (bool) { + return transferFrom(msg.sender, dst, wad); + } + + function transferFrom(address src, address dst, uint wad) + public returns (bool) + { + require(balanceOf[src] >= wad, "Dai/insufficient-balance"); + if (src != msg.sender && allowance[src][msg.sender] != UINT_MAX) { + require(allowance[src][msg.sender] >= wad, "Dai/insufficient-allowance"); + allowance[src][msg.sender] = allowance[src][msg.sender] - wad; + } + balanceOf[src] = balanceOf[src] - wad; + balanceOf[dst] = balanceOf[dst] + wad; + emit Transfer(src, dst, wad); + return true; + } + + function safeTransferFrom(address from, address to, uint256 value) external{ + transferFrom(from, to, value); + } + + +} diff --git a/test/demo-contracts/UniswapV2Swap.USDC.kore b/test/demo-contracts/UniswapV2Swap.USDC.kore new file mode 100644 index 0000000..78b3529 --- /dev/null +++ b/test/demo-contracts/UniswapV2Swap.USDC.kore @@ -0,0 +1 @@ +Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Program'Unds'PragmaDefinition'Unds'SourceUnits{}(\dv{SortPragmaDefinition{}}("pragma solidity ^0.8.24;"),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'SourceUnits'Unds'SourceUnit'Unds'SourceUnits{}(inj{SortContractDefinition{}, SortSourceUnit{}}(Lblcontract'UndsLBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'ContractDefinition'Unds'Id'Unds'ContractBodyElements{}(\dv{SortId{}}("USDCMock"),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortStateVariableDeclaration{}, SortContractBodyElement{}}(Lbl'UndsUndsUndsEqlsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'StateVariableDeclaration'Unds'TypeName'Unds'VisibilitySpecifier'Unds'Id'Unds'Expression{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lblprivate'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}(),\dv{SortId{}}("UINT256_MAX"),inj{SortHexNumber{}, SortExpression{}}(\dv{SortHexNumber{}}("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortStateVariableDeclaration{}, SortContractBodyElement{}}(Lbl'UndsUndsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'StateVariableDeclaration'Unds'TypeName'Unds'VisibilitySpecifier'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lblprivate'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}(),\dv{SortId{}}("_totalSupply"))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortStateVariableDeclaration{}, SortContractBodyElement{}}(Lbl'UndsUndsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'StateVariableDeclaration'Unds'TypeName'Unds'VisibilitySpecifier'Unds'Id{}(inj{SortMappingType{}, SortTypeName{}}(Lblmapping'LParUndsUndsEqls-GT-UndsUndsRParUnds'SOLIDITY-SYNTAX'Unds'MappingType'Unds'MappingKeyType'Unds'OptionalIdentifier'Unds'TypeName'Unds'OptionalIdentifier{}(inj{SortElementaryTypeName{}, SortMappingKeyType{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),inj{SortId{}, SortOptionalIdentifier{}}(\dv{SortId{}}("account")),inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Unds'SOLIDITY-SYNTAX'Unds'OptionalIdentifier{}())),Lblprivate'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}(),\dv{SortId{}}("_balances"))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortStateVariableDeclaration{}, SortContractBodyElement{}}(Lbl'UndsUndsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'StateVariableDeclaration'Unds'TypeName'Unds'VisibilitySpecifier'Unds'Id{}(inj{SortMappingType{}, SortTypeName{}}(Lblmapping'LParUndsUndsEqls-GT-UndsUndsRParUnds'SOLIDITY-SYNTAX'Unds'MappingType'Unds'MappingKeyType'Unds'OptionalIdentifier'Unds'TypeName'Unds'OptionalIdentifier{}(inj{SortElementaryTypeName{}, SortMappingKeyType{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),inj{SortId{}, SortOptionalIdentifier{}}(\dv{SortId{}}("account")),inj{SortMappingType{}, SortTypeName{}}(Lblmapping'LParUndsUndsEqls-GT-UndsUndsRParUnds'SOLIDITY-SYNTAX'Unds'MappingType'Unds'MappingKeyType'Unds'OptionalIdentifier'Unds'TypeName'Unds'OptionalIdentifier{}(inj{SortElementaryTypeName{}, SortMappingKeyType{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),inj{SortId{}, SortOptionalIdentifier{}}(\dv{SortId{}}("spender")),inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Unds'SOLIDITY-SYNTAX'Unds'OptionalIdentifier{}())),Lbl'Unds'SOLIDITY-SYNTAX'Unds'OptionalIdentifier{}())),Lblprivate'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}(),\dv{SortId{}}("_allowances"))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortEventDefinition{}, SortContractBodyElement{}}(Lblevent'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EventDefinition'Unds'Id'Unds'EventParameters{}(\dv{SortId{}}("Transfer"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'Unds'indexed'UndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("from")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'Unds'indexed'UndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("to")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters'QuotRBraUnds'EventParameters{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortEventDefinition{}, SortContractBodyElement{}}(Lblevent'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EventDefinition'Unds'Id'Unds'EventParameters{}(\dv{SortId{}}("Approval"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'Unds'indexed'UndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("owner")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'Unds'indexed'UndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("spender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters'QuotRBraUnds'EventParameters{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'ReturnSpecifier'Unds'FunctionBody{}(\dv{SortId{}}("decimals"),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}(),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblexternal'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),Lblreturns'LParUndsRParUnds'SOLIDITY-SYNTAX'Unds'ReturnSpecifier'Unds'ParameterList{}(Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(inj{SortElementaryTypeName{}, SortParameter{}}(Lbluint8'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortReturnStatement{}, SortStatement{}}(Lblreturn'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ReturnStatement'Unds'Expression{}(inj{SortDecimal{}, SortExpression{}}(\dv{SortDecimal{}}("18")))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'FunctionBody{}(\dv{SortId{}}("mint"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("account")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblpublic'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("require")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsBangEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("account")),Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortElementaryTypeName{}, SortExpression{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortDecimal{}, SortExpression{}}(\dv{SortDecimal{}}("0")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("USDC: invalid receiver")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_update")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortElementaryTypeName{}, SortExpression{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortDecimal{}, SortExpression{}}(\dv{SortDecimal{}}("0")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}())),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("account")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}())))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}())))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'ReturnSpecifier'Unds'FunctionBody{}(\dv{SortId{}}("balanceOf"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("account")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}()),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblpublic'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),Lblreturns'LParUndsRParUnds'SOLIDITY-SYNTAX'Unds'ReturnSpecifier'Unds'ParameterList{}(Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(inj{SortElementaryTypeName{}, SortParameter{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortReturnStatement{}, SortStatement{}}(Lblreturn'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ReturnStatement'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_balances")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("account"))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'ReturnSpecifier'Unds'FunctionBody{}(\dv{SortId{}}("transfer"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("to")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblpublic'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),Lblreturns'LParUndsRParUnds'SOLIDITY-SYNTAX'Unds'ReturnSpecifier'Unds'ParameterList{}(Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(inj{SortElementaryTypeName{}, SortParameter{}}(Lblbool'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortVariableDeclarationStatement{}, SortStatement{}}(Lbl'UndsEqlsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'VariableDeclarationStatement'Unds'VariableDeclaration'Unds'Expression{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'VariableDeclaration'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("owner")),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender")))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_transfer")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("owner")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}())))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortReturnStatement{}, SortStatement{}}(Lblreturn'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ReturnStatement'Unds'Expression{}(inj{SortBool{}, SortExpression{}}(\dv{SortBool{}}("true")))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'ReturnSpecifier'Unds'FunctionBody{}(\dv{SortId{}}("allowance"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("owner")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("spender")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblpublic'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),Lblreturns'LParUndsRParUnds'SOLIDITY-SYNTAX'Unds'ReturnSpecifier'Unds'ParameterList{}(Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(inj{SortElementaryTypeName{}, SortParameter{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortReturnStatement{}, SortStatement{}}(Lblreturn'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ReturnStatement'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_allowances")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("owner"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("spender"))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'ReturnSpecifier'Unds'FunctionBody{}(\dv{SortId{}}("approve"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("spender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblpublic'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),Lblreturns'LParUndsRParUnds'SOLIDITY-SYNTAX'Unds'ReturnSpecifier'Unds'ParameterList{}(Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(inj{SortElementaryTypeName{}, SortParameter{}}(Lblbool'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortVariableDeclarationStatement{}, SortStatement{}}(Lbl'UndsEqlsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'VariableDeclarationStatement'Unds'VariableDeclaration'Unds'Expression{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'VariableDeclaration'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("owner")),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender")))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_approve")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("owner")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("spender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortBool{}, SortExpression{}}(\dv{SortBool{}}("true")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortReturnStatement{}, SortStatement{}}(Lblreturn'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ReturnStatement'Unds'Expression{}(inj{SortBool{}, SortExpression{}}(\dv{SortBool{}}("true")))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'ReturnSpecifier'Unds'FunctionBody{}(\dv{SortId{}}("transferFrom"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("from")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("to")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}()))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblpublic'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),Lblreturns'LParUndsRParUnds'SOLIDITY-SYNTAX'Unds'ReturnSpecifier'Unds'ParameterList{}(Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(inj{SortElementaryTypeName{}, SortParameter{}}(Lblbool'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortVariableDeclarationStatement{}, SortStatement{}}(Lbl'UndsEqlsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'VariableDeclarationStatement'Unds'VariableDeclaration'Unds'Expression{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'VariableDeclaration'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("spender")),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender")))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_spendAllowance")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("spender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}())))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_transfer")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}())))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortReturnStatement{}, SortStatement{}}(Lblreturn'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ReturnStatement'Unds'Expression{}(inj{SortBool{}, SortExpression{}}(\dv{SortBool{}}("true")))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}())))))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'FunctionBody{}(\dv{SortId{}}("_transfer"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("from")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("to")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}()))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblprivate'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("require")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsBangEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from")),Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortElementaryTypeName{}, SortExpression{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortDecimal{}, SortExpression{}}(\dv{SortDecimal{}}("0")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("USDC: invalid sender")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("require")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsBangEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to")),Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortElementaryTypeName{}, SortExpression{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortDecimal{}, SortExpression{}}(\dv{SortDecimal{}}("0")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("USDC: invalid receiver")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_update")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}())))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'FunctionBody{}(\dv{SortId{}}("_update"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("from")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("to")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}()))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblprivate'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortIfStatement{}, SortStatement{}}(Lblif'LParUndsRParUnds'else'UndsUnds'SOLIDITY-SYNTAX'Unds'IfStatement'Unds'Expression'Unds'Statement'Unds'Statement{}(Lbl'UndsEqlsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from")),Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortElementaryTypeName{}, SortExpression{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortDecimal{}, SortExpression{}}(\dv{SortDecimal{}}("0")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))),inj{SortBlock{}, SortStatement{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_totalSupply")),Lbl'UndsPlusUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_totalSupply")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))),inj{SortBlock{}, SortStatement{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortVariableDeclarationStatement{}, SortStatement{}}(Lbl'UndsEqlsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'VariableDeclarationStatement'Unds'VariableDeclaration'Unds'Expression{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'VariableDeclaration'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("fromBalance")),Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_balances")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from"))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("require")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'Unds-GT-EqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("fromBalance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value"))),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("USDC: insufficient balance")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_balances")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from"))),Lbl'Unds'-'UndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("fromBalance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortIfStatement{}, SortStatement{}}(Lblif'LParUndsRParUnds'else'UndsUnds'SOLIDITY-SYNTAX'Unds'IfStatement'Unds'Expression'Unds'Statement'Unds'Statement{}(Lbl'UndsEqlsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to")),Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortElementaryTypeName{}, SortExpression{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortDecimal{}, SortExpression{}}(\dv{SortDecimal{}}("0")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))),inj{SortBlock{}, SortStatement{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_totalSupply")),Lbl'Unds'-'UndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_totalSupply")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))),inj{SortBlock{}, SortStatement{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_balances")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to"))),Lbl'UndsPlusUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_balances")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortEmitStatement{}, SortStatement{}}(Lblemit'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EmitStatement'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("Transfer")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'FunctionBody{}(\dv{SortId{}}("_approve"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("owner")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("spender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("value")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lblbool'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("emitEvent")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblprivate'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("require")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsBangEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("owner")),Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortElementaryTypeName{}, SortExpression{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortDecimal{}, SortExpression{}}(\dv{SortDecimal{}}("0")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("USDC: invalid approver")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("require")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsBangEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("spender")),Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortElementaryTypeName{}, SortExpression{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortDecimal{}, SortExpression{}}(\dv{SortDecimal{}}("0")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("USDC: invalid spender")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_allowances")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("owner"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("spender"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value"))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortIfStatement{}, SortStatement{}}(Lblif'LParUndsRParUndsUnds'SOLIDITY-SYNTAX'Unds'IfStatement'Unds'Expression'Unds'Statement{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("emitEvent")),inj{SortBlock{}, SortStatement{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortEmitStatement{}, SortStatement{}}(Lblemit'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EmitStatement'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("Approval")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("owner")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("spender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}())))))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'FunctionBody{}(\dv{SortId{}}("_spendAllowance"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("owner")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("spender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}()))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblprivate'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortVariableDeclarationStatement{}, SortStatement{}}(Lbl'UndsEqlsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'VariableDeclarationStatement'Unds'VariableDeclaration'Unds'Expression{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'VariableDeclaration'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("currentAllowance")),Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("allowance")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("owner")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("spender")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortIfStatement{}, SortStatement{}}(Lblif'LParUndsRParUndsUnds'SOLIDITY-SYNTAX'Unds'IfStatement'Unds'Expression'Unds'Statement{}(Lbl'UndsBangEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("currentAllowance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("UINT256_MAX"))),inj{SortBlock{}, SortStatement{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("require")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'Unds-GT-EqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("currentAllowance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value"))),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("USDC: insufficient allowance")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_approve")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("owner")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("spender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'Unds'-'UndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("currentAllowance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value"))),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortBool{}, SortExpression{}}(\dv{SortBool{}}("false")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}())))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}())))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements'QuotRBraUnds'ContractBodyElements{}()))))))))))))))))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'SourceUnits'Unds'SourceUnit'Unds'SourceUnits'QuotRBraUnds'SourceUnits{}())) \ No newline at end of file diff --git a/test/demo-contracts/UniswapV2Swap.USDC.kore.bin b/test/demo-contracts/UniswapV2Swap.USDC.kore.bin new file mode 100644 index 0000000..4a60119 --- /dev/null +++ b/test/demo-contracts/UniswapV2Swap.USDC.kore.bin @@ -0,0 +1 @@ +6B736F6C016B0100000180060000001800000000000000707261676D6120736F6C6964697479205E302E382E32343B00016C0100000179050000010A0200000112060000000800000000000000555344434D6F636B00016401000001300500000170010000018005000001FD04000001D90300000112060000000B0000000000000055494E543235365F4D41580001BF050000018E06000000420000000000000030786666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666600016401000001300500000171010000018005000001FD04000001D90300000112060000000C000000000000005F746F74616C537570706C7900016401000001300500000171010000018D050000019B03000001800500000100020000015805000001120600000007000000000000006163636F756E7400018005000001FD04000001DA00000001D903000001120600000009000000000000005F62616C616E63657300016401000001300500000171010000018D050000019B03000001800500000100020000015805000001120600000007000000000000006163636F756E7400018D050000019B03000001800500000100020000015805000001120600000007000000000000007370656E64657200018005000001FD04000001DA00000001DA00000001D90300000112060000000B000000000000005F616C6C6F77616E63657300016401000001D0050000011E02000001120600000008000000000000005472616E7366657200011601000001E400000001800500000100020000011206000000040000000000000066726F6D00011601000001E4000000018005000001000200000112060000000200000000000000746F0001160100000166010000018005000001FD040000011206000000050000000000000076616C75650001BD000000016401000001D0050000011E0200000112060000000800000000000000417070726F76616C00011601000001E40000000180050000010002000001120600000005000000000000006F776E657200011601000001E40000000180050000010002000001120600000007000000000000007370656E6465720001160100000166010000018005000001FD040000011206000000050000000000000076616C75650001BD000000016401000001CF05000001630200000112060000000800000000000000646563696D616C730001C000000001670100000159050000012302000001C200000001DA0400000119010000018005000001FF04000001C0000000016505000001AB000000016D010000019E05000001D9040000013E050000018C06000000020000000000000031380001C4000000016401000001CF050000016202000001120600000004000000000000006D696E74000119010000016A0100000180050000010002000001120600000007000000000000006163636F756E74000119010000016A010000018005000001FD040000011206000000050000000000000076616C75650001C00000000167010000015905000001CE04000001C2000000016505000001AB000000016D0100000199050000014F010000013001000001580500000112060000000700000000000000726571756972650001140100000110010000015805000001120600000007000000000000006163636F756E74000130010000018005000001000200000114010000013E050000018C0600000001000000000000003000016605000001B90000000166050000011201000001C70500000161060000001600000000000000555344433A20696E76616C69642072656365697665720001B9000000016D0100000199050000014F0100000130010000015805000001120600000007000000000000005F7570646174650001140100000130010000018005000001000200000114010000013E050000018C0600000001000000000000003000016605000001B90000000114010000015805000001120600000007000000000000006163636F756E740001140100000158050000011206000000050000000000000076616C756500016605000001B900000001C4000000016401000001CF0500000163020000011206000000090000000000000062616C616E63654F66000119010000016A0100000180050000010002000001120600000007000000000000006163636F756E740001C00000000167010000015905000001CE04000001C200000001DA0400000119010000018005000001FD04000001C0000000016505000001AB000000016D010000019E05000001D90400000136010000015805000001120600000009000000000000005F62616C616E63657300015805000001120600000007000000000000006163636F756E740001C4000000016401000001CF050000016302000001120600000008000000000000007472616E73666572000119010000016A010000018005000001000200000112060000000200000000000000746F000119010000016A010000018005000001FD040000011206000000050000000000000076616C75650001C00000000167010000015905000001CE04000001C200000001DA04000001190100000180050000010402000001C0000000016505000001AB000000016D0100000144050000012D010000016F0100000180050000010002000001120600000005000000000000006F776E6572000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E64657200016D0100000199050000014F0100000130010000015805000001120600000009000000000000005F7472616E73666572000114010000015805000001120600000005000000000000006F776E657200011401000001580500000112060000000200000000000000746F0001140100000158050000011206000000050000000000000076616C756500016605000001B9000000016D010000019E05000001D904000001770500000126060000000400000000000000747275650001C4000000016401000001CF05000001630200000112060000000900000000000000616C6C6F77616E6365000119010000016A0100000180050000010002000001120600000005000000000000006F776E6572000119010000016A0100000180050000010002000001120600000007000000000000007370656E6465720001C00000000167010000015905000001CE04000001C200000001DA0400000119010000018005000001FD04000001C0000000016505000001AB000000016D010000019E05000001D90400000136010000013601000001580500000112060000000B000000000000005F616C6C6F77616E63657300015805000001120600000005000000000000006F776E657200015805000001120600000007000000000000007370656E6465720001C4000000016401000001CF05000001630200000112060000000700000000000000617070726F7665000119010000016A0100000180050000010002000001120600000007000000000000007370656E646572000119010000016A010000018005000001FD040000011206000000050000000000000076616C75650001C00000000167010000015905000001CE04000001C200000001DA04000001190100000180050000010402000001C0000000016505000001AB000000016D0100000144050000012D010000016F0100000180050000010002000001120600000005000000000000006F776E6572000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E64657200016D0100000199050000014F0100000130010000015805000001120600000008000000000000005F617070726F7665000114010000015805000001120600000005000000000000006F776E6572000114010000015805000001120600000007000000000000007370656E6465720001140100000158050000011206000000050000000000000076616C7565000114010000017705000001260600000004000000000000007472756500016605000001B9000000016D010000019E05000001D904000001770500000126060000000400000000000000747275650001C4000000016401000001CF05000001630200000112060000000C000000000000007472616E7366657246726F6D000119010000016A01000001800500000100020000011206000000040000000000000066726F6D000119010000016A010000018005000001000200000112060000000200000000000000746F000119010000016A010000018005000001FD040000011206000000050000000000000076616C75650001C00000000167010000015905000001CE04000001C200000001DA04000001190100000180050000010402000001C0000000016505000001AB000000016D0100000144050000012D010000016F0100000180050000010002000001120600000007000000000000007370656E646572000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E64657200016D0100000199050000014F010000013001000001580500000112060000000F000000000000005F7370656E64416C6C6F77616E63650001140100000158050000011206000000040000000000000066726F6D000114010000015805000001120600000007000000000000007370656E6465720001140100000158050000011206000000050000000000000076616C756500016605000001B9000000016D0100000199050000014F0100000130010000015805000001120600000009000000000000005F7472616E736665720001140100000158050000011206000000040000000000000066726F6D00011401000001580500000112060000000200000000000000746F0001140100000158050000011206000000050000000000000076616C756500016605000001B9000000016D010000019E05000001D904000001770500000126060000000400000000000000747275650001C4000000016401000001CF050000016202000001120600000009000000000000005F7472616E73666572000119010000016A01000001800500000100020000011206000000040000000000000066726F6D000119010000016A010000018005000001000200000112060000000200000000000000746F000119010000016A010000018005000001FD040000011206000000050000000000000076616C75650001C00000000167010000015905000001D903000001C2000000016505000001AB000000016D0100000199050000014F0100000130010000015805000001120600000007000000000000007265717569726500011401000001100100000158050000011206000000040000000000000066726F6D000130010000018005000001000200000114010000013E050000018C0600000001000000000000003000016605000001B90000000166050000011201000001C70500000161060000001400000000000000555344433A20696E76616C69642073656E6465720001B9000000016D0100000199050000014F01000001300100000158050000011206000000070000000000000072657175697265000114010000011001000001580500000112060000000200000000000000746F000130010000018005000001000200000114010000013E050000018C0600000001000000000000003000016605000001B90000000166050000011201000001C70500000161060000001600000000000000555344433A20696E76616C69642072656365697665720001B9000000016D0100000199050000014F0100000130010000015805000001120600000007000000000000005F7570646174650001140100000158050000011206000000040000000000000066726F6D00011401000001580500000112060000000200000000000000746F0001140100000158050000011206000000050000000000000076616C756500016605000001B900000001C4000000016401000001CF050000016202000001120600000007000000000000005F757064617465000119010000016A01000001800500000100020000011206000000040000000000000066726F6D000119010000016A010000018005000001000200000112060000000200000000000000746F000119010000016A010000018005000001FD040000011206000000050000000000000076616C75650001C00000000167010000015905000001D903000001C2000000016505000001AB000000016D01000001D1050000017702000001230100000158050000011206000000040000000000000066726F6D000130010000018005000001000200000114010000013E050000018C0600000001000000000000003000016605000001B9000000016505000001AB000000016D0100000199050000014F010000012E01000001580500000112060000000C000000000000005F746F74616C537570706C7900014D01000001580500000112060000000C000000000000005F746F74616C537570706C79000158050000011206000000050000000000000076616C75650001C4000000016505000001AB000000016D0100000144050000012D010000016F010000018005000001FD0400000112060000000B0000000000000066726F6D42616C616E6365000136010000015805000001120600000009000000000000005F62616C616E636573000158050000011206000000040000000000000066726F6D00016D0100000199050000014F0100000130010000015805000001120600000007000000000000007265717569726500011401000001F900000001580500000112060000000B0000000000000066726F6D42616C616E6365000158050000011206000000050000000000000076616C7565000166050000011201000001C70500000161060000001A00000000000000555344433A20696E73756666696369656E742062616C616E63650001B9000000016D0100000199050000014F010000012E0100000136010000015805000001120600000009000000000000005F62616C616E636573000158050000011206000000040000000000000066726F6D0001CA00000001580500000112060000000B0000000000000066726F6D42616C616E6365000158050000011206000000050000000000000076616C75650001C4000000016D01000001D10500000177020000012301000001580500000112060000000200000000000000746F000130010000018005000001000200000114010000013E050000018C0600000001000000000000003000016605000001B9000000016505000001AB000000016D0100000199050000014F010000012E01000001580500000112060000000C000000000000005F746F74616C537570706C790001CA00000001580500000112060000000C000000000000005F746F74616C537570706C79000158050000011206000000050000000000000076616C75650001C4000000016505000001AB000000016D0100000199050000014F010000012E0100000136010000015805000001120600000009000000000000005F62616C616E6365730001580500000112060000000200000000000000746F00014D0100000136010000015805000001120600000009000000000000005F62616C616E6365730001580500000112060000000200000000000000746F000158050000011206000000050000000000000076616C75650001C4000000016D01000001B50500000118020000015805000001120600000008000000000000005472616E736665720001140100000158050000011206000000040000000000000066726F6D00011401000001580500000112060000000200000000000000746F0001140100000158050000011206000000050000000000000076616C756500016605000001B900000001C4000000016401000001CF050000016202000001120600000008000000000000005F617070726F7665000119010000016A0100000180050000010002000001120600000005000000000000006F776E6572000119010000016A0100000180050000010002000001120600000007000000000000007370656E646572000119010000016A010000018005000001FD040000011206000000050000000000000076616C7565000119010000016A010000018005000001040200000112060000000900000000000000656D69744576656E740001C00000000167010000015905000001D903000001C2000000016505000001AB000000016D0100000199050000014F010000013001000001580500000112060000000700000000000000726571756972650001140100000110010000015805000001120600000005000000000000006F776E6572000130010000018005000001000200000114010000013E050000018C0600000001000000000000003000016605000001B90000000166050000011201000001C70500000161060000001600000000000000555344433A20696E76616C696420617070726F7665720001B9000000016D0100000199050000014F010000013001000001580500000112060000000700000000000000726571756972650001140100000110010000015805000001120600000007000000000000007370656E646572000130010000018005000001000200000114010000013E050000018C0600000001000000000000003000016605000001B90000000166050000011201000001C70500000161060000001500000000000000555344433A20696E76616C6964207370656E6465720001B9000000016D0100000199050000014F010000012E0100000136010000013601000001580500000112060000000B000000000000005F616C6C6F77616E63657300015805000001120600000005000000000000006F776E657200015805000001120600000007000000000000007370656E646572000158050000011206000000050000000000000076616C756500016D01000001D1050000017802000001580500000112060000000900000000000000656D69744576656E7400016505000001AB000000016D01000001B5050000011802000001580500000112060000000800000000000000417070726F76616C000114010000015805000001120600000005000000000000006F776E6572000114010000015805000001120600000007000000000000007370656E6465720001140100000158050000011206000000050000000000000076616C756500016605000001B900000001C400000001C4000000016401000001CF05000001620200000112060000000F000000000000005F7370656E64416C6C6F77616E6365000119010000016A0100000180050000010002000001120600000005000000000000006F776E6572000119010000016A0100000180050000010002000001120600000007000000000000007370656E646572000119010000016A010000018005000001FD040000011206000000050000000000000076616C75650001C00000000167010000015905000001D903000001C2000000016505000001AB000000016D0100000144050000012D010000016F010000018005000001FD040000011206000000100000000000000063757272656E74416C6C6F77616E636500013001000001580500000112060000000900000000000000616C6C6F77616E6365000114010000015805000001120600000005000000000000006F776E6572000114010000015805000001120600000007000000000000007370656E64657200016605000001B9000000016D01000001D1050000017802000001100100000158050000011206000000100000000000000063757272656E74416C6C6F77616E63650001580500000112060000000B0000000000000055494E543235365F4D415800016505000001AB000000016D0100000199050000014F0100000130010000015805000001120600000007000000000000007265717569726500011401000001F90000000158050000011206000000100000000000000063757272656E74416C6C6F77616E6365000158050000011206000000050000000000000076616C7565000166050000011201000001C70500000161060000001C00000000000000555344433A20696E73756666696369656E7420616C6C6F77616E63650001B9000000016D0100000199050000014F0100000130010000015805000001120600000008000000000000005F617070726F7665000114010000015805000001120600000005000000000000006F776E6572000114010000015805000001120600000007000000000000007370656E64657200011401000001CA0000000158050000011206000000100000000000000063757272656E74416C6C6F77616E6365000158050000011206000000050000000000000076616C75650001140100000177050000012606000000050000000000000066616C736500016605000001B900000001C400000001C400000001C100000001C3000000 diff --git a/test/demo-contracts/UniswapV2Swap.USDC.sol b/test/demo-contracts/UniswapV2Swap.USDC.sol new file mode 100644 index 0000000..5bbd2dc --- /dev/null +++ b/test/demo-contracts/UniswapV2Swap.USDC.sol @@ -0,0 +1,101 @@ +// SPDX-License-Identifier: MIT + +// The source code of this contract uses the following contracts +// UniswapV2SwapExamples: https://solidity-by-example.org/defi/uniswap-v2/ + +pragma solidity ^0.8.24; + +contract USDCMock { + uint256 private UINT256_MAX = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; + + uint256 private _totalSupply; + + mapping(address account => uint256) private _balances; + mapping(address account => mapping(address spender => uint256)) private _allowances; + + event Transfer(address indexed from, address indexed to, uint256 value); + event Approval(address indexed owner, address indexed spender, uint256 value); + + function decimals() external returns (uint8) { + return 18; + } + + function mint(address account, uint256 value) public { + require(account != address(0), "USDC: invalid receiver"); + _update(address(0), account, value); + } + + function balanceOf(address account) public returns (uint256) { + return _balances[account]; + } + + function transfer(address to, uint256 value) public returns (bool) { + address owner = msg.sender; + _transfer(owner, to, value); + return true; + } + + function allowance(address owner, address spender) public returns (uint256) { + return _allowances[owner][spender]; + } + + function approve(address spender, uint256 value) public returns (bool) { + address owner = msg.sender; + _approve(owner, spender, value, true); + return true; + } + + function transferFrom(address from, address to, uint256 value) public returns (bool) { + address spender = msg.sender; + _spendAllowance(from, spender, value); + _transfer(from, to, value); + return true; + } + + function _transfer(address from, address to, uint256 value) private { + require(from != address(0), "USDC: invalid sender"); + require(to != address(0), "USDC: invalid receiver"); + _update(from, to, value); + } + + function _update(address from, address to, uint256 value) private { + if (from == address(0)) { + _totalSupply = _totalSupply + value; + } else { + uint256 fromBalance = _balances[from]; + require(fromBalance >= value, "USDC: insufficient balance"); + _balances[from] = fromBalance - value; + + } + + if (to == address(0)) { + _totalSupply = _totalSupply - value; + + } else { + _balances[to] = _balances[to] + value; + } + + emit Transfer(from, to, value); + } + + + function _approve(address owner, address spender, uint256 value, bool emitEvent) private { + require(owner != address(0), "USDC: invalid approver"); + require(spender != address(0), "USDC: invalid spender"); + _allowances[owner][spender] = value; + if (emitEvent) { + emit Approval(owner, spender, value); + } + } + + function _spendAllowance(address owner, address spender, uint256 value) private { + uint256 currentAllowance = allowance(owner, spender); + if (currentAllowance != UINT256_MAX) { + require(currentAllowance >= value, "USDC: insufficient allowance"); + _approve(owner, spender, currentAllowance - value, false); + + } + } + + +} diff --git a/test/demo-contracts/UniswapV2Swap.WETH.kore b/test/demo-contracts/UniswapV2Swap.WETH.kore new file mode 100644 index 0000000..c3c0908 --- /dev/null +++ b/test/demo-contracts/UniswapV2Swap.WETH.kore @@ -0,0 +1 @@ +Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Program'Unds'PragmaDefinition'Unds'SourceUnits{}(\dv{SortPragmaDefinition{}}("pragma solidity ^0.8.24;"),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'SourceUnits'Unds'SourceUnit'Unds'SourceUnits{}(inj{SortContractDefinition{}, SortSourceUnit{}}(Lblcontract'UndsLBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'ContractDefinition'Unds'Id'Unds'ContractBodyElements{}(\dv{SortId{}}("WETHMock"),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortStateVariableDeclaration{}, SortContractBodyElement{}}(Lbl'UndsUndsUndsEqlsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'StateVariableDeclaration'Unds'TypeName'Unds'VisibilitySpecifier'Unds'Id'Unds'Expression{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lblprivate'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}(),\dv{SortId{}}("UINT256_MAX"),inj{SortHexNumber{}, SortExpression{}}(\dv{SortHexNumber{}}("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortStateVariableDeclaration{}, SortContractBodyElement{}}(Lbl'UndsUndsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'StateVariableDeclaration'Unds'TypeName'Unds'VisibilitySpecifier'Unds'Id{}(inj{SortMappingType{}, SortTypeName{}}(Lblmapping'LParUndsUndsEqls-GT-UndsUndsRParUnds'SOLIDITY-SYNTAX'Unds'MappingType'Unds'MappingKeyType'Unds'OptionalIdentifier'Unds'TypeName'Unds'OptionalIdentifier{}(inj{SortElementaryTypeName{}, SortMappingKeyType{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Unds'SOLIDITY-SYNTAX'Unds'OptionalIdentifier{}(),inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Unds'SOLIDITY-SYNTAX'Unds'OptionalIdentifier{}())),Lblpublic'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}(),\dv{SortId{}}("balanceOf"))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortStateVariableDeclaration{}, SortContractBodyElement{}}(Lbl'UndsUndsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'StateVariableDeclaration'Unds'TypeName'Unds'VisibilitySpecifier'Unds'Id{}(inj{SortMappingType{}, SortTypeName{}}(Lblmapping'LParUndsUndsEqls-GT-UndsUndsRParUnds'SOLIDITY-SYNTAX'Unds'MappingType'Unds'MappingKeyType'Unds'OptionalIdentifier'Unds'TypeName'Unds'OptionalIdentifier{}(inj{SortElementaryTypeName{}, SortMappingKeyType{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Unds'SOLIDITY-SYNTAX'Unds'OptionalIdentifier{}(),inj{SortMappingType{}, SortTypeName{}}(Lblmapping'LParUndsUndsEqls-GT-UndsUndsRParUnds'SOLIDITY-SYNTAX'Unds'MappingType'Unds'MappingKeyType'Unds'OptionalIdentifier'Unds'TypeName'Unds'OptionalIdentifier{}(inj{SortElementaryTypeName{}, SortMappingKeyType{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Unds'SOLIDITY-SYNTAX'Unds'OptionalIdentifier{}(),inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Unds'SOLIDITY-SYNTAX'Unds'OptionalIdentifier{}())),Lbl'Unds'SOLIDITY-SYNTAX'Unds'OptionalIdentifier{}())),Lblpublic'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}(),\dv{SortId{}}("allowance"))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortEventDefinition{}, SortContractBodyElement{}}(Lblevent'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EventDefinition'Unds'Id'Unds'EventParameters{}(\dv{SortId{}}("Approval"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'Unds'indexed'UndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("owner")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'Unds'indexed'UndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("spender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters'QuotRBraUnds'EventParameters{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortEventDefinition{}, SortContractBodyElement{}}(Lblevent'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EventDefinition'Unds'Id'Unds'EventParameters{}(\dv{SortId{}}("Transfer"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'Unds'indexed'UndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("from")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'Unds'indexed'UndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("to")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters'QuotRBraUnds'EventParameters{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'ReturnSpecifier'Unds'FunctionBody{}(\dv{SortId{}}("decimals"),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}(),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblexternal'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),Lblreturns'LParUndsRParUnds'SOLIDITY-SYNTAX'Unds'ReturnSpecifier'Unds'ParameterList{}(Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(inj{SortElementaryTypeName{}, SortParameter{}}(Lbluint8'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortReturnStatement{}, SortStatement{}}(Lblreturn'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ReturnStatement'Unds'Expression{}(inj{SortDecimal{}, SortExpression{}}(\dv{SortDecimal{}}("18")))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'FunctionBody{}(\dv{SortId{}}("deposit"),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}(),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblexternal'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(Lblpayable'Unds'SOLIDITY-SYNTAX'Unds'FunctionSpecifier{}(),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}())),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender"))),Lbl'UndsPlusUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender"))),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("value")))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortEmitStatement{}, SortStatement{}}(Lblemit'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EmitStatement'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("Transfer")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortElementaryTypeName{}, SortExpression{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortDecimal{}, SortExpression{}}(\dv{SortDecimal{}}("0")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}())),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}())))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'ReturnSpecifier'Unds'FunctionBody{}(\dv{SortId{}}("approve"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("spender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblexternal'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),Lblreturns'LParUndsRParUnds'SOLIDITY-SYNTAX'Unds'ReturnSpecifier'Unds'ParameterList{}(Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(inj{SortElementaryTypeName{}, SortParameter{}}(Lblbool'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("allowance")),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("spender"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value"))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortEmitStatement{}, SortStatement{}}(Lblemit'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EmitStatement'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("Approval")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("spender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortReturnStatement{}, SortStatement{}}(Lblreturn'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ReturnStatement'Unds'Expression{}(inj{SortBool{}, SortExpression{}}(\dv{SortBool{}}("true")))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'ReturnSpecifier'Unds'FunctionBody{}(\dv{SortId{}}("transfer"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("to")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblexternal'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),Lblreturns'LParUndsRParUnds'SOLIDITY-SYNTAX'Unds'ReturnSpecifier'Unds'ParameterList{}(Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(inj{SortElementaryTypeName{}, SortParameter{}}(Lblbool'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortIfStatement{}, SortStatement{}}(Lblif'LParUndsRParUnds'else'UndsUnds'SOLIDITY-SYNTAX'Unds'IfStatement'Unds'Expression'Unds'Statement'Unds'Statement{}(Lbl'UndsAnd-And-UndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsBangEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to")),Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortElementaryTypeName{}, SortExpression{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortDecimal{}, SortExpression{}}(\dv{SortDecimal{}}("0")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))),Lbl'UndsBangEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to")),Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortElementaryTypeName{}, SortExpression{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("this")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}())))),inj{SortBlock{}, SortStatement{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortVariableDeclarationStatement{}, SortStatement{}}(Lbl'UndsEqlsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'VariableDeclarationStatement'Unds'VariableDeclaration'Unds'Expression{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'VariableDeclaration'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("balance")),Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender"))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("require")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'Unds-GT-EqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value"))),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("WETH: transfer amount exceeds balance")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender"))),Lbl'Unds'-'UndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to"))),Lbl'UndsPlusUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortEmitStatement{}, SortStatement{}}(Lblemit'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EmitStatement'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("Transfer")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))))),inj{SortBlock{}, SortStatement{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortVariableDeclarationStatement{}, SortStatement{}}(Lbl'UndsEqlsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'VariableDeclarationStatement'Unds'VariableDeclaration'Unds'Expression{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'VariableDeclaration'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("balance")),Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender"))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("require")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'Unds-GT-EqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value"))),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("WETH: burn amount exceeds balance")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender"))),Lbl'Unds'-'UndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortEmitStatement{}, SortStatement{}}(Lblemit'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EmitStatement'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("Transfer")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortElementaryTypeName{}, SortExpression{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortDecimal{}, SortExpression{}}(\dv{SortDecimal{}}("0")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}())),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortVariableDeclarationStatement{}, SortStatement{}}(Lbl'LParUndsCommRParEqlsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'VariableDeclarationStatement'Unds'VariableDeclaration'Unds'Expression{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'VariableDeclaration'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lblbool'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("success")),Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsLBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'KeyValues{}(Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender")),\dv{SortId{}}("call")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'KeyValues'Unds'KeyValue'Unds'KeyValues{}(Lbl'UndsColnUndsUnds'SOLIDITY-SYNTAX'Unds'KeyValue'Unds'Id'Unds'Expression{}(\dv{SortId{}}("value"),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value"))),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'KeyValues'Unds'KeyValue'Unds'KeyValues'QuotRBraUnds'KeyValues{}())),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}())))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("require")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("success")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("WETH: ETH transfer failed")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}())))))))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortReturnStatement{}, SortStatement{}}(Lblreturn'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ReturnStatement'Unds'Expression{}(inj{SortBool{}, SortExpression{}}(\dv{SortBool{}}("true")))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}())))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'ReturnSpecifier'Unds'FunctionBody{}(\dv{SortId{}}("transferFrom"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("from")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("to")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}()))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblexternal'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),Lblreturns'LParUndsRParUnds'SOLIDITY-SYNTAX'Unds'ReturnSpecifier'Unds'ParameterList{}(Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(inj{SortElementaryTypeName{}, SortParameter{}}(Lblbool'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortIfStatement{}, SortStatement{}}(Lblif'LParUndsRParUndsUnds'SOLIDITY-SYNTAX'Unds'IfStatement'Unds'Expression'Unds'Statement{}(Lbl'UndsBangEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from")),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender"))),inj{SortBlock{}, SortStatement{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortVariableDeclarationStatement{}, SortStatement{}}(Lbl'UndsEqlsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'VariableDeclarationStatement'Unds'VariableDeclaration'Unds'Expression{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'VariableDeclaration'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("allowed")),Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("allowance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from"))),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender"))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortIfStatement{}, SortStatement{}}(Lblif'LParUndsRParUndsUnds'SOLIDITY-SYNTAX'Unds'IfStatement'Unds'Expression'Unds'Statement{}(Lbl'UndsBangEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("allowed")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("UINT256_MAX"))),inj{SortBlock{}, SortStatement{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("require")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'Unds-GT-EqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("allowed")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value"))),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("WETH: request exceeds allowance")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortVariableDeclarationStatement{}, SortStatement{}}(Lbl'UndsEqlsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'VariableDeclarationStatement'Unds'VariableDeclaration'Unds'Expression{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'VariableDeclaration'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("reduced")),Lbl'Unds'-'UndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("allowed")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value"))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("allowance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from"))),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("reduced"))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortEmitStatement{}, SortStatement{}}(Lblemit'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EmitStatement'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("Approval")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("reduced")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}())))))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}())))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortIfStatement{}, SortStatement{}}(Lblif'LParUndsRParUnds'else'UndsUnds'SOLIDITY-SYNTAX'Unds'IfStatement'Unds'Expression'Unds'Statement'Unds'Statement{}(Lbl'UndsAnd-And-UndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsBangEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to")),Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortElementaryTypeName{}, SortExpression{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortDecimal{}, SortExpression{}}(\dv{SortDecimal{}}("0")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))),Lbl'UndsBangEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to")),Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortElementaryTypeName{}, SortExpression{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("this")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}())))),inj{SortBlock{}, SortStatement{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortVariableDeclarationStatement{}, SortStatement{}}(Lbl'UndsEqlsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'VariableDeclarationStatement'Unds'VariableDeclaration'Unds'Expression{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'VariableDeclaration'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("balance")),Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from"))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("require")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'Unds-GT-EqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value"))),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("WETH: transfer amount exceeds balance")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from"))),Lbl'Unds'-'UndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to"))),Lbl'UndsPlusUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortEmitStatement{}, SortStatement{}}(Lblemit'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EmitStatement'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("Transfer")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))))),inj{SortBlock{}, SortStatement{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortVariableDeclarationStatement{}, SortStatement{}}(Lbl'UndsEqlsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'VariableDeclarationStatement'Unds'VariableDeclaration'Unds'Expression{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'VariableDeclaration'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("balance")),Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from"))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("require")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'Unds-GT-EqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value"))),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("WETH: burn amount exceeds balance")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from"))),Lbl'Unds'-'UndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortEmitStatement{}, SortStatement{}}(Lblemit'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EmitStatement'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("Transfer")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortElementaryTypeName{}, SortExpression{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortDecimal{}, SortExpression{}}(\dv{SortDecimal{}}("0")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}())),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortVariableDeclarationStatement{}, SortStatement{}}(Lbl'LParUndsCommRParEqlsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'VariableDeclarationStatement'Unds'VariableDeclaration'Unds'Expression{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'VariableDeclaration'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lblbool'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("success")),Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsLBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'KeyValues{}(Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender")),\dv{SortId{}}("call")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'KeyValues'Unds'KeyValue'Unds'KeyValues{}(Lbl'UndsColnUndsUnds'SOLIDITY-SYNTAX'Unds'KeyValue'Unds'Id'Unds'Expression{}(\dv{SortId{}}("value"),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value"))),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'KeyValues'Unds'KeyValue'Unds'KeyValues'QuotRBraUnds'KeyValues{}())),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}())))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("require")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("success")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("WETH: ETH transfer failed")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}())))))))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortReturnStatement{}, SortStatement{}}(Lblreturn'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ReturnStatement'Unds'Expression{}(inj{SortBool{}, SortExpression{}}(\dv{SortBool{}}("true")))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements'QuotRBraUnds'ContractBodyElements{}())))))))))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'SourceUnits'Unds'SourceUnit'Unds'SourceUnits'QuotRBraUnds'SourceUnits{}())) \ No newline at end of file diff --git a/test/demo-contracts/UniswapV2Swap.WETH.kore.bin b/test/demo-contracts/UniswapV2Swap.WETH.kore.bin new file mode 100644 index 0000000..b8010b9 --- /dev/null +++ b/test/demo-contracts/UniswapV2Swap.WETH.kore.bin @@ -0,0 +1 @@ +6B736F6C016B0100000180060000001800000000000000707261676D6120736F6C6964697479205E302E382E32343B00016C0100000179050000010A0200000112060000000800000000000000574554484D6F636B00016401000001300500000170010000018005000001FD04000001D90300000112060000000B0000000000000055494E543235365F4D41580001BF050000018E06000000420000000000000030786666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666600016401000001300500000171010000018D050000019B0300000180050000010002000001DA000000018005000001FD04000001DA00000001CE040000011206000000090000000000000062616C616E63654F6600016401000001300500000171010000018D050000019B0300000180050000010002000001DA000000018D050000019B0300000180050000010002000001DA000000018005000001FD04000001DA00000001DA00000001CE0400000112060000000900000000000000616C6C6F77616E636500016401000001D0050000011E0200000112060000000800000000000000417070726F76616C00011601000001E40000000180050000010002000001120600000005000000000000006F776E657200011601000001E40000000180050000010002000001120600000007000000000000007370656E6465720001160100000166010000018005000001FD040000011206000000050000000000000076616C75650001BD000000016401000001D0050000011E02000001120600000008000000000000005472616E7366657200011601000001E400000001800500000100020000011206000000040000000000000066726F6D00011601000001E4000000018005000001000200000112060000000200000000000000746F0001160100000166010000018005000001FD040000011206000000050000000000000076616C75650001BD000000016401000001CF05000001630200000112060000000800000000000000646563696D616C730001C000000001670100000159050000012302000001C200000001DA0400000119010000018005000001FF04000001C0000000016505000001AB000000016D010000019E05000001D9040000013E050000018C06000000020000000000000031380001C4000000016401000001CF050000016202000001120600000007000000000000006465706F7369740001C0000000016701000001590500000123020000016701000001D803000001C2000000016505000001AB000000016D0100000199050000014F010000012E01000001360100000158050000011206000000090000000000000062616C616E63654F66000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E64657200014D01000001360100000158050000011206000000090000000000000062616C616E63654F66000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E646572000161010000015805000001120600000003000000000000006D736700011206000000050000000000000076616C756500016D01000001B50500000118020000015805000001120600000008000000000000005472616E736665720001140100000130010000018005000001000200000114010000013E050000018C0600000001000000000000003000016605000001B900000001140100000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E6465720001140100000161010000015805000001120600000003000000000000006D736700011206000000050000000000000076616C756500016605000001B900000001C4000000016401000001CF05000001630200000112060000000700000000000000617070726F7665000119010000016A0100000180050000010002000001120600000007000000000000007370656E646572000119010000016A010000018005000001FD040000011206000000050000000000000076616C75650001C000000001670100000159050000012302000001C200000001DA04000001190100000180050000010402000001C0000000016505000001AB000000016D0100000199050000014F010000012E0100000136010000013601000001580500000112060000000900000000000000616C6C6F77616E6365000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E64657200015805000001120600000007000000000000007370656E646572000158050000011206000000050000000000000076616C756500016D01000001B5050000011802000001580500000112060000000800000000000000417070726F76616C0001140100000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E646572000114010000015805000001120600000007000000000000007370656E6465720001140100000158050000011206000000050000000000000076616C756500016605000001B9000000016D010000019E05000001D904000001770500000126060000000400000000000000747275650001C4000000016401000001CF050000016302000001120600000008000000000000007472616E73666572000119010000016A010000018005000001000200000112060000000200000000000000746F000119010000016A010000018005000001FD040000011206000000050000000000000076616C75650001C000000001670100000159050000012302000001C200000001DA04000001190100000180050000010402000001C0000000016505000001AB000000016D01000001D10500000177020000010F010000011001000001580500000112060000000200000000000000746F000130010000018005000001000200000114010000013E050000018C0600000001000000000000003000016605000001B9000000011001000001580500000112060000000200000000000000746F000130010000018005000001000200000114010000015805000001120600000004000000000000007468697300016605000001B9000000016505000001AB000000016D0100000144050000012D010000016F010000018005000001FD040000011206000000070000000000000062616C616E63650001360100000158050000011206000000090000000000000062616C616E63654F66000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E64657200016D0100000199050000014F0100000130010000015805000001120600000007000000000000007265717569726500011401000001F90000000158050000011206000000070000000000000062616C616E6365000158050000011206000000050000000000000076616C7565000166050000011201000001C70500000161060000002500000000000000574554483A207472616E7366657220616D6F756E7420657863656564732062616C616E63650001B9000000016D0100000199050000014F010000012E01000001360100000158050000011206000000090000000000000062616C616E63654F66000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E6465720001CA0000000158050000011206000000070000000000000062616C616E6365000158050000011206000000050000000000000076616C756500016D0100000199050000014F010000012E01000001360100000158050000011206000000090000000000000062616C616E63654F660001580500000112060000000200000000000000746F00014D01000001360100000158050000011206000000090000000000000062616C616E63654F660001580500000112060000000200000000000000746F000158050000011206000000050000000000000076616C756500016D01000001B50500000118020000015805000001120600000008000000000000005472616E736665720001140100000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E64657200011401000001580500000112060000000200000000000000746F0001140100000158050000011206000000050000000000000076616C756500016605000001B900000001C4000000016505000001AB000000016D0100000144050000012D010000016F010000018005000001FD040000011206000000070000000000000062616C616E63650001360100000158050000011206000000090000000000000062616C616E63654F66000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E64657200016D0100000199050000014F0100000130010000015805000001120600000007000000000000007265717569726500011401000001F90000000158050000011206000000070000000000000062616C616E6365000158050000011206000000050000000000000076616C7565000166050000011201000001C70500000161060000002100000000000000574554483A206275726E20616D6F756E7420657863656564732062616C616E63650001B9000000016D0100000199050000014F010000012E01000001360100000158050000011206000000090000000000000062616C616E63654F66000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E6465720001CA0000000158050000011206000000070000000000000062616C616E6365000158050000011206000000050000000000000076616C756500016D01000001B50500000118020000015805000001120600000008000000000000005472616E736665720001140100000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E6465720001140100000130010000018005000001000200000114010000013E050000018C0600000001000000000000003000016605000001B900000001140100000158050000011206000000050000000000000076616C756500016605000001B9000000016D010000014405000001AD000000016F01000001800500000104020000011206000000070000000000000073756363657373000130010000012F01000001610100000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E64657200011206000000040000000000000063616C6C0001180100000111010000011206000000050000000000000076616C7565000158050000011206000000050000000000000076616C75650001BF0000000166050000011201000001C705000001610600000000000000000000000001B9000000016D0100000199050000014F010000013001000001580500000112060000000700000000000000726571756972650001140100000158050000011206000000070000000000000073756363657373000166050000011201000001C70500000161060000001900000000000000574554483A20455448207472616E73666572206661696C65640001B900000001C4000000016D010000019E05000001D904000001770500000126060000000400000000000000747275650001C4000000016401000001CF05000001630200000112060000000C000000000000007472616E7366657246726F6D000119010000016A01000001800500000100020000011206000000040000000000000066726F6D000119010000016A010000018005000001000200000112060000000200000000000000746F000119010000016A010000018005000001FD040000011206000000050000000000000076616C75650001C000000001670100000159050000012302000001C200000001DA04000001190100000180050000010402000001C0000000016505000001AB000000016D01000001D1050000017802000001100100000158050000011206000000040000000000000066726F6D000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E64657200016505000001AB000000016D0100000144050000012D010000016F010000018005000001FD0400000112060000000700000000000000616C6C6F776564000136010000013601000001580500000112060000000900000000000000616C6C6F77616E6365000158050000011206000000040000000000000066726F6D000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E64657200016D01000001D10500000178020000011001000001580500000112060000000700000000000000616C6C6F7765640001580500000112060000000B0000000000000055494E543235365F4D415800016505000001AB000000016D0100000199050000014F0100000130010000015805000001120600000007000000000000007265717569726500011401000001F900000001580500000112060000000700000000000000616C6C6F776564000158050000011206000000050000000000000076616C7565000166050000011201000001C70500000161060000001F00000000000000574554483A2072657175657374206578636565647320616C6C6F77616E63650001B9000000016D0100000144050000012D010000016F010000018005000001FD0400000112060000000700000000000000726564756365640001CA00000001580500000112060000000700000000000000616C6C6F776564000158050000011206000000050000000000000076616C756500016D0100000199050000014F010000012E0100000136010000013601000001580500000112060000000900000000000000616C6C6F77616E6365000158050000011206000000040000000000000066726F6D000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E64657200015805000001120600000007000000000000007265647563656400016D01000001B5050000011802000001580500000112060000000800000000000000417070726F76616C0001140100000158050000011206000000040000000000000066726F6D0001140100000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E646572000114010000015805000001120600000007000000000000007265647563656400016605000001B900000001C400000001C4000000016D01000001D10500000177020000010F010000011001000001580500000112060000000200000000000000746F000130010000018005000001000200000114010000013E050000018C0600000001000000000000003000016605000001B9000000011001000001580500000112060000000200000000000000746F000130010000018005000001000200000114010000015805000001120600000004000000000000007468697300016605000001B9000000016505000001AB000000016D0100000144050000012D010000016F010000018005000001FD040000011206000000070000000000000062616C616E63650001360100000158050000011206000000090000000000000062616C616E63654F66000158050000011206000000040000000000000066726F6D00016D0100000199050000014F0100000130010000015805000001120600000007000000000000007265717569726500011401000001F90000000158050000011206000000070000000000000062616C616E6365000158050000011206000000050000000000000076616C7565000166050000011201000001C70500000161060000002500000000000000574554483A207472616E7366657220616D6F756E7420657863656564732062616C616E63650001B9000000016D0100000199050000014F010000012E01000001360100000158050000011206000000090000000000000062616C616E63654F66000158050000011206000000040000000000000066726F6D0001CA0000000158050000011206000000070000000000000062616C616E6365000158050000011206000000050000000000000076616C756500016D0100000199050000014F010000012E01000001360100000158050000011206000000090000000000000062616C616E63654F660001580500000112060000000200000000000000746F00014D01000001360100000158050000011206000000090000000000000062616C616E63654F660001580500000112060000000200000000000000746F000158050000011206000000050000000000000076616C756500016D01000001B50500000118020000015805000001120600000008000000000000005472616E736665720001140100000158050000011206000000040000000000000066726F6D00011401000001580500000112060000000200000000000000746F0001140100000158050000011206000000050000000000000076616C756500016605000001B900000001C4000000016505000001AB000000016D0100000144050000012D010000016F010000018005000001FD040000011206000000070000000000000062616C616E63650001360100000158050000011206000000090000000000000062616C616E63654F66000158050000011206000000040000000000000066726F6D00016D0100000199050000014F0100000130010000015805000001120600000007000000000000007265717569726500011401000001F90000000158050000011206000000070000000000000062616C616E6365000158050000011206000000050000000000000076616C7565000166050000011201000001C70500000161060000002100000000000000574554483A206275726E20616D6F756E7420657863656564732062616C616E63650001B9000000016D0100000199050000014F010000012E01000001360100000158050000011206000000090000000000000062616C616E63654F66000158050000011206000000040000000000000066726F6D0001CA0000000158050000011206000000070000000000000062616C616E6365000158050000011206000000050000000000000076616C756500016D01000001B50500000118020000015805000001120600000008000000000000005472616E736665720001140100000158050000011206000000040000000000000066726F6D0001140100000130010000018005000001000200000114010000013E050000018C0600000001000000000000003000016605000001B900000001140100000158050000011206000000050000000000000076616C756500016605000001B9000000016D010000014405000001AD000000016F01000001800500000104020000011206000000070000000000000073756363657373000130010000012F01000001610100000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E64657200011206000000040000000000000063616C6C0001180100000111010000011206000000050000000000000076616C7565000158050000011206000000050000000000000076616C75650001BF0000000166050000011201000001C705000001610600000000000000000000000001B9000000016D0100000199050000014F010000013001000001580500000112060000000700000000000000726571756972650001140100000158050000011206000000070000000000000073756363657373000166050000011201000001C70500000161060000001900000000000000574554483A20455448207472616E73666572206661696C65640001B900000001C4000000016D010000019E05000001D904000001770500000126060000000400000000000000747275650001C400000001C100000001C3000000 diff --git a/test/demo-contracts/UniswapV2Swap.WETH.sol b/test/demo-contracts/UniswapV2Swap.WETH.sol new file mode 100644 index 0000000..4adbe35 --- /dev/null +++ b/test/demo-contracts/UniswapV2Swap.WETH.sol @@ -0,0 +1,85 @@ +// SPDX-License-Identifier: MIT + +// The source code of this contract uses the following contracts +// UniswapV2SwapExamples: https://solidity-by-example.org/defi/uniswap-v2/ + +pragma solidity ^0.8.24; + +contract WETHMock { + + uint256 private UINT256_MAX = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; + + mapping (address => uint256) public balanceOf; + mapping (address => mapping (address => uint256)) public allowance; + + event Approval(address indexed owner, address indexed spender, uint256 value); + event Transfer(address indexed from, address indexed to, uint256 value); + + function decimals() external returns (uint8) { + return 18; + } + + function deposit() external payable { + balanceOf[msg.sender] = balanceOf[msg.sender] + msg.value; + emit Transfer(address(0), msg.sender, msg.value); + } + + function approve(address spender, uint256 value) external returns (bool) { + allowance[msg.sender][spender] = value; + emit Approval(msg.sender, spender, value); + + return true; + } + + function transfer(address to, uint256 value) external returns (bool) { + if (to != address(0) && to != address(this)) { // Transfer + uint256 balance = balanceOf[msg.sender]; + require(balance >= value, "WETH: transfer amount exceeds balance"); + + balanceOf[msg.sender] = balance - value; + balanceOf[to] = balanceOf[to] + value; + emit Transfer(msg.sender, to, value); + } else { // Withdraw + uint256 balance = balanceOf[msg.sender]; + require(balance >= value, "WETH: burn amount exceeds balance"); + balanceOf[msg.sender] = balance - value; + emit Transfer(msg.sender, address(0), value); + + (bool success, ) = msg.sender.call{value: value}(""); + require(success, "WETH: ETH transfer failed"); + } + + return true; + } + + function transferFrom(address from, address to, uint256 value) external returns (bool) { + if (from != msg.sender) { + uint256 allowed = allowance[from][msg.sender]; + if (allowed != UINT256_MAX) { + require(allowed >= value, "WETH: request exceeds allowance"); + uint256 reduced = allowed - value; + allowance[from][msg.sender] = reduced; + emit Approval(from, msg.sender, reduced); + } + } + + if (to != address(0) && to != address(this)) { + uint256 balance = balanceOf[from]; + require(balance >= value, "WETH: transfer amount exceeds balance"); + + balanceOf[from] = balance - value; + balanceOf[to] = balanceOf[to] + value; + emit Transfer(from, to, value); + } else { + uint256 balance = balanceOf[from]; + require(balance >= value, "WETH: burn amount exceeds balance"); + balanceOf[from] = balance - value; + emit Transfer(from, address(0), value); + + (bool success, ) = msg.sender.call{value: value}(""); + require(success, "WETH: ETH transfer failed"); + } + + return true; + } +} From 82946839d8f7b86151395a7ed8cc063e0d787fde Mon Sep 17 00:00:00 2001 From: Roberto Rosmaninho Date: Mon, 28 Oct 2024 16:18:51 -0300 Subject: [PATCH 21/41] in-meeting modification --- byol_solidity.py | 91 ++++++++++++++++++++++++++++++++++++++++++++++++ src/solidity.md | 31 +++++++++-------- 2 files changed, 108 insertions(+), 14 deletions(-) create mode 100755 byol_solidity.py diff --git a/byol_solidity.py b/byol_solidity.py new file mode 100755 index 0000000..a5fbdcd --- /dev/null +++ b/byol_solidity.py @@ -0,0 +1,91 @@ +#!/usr/bin/python3 +from web3 import Web3 +from web3.middleware import SignAndSendRawMiddlewareBuilder +import time + +simple_usdc_hex = open('test/demo-contracts/UniswapV2Swap.USDC.kore.bin').read().rstrip() + +w3 = Web3(Web3.HTTPProvider('http://localhost:8545')) +sender = w3.eth.account.create() +pk = w3.to_hex(sender.key) +print(sender.address) + +tx_hash = w3.eth.send_transaction({'from': w3.eth.accounts[0],'to':sender.address,'value':1000000000000000000}) +print(tx_hash) +w3.eth.wait_for_transaction_receipt(tx_hash) + +w3.middleware_onion.inject(SignAndSendRawMiddlewareBuilder.build(sender), layer=0) + +deploy_usdc_tx = { + 'from': sender.address, + 'data': simple_usdc_hex, + 'to': '', + 'value': 0, + 'gas': 11000000, + 'maxFeePerGas': 2000000000, + 'maxPriorityFeePerGas': 1000000000, +} + +tx_hash = w3.eth.send_transaction(deploy_usdc_tx) +print(tx_hash) +receipt = w3.eth.wait_for_transaction_receipt(tx_hash) +print(receipt) +usdc_address = receipt['contractAddress'] + +mint_usdc_data = '40c10f19000000000000000000000000' + sender.address[2:] + '00000000000000000000000000000000000000000000000000000000000003e8' + +mint_usdc_tx = { + 'from': sender.address, + 'data': mint_usdc_data, + 'to': usdc_address, + 'value': 0, + 'gas': 11000000, + 'maxFeePerGas': 2000000000, + 'maxPriorityFeePerGas': 1000000000, +} + +tx_hash = w3.eth.send_transaction(mint_usdc_tx) +print(tx_hash) +receipt = w3.eth.wait_for_transaction_receipt(tx_hash) +print(receipt) + +balanceOf_usdc_data = '70a08231000000000000000000000000' + sender.address[2:] + +balanceOf_usdc_tx = { + 'from': sender.address, + 'data': balanceOf_usdc_data, + 'to': usdc_address, + 'value': 0, + 'gas': 11000000, + 'maxFeePerGas': 2000000000, + 'maxPriorityFeePerGas': 1000000000, +} + +balance = w3.eth.call(balanceOf_usdc_tx) +print(balance) + +transfer_usdc_data = 'a9059cbb000000000000000000000000111111111111111111111111111111111111111100000000000000000000000000000000000000000000000000000000000003e8' + +transfer_usdc_tx = { + 'from': sender.address, + 'data': transfer_usdc_data, + 'to': usdc_address, + 'value': 0, + 'gas': 11000000, + 'maxFeePerGas': 2000000000, + 'maxPriorityFeePerGas': 1000000000, +} + +tx_hash = w3.eth.send_transaction(transfer_usdc_tx) +print(tx_hash) +receipt = w3.eth.wait_for_transaction_receipt(tx_hash) +print(receipt) + +balance = w3.eth.call(balanceOf_usdc_tx) +print(balance) + +balanceOf_usdc_data2 = '70a082310000000000000000000000001111111111111111111111111111111111111111' +balanceOf_usdc_tx['data'] = balanceOf_usdc_data2 + +balance = w3.eth.call(balanceOf_usdc_tx) +print(balance) diff --git a/src/solidity.md b/src/solidity.md index d28a438..6fedb0a 100644 --- a/src/solidity.md +++ b/src/solidity.md @@ -20,7 +20,6 @@ module SOLIDITY-CONFIGURATION syntax Id ::= "Id" [token] configuration - decodeProgram($PGM:Bytes) ~> execute($CREATE:Bool, #if $CREATE:Bool #then $PGM:Bytes #else CallData() #fi) Id @@ -81,7 +80,6 @@ module SOLIDITY-CONFIGURATION EVMC_SUCCESS $GAS:Int - syntax KItem ::= execute(Bool, Bytes) @@ -103,13 +101,13 @@ module SOLIDITY-CONFIGURATION // The active contract should be the last one in the list of contracts as // decoded by the provided $PGM. rule execute(false, B) => - #let Sel = Bytes2String(substrBytes(B, 0, 4)) #in #let ARGS::CallArgumentList = decodeArgs(substrBytes(B, 4, lengthBytes(B)), ParamTypes) #in F ( ARGS ) TYPE + _ => TYPE TYPE - ... Sel |-> F:Id ... + ... Bytes2String(substrBytes(B, 0, 4)) |-> F:Id ... F ParamTypes @@ -153,35 +151,39 @@ module SOLIDITY-ULM-SIGNATURE-IMPLEMENTATION imports BYTES imports ULM-SIGNATURE - rule getStatus(... + rule getStatus(... ... STATUS:Int ... - ...) => STATUS + ...) => STATUS // getOutput gets the output from the top of the K cell (as expected after // completion of the return statement) and encodes it to Bytes. // We currently handle the encoding of return values of types uint256 and bool. - rule getOutput(... + + rule getOutput(... + B:Bytes + ...) => B + rule getOutput(... v(V:MInt{256}, uint256) ... - ...) => Int2Bytes(32, MInt2Unsigned(V), BE) - rule getOutput(... + ...) => Int2Bytes(32, MInt2Unsigned(V), BE) + rule getOutput(... v(true, bool) ... - ...) => Int2Bytes(32, 1, BE) - rule getOutput(... + ...) => Int2Bytes(32, 1, BE) + rule getOutput(... v(false, bool) ... - ...) => Int2Bytes(32, 0, BE) + ...) => Int2Bytes(32, 0, BE) // getGasLeft returns the amount of gas left by reading it from the cell . // The semantics currently initialize the gas by reading the appropriate ULM // configuration variable, but do not update it as the computations are performed. // I.e., this function is always going to return the exact amount of gas that was // provided to begin with. - rule getGasLeft(... + rule getGasLeft(... ... GASLEFT:Int ... - ...) => GASLEFT + ...) => GASLEFT endmodule ``` @@ -282,6 +284,7 @@ module SOLIDITY imports SOLIDITY-EXPRESSION imports SOLIDITY-STATEMENT imports SOLIDITY-FUNCTION-SELECTORS + imports SOLIDITY-ULM-SIGNATURE-IMPLEMENTATION rule _:PragmaDefinition Ss:SourceUnits => Ss ... rule S:SourceUnit Ss:SourceUnits => S ~> Ss From b16c4451fec8380d141985048746db2f7bd9e0bc Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Wed, 30 Oct 2024 12:09:24 -0500 Subject: [PATCH 22/41] Replaced Mock contracts with renamed versions. KORE and bin is automatically generated. --- test/demo-contracts/UniswapV2Swap.DAI.kore | 1 - .../demo-contracts/UniswapV2Swap.DAI.kore.bin | 1 - test/demo-contracts/UniswapV2Swap.USDC.kore | 1 - .../UniswapV2Swap.USDC.kore.bin | 1 - test/demo-contracts/UniswapV2Swap.WETH.kore | 1 - .../UniswapV2Swap.WETH.kore.bin | 1 - ...p.DAI.sol => UniswapV2SwapRenamed.DAI.sol} | 20 +++---- ...USDC.sol => UniswapV2SwapRenamed.USDC.sol} | 58 +++++++++---------- ...WETH.sol => UniswapV2SwapRenamed.WETH.sol} | 28 ++++----- 9 files changed, 53 insertions(+), 59 deletions(-) delete mode 100644 test/demo-contracts/UniswapV2Swap.DAI.kore delete mode 100644 test/demo-contracts/UniswapV2Swap.DAI.kore.bin delete mode 100644 test/demo-contracts/UniswapV2Swap.USDC.kore delete mode 100644 test/demo-contracts/UniswapV2Swap.USDC.kore.bin delete mode 100644 test/demo-contracts/UniswapV2Swap.WETH.kore delete mode 100644 test/demo-contracts/UniswapV2Swap.WETH.kore.bin rename test/demo-contracts/{UniswapV2Swap.DAI.sol => UniswapV2SwapRenamed.DAI.sol} (71%) rename test/demo-contracts/{UniswapV2Swap.USDC.sol => UniswapV2SwapRenamed.USDC.sol} (52%) rename test/demo-contracts/{UniswapV2Swap.WETH.sol => UniswapV2SwapRenamed.WETH.sol} (72%) diff --git a/test/demo-contracts/UniswapV2Swap.DAI.kore b/test/demo-contracts/UniswapV2Swap.DAI.kore deleted file mode 100644 index 6a8ef56..0000000 --- a/test/demo-contracts/UniswapV2Swap.DAI.kore +++ /dev/null @@ -1 +0,0 @@ -Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Program'Unds'PragmaDefinition'Unds'SourceUnits{}(\dv{SortPragmaDefinition{}}("pragma solidity ^0.8.24;"),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'SourceUnits'Unds'SourceUnit'Unds'SourceUnits{}(inj{SortContractDefinition{}, SortSourceUnit{}}(Lblcontract'UndsLBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'ContractDefinition'Unds'Id'Unds'ContractBodyElements{}(\dv{SortId{}}("DAIMock"),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortStateVariableDeclaration{}, SortContractBodyElement{}}(Lbl'UndsUndsUndsEqlsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'StateVariableDeclaration'Unds'TypeName'Unds'VisibilitySpecifier'Unds'Id'Unds'Expression{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lblprivate'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}(),\dv{SortId{}}("UINT_MAX"),inj{SortHexNumber{}, SortExpression{}}(\dv{SortHexNumber{}}("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortStateVariableDeclaration{}, SortContractBodyElement{}}(Lbl'UndsUndsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'StateVariableDeclaration'Unds'TypeName'Unds'VisibilitySpecifier'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lblpublic'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}(),\dv{SortId{}}("totalSupply"))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortStateVariableDeclaration{}, SortContractBodyElement{}}(Lbl'UndsUndsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'StateVariableDeclaration'Unds'TypeName'Unds'VisibilitySpecifier'Unds'Id{}(inj{SortMappingType{}, SortTypeName{}}(Lblmapping'LParUndsUndsEqls-GT-UndsUndsRParUnds'SOLIDITY-SYNTAX'Unds'MappingType'Unds'MappingKeyType'Unds'OptionalIdentifier'Unds'TypeName'Unds'OptionalIdentifier{}(inj{SortElementaryTypeName{}, SortMappingKeyType{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Unds'SOLIDITY-SYNTAX'Unds'OptionalIdentifier{}(),inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Unds'SOLIDITY-SYNTAX'Unds'OptionalIdentifier{}())),Lblpublic'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}(),\dv{SortId{}}("balanceOf"))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortStateVariableDeclaration{}, SortContractBodyElement{}}(Lbl'UndsUndsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'StateVariableDeclaration'Unds'TypeName'Unds'VisibilitySpecifier'Unds'Id{}(inj{SortMappingType{}, SortTypeName{}}(Lblmapping'LParUndsUndsEqls-GT-UndsUndsRParUnds'SOLIDITY-SYNTAX'Unds'MappingType'Unds'MappingKeyType'Unds'OptionalIdentifier'Unds'TypeName'Unds'OptionalIdentifier{}(inj{SortElementaryTypeName{}, SortMappingKeyType{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Unds'SOLIDITY-SYNTAX'Unds'OptionalIdentifier{}(),inj{SortMappingType{}, SortTypeName{}}(Lblmapping'LParUndsUndsEqls-GT-UndsUndsRParUnds'SOLIDITY-SYNTAX'Unds'MappingType'Unds'MappingKeyType'Unds'OptionalIdentifier'Unds'TypeName'Unds'OptionalIdentifier{}(inj{SortElementaryTypeName{}, SortMappingKeyType{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Unds'SOLIDITY-SYNTAX'Unds'OptionalIdentifier{}(),inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Unds'SOLIDITY-SYNTAX'Unds'OptionalIdentifier{}())),Lbl'Unds'SOLIDITY-SYNTAX'Unds'OptionalIdentifier{}())),Lblpublic'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}(),\dv{SortId{}}("allowance"))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortEventDefinition{}, SortContractBodyElement{}}(Lblevent'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EventDefinition'Unds'Id'Unds'EventParameters{}(\dv{SortId{}}("Approval"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'Unds'indexed'UndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("src")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'Unds'indexed'UndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("guy")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("wad")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters'QuotRBraUnds'EventParameters{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortEventDefinition{}, SortContractBodyElement{}}(Lblevent'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EventDefinition'Unds'Id'Unds'EventParameters{}(\dv{SortId{}}("Transfer"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'Unds'indexed'UndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("src")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'Unds'indexed'UndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("dst")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("wad")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters'QuotRBraUnds'EventParameters{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'ReturnSpecifier'Unds'FunctionBody{}(\dv{SortId{}}("decimals"),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}(),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblexternal'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),Lblreturns'LParUndsRParUnds'SOLIDITY-SYNTAX'Unds'ReturnSpecifier'Unds'ParameterList{}(Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(inj{SortElementaryTypeName{}, SortParameter{}}(Lbluint8'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortReturnStatement{}, SortStatement{}}(Lblreturn'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ReturnStatement'Unds'Expression{}(inj{SortDecimal{}, SortExpression{}}(\dv{SortDecimal{}}("18")))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'FunctionBody{}(\dv{SortId{}}("mint"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("usr")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("wad")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblpublic'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("usr"))),Lbl'UndsPlusUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("usr"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("wad")))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("totalSupply")),Lbl'UndsPlusUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("totalSupply")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("wad")))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortEmitStatement{}, SortStatement{}}(Lblemit'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EmitStatement'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("Transfer")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortElementaryTypeName{}, SortExpression{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortDecimal{}, SortExpression{}}(\dv{SortDecimal{}}("0")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}())),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("usr")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("wad")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'FunctionBody{}(\dv{SortId{}}("mintOnDeposit"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("usr")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("wad")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblpublic'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("mint")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("usr")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("wad")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'FunctionBody{}(\dv{SortId{}}("burn"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("usr")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("wad")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblpublic'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortIfStatement{}, SortStatement{}}(Lblif'LParUndsRParUndsUnds'SOLIDITY-SYNTAX'Unds'IfStatement'Unds'Expression'Unds'Statement{}(Lbl'Unds-GT-EqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("usr"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("wad"))),inj{SortBlock{}, SortStatement{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("usr"))),Lbl'Unds'-'UndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("usr"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("wad")))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("totalSupply")),Lbl'Unds'-'UndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("totalSupply")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("wad")))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}())))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'ReturnSpecifier'Unds'FunctionBody{}(\dv{SortId{}}("approve"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("usr")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("wad")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblexternal'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),Lblreturns'LParUndsRParUnds'SOLIDITY-SYNTAX'Unds'ReturnSpecifier'Unds'ParameterList{}(Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(inj{SortElementaryTypeName{}, SortParameter{}}(Lblbool'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("allowance")),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("usr"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("wad"))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortEmitStatement{}, SortStatement{}}(Lblemit'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EmitStatement'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("Approval")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("usr")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("wad")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortReturnStatement{}, SortStatement{}}(Lblreturn'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ReturnStatement'Unds'Expression{}(inj{SortBool{}, SortExpression{}}(\dv{SortBool{}}("true")))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'ReturnSpecifier'Unds'FunctionBody{}(\dv{SortId{}}("transfer"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("dst")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("wad")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblpublic'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),Lblreturns'LParUndsRParUnds'SOLIDITY-SYNTAX'Unds'ReturnSpecifier'Unds'ParameterList{}(Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(inj{SortElementaryTypeName{}, SortParameter{}}(Lblbool'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortReturnStatement{}, SortStatement{}}(Lblreturn'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ReturnStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("transferFrom")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("dst")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("wad")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}())))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'ReturnSpecifier'Unds'FunctionBody{}(\dv{SortId{}}("transferFrom"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("src")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("dst")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("wad")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}()))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblpublic'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),Lblreturns'LParUndsRParUnds'SOLIDITY-SYNTAX'Unds'ReturnSpecifier'Unds'ParameterList{}(Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(inj{SortElementaryTypeName{}, SortParameter{}}(Lblbool'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("require")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'Unds-GT-EqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("src"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("wad"))),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("Dai/insufficient-balance")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortIfStatement{}, SortStatement{}}(Lblif'LParUndsRParUndsUnds'SOLIDITY-SYNTAX'Unds'IfStatement'Unds'Expression'Unds'Statement{}(Lbl'UndsAnd-And-UndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsBangEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("src")),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender"))),Lbl'UndsBangEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("allowance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("src"))),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("UINT_MAX")))),inj{SortBlock{}, SortStatement{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("require")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'Unds-GT-EqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("allowance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("src"))),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("wad"))),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("Dai/insufficient-allowance")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("allowance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("src"))),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender"))),Lbl'Unds'-'UndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("allowance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("src"))),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("wad")))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}())))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("src"))),Lbl'Unds'-'UndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("src"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("wad")))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("dst"))),Lbl'UndsPlusUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("dst"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("wad")))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortEmitStatement{}, SortStatement{}}(Lblemit'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EmitStatement'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("Transfer")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("src")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("dst")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("wad")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortReturnStatement{}, SortStatement{}}(Lblreturn'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ReturnStatement'Unds'Expression{}(inj{SortBool{}, SortExpression{}}(\dv{SortBool{}}("true")))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}())))))))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'FunctionBody{}(\dv{SortId{}}("safeTransferFrom"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("from")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("to")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}()))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblexternal'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("transferFrom")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}())))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements'QuotRBraUnds'ContractBodyElements{}())))))))))))))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'SourceUnits'Unds'SourceUnit'Unds'SourceUnits'QuotRBraUnds'SourceUnits{}())) \ No newline at end of file diff --git a/test/demo-contracts/UniswapV2Swap.DAI.kore.bin b/test/demo-contracts/UniswapV2Swap.DAI.kore.bin deleted file mode 100644 index 772edee..0000000 --- a/test/demo-contracts/UniswapV2Swap.DAI.kore.bin +++ /dev/null @@ -1 +0,0 @@ -6B736F6C016B0100000180060000001800000000000000707261676D6120736F6C6964697479205E302E382E32343B00016C0100000179050000010A02000001120600000007000000000000004441494D6F636B00016401000001300500000170010000018005000001FD04000001D9030000011206000000080000000000000055494E545F4D41580001BF050000018E06000000420000000000000030786666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666600016401000001300500000171010000018005000001FD04000001CE0400000112060000000B00000000000000746F74616C537570706C7900016401000001300500000171010000018D050000019B0300000180050000010002000001DA000000018005000001FD04000001DA00000001CE040000011206000000090000000000000062616C616E63654F6600016401000001300500000171010000018D050000019B0300000180050000010002000001DA000000018D050000019B0300000180050000010002000001DA000000018005000001FD04000001DA00000001DA00000001CE0400000112060000000900000000000000616C6C6F77616E636500016401000001D0050000011E0200000112060000000800000000000000417070726F76616C00011601000001E400000001800500000100020000011206000000030000000000000073726300011601000001E40000000180050000010002000001120600000003000000000000006775790001160100000166010000018005000001FD04000001120600000003000000000000007761640001BD000000016401000001D0050000011E02000001120600000008000000000000005472616E7366657200011601000001E400000001800500000100020000011206000000030000000000000073726300011601000001E40000000180050000010002000001120600000003000000000000006473740001160100000166010000018005000001FD04000001120600000003000000000000007761640001BD000000016401000001CF05000001630200000112060000000800000000000000646563696D616C730001C000000001670100000159050000012302000001C200000001DA0400000119010000018005000001FF04000001C0000000016505000001AB000000016D010000019E05000001D9040000013E050000018C06000000020000000000000031380001C4000000016401000001CF050000016202000001120600000004000000000000006D696E74000119010000016A010000018005000001000200000112060000000300000000000000757372000119010000016A010000018005000001FD04000001120600000003000000000000007761640001C00000000167010000015905000001CE04000001C2000000016505000001AB000000016D0100000199050000014F010000012E01000001360100000158050000011206000000090000000000000062616C616E63654F66000158050000011206000000030000000000000075737200014D01000001360100000158050000011206000000090000000000000062616C616E63654F660001580500000112060000000300000000000000757372000158050000011206000000030000000000000077616400016D0100000199050000014F010000012E01000001580500000112060000000B00000000000000746F74616C537570706C7900014D01000001580500000112060000000B00000000000000746F74616C537570706C79000158050000011206000000030000000000000077616400016D01000001B50500000118020000015805000001120600000008000000000000005472616E736665720001140100000130010000018005000001000200000114010000013E050000018C0600000001000000000000003000016605000001B90000000114010000015805000001120600000003000000000000007573720001140100000158050000011206000000030000000000000077616400016605000001B900000001C4000000016401000001CF05000001620200000112060000000D000000000000006D696E744F6E4465706F736974000119010000016A010000018005000001000200000112060000000300000000000000757372000119010000016A010000018005000001FD04000001120600000003000000000000007761640001C00000000167010000015905000001CE04000001C2000000016505000001AB000000016D0100000199050000014F0100000130010000015805000001120600000004000000000000006D696E74000114010000015805000001120600000003000000000000007573720001140100000158050000011206000000030000000000000077616400016605000001B900000001C4000000016401000001CF050000016202000001120600000004000000000000006275726E000119010000016A010000018005000001000200000112060000000300000000000000757372000119010000016A010000018005000001FD04000001120600000003000000000000007761640001C00000000167010000015905000001CE04000001C2000000016505000001AB000000016D01000001D1050000017802000001F900000001360100000158050000011206000000090000000000000062616C616E63654F660001580500000112060000000300000000000000757372000158050000011206000000030000000000000077616400016505000001AB000000016D0100000199050000014F010000012E01000001360100000158050000011206000000090000000000000062616C616E63654F6600015805000001120600000003000000000000007573720001CA00000001360100000158050000011206000000090000000000000062616C616E63654F660001580500000112060000000300000000000000757372000158050000011206000000030000000000000077616400016D0100000199050000014F010000012E01000001580500000112060000000B00000000000000746F74616C537570706C790001CA00000001580500000112060000000B00000000000000746F74616C537570706C7900015805000001120600000003000000000000007761640001C400000001C4000000016401000001CF05000001630200000112060000000700000000000000617070726F7665000119010000016A010000018005000001000200000112060000000300000000000000757372000119010000016A010000018005000001FD04000001120600000003000000000000007761640001C000000001670100000159050000012302000001C200000001DA04000001190100000180050000010402000001C0000000016505000001AB000000016D0100000199050000014F010000012E0100000136010000013601000001580500000112060000000900000000000000616C6C6F77616E6365000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E6465720001580500000112060000000300000000000000757372000158050000011206000000030000000000000077616400016D01000001B5050000011802000001580500000112060000000800000000000000417070726F76616C0001140100000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E646572000114010000015805000001120600000003000000000000007573720001140100000158050000011206000000030000000000000077616400016605000001B9000000016D010000019E05000001D904000001770500000126060000000400000000000000747275650001C4000000016401000001CF050000016302000001120600000008000000000000007472616E73666572000119010000016A010000018005000001000200000112060000000300000000000000647374000119010000016A010000018005000001FD04000001120600000003000000000000007761640001C00000000167010000015905000001CE04000001C200000001DA04000001190100000180050000010402000001C0000000016505000001AB000000016D010000019E05000001D9040000013001000001580500000112060000000C000000000000007472616E7366657246726F6D0001140100000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E646572000114010000015805000001120600000003000000000000006473740001140100000158050000011206000000030000000000000077616400016605000001B900000001C4000000016401000001CF05000001630200000112060000000C000000000000007472616E7366657246726F6D000119010000016A010000018005000001000200000112060000000300000000000000737263000119010000016A010000018005000001000200000112060000000300000000000000647374000119010000016A010000018005000001FD04000001120600000003000000000000007761640001C00000000167010000015905000001CE04000001C200000001DA04000001190100000180050000010402000001C0000000016505000001AB000000016D0100000199050000014F0100000130010000015805000001120600000007000000000000007265717569726500011401000001F900000001360100000158050000011206000000090000000000000062616C616E63654F6600015805000001120600000003000000000000007372630001580500000112060000000300000000000000776164000166050000011201000001C705000001610600000018000000000000004461692F696E73756666696369656E742D62616C616E63650001B9000000016D01000001D10500000178020000010F010000011001000001580500000112060000000300000000000000737263000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E6465720001100100000136010000013601000001580500000112060000000900000000000000616C6C6F77616E63650001580500000112060000000300000000000000737263000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E646572000158050000011206000000080000000000000055494E545F4D415800016505000001AB000000016D0100000199050000014F0100000130010000015805000001120600000007000000000000007265717569726500011401000001F90000000136010000013601000001580500000112060000000900000000000000616C6C6F77616E63650001580500000112060000000300000000000000737263000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E6465720001580500000112060000000300000000000000776164000166050000011201000001C70500000161060000001A000000000000004461692F696E73756666696369656E742D616C6C6F77616E63650001B9000000016D0100000199050000014F010000012E0100000136010000013601000001580500000112060000000900000000000000616C6C6F77616E63650001580500000112060000000300000000000000737263000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E6465720001CA0000000136010000013601000001580500000112060000000900000000000000616C6C6F77616E63650001580500000112060000000300000000000000737263000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E64657200015805000001120600000003000000000000007761640001C4000000016D0100000199050000014F010000012E01000001360100000158050000011206000000090000000000000062616C616E63654F6600015805000001120600000003000000000000007372630001CA00000001360100000158050000011206000000090000000000000062616C616E63654F660001580500000112060000000300000000000000737263000158050000011206000000030000000000000077616400016D0100000199050000014F010000012E01000001360100000158050000011206000000090000000000000062616C616E63654F66000158050000011206000000030000000000000064737400014D01000001360100000158050000011206000000090000000000000062616C616E63654F660001580500000112060000000300000000000000647374000158050000011206000000030000000000000077616400016D01000001B50500000118020000015805000001120600000008000000000000005472616E7366657200011401000001580500000112060000000300000000000000737263000114010000015805000001120600000003000000000000006473740001140100000158050000011206000000030000000000000077616400016605000001B9000000016D010000019E05000001D904000001770500000126060000000400000000000000747275650001C4000000016401000001CF05000001620200000112060000001000000000000000736166655472616E7366657246726F6D000119010000016A01000001800500000100020000011206000000040000000000000066726F6D000119010000016A010000018005000001000200000112060000000200000000000000746F000119010000016A010000018005000001FD040000011206000000050000000000000076616C75650001C000000001670100000159050000012302000001C2000000016505000001AB000000016D0100000199050000014F010000013001000001580500000112060000000C000000000000007472616E7366657246726F6D0001140100000158050000011206000000040000000000000066726F6D00011401000001580500000112060000000200000000000000746F0001140100000158050000011206000000050000000000000076616C756500016605000001B900000001C400000001C100000001C3000000 diff --git a/test/demo-contracts/UniswapV2Swap.USDC.kore b/test/demo-contracts/UniswapV2Swap.USDC.kore deleted file mode 100644 index 78b3529..0000000 --- a/test/demo-contracts/UniswapV2Swap.USDC.kore +++ /dev/null @@ -1 +0,0 @@ -Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Program'Unds'PragmaDefinition'Unds'SourceUnits{}(\dv{SortPragmaDefinition{}}("pragma solidity ^0.8.24;"),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'SourceUnits'Unds'SourceUnit'Unds'SourceUnits{}(inj{SortContractDefinition{}, SortSourceUnit{}}(Lblcontract'UndsLBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'ContractDefinition'Unds'Id'Unds'ContractBodyElements{}(\dv{SortId{}}("USDCMock"),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortStateVariableDeclaration{}, SortContractBodyElement{}}(Lbl'UndsUndsUndsEqlsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'StateVariableDeclaration'Unds'TypeName'Unds'VisibilitySpecifier'Unds'Id'Unds'Expression{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lblprivate'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}(),\dv{SortId{}}("UINT256_MAX"),inj{SortHexNumber{}, SortExpression{}}(\dv{SortHexNumber{}}("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortStateVariableDeclaration{}, SortContractBodyElement{}}(Lbl'UndsUndsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'StateVariableDeclaration'Unds'TypeName'Unds'VisibilitySpecifier'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lblprivate'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}(),\dv{SortId{}}("_totalSupply"))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortStateVariableDeclaration{}, SortContractBodyElement{}}(Lbl'UndsUndsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'StateVariableDeclaration'Unds'TypeName'Unds'VisibilitySpecifier'Unds'Id{}(inj{SortMappingType{}, SortTypeName{}}(Lblmapping'LParUndsUndsEqls-GT-UndsUndsRParUnds'SOLIDITY-SYNTAX'Unds'MappingType'Unds'MappingKeyType'Unds'OptionalIdentifier'Unds'TypeName'Unds'OptionalIdentifier{}(inj{SortElementaryTypeName{}, SortMappingKeyType{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),inj{SortId{}, SortOptionalIdentifier{}}(\dv{SortId{}}("account")),inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Unds'SOLIDITY-SYNTAX'Unds'OptionalIdentifier{}())),Lblprivate'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}(),\dv{SortId{}}("_balances"))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortStateVariableDeclaration{}, SortContractBodyElement{}}(Lbl'UndsUndsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'StateVariableDeclaration'Unds'TypeName'Unds'VisibilitySpecifier'Unds'Id{}(inj{SortMappingType{}, SortTypeName{}}(Lblmapping'LParUndsUndsEqls-GT-UndsUndsRParUnds'SOLIDITY-SYNTAX'Unds'MappingType'Unds'MappingKeyType'Unds'OptionalIdentifier'Unds'TypeName'Unds'OptionalIdentifier{}(inj{SortElementaryTypeName{}, SortMappingKeyType{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),inj{SortId{}, SortOptionalIdentifier{}}(\dv{SortId{}}("account")),inj{SortMappingType{}, SortTypeName{}}(Lblmapping'LParUndsUndsEqls-GT-UndsUndsRParUnds'SOLIDITY-SYNTAX'Unds'MappingType'Unds'MappingKeyType'Unds'OptionalIdentifier'Unds'TypeName'Unds'OptionalIdentifier{}(inj{SortElementaryTypeName{}, SortMappingKeyType{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),inj{SortId{}, SortOptionalIdentifier{}}(\dv{SortId{}}("spender")),inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Unds'SOLIDITY-SYNTAX'Unds'OptionalIdentifier{}())),Lbl'Unds'SOLIDITY-SYNTAX'Unds'OptionalIdentifier{}())),Lblprivate'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}(),\dv{SortId{}}("_allowances"))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortEventDefinition{}, SortContractBodyElement{}}(Lblevent'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EventDefinition'Unds'Id'Unds'EventParameters{}(\dv{SortId{}}("Transfer"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'Unds'indexed'UndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("from")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'Unds'indexed'UndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("to")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters'QuotRBraUnds'EventParameters{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortEventDefinition{}, SortContractBodyElement{}}(Lblevent'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EventDefinition'Unds'Id'Unds'EventParameters{}(\dv{SortId{}}("Approval"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'Unds'indexed'UndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("owner")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'Unds'indexed'UndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("spender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters'QuotRBraUnds'EventParameters{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'ReturnSpecifier'Unds'FunctionBody{}(\dv{SortId{}}("decimals"),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}(),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblexternal'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),Lblreturns'LParUndsRParUnds'SOLIDITY-SYNTAX'Unds'ReturnSpecifier'Unds'ParameterList{}(Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(inj{SortElementaryTypeName{}, SortParameter{}}(Lbluint8'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortReturnStatement{}, SortStatement{}}(Lblreturn'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ReturnStatement'Unds'Expression{}(inj{SortDecimal{}, SortExpression{}}(\dv{SortDecimal{}}("18")))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'FunctionBody{}(\dv{SortId{}}("mint"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("account")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblpublic'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("require")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsBangEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("account")),Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortElementaryTypeName{}, SortExpression{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortDecimal{}, SortExpression{}}(\dv{SortDecimal{}}("0")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("USDC: invalid receiver")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_update")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortElementaryTypeName{}, SortExpression{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortDecimal{}, SortExpression{}}(\dv{SortDecimal{}}("0")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}())),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("account")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}())))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}())))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'ReturnSpecifier'Unds'FunctionBody{}(\dv{SortId{}}("balanceOf"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("account")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}()),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblpublic'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),Lblreturns'LParUndsRParUnds'SOLIDITY-SYNTAX'Unds'ReturnSpecifier'Unds'ParameterList{}(Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(inj{SortElementaryTypeName{}, SortParameter{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortReturnStatement{}, SortStatement{}}(Lblreturn'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ReturnStatement'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_balances")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("account"))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'ReturnSpecifier'Unds'FunctionBody{}(\dv{SortId{}}("transfer"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("to")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblpublic'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),Lblreturns'LParUndsRParUnds'SOLIDITY-SYNTAX'Unds'ReturnSpecifier'Unds'ParameterList{}(Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(inj{SortElementaryTypeName{}, SortParameter{}}(Lblbool'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortVariableDeclarationStatement{}, SortStatement{}}(Lbl'UndsEqlsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'VariableDeclarationStatement'Unds'VariableDeclaration'Unds'Expression{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'VariableDeclaration'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("owner")),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender")))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_transfer")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("owner")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}())))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortReturnStatement{}, SortStatement{}}(Lblreturn'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ReturnStatement'Unds'Expression{}(inj{SortBool{}, SortExpression{}}(\dv{SortBool{}}("true")))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'ReturnSpecifier'Unds'FunctionBody{}(\dv{SortId{}}("allowance"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("owner")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("spender")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblpublic'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),Lblreturns'LParUndsRParUnds'SOLIDITY-SYNTAX'Unds'ReturnSpecifier'Unds'ParameterList{}(Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(inj{SortElementaryTypeName{}, SortParameter{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortReturnStatement{}, SortStatement{}}(Lblreturn'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ReturnStatement'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_allowances")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("owner"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("spender"))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'ReturnSpecifier'Unds'FunctionBody{}(\dv{SortId{}}("approve"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("spender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblpublic'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),Lblreturns'LParUndsRParUnds'SOLIDITY-SYNTAX'Unds'ReturnSpecifier'Unds'ParameterList{}(Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(inj{SortElementaryTypeName{}, SortParameter{}}(Lblbool'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortVariableDeclarationStatement{}, SortStatement{}}(Lbl'UndsEqlsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'VariableDeclarationStatement'Unds'VariableDeclaration'Unds'Expression{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'VariableDeclaration'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("owner")),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender")))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_approve")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("owner")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("spender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortBool{}, SortExpression{}}(\dv{SortBool{}}("true")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortReturnStatement{}, SortStatement{}}(Lblreturn'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ReturnStatement'Unds'Expression{}(inj{SortBool{}, SortExpression{}}(\dv{SortBool{}}("true")))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'ReturnSpecifier'Unds'FunctionBody{}(\dv{SortId{}}("transferFrom"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("from")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("to")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}()))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblpublic'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),Lblreturns'LParUndsRParUnds'SOLIDITY-SYNTAX'Unds'ReturnSpecifier'Unds'ParameterList{}(Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(inj{SortElementaryTypeName{}, SortParameter{}}(Lblbool'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortVariableDeclarationStatement{}, SortStatement{}}(Lbl'UndsEqlsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'VariableDeclarationStatement'Unds'VariableDeclaration'Unds'Expression{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'VariableDeclaration'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("spender")),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender")))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_spendAllowance")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("spender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}())))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_transfer")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}())))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortReturnStatement{}, SortStatement{}}(Lblreturn'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ReturnStatement'Unds'Expression{}(inj{SortBool{}, SortExpression{}}(\dv{SortBool{}}("true")))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}())))))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'FunctionBody{}(\dv{SortId{}}("_transfer"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("from")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("to")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}()))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblprivate'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("require")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsBangEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from")),Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortElementaryTypeName{}, SortExpression{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortDecimal{}, SortExpression{}}(\dv{SortDecimal{}}("0")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("USDC: invalid sender")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("require")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsBangEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to")),Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortElementaryTypeName{}, SortExpression{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortDecimal{}, SortExpression{}}(\dv{SortDecimal{}}("0")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("USDC: invalid receiver")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_update")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}())))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'FunctionBody{}(\dv{SortId{}}("_update"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("from")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("to")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}()))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblprivate'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortIfStatement{}, SortStatement{}}(Lblif'LParUndsRParUnds'else'UndsUnds'SOLIDITY-SYNTAX'Unds'IfStatement'Unds'Expression'Unds'Statement'Unds'Statement{}(Lbl'UndsEqlsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from")),Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortElementaryTypeName{}, SortExpression{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortDecimal{}, SortExpression{}}(\dv{SortDecimal{}}("0")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))),inj{SortBlock{}, SortStatement{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_totalSupply")),Lbl'UndsPlusUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_totalSupply")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))),inj{SortBlock{}, SortStatement{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortVariableDeclarationStatement{}, SortStatement{}}(Lbl'UndsEqlsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'VariableDeclarationStatement'Unds'VariableDeclaration'Unds'Expression{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'VariableDeclaration'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("fromBalance")),Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_balances")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from"))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("require")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'Unds-GT-EqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("fromBalance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value"))),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("USDC: insufficient balance")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_balances")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from"))),Lbl'Unds'-'UndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("fromBalance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortIfStatement{}, SortStatement{}}(Lblif'LParUndsRParUnds'else'UndsUnds'SOLIDITY-SYNTAX'Unds'IfStatement'Unds'Expression'Unds'Statement'Unds'Statement{}(Lbl'UndsEqlsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to")),Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortElementaryTypeName{}, SortExpression{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortDecimal{}, SortExpression{}}(\dv{SortDecimal{}}("0")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))),inj{SortBlock{}, SortStatement{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_totalSupply")),Lbl'Unds'-'UndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_totalSupply")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))),inj{SortBlock{}, SortStatement{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_balances")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to"))),Lbl'UndsPlusUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_balances")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortEmitStatement{}, SortStatement{}}(Lblemit'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EmitStatement'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("Transfer")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'FunctionBody{}(\dv{SortId{}}("_approve"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("owner")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("spender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("value")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lblbool'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("emitEvent")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblprivate'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("require")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsBangEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("owner")),Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortElementaryTypeName{}, SortExpression{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortDecimal{}, SortExpression{}}(\dv{SortDecimal{}}("0")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("USDC: invalid approver")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("require")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsBangEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("spender")),Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortElementaryTypeName{}, SortExpression{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortDecimal{}, SortExpression{}}(\dv{SortDecimal{}}("0")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("USDC: invalid spender")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_allowances")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("owner"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("spender"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value"))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortIfStatement{}, SortStatement{}}(Lblif'LParUndsRParUndsUnds'SOLIDITY-SYNTAX'Unds'IfStatement'Unds'Expression'Unds'Statement{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("emitEvent")),inj{SortBlock{}, SortStatement{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortEmitStatement{}, SortStatement{}}(Lblemit'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EmitStatement'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("Approval")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("owner")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("spender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}())))))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'FunctionBody{}(\dv{SortId{}}("_spendAllowance"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("owner")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("spender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}()))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblprivate'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortVariableDeclarationStatement{}, SortStatement{}}(Lbl'UndsEqlsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'VariableDeclarationStatement'Unds'VariableDeclaration'Unds'Expression{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'VariableDeclaration'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("currentAllowance")),Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("allowance")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("owner")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("spender")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortIfStatement{}, SortStatement{}}(Lblif'LParUndsRParUndsUnds'SOLIDITY-SYNTAX'Unds'IfStatement'Unds'Expression'Unds'Statement{}(Lbl'UndsBangEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("currentAllowance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("UINT256_MAX"))),inj{SortBlock{}, SortStatement{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("require")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'Unds-GT-EqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("currentAllowance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value"))),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("USDC: insufficient allowance")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("_approve")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("owner")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("spender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'Unds'-'UndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("currentAllowance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value"))),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortBool{}, SortExpression{}}(\dv{SortBool{}}("false")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}())))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}())))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements'QuotRBraUnds'ContractBodyElements{}()))))))))))))))))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'SourceUnits'Unds'SourceUnit'Unds'SourceUnits'QuotRBraUnds'SourceUnits{}())) \ No newline at end of file diff --git a/test/demo-contracts/UniswapV2Swap.USDC.kore.bin b/test/demo-contracts/UniswapV2Swap.USDC.kore.bin deleted file mode 100644 index 4a60119..0000000 --- a/test/demo-contracts/UniswapV2Swap.USDC.kore.bin +++ /dev/null @@ -1 +0,0 @@ -6B736F6C016B0100000180060000001800000000000000707261676D6120736F6C6964697479205E302E382E32343B00016C0100000179050000010A0200000112060000000800000000000000555344434D6F636B00016401000001300500000170010000018005000001FD04000001D90300000112060000000B0000000000000055494E543235365F4D41580001BF050000018E06000000420000000000000030786666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666600016401000001300500000171010000018005000001FD04000001D90300000112060000000C000000000000005F746F74616C537570706C7900016401000001300500000171010000018D050000019B03000001800500000100020000015805000001120600000007000000000000006163636F756E7400018005000001FD04000001DA00000001D903000001120600000009000000000000005F62616C616E63657300016401000001300500000171010000018D050000019B03000001800500000100020000015805000001120600000007000000000000006163636F756E7400018D050000019B03000001800500000100020000015805000001120600000007000000000000007370656E64657200018005000001FD04000001DA00000001DA00000001D90300000112060000000B000000000000005F616C6C6F77616E63657300016401000001D0050000011E02000001120600000008000000000000005472616E7366657200011601000001E400000001800500000100020000011206000000040000000000000066726F6D00011601000001E4000000018005000001000200000112060000000200000000000000746F0001160100000166010000018005000001FD040000011206000000050000000000000076616C75650001BD000000016401000001D0050000011E0200000112060000000800000000000000417070726F76616C00011601000001E40000000180050000010002000001120600000005000000000000006F776E657200011601000001E40000000180050000010002000001120600000007000000000000007370656E6465720001160100000166010000018005000001FD040000011206000000050000000000000076616C75650001BD000000016401000001CF05000001630200000112060000000800000000000000646563696D616C730001C000000001670100000159050000012302000001C200000001DA0400000119010000018005000001FF04000001C0000000016505000001AB000000016D010000019E05000001D9040000013E050000018C06000000020000000000000031380001C4000000016401000001CF050000016202000001120600000004000000000000006D696E74000119010000016A0100000180050000010002000001120600000007000000000000006163636F756E74000119010000016A010000018005000001FD040000011206000000050000000000000076616C75650001C00000000167010000015905000001CE04000001C2000000016505000001AB000000016D0100000199050000014F010000013001000001580500000112060000000700000000000000726571756972650001140100000110010000015805000001120600000007000000000000006163636F756E74000130010000018005000001000200000114010000013E050000018C0600000001000000000000003000016605000001B90000000166050000011201000001C70500000161060000001600000000000000555344433A20696E76616C69642072656365697665720001B9000000016D0100000199050000014F0100000130010000015805000001120600000007000000000000005F7570646174650001140100000130010000018005000001000200000114010000013E050000018C0600000001000000000000003000016605000001B90000000114010000015805000001120600000007000000000000006163636F756E740001140100000158050000011206000000050000000000000076616C756500016605000001B900000001C4000000016401000001CF0500000163020000011206000000090000000000000062616C616E63654F66000119010000016A0100000180050000010002000001120600000007000000000000006163636F756E740001C00000000167010000015905000001CE04000001C200000001DA0400000119010000018005000001FD04000001C0000000016505000001AB000000016D010000019E05000001D90400000136010000015805000001120600000009000000000000005F62616C616E63657300015805000001120600000007000000000000006163636F756E740001C4000000016401000001CF050000016302000001120600000008000000000000007472616E73666572000119010000016A010000018005000001000200000112060000000200000000000000746F000119010000016A010000018005000001FD040000011206000000050000000000000076616C75650001C00000000167010000015905000001CE04000001C200000001DA04000001190100000180050000010402000001C0000000016505000001AB000000016D0100000144050000012D010000016F0100000180050000010002000001120600000005000000000000006F776E6572000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E64657200016D0100000199050000014F0100000130010000015805000001120600000009000000000000005F7472616E73666572000114010000015805000001120600000005000000000000006F776E657200011401000001580500000112060000000200000000000000746F0001140100000158050000011206000000050000000000000076616C756500016605000001B9000000016D010000019E05000001D904000001770500000126060000000400000000000000747275650001C4000000016401000001CF05000001630200000112060000000900000000000000616C6C6F77616E6365000119010000016A0100000180050000010002000001120600000005000000000000006F776E6572000119010000016A0100000180050000010002000001120600000007000000000000007370656E6465720001C00000000167010000015905000001CE04000001C200000001DA0400000119010000018005000001FD04000001C0000000016505000001AB000000016D010000019E05000001D90400000136010000013601000001580500000112060000000B000000000000005F616C6C6F77616E63657300015805000001120600000005000000000000006F776E657200015805000001120600000007000000000000007370656E6465720001C4000000016401000001CF05000001630200000112060000000700000000000000617070726F7665000119010000016A0100000180050000010002000001120600000007000000000000007370656E646572000119010000016A010000018005000001FD040000011206000000050000000000000076616C75650001C00000000167010000015905000001CE04000001C200000001DA04000001190100000180050000010402000001C0000000016505000001AB000000016D0100000144050000012D010000016F0100000180050000010002000001120600000005000000000000006F776E6572000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E64657200016D0100000199050000014F0100000130010000015805000001120600000008000000000000005F617070726F7665000114010000015805000001120600000005000000000000006F776E6572000114010000015805000001120600000007000000000000007370656E6465720001140100000158050000011206000000050000000000000076616C7565000114010000017705000001260600000004000000000000007472756500016605000001B9000000016D010000019E05000001D904000001770500000126060000000400000000000000747275650001C4000000016401000001CF05000001630200000112060000000C000000000000007472616E7366657246726F6D000119010000016A01000001800500000100020000011206000000040000000000000066726F6D000119010000016A010000018005000001000200000112060000000200000000000000746F000119010000016A010000018005000001FD040000011206000000050000000000000076616C75650001C00000000167010000015905000001CE04000001C200000001DA04000001190100000180050000010402000001C0000000016505000001AB000000016D0100000144050000012D010000016F0100000180050000010002000001120600000007000000000000007370656E646572000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E64657200016D0100000199050000014F010000013001000001580500000112060000000F000000000000005F7370656E64416C6C6F77616E63650001140100000158050000011206000000040000000000000066726F6D000114010000015805000001120600000007000000000000007370656E6465720001140100000158050000011206000000050000000000000076616C756500016605000001B9000000016D0100000199050000014F0100000130010000015805000001120600000009000000000000005F7472616E736665720001140100000158050000011206000000040000000000000066726F6D00011401000001580500000112060000000200000000000000746F0001140100000158050000011206000000050000000000000076616C756500016605000001B9000000016D010000019E05000001D904000001770500000126060000000400000000000000747275650001C4000000016401000001CF050000016202000001120600000009000000000000005F7472616E73666572000119010000016A01000001800500000100020000011206000000040000000000000066726F6D000119010000016A010000018005000001000200000112060000000200000000000000746F000119010000016A010000018005000001FD040000011206000000050000000000000076616C75650001C00000000167010000015905000001D903000001C2000000016505000001AB000000016D0100000199050000014F0100000130010000015805000001120600000007000000000000007265717569726500011401000001100100000158050000011206000000040000000000000066726F6D000130010000018005000001000200000114010000013E050000018C0600000001000000000000003000016605000001B90000000166050000011201000001C70500000161060000001400000000000000555344433A20696E76616C69642073656E6465720001B9000000016D0100000199050000014F01000001300100000158050000011206000000070000000000000072657175697265000114010000011001000001580500000112060000000200000000000000746F000130010000018005000001000200000114010000013E050000018C0600000001000000000000003000016605000001B90000000166050000011201000001C70500000161060000001600000000000000555344433A20696E76616C69642072656365697665720001B9000000016D0100000199050000014F0100000130010000015805000001120600000007000000000000005F7570646174650001140100000158050000011206000000040000000000000066726F6D00011401000001580500000112060000000200000000000000746F0001140100000158050000011206000000050000000000000076616C756500016605000001B900000001C4000000016401000001CF050000016202000001120600000007000000000000005F757064617465000119010000016A01000001800500000100020000011206000000040000000000000066726F6D000119010000016A010000018005000001000200000112060000000200000000000000746F000119010000016A010000018005000001FD040000011206000000050000000000000076616C75650001C00000000167010000015905000001D903000001C2000000016505000001AB000000016D01000001D1050000017702000001230100000158050000011206000000040000000000000066726F6D000130010000018005000001000200000114010000013E050000018C0600000001000000000000003000016605000001B9000000016505000001AB000000016D0100000199050000014F010000012E01000001580500000112060000000C000000000000005F746F74616C537570706C7900014D01000001580500000112060000000C000000000000005F746F74616C537570706C79000158050000011206000000050000000000000076616C75650001C4000000016505000001AB000000016D0100000144050000012D010000016F010000018005000001FD0400000112060000000B0000000000000066726F6D42616C616E6365000136010000015805000001120600000009000000000000005F62616C616E636573000158050000011206000000040000000000000066726F6D00016D0100000199050000014F0100000130010000015805000001120600000007000000000000007265717569726500011401000001F900000001580500000112060000000B0000000000000066726F6D42616C616E6365000158050000011206000000050000000000000076616C7565000166050000011201000001C70500000161060000001A00000000000000555344433A20696E73756666696369656E742062616C616E63650001B9000000016D0100000199050000014F010000012E0100000136010000015805000001120600000009000000000000005F62616C616E636573000158050000011206000000040000000000000066726F6D0001CA00000001580500000112060000000B0000000000000066726F6D42616C616E6365000158050000011206000000050000000000000076616C75650001C4000000016D01000001D10500000177020000012301000001580500000112060000000200000000000000746F000130010000018005000001000200000114010000013E050000018C0600000001000000000000003000016605000001B9000000016505000001AB000000016D0100000199050000014F010000012E01000001580500000112060000000C000000000000005F746F74616C537570706C790001CA00000001580500000112060000000C000000000000005F746F74616C537570706C79000158050000011206000000050000000000000076616C75650001C4000000016505000001AB000000016D0100000199050000014F010000012E0100000136010000015805000001120600000009000000000000005F62616C616E6365730001580500000112060000000200000000000000746F00014D0100000136010000015805000001120600000009000000000000005F62616C616E6365730001580500000112060000000200000000000000746F000158050000011206000000050000000000000076616C75650001C4000000016D01000001B50500000118020000015805000001120600000008000000000000005472616E736665720001140100000158050000011206000000040000000000000066726F6D00011401000001580500000112060000000200000000000000746F0001140100000158050000011206000000050000000000000076616C756500016605000001B900000001C4000000016401000001CF050000016202000001120600000008000000000000005F617070726F7665000119010000016A0100000180050000010002000001120600000005000000000000006F776E6572000119010000016A0100000180050000010002000001120600000007000000000000007370656E646572000119010000016A010000018005000001FD040000011206000000050000000000000076616C7565000119010000016A010000018005000001040200000112060000000900000000000000656D69744576656E740001C00000000167010000015905000001D903000001C2000000016505000001AB000000016D0100000199050000014F010000013001000001580500000112060000000700000000000000726571756972650001140100000110010000015805000001120600000005000000000000006F776E6572000130010000018005000001000200000114010000013E050000018C0600000001000000000000003000016605000001B90000000166050000011201000001C70500000161060000001600000000000000555344433A20696E76616C696420617070726F7665720001B9000000016D0100000199050000014F010000013001000001580500000112060000000700000000000000726571756972650001140100000110010000015805000001120600000007000000000000007370656E646572000130010000018005000001000200000114010000013E050000018C0600000001000000000000003000016605000001B90000000166050000011201000001C70500000161060000001500000000000000555344433A20696E76616C6964207370656E6465720001B9000000016D0100000199050000014F010000012E0100000136010000013601000001580500000112060000000B000000000000005F616C6C6F77616E63657300015805000001120600000005000000000000006F776E657200015805000001120600000007000000000000007370656E646572000158050000011206000000050000000000000076616C756500016D01000001D1050000017802000001580500000112060000000900000000000000656D69744576656E7400016505000001AB000000016D01000001B5050000011802000001580500000112060000000800000000000000417070726F76616C000114010000015805000001120600000005000000000000006F776E6572000114010000015805000001120600000007000000000000007370656E6465720001140100000158050000011206000000050000000000000076616C756500016605000001B900000001C400000001C4000000016401000001CF05000001620200000112060000000F000000000000005F7370656E64416C6C6F77616E6365000119010000016A0100000180050000010002000001120600000005000000000000006F776E6572000119010000016A0100000180050000010002000001120600000007000000000000007370656E646572000119010000016A010000018005000001FD040000011206000000050000000000000076616C75650001C00000000167010000015905000001D903000001C2000000016505000001AB000000016D0100000144050000012D010000016F010000018005000001FD040000011206000000100000000000000063757272656E74416C6C6F77616E636500013001000001580500000112060000000900000000000000616C6C6F77616E6365000114010000015805000001120600000005000000000000006F776E6572000114010000015805000001120600000007000000000000007370656E64657200016605000001B9000000016D01000001D1050000017802000001100100000158050000011206000000100000000000000063757272656E74416C6C6F77616E63650001580500000112060000000B0000000000000055494E543235365F4D415800016505000001AB000000016D0100000199050000014F0100000130010000015805000001120600000007000000000000007265717569726500011401000001F90000000158050000011206000000100000000000000063757272656E74416C6C6F77616E6365000158050000011206000000050000000000000076616C7565000166050000011201000001C70500000161060000001C00000000000000555344433A20696E73756666696369656E7420616C6C6F77616E63650001B9000000016D0100000199050000014F0100000130010000015805000001120600000008000000000000005F617070726F7665000114010000015805000001120600000005000000000000006F776E6572000114010000015805000001120600000007000000000000007370656E64657200011401000001CA0000000158050000011206000000100000000000000063757272656E74416C6C6F77616E6365000158050000011206000000050000000000000076616C75650001140100000177050000012606000000050000000000000066616C736500016605000001B900000001C400000001C400000001C100000001C3000000 diff --git a/test/demo-contracts/UniswapV2Swap.WETH.kore b/test/demo-contracts/UniswapV2Swap.WETH.kore deleted file mode 100644 index c3c0908..0000000 --- a/test/demo-contracts/UniswapV2Swap.WETH.kore +++ /dev/null @@ -1 +0,0 @@ -Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Program'Unds'PragmaDefinition'Unds'SourceUnits{}(\dv{SortPragmaDefinition{}}("pragma solidity ^0.8.24;"),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'SourceUnits'Unds'SourceUnit'Unds'SourceUnits{}(inj{SortContractDefinition{}, SortSourceUnit{}}(Lblcontract'UndsLBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'ContractDefinition'Unds'Id'Unds'ContractBodyElements{}(\dv{SortId{}}("WETHMock"),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortStateVariableDeclaration{}, SortContractBodyElement{}}(Lbl'UndsUndsUndsEqlsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'StateVariableDeclaration'Unds'TypeName'Unds'VisibilitySpecifier'Unds'Id'Unds'Expression{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lblprivate'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}(),\dv{SortId{}}("UINT256_MAX"),inj{SortHexNumber{}, SortExpression{}}(\dv{SortHexNumber{}}("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortStateVariableDeclaration{}, SortContractBodyElement{}}(Lbl'UndsUndsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'StateVariableDeclaration'Unds'TypeName'Unds'VisibilitySpecifier'Unds'Id{}(inj{SortMappingType{}, SortTypeName{}}(Lblmapping'LParUndsUndsEqls-GT-UndsUndsRParUnds'SOLIDITY-SYNTAX'Unds'MappingType'Unds'MappingKeyType'Unds'OptionalIdentifier'Unds'TypeName'Unds'OptionalIdentifier{}(inj{SortElementaryTypeName{}, SortMappingKeyType{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Unds'SOLIDITY-SYNTAX'Unds'OptionalIdentifier{}(),inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Unds'SOLIDITY-SYNTAX'Unds'OptionalIdentifier{}())),Lblpublic'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}(),\dv{SortId{}}("balanceOf"))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortStateVariableDeclaration{}, SortContractBodyElement{}}(Lbl'UndsUndsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'StateVariableDeclaration'Unds'TypeName'Unds'VisibilitySpecifier'Unds'Id{}(inj{SortMappingType{}, SortTypeName{}}(Lblmapping'LParUndsUndsEqls-GT-UndsUndsRParUnds'SOLIDITY-SYNTAX'Unds'MappingType'Unds'MappingKeyType'Unds'OptionalIdentifier'Unds'TypeName'Unds'OptionalIdentifier{}(inj{SortElementaryTypeName{}, SortMappingKeyType{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Unds'SOLIDITY-SYNTAX'Unds'OptionalIdentifier{}(),inj{SortMappingType{}, SortTypeName{}}(Lblmapping'LParUndsUndsEqls-GT-UndsUndsRParUnds'SOLIDITY-SYNTAX'Unds'MappingType'Unds'MappingKeyType'Unds'OptionalIdentifier'Unds'TypeName'Unds'OptionalIdentifier{}(inj{SortElementaryTypeName{}, SortMappingKeyType{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Unds'SOLIDITY-SYNTAX'Unds'OptionalIdentifier{}(),inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Unds'SOLIDITY-SYNTAX'Unds'OptionalIdentifier{}())),Lbl'Unds'SOLIDITY-SYNTAX'Unds'OptionalIdentifier{}())),Lblpublic'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}(),\dv{SortId{}}("allowance"))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortEventDefinition{}, SortContractBodyElement{}}(Lblevent'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EventDefinition'Unds'Id'Unds'EventParameters{}(\dv{SortId{}}("Approval"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'Unds'indexed'UndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("owner")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'Unds'indexed'UndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("spender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters'QuotRBraUnds'EventParameters{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortEventDefinition{}, SortContractBodyElement{}}(Lblevent'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EventDefinition'Unds'Id'Unds'EventParameters{}(\dv{SortId{}}("Transfer"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'Unds'indexed'UndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("from")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'Unds'indexed'UndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("to")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'EventParameters'Unds'EventParameter'Unds'EventParameters'QuotRBraUnds'EventParameters{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'ReturnSpecifier'Unds'FunctionBody{}(\dv{SortId{}}("decimals"),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}(),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblexternal'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),Lblreturns'LParUndsRParUnds'SOLIDITY-SYNTAX'Unds'ReturnSpecifier'Unds'ParameterList{}(Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(inj{SortElementaryTypeName{}, SortParameter{}}(Lbluint8'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortReturnStatement{}, SortStatement{}}(Lblreturn'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ReturnStatement'Unds'Expression{}(inj{SortDecimal{}, SortExpression{}}(\dv{SortDecimal{}}("18")))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'FunctionBody{}(\dv{SortId{}}("deposit"),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}(),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblexternal'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(Lblpayable'Unds'SOLIDITY-SYNTAX'Unds'FunctionSpecifier{}(),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}())),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender"))),Lbl'UndsPlusUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender"))),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("value")))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortEmitStatement{}, SortStatement{}}(Lblemit'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EmitStatement'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("Transfer")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortElementaryTypeName{}, SortExpression{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortDecimal{}, SortExpression{}}(\dv{SortDecimal{}}("0")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}())),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}())))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'ReturnSpecifier'Unds'FunctionBody{}(\dv{SortId{}}("approve"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("spender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblexternal'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),Lblreturns'LParUndsRParUnds'SOLIDITY-SYNTAX'Unds'ReturnSpecifier'Unds'ParameterList{}(Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(inj{SortElementaryTypeName{}, SortParameter{}}(Lblbool'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("allowance")),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("spender"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value"))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortEmitStatement{}, SortStatement{}}(Lblemit'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EmitStatement'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("Approval")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("spender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortReturnStatement{}, SortStatement{}}(Lblreturn'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ReturnStatement'Unds'Expression{}(inj{SortBool{}, SortExpression{}}(\dv{SortBool{}}("true")))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'ReturnSpecifier'Unds'FunctionBody{}(\dv{SortId{}}("transfer"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("to")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblexternal'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),Lblreturns'LParUndsRParUnds'SOLIDITY-SYNTAX'Unds'ReturnSpecifier'Unds'ParameterList{}(Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(inj{SortElementaryTypeName{}, SortParameter{}}(Lblbool'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortIfStatement{}, SortStatement{}}(Lblif'LParUndsRParUnds'else'UndsUnds'SOLIDITY-SYNTAX'Unds'IfStatement'Unds'Expression'Unds'Statement'Unds'Statement{}(Lbl'UndsAnd-And-UndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsBangEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to")),Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortElementaryTypeName{}, SortExpression{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortDecimal{}, SortExpression{}}(\dv{SortDecimal{}}("0")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))),Lbl'UndsBangEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to")),Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortElementaryTypeName{}, SortExpression{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("this")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}())))),inj{SortBlock{}, SortStatement{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortVariableDeclarationStatement{}, SortStatement{}}(Lbl'UndsEqlsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'VariableDeclarationStatement'Unds'VariableDeclaration'Unds'Expression{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'VariableDeclaration'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("balance")),Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender"))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("require")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'Unds-GT-EqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value"))),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("WETH: transfer amount exceeds balance")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender"))),Lbl'Unds'-'UndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to"))),Lbl'UndsPlusUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortEmitStatement{}, SortStatement{}}(Lblemit'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EmitStatement'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("Transfer")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))))),inj{SortBlock{}, SortStatement{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortVariableDeclarationStatement{}, SortStatement{}}(Lbl'UndsEqlsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'VariableDeclarationStatement'Unds'VariableDeclaration'Unds'Expression{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'VariableDeclaration'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("balance")),Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender"))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("require")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'Unds-GT-EqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value"))),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("WETH: burn amount exceeds balance")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender"))),Lbl'Unds'-'UndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortEmitStatement{}, SortStatement{}}(Lblemit'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EmitStatement'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("Transfer")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortElementaryTypeName{}, SortExpression{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortDecimal{}, SortExpression{}}(\dv{SortDecimal{}}("0")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}())),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortVariableDeclarationStatement{}, SortStatement{}}(Lbl'LParUndsCommRParEqlsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'VariableDeclarationStatement'Unds'VariableDeclaration'Unds'Expression{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'VariableDeclaration'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lblbool'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("success")),Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsLBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'KeyValues{}(Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender")),\dv{SortId{}}("call")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'KeyValues'Unds'KeyValue'Unds'KeyValues{}(Lbl'UndsColnUndsUnds'SOLIDITY-SYNTAX'Unds'KeyValue'Unds'Id'Unds'Expression{}(\dv{SortId{}}("value"),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value"))),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'KeyValues'Unds'KeyValue'Unds'KeyValues'QuotRBraUnds'KeyValues{}())),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}())))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("require")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("success")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("WETH: ETH transfer failed")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}())))))))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortReturnStatement{}, SortStatement{}}(Lblreturn'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ReturnStatement'Unds'Expression{}(inj{SortBool{}, SortExpression{}}(\dv{SortBool{}}("true")))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}())))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements{}(inj{SortFunctionDefinition{}, SortContractBodyElement{}}(Lblfunction'UndsLParUndsRParUndsUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionDefinition'Unds'Id'Unds'ParameterList'Unds'FunctionSpecifiers'Unds'ReturnSpecifier'Unds'FunctionBody{}(\dv{SortId{}}("transferFrom"),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("from")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("to")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Parameter'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}()))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers{}(inj{SortVisibilitySpecifier{}, SortFunctionSpecifier{}}(Lblexternal'Unds'SOLIDITY-SYNTAX'Unds'VisibilitySpecifier{}()),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'FunctionSpecifiers'Unds'FunctionSpecifier'Unds'FunctionSpecifiers'QuotRBraUnds'FunctionSpecifiers{}()),Lblreturns'LParUndsRParUnds'SOLIDITY-SYNTAX'Unds'ReturnSpecifier'Unds'ParameterList{}(Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList{}(inj{SortElementaryTypeName{}, SortParameter{}}(Lblbool'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'ParameterList'Unds'Parameter'Unds'ParameterList'QuotRBraUnds'ParameterList{}())),inj{SortBlock{}, SortFunctionBody{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortIfStatement{}, SortStatement{}}(Lblif'LParUndsRParUndsUnds'SOLIDITY-SYNTAX'Unds'IfStatement'Unds'Expression'Unds'Statement{}(Lbl'UndsBangEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from")),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender"))),inj{SortBlock{}, SortStatement{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortVariableDeclarationStatement{}, SortStatement{}}(Lbl'UndsEqlsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'VariableDeclarationStatement'Unds'VariableDeclaration'Unds'Expression{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'VariableDeclaration'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("allowed")),Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("allowance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from"))),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender"))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortIfStatement{}, SortStatement{}}(Lblif'LParUndsRParUndsUnds'SOLIDITY-SYNTAX'Unds'IfStatement'Unds'Expression'Unds'Statement{}(Lbl'UndsBangEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("allowed")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("UINT256_MAX"))),inj{SortBlock{}, SortStatement{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("require")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'Unds-GT-EqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("allowed")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value"))),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("WETH: request exceeds allowance")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortVariableDeclarationStatement{}, SortStatement{}}(Lbl'UndsEqlsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'VariableDeclarationStatement'Unds'VariableDeclaration'Unds'Expression{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'VariableDeclaration'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("reduced")),Lbl'Unds'-'UndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("allowed")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value"))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("allowance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from"))),Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("reduced"))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortEmitStatement{}, SortStatement{}}(Lblemit'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EmitStatement'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("Approval")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("reduced")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}())))))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}())))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortIfStatement{}, SortStatement{}}(Lblif'LParUndsRParUnds'else'UndsUnds'SOLIDITY-SYNTAX'Unds'IfStatement'Unds'Expression'Unds'Statement'Unds'Statement{}(Lbl'UndsAnd-And-UndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsBangEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to")),Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortElementaryTypeName{}, SortExpression{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortDecimal{}, SortExpression{}}(\dv{SortDecimal{}}("0")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))),Lbl'UndsBangEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to")),Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortElementaryTypeName{}, SortExpression{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("this")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}())))),inj{SortBlock{}, SortStatement{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortVariableDeclarationStatement{}, SortStatement{}}(Lbl'UndsEqlsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'VariableDeclarationStatement'Unds'VariableDeclaration'Unds'Expression{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'VariableDeclaration'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("balance")),Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from"))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("require")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'Unds-GT-EqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value"))),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("WETH: transfer amount exceeds balance")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from"))),Lbl'Unds'-'UndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to"))),Lbl'UndsPlusUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to"))),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortEmitStatement{}, SortStatement{}}(Lblemit'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EmitStatement'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("Transfer")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("to")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))))),inj{SortBlock{}, SortStatement{}}(Lbl'LBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Block'Unds'Statements{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortVariableDeclarationStatement{}, SortStatement{}}(Lbl'UndsEqlsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'VariableDeclarationStatement'Unds'VariableDeclaration'Unds'Expression{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'VariableDeclaration'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lbluint256'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("balance")),Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from"))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("require")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'Unds-GT-EqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value"))),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("WETH: burn amount exceeds balance")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsEqlsUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(Lbl'UndsLSqBUndsRSqBUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balanceOf")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from"))),Lbl'Unds'-'UndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Expression{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("balance")),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortEmitStatement{}, SortStatement{}}(Lblemit'UndsLParUndsRParSClnUnds'SOLIDITY-SYNTAX'Unds'EmitStatement'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("Transfer")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("from")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortElementaryTypeName{}, SortExpression{}}(Lbladdress'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortDecimal{}, SortExpression{}}(\dv{SortDecimal{}}("0")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}())),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortVariableDeclarationStatement{}, SortStatement{}}(Lbl'LParUndsCommRParEqlsUndsSClnUnds'SOLIDITY-SYNTAX'Unds'VariableDeclarationStatement'Unds'VariableDeclaration'Unds'Expression{}(Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'VariableDeclaration'Unds'TypeName'Unds'Id{}(inj{SortElementaryTypeName{}, SortTypeName{}}(Lblbool'Unds'SOLIDITY-SYNTAX'Unds'ElementaryTypeName{}()),\dv{SortId{}}("success")),Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(Lbl'UndsLBraUndsRBraUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'KeyValues{}(Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(Lbl'UndsStopUndsUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'Id{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("msg")),\dv{SortId{}}("sender")),\dv{SortId{}}("call")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'KeyValues'Unds'KeyValue'Unds'KeyValues{}(Lbl'UndsColnUndsUnds'SOLIDITY-SYNTAX'Unds'KeyValue'Unds'Id'Unds'Expression{}(\dv{SortId{}}("value"),inj{SortId{}, SortExpression{}}(\dv{SortId{}}("value"))),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'KeyValues'Unds'KeyValue'Unds'KeyValues'QuotRBraUnds'KeyValues{}())),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}())))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortExpressionStatement{}, SortStatement{}}(Lbl'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ExpressionStatement'Unds'Expression{}(Lbl'UndsLParUndsRParUnds'SOLIDITY-SYNTAX'Unds'Expression'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("require")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortId{}, SortExpression{}}(\dv{SortId{}}("success")),Lbl'UndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList{}(inj{SortString{}, SortExpression{}}(\dv{SortString{}}("WETH: ETH transfer failed")),Lbl'Stop'List'LBraQuotUndsCommUndsUnds'SOLIDITY-SYNTAX'Unds'CallArgumentList'Unds'Expression'Unds'CallArgumentList'QuotRBraUnds'CallArgumentList{}()))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}())))))))))),Lbl'UndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements{}(inj{SortReturnStatement{}, SortStatement{}}(Lblreturn'UndsSClnUnds'SOLIDITY-SYNTAX'Unds'ReturnStatement'Unds'Expression{}(inj{SortBool{}, SortExpression{}}(\dv{SortBool{}}("true")))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'Statements'Unds'Statement'Unds'Statements'QuotRBraUnds'Statements{}()))))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'ContractBodyElements'Unds'ContractBodyElement'Unds'ContractBodyElements'QuotRBraUnds'ContractBodyElements{}())))))))))))),Lbl'Stop'List'LBraQuotUndsUndsUnds'SOLIDITY-SYNTAX'Unds'SourceUnits'Unds'SourceUnit'Unds'SourceUnits'QuotRBraUnds'SourceUnits{}())) \ No newline at end of file diff --git a/test/demo-contracts/UniswapV2Swap.WETH.kore.bin b/test/demo-contracts/UniswapV2Swap.WETH.kore.bin deleted file mode 100644 index b8010b9..0000000 --- a/test/demo-contracts/UniswapV2Swap.WETH.kore.bin +++ /dev/null @@ -1 +0,0 @@ -6B736F6C016B0100000180060000001800000000000000707261676D6120736F6C6964697479205E302E382E32343B00016C0100000179050000010A0200000112060000000800000000000000574554484D6F636B00016401000001300500000170010000018005000001FD04000001D90300000112060000000B0000000000000055494E543235365F4D41580001BF050000018E06000000420000000000000030786666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666600016401000001300500000171010000018D050000019B0300000180050000010002000001DA000000018005000001FD04000001DA00000001CE040000011206000000090000000000000062616C616E63654F6600016401000001300500000171010000018D050000019B0300000180050000010002000001DA000000018D050000019B0300000180050000010002000001DA000000018005000001FD04000001DA00000001DA00000001CE0400000112060000000900000000000000616C6C6F77616E636500016401000001D0050000011E0200000112060000000800000000000000417070726F76616C00011601000001E40000000180050000010002000001120600000005000000000000006F776E657200011601000001E40000000180050000010002000001120600000007000000000000007370656E6465720001160100000166010000018005000001FD040000011206000000050000000000000076616C75650001BD000000016401000001D0050000011E02000001120600000008000000000000005472616E7366657200011601000001E400000001800500000100020000011206000000040000000000000066726F6D00011601000001E4000000018005000001000200000112060000000200000000000000746F0001160100000166010000018005000001FD040000011206000000050000000000000076616C75650001BD000000016401000001CF05000001630200000112060000000800000000000000646563696D616C730001C000000001670100000159050000012302000001C200000001DA0400000119010000018005000001FF04000001C0000000016505000001AB000000016D010000019E05000001D9040000013E050000018C06000000020000000000000031380001C4000000016401000001CF050000016202000001120600000007000000000000006465706F7369740001C0000000016701000001590500000123020000016701000001D803000001C2000000016505000001AB000000016D0100000199050000014F010000012E01000001360100000158050000011206000000090000000000000062616C616E63654F66000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E64657200014D01000001360100000158050000011206000000090000000000000062616C616E63654F66000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E646572000161010000015805000001120600000003000000000000006D736700011206000000050000000000000076616C756500016D01000001B50500000118020000015805000001120600000008000000000000005472616E736665720001140100000130010000018005000001000200000114010000013E050000018C0600000001000000000000003000016605000001B900000001140100000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E6465720001140100000161010000015805000001120600000003000000000000006D736700011206000000050000000000000076616C756500016605000001B900000001C4000000016401000001CF05000001630200000112060000000700000000000000617070726F7665000119010000016A0100000180050000010002000001120600000007000000000000007370656E646572000119010000016A010000018005000001FD040000011206000000050000000000000076616C75650001C000000001670100000159050000012302000001C200000001DA04000001190100000180050000010402000001C0000000016505000001AB000000016D0100000199050000014F010000012E0100000136010000013601000001580500000112060000000900000000000000616C6C6F77616E6365000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E64657200015805000001120600000007000000000000007370656E646572000158050000011206000000050000000000000076616C756500016D01000001B5050000011802000001580500000112060000000800000000000000417070726F76616C0001140100000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E646572000114010000015805000001120600000007000000000000007370656E6465720001140100000158050000011206000000050000000000000076616C756500016605000001B9000000016D010000019E05000001D904000001770500000126060000000400000000000000747275650001C4000000016401000001CF050000016302000001120600000008000000000000007472616E73666572000119010000016A010000018005000001000200000112060000000200000000000000746F000119010000016A010000018005000001FD040000011206000000050000000000000076616C75650001C000000001670100000159050000012302000001C200000001DA04000001190100000180050000010402000001C0000000016505000001AB000000016D01000001D10500000177020000010F010000011001000001580500000112060000000200000000000000746F000130010000018005000001000200000114010000013E050000018C0600000001000000000000003000016605000001B9000000011001000001580500000112060000000200000000000000746F000130010000018005000001000200000114010000015805000001120600000004000000000000007468697300016605000001B9000000016505000001AB000000016D0100000144050000012D010000016F010000018005000001FD040000011206000000070000000000000062616C616E63650001360100000158050000011206000000090000000000000062616C616E63654F66000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E64657200016D0100000199050000014F0100000130010000015805000001120600000007000000000000007265717569726500011401000001F90000000158050000011206000000070000000000000062616C616E6365000158050000011206000000050000000000000076616C7565000166050000011201000001C70500000161060000002500000000000000574554483A207472616E7366657220616D6F756E7420657863656564732062616C616E63650001B9000000016D0100000199050000014F010000012E01000001360100000158050000011206000000090000000000000062616C616E63654F66000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E6465720001CA0000000158050000011206000000070000000000000062616C616E6365000158050000011206000000050000000000000076616C756500016D0100000199050000014F010000012E01000001360100000158050000011206000000090000000000000062616C616E63654F660001580500000112060000000200000000000000746F00014D01000001360100000158050000011206000000090000000000000062616C616E63654F660001580500000112060000000200000000000000746F000158050000011206000000050000000000000076616C756500016D01000001B50500000118020000015805000001120600000008000000000000005472616E736665720001140100000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E64657200011401000001580500000112060000000200000000000000746F0001140100000158050000011206000000050000000000000076616C756500016605000001B900000001C4000000016505000001AB000000016D0100000144050000012D010000016F010000018005000001FD040000011206000000070000000000000062616C616E63650001360100000158050000011206000000090000000000000062616C616E63654F66000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E64657200016D0100000199050000014F0100000130010000015805000001120600000007000000000000007265717569726500011401000001F90000000158050000011206000000070000000000000062616C616E6365000158050000011206000000050000000000000076616C7565000166050000011201000001C70500000161060000002100000000000000574554483A206275726E20616D6F756E7420657863656564732062616C616E63650001B9000000016D0100000199050000014F010000012E01000001360100000158050000011206000000090000000000000062616C616E63654F66000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E6465720001CA0000000158050000011206000000070000000000000062616C616E6365000158050000011206000000050000000000000076616C756500016D01000001B50500000118020000015805000001120600000008000000000000005472616E736665720001140100000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E6465720001140100000130010000018005000001000200000114010000013E050000018C0600000001000000000000003000016605000001B900000001140100000158050000011206000000050000000000000076616C756500016605000001B9000000016D010000014405000001AD000000016F01000001800500000104020000011206000000070000000000000073756363657373000130010000012F01000001610100000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E64657200011206000000040000000000000063616C6C0001180100000111010000011206000000050000000000000076616C7565000158050000011206000000050000000000000076616C75650001BF0000000166050000011201000001C705000001610600000000000000000000000001B9000000016D0100000199050000014F010000013001000001580500000112060000000700000000000000726571756972650001140100000158050000011206000000070000000000000073756363657373000166050000011201000001C70500000161060000001900000000000000574554483A20455448207472616E73666572206661696C65640001B900000001C4000000016D010000019E05000001D904000001770500000126060000000400000000000000747275650001C4000000016401000001CF05000001630200000112060000000C000000000000007472616E7366657246726F6D000119010000016A01000001800500000100020000011206000000040000000000000066726F6D000119010000016A010000018005000001000200000112060000000200000000000000746F000119010000016A010000018005000001FD040000011206000000050000000000000076616C75650001C000000001670100000159050000012302000001C200000001DA04000001190100000180050000010402000001C0000000016505000001AB000000016D01000001D1050000017802000001100100000158050000011206000000040000000000000066726F6D000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E64657200016505000001AB000000016D0100000144050000012D010000016F010000018005000001FD0400000112060000000700000000000000616C6C6F776564000136010000013601000001580500000112060000000900000000000000616C6C6F77616E6365000158050000011206000000040000000000000066726F6D000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E64657200016D01000001D10500000178020000011001000001580500000112060000000700000000000000616C6C6F7765640001580500000112060000000B0000000000000055494E543235365F4D415800016505000001AB000000016D0100000199050000014F0100000130010000015805000001120600000007000000000000007265717569726500011401000001F900000001580500000112060000000700000000000000616C6C6F776564000158050000011206000000050000000000000076616C7565000166050000011201000001C70500000161060000001F00000000000000574554483A2072657175657374206578636565647320616C6C6F77616E63650001B9000000016D0100000144050000012D010000016F010000018005000001FD0400000112060000000700000000000000726564756365640001CA00000001580500000112060000000700000000000000616C6C6F776564000158050000011206000000050000000000000076616C756500016D0100000199050000014F010000012E0100000136010000013601000001580500000112060000000900000000000000616C6C6F77616E6365000158050000011206000000040000000000000066726F6D000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E64657200015805000001120600000007000000000000007265647563656400016D01000001B5050000011802000001580500000112060000000800000000000000417070726F76616C0001140100000158050000011206000000040000000000000066726F6D0001140100000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E646572000114010000015805000001120600000007000000000000007265647563656400016605000001B900000001C400000001C4000000016D01000001D10500000177020000010F010000011001000001580500000112060000000200000000000000746F000130010000018005000001000200000114010000013E050000018C0600000001000000000000003000016605000001B9000000011001000001580500000112060000000200000000000000746F000130010000018005000001000200000114010000015805000001120600000004000000000000007468697300016605000001B9000000016505000001AB000000016D0100000144050000012D010000016F010000018005000001FD040000011206000000070000000000000062616C616E63650001360100000158050000011206000000090000000000000062616C616E63654F66000158050000011206000000040000000000000066726F6D00016D0100000199050000014F0100000130010000015805000001120600000007000000000000007265717569726500011401000001F90000000158050000011206000000070000000000000062616C616E6365000158050000011206000000050000000000000076616C7565000166050000011201000001C70500000161060000002500000000000000574554483A207472616E7366657220616D6F756E7420657863656564732062616C616E63650001B9000000016D0100000199050000014F010000012E01000001360100000158050000011206000000090000000000000062616C616E63654F66000158050000011206000000040000000000000066726F6D0001CA0000000158050000011206000000070000000000000062616C616E6365000158050000011206000000050000000000000076616C756500016D0100000199050000014F010000012E01000001360100000158050000011206000000090000000000000062616C616E63654F660001580500000112060000000200000000000000746F00014D01000001360100000158050000011206000000090000000000000062616C616E63654F660001580500000112060000000200000000000000746F000158050000011206000000050000000000000076616C756500016D01000001B50500000118020000015805000001120600000008000000000000005472616E736665720001140100000158050000011206000000040000000000000066726F6D00011401000001580500000112060000000200000000000000746F0001140100000158050000011206000000050000000000000076616C756500016605000001B900000001C4000000016505000001AB000000016D0100000144050000012D010000016F010000018005000001FD040000011206000000070000000000000062616C616E63650001360100000158050000011206000000090000000000000062616C616E63654F66000158050000011206000000040000000000000066726F6D00016D0100000199050000014F0100000130010000015805000001120600000007000000000000007265717569726500011401000001F90000000158050000011206000000070000000000000062616C616E6365000158050000011206000000050000000000000076616C7565000166050000011201000001C70500000161060000002100000000000000574554483A206275726E20616D6F756E7420657863656564732062616C616E63650001B9000000016D0100000199050000014F010000012E01000001360100000158050000011206000000090000000000000062616C616E63654F66000158050000011206000000040000000000000066726F6D0001CA0000000158050000011206000000070000000000000062616C616E6365000158050000011206000000050000000000000076616C756500016D01000001B50500000118020000015805000001120600000008000000000000005472616E736665720001140100000158050000011206000000040000000000000066726F6D0001140100000130010000018005000001000200000114010000013E050000018C0600000001000000000000003000016605000001B900000001140100000158050000011206000000050000000000000076616C756500016605000001B9000000016D010000014405000001AD000000016F01000001800500000104020000011206000000070000000000000073756363657373000130010000012F01000001610100000161010000015805000001120600000003000000000000006D736700011206000000060000000000000073656E64657200011206000000040000000000000063616C6C0001180100000111010000011206000000050000000000000076616C7565000158050000011206000000050000000000000076616C75650001BF0000000166050000011201000001C705000001610600000000000000000000000001B9000000016D0100000199050000014F010000013001000001580500000112060000000700000000000000726571756972650001140100000158050000011206000000070000000000000073756363657373000166050000011201000001C70500000161060000001900000000000000574554483A20455448207472616E73666572206661696C65640001B900000001C4000000016D010000019E05000001D904000001770500000126060000000400000000000000747275650001C400000001C100000001C3000000 diff --git a/test/demo-contracts/UniswapV2Swap.DAI.sol b/test/demo-contracts/UniswapV2SwapRenamed.DAI.sol similarity index 71% rename from test/demo-contracts/UniswapV2Swap.DAI.sol rename to test/demo-contracts/UniswapV2SwapRenamed.DAI.sol index 9415a6d..abc875a 100644 --- a/test/demo-contracts/UniswapV2Swap.DAI.sol +++ b/test/demo-contracts/UniswapV2SwapRenamed.DAI.sol @@ -5,17 +5,17 @@ pragma solidity ^0.8.24; -contract DAIMock { +contract dAIMock { - uint private UINT_MAX = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; + uint private constUINTMAX = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; uint256 public totalSupply; - mapping (address => uint) public balanceOf; - mapping (address => mapping (address => uint)) public allowance; + mapping (address daiact => uint) public balanceOf; + mapping (address daiownr => mapping (address daispdr => uint)) public allowance; - event Approval(address indexed src, address indexed guy, uint wad); - event Transfer(address indexed src, address indexed dst, uint wad); + event approvalEvent(address indexed src, address indexed guy, uint wad); + event transferEvent(address indexed src, address indexed dst, uint wad); function decimals() external returns (uint8) { return 18; @@ -24,7 +24,7 @@ contract DAIMock { function mint(address usr, uint wad) public { balanceOf[usr] = balanceOf[usr] + wad; totalSupply = totalSupply + wad; - emit Transfer(address(0), usr, wad); + emit transferEvent(address(0), usr, wad); } function mintOnDeposit(address usr, uint wad) public { @@ -40,7 +40,7 @@ contract DAIMock { function approve(address usr, uint wad) external returns (bool) { allowance[msg.sender][usr] = wad; - emit Approval(msg.sender, usr, wad); + emit approvalEvent(msg.sender, usr, wad); return true; } @@ -53,13 +53,13 @@ contract DAIMock { public returns (bool) { require(balanceOf[src] >= wad, "Dai/insufficient-balance"); - if (src != msg.sender && allowance[src][msg.sender] != UINT_MAX) { + if (src != msg.sender && allowance[src][msg.sender] != constUINTMAX) { require(allowance[src][msg.sender] >= wad, "Dai/insufficient-allowance"); allowance[src][msg.sender] = allowance[src][msg.sender] - wad; } balanceOf[src] = balanceOf[src] - wad; balanceOf[dst] = balanceOf[dst] + wad; - emit Transfer(src, dst, wad); + emit transferEvent(src, dst, wad); return true; } diff --git a/test/demo-contracts/UniswapV2Swap.USDC.sol b/test/demo-contracts/UniswapV2SwapRenamed.USDC.sol similarity index 52% rename from test/demo-contracts/UniswapV2Swap.USDC.sol rename to test/demo-contracts/UniswapV2SwapRenamed.USDC.sol index 5bbd2dc..b9985c0 100644 --- a/test/demo-contracts/UniswapV2Swap.USDC.sol +++ b/test/demo-contracts/UniswapV2SwapRenamed.USDC.sol @@ -5,16 +5,16 @@ pragma solidity ^0.8.24; -contract USDCMock { - uint256 private UINT256_MAX = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; +contract uSDCMock { + uint256 private constUINT256MAX = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; - uint256 private _totalSupply; + uint256 private vidTotalSupply; - mapping(address account => uint256) private _balances; - mapping(address account => mapping(address spender => uint256)) private _allowances; + mapping(address account => uint256) private vidBalances; + mapping(address account => mapping(address spender => uint256)) private vidAllowances; - event Transfer(address indexed from, address indexed to, uint256 value); - event Approval(address indexed owner, address indexed spender, uint256 value); + event transferEvent(address indexed from, address indexed to, uint256 value); + event approvalEvent(address indexed owner, address indexed spender, uint256 value); function decimals() external returns (uint8) { return 18; @@ -22,77 +22,77 @@ contract USDCMock { function mint(address account, uint256 value) public { require(account != address(0), "USDC: invalid receiver"); - _update(address(0), account, value); + fidUpdate(address(0), account, value); } function balanceOf(address account) public returns (uint256) { - return _balances[account]; + return vidBalances[account]; } function transfer(address to, uint256 value) public returns (bool) { address owner = msg.sender; - _transfer(owner, to, value); + fidTransfer(owner, to, value); return true; } function allowance(address owner, address spender) public returns (uint256) { - return _allowances[owner][spender]; + return vidAllowances[owner][spender]; } function approve(address spender, uint256 value) public returns (bool) { address owner = msg.sender; - _approve(owner, spender, value, true); + fidApprove(owner, spender, value, true); return true; } function transferFrom(address from, address to, uint256 value) public returns (bool) { address spender = msg.sender; - _spendAllowance(from, spender, value); - _transfer(from, to, value); + fidSpendAllowance(from, spender, value); + fidTransfer(from, to, value); return true; } - function _transfer(address from, address to, uint256 value) private { + function fidTransfer(address from, address to, uint256 value) private { require(from != address(0), "USDC: invalid sender"); require(to != address(0), "USDC: invalid receiver"); - _update(from, to, value); + fidUpdate(from, to, value); } - function _update(address from, address to, uint256 value) private { + function fidUpdate(address from, address to, uint256 value) private { if (from == address(0)) { - _totalSupply = _totalSupply + value; + vidTotalSupply = vidTotalSupply + value; } else { - uint256 fromBalance = _balances[from]; + uint256 fromBalance = vidBalances[from]; require(fromBalance >= value, "USDC: insufficient balance"); - _balances[from] = fromBalance - value; + vidBalances[from] = fromBalance - value; } if (to == address(0)) { - _totalSupply = _totalSupply - value; + vidTotalSupply = vidTotalSupply - value; } else { - _balances[to] = _balances[to] + value; + vidBalances[to] = vidBalances[to] + value; } - emit Transfer(from, to, value); + emit transferEvent(from, to, value); } - function _approve(address owner, address spender, uint256 value, bool emitEvent) private { + function fidApprove(address owner, address spender, uint256 value, bool emitEvent) private { require(owner != address(0), "USDC: invalid approver"); require(spender != address(0), "USDC: invalid spender"); - _allowances[owner][spender] = value; + vidAllowances[owner][spender] = value; if (emitEvent) { - emit Approval(owner, spender, value); + emit approvalEvent(owner, spender, value); } } - function _spendAllowance(address owner, address spender, uint256 value) private { + function fidSpendAllowance(address owner, address spender, uint256 value) private { uint256 currentAllowance = allowance(owner, spender); - if (currentAllowance != UINT256_MAX) { + if (currentAllowance != constUINT256MAX) { require(currentAllowance >= value, "USDC: insufficient allowance"); - _approve(owner, spender, currentAllowance - value, false); + fidApprove(owner, spender, currentAllowance - value, false); } } diff --git a/test/demo-contracts/UniswapV2Swap.WETH.sol b/test/demo-contracts/UniswapV2SwapRenamed.WETH.sol similarity index 72% rename from test/demo-contracts/UniswapV2Swap.WETH.sol rename to test/demo-contracts/UniswapV2SwapRenamed.WETH.sol index 4adbe35..31184a0 100644 --- a/test/demo-contracts/UniswapV2Swap.WETH.sol +++ b/test/demo-contracts/UniswapV2SwapRenamed.WETH.sol @@ -5,15 +5,15 @@ pragma solidity ^0.8.24; -contract WETHMock { +contract wETHMock { - uint256 private UINT256_MAX = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; + uint256 private constUINT256MAX = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; - mapping (address => uint256) public balanceOf; - mapping (address => mapping (address => uint256)) public allowance; + mapping (address wethact => uint256) public balanceOf; + mapping (address wethownr => mapping (address wethspdr => uint256)) public allowance; - event Approval(address indexed owner, address indexed spender, uint256 value); - event Transfer(address indexed from, address indexed to, uint256 value); + event approvalEvent(address indexed owner, address indexed spender, uint256 value); + event transferEvent(address indexed from, address indexed to, uint256 value); function decimals() external returns (uint8) { return 18; @@ -21,12 +21,12 @@ contract WETHMock { function deposit() external payable { balanceOf[msg.sender] = balanceOf[msg.sender] + msg.value; - emit Transfer(address(0), msg.sender, msg.value); + emit transferEvent(address(0), msg.sender, msg.value); } function approve(address spender, uint256 value) external returns (bool) { allowance[msg.sender][spender] = value; - emit Approval(msg.sender, spender, value); + emit approvalEvent(msg.sender, spender, value); return true; } @@ -38,12 +38,12 @@ contract WETHMock { balanceOf[msg.sender] = balance - value; balanceOf[to] = balanceOf[to] + value; - emit Transfer(msg.sender, to, value); + emit transferEvent(msg.sender, to, value); } else { // Withdraw uint256 balance = balanceOf[msg.sender]; require(balance >= value, "WETH: burn amount exceeds balance"); balanceOf[msg.sender] = balance - value; - emit Transfer(msg.sender, address(0), value); + emit transferEvent(msg.sender, address(0), value); (bool success, ) = msg.sender.call{value: value}(""); require(success, "WETH: ETH transfer failed"); @@ -55,11 +55,11 @@ contract WETHMock { function transferFrom(address from, address to, uint256 value) external returns (bool) { if (from != msg.sender) { uint256 allowed = allowance[from][msg.sender]; - if (allowed != UINT256_MAX) { + if (allowed != constUINT256MAX) { require(allowed >= value, "WETH: request exceeds allowance"); uint256 reduced = allowed - value; allowance[from][msg.sender] = reduced; - emit Approval(from, msg.sender, reduced); + emit approvalEvent(from, msg.sender, reduced); } } @@ -69,12 +69,12 @@ contract WETHMock { balanceOf[from] = balance - value; balanceOf[to] = balanceOf[to] + value; - emit Transfer(from, to, value); + emit transferEvent(from, to, value); } else { uint256 balance = balanceOf[from]; require(balance >= value, "WETH: burn amount exceeds balance"); balanceOf[from] = balance - value; - emit Transfer(from, address(0), value); + emit transferEvent(from, address(0), value); (bool success, ) = msg.sender.call{value: value}(""); require(success, "WETH: ETH transfer failed"); From dd474bfbdd4a2d341bee5f1a786f92dacc8f59b3 Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Wed, 30 Oct 2024 12:18:30 -0500 Subject: [PATCH 23/41] Changed name of generated .bin according to renamed Mock contract names. --- byol_solidity.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/byol_solidity.py b/byol_solidity.py index a5fbdcd..80ef2bc 100755 --- a/byol_solidity.py +++ b/byol_solidity.py @@ -3,7 +3,7 @@ from web3.middleware import SignAndSendRawMiddlewareBuilder import time -simple_usdc_hex = open('test/demo-contracts/UniswapV2Swap.USDC.kore.bin').read().rstrip() +simple_usdc_hex = open('test/demo-contracts/UniswapV2SwapRenamed.USDC.kore.bin').read().rstrip() w3 = Web3(Web3.HTTPProvider('http://localhost:8545')) sender = w3.eth.account.create() From 3343f28ad61566f932f7a03ab2d69e2f9d46b794 Mon Sep 17 00:00:00 2001 From: Roberto Rosmaninho Date: Wed, 30 Oct 2024 15:24:03 -0300 Subject: [PATCH 24/41] Adding Script that uses GETH-EVM to execute a Swap between WEth and DAi tokens from the Solidity Semantics --- WEth_to_DAi_Solidity_Tokens_Swap_script.py | 245 +++++++++++++++++++++ 1 file changed, 245 insertions(+) create mode 100755 WEth_to_DAi_Solidity_Tokens_Swap_script.py diff --git a/WEth_to_DAi_Solidity_Tokens_Swap_script.py b/WEth_to_DAi_Solidity_Tokens_Swap_script.py new file mode 100755 index 0000000..627d6de --- /dev/null +++ b/WEth_to_DAi_Solidity_Tokens_Swap_script.py @@ -0,0 +1,245 @@ +import json +from web3 import Web3 +from web3.exceptions import ContractLogicError +from solcx import install_solc, compile_source + +install_solc(version="latest") + +# Set Geth's URL +GETH_URL = "http://localhost:8545" + +w3 = Web3(Web3.HTTPProvider(GETH_URL)) +dev_account_address = w3.eth.accounts[0] +w3.eth.default_account = dev_account_address + + +def compile_contract(filename): + with open(filename, "r") as file: + contract_source = file.read().strip() + compiled_sol = compile_source( + contract_source, output_values=["abi", "bin"], optimize=True + ) + print(f"Compilation units: {len(compiled_sol)}") + return compiled_sol + + +def main(): + print(f"Starting block number: {w3.eth.block_number}") + + # Compile our Uniswap contract + compiled_sol = compile_contract("test/examples/swaps/UniswapV2SwapRenamed.sol") + + # List of contracts to deploy (in this order) + contract_ids = [ + "uniswapV2Pair", + "uniswapV2Router02", + "uniswapV2Swap", + "uniswapV2SwapTest", + ] + + solidity_usdc_hex = open('test/demo-contracts/UniswapV2SwapRenamed.USDC.kore.bin').read().rstrip() + solidity_dai_hex = open('test/demo-contracts/UniswapV2SwapRenamed.DAI.kore.bin').read().rstrip() + solidity_weth_hex = open('test/demo-contracts/UniswapV2SwapRenamed.WETH.kore.bin').read().rstrip() + + solidity_contracts = {"uSDCMock": solidity_usdc_hex, "dAIMock": solidity_dai_hex, "wETHMock": solidity_weth_hex} + solidity_contracts_address = {} + + for sol_contract_name, sol_contract_hex in solidity_contracts.items(): + deploy_solidity_tx = { + 'from': dev_account_address, + 'data': sol_contract_hex, + 'to': '', + 'value': 0, + 'gas': 11000000, + 'maxFeePerGas': 2000000000, + 'maxPriorityFeePerGas': 1000000000, + } + + tx_hash = w3.eth.send_transaction(deploy_solidity_tx) + receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + solidity_contracts_address[sol_contract_name] = receipt['contractAddress'] + print(f"Contract {sol_contract_name} deployed with address: {receipt['contractAddress']}") + + + # Deploy contracts + deployed_contracts = {} + for id in contract_ids: + interface = compiled_sol[":" + id] + abi, binary = interface["abi"], interface["bin"] + Contract = w3.eth.contract(abi=abi, bytecode="6B65766D" + binary) + if id in {"uniswapV2Swap", "uniswapV2Pair"}: + # We know by now token contracts were already deployed + weth_address = solidity_contracts_address["wETHMock"] + dai_address = solidity_contracts_address["dAIMock"] + usdc_address = solidity_contracts_address["uSDCMock"] + if id == "uniswapV2Swap": + tx_hash = Contract.constructor( + weth_address, dai_address, usdc_address + ).transact() + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + deployed_contracts[id] = { + "address": tx_receipt.contractAddress, + "abi": abi, + } + print( + f"Contract {id} deployed with address: {tx_receipt.contractAddress}" + ) + elif id == "uniswapV2Pair": + # Deploy (weth, dai) + tx_hash = Contract.constructor(weth_address, dai_address).transact() + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + deployed_contracts[id + ":WETH-DAI"] = { + "address": tx_receipt.contractAddress, + "abi": abi, + } + print( + f"Contract {id}:WETH-DAI deployed with address: {tx_receipt.contractAddress}" + ) + + # Deploy (weth, usdc) + tx_hash = Contract.constructor(weth_address, usdc_address).transact() + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + deployed_contracts[id + ":WETH-USDC"] = { + "address": tx_receipt.contractAddress, + "abi": abi, + } + print( + f"Contract {id}:WETH-USDC deployed with address: {tx_receipt.contractAddress}" + ) + + # Deploy (usdc, dai) + tx_hash = Contract.constructor(usdc_address, dai_address).transact() + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + deployed_contracts[id + ":USDC-DAI"] = { + "address": tx_receipt.contractAddress, + "abi": abi, + } + print( + f"Contract {id}:USDC-DAI deployed with address: {tx_receipt.contractAddress}" + ) + else: + # Token, router or test contracts + tx_hash = Contract.constructor().transact() + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + deployed_contracts[id] = {"address": tx_receipt.contractAddress, "abi": abi} + print(f"Contract {id} deployed with address: {tx_receipt.contractAddress}") + + # Mint tokens to dev account + weth_address = solidity_contracts_address["wETHMock"] + dai_address = solidity_contracts_address["dAIMock"] + #usdc_address = solidity_contracts_address["uSDCMock"] + + # Mint WETH (Deposit, as WETH doesn't have mint function) + deposit_weth_data = 'd0e30db0' + deposit_weth_tx = { + "chainId": w3.eth.chain_id, + "from": dev_account_address, + 'data': deposit_weth_data, + 'to': weth_address, + "value": w3.to_wei(10000000, "ether"), + "gas": 200000, + "gasPrice": w3.to_wei(20, "gwei"), + "nonce": w3.eth.get_transaction_count(dev_account_address), + } + tx_hash = w3.eth.send_transaction(deposit_weth_tx) + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + print("Minted WETH: ", tx_receipt["status"] == 1 and "Success" or "Failed") + + # Mint DAI + # mint(dev_account_address, 10000000 * 10**18) + dai_mint_data = '40c10f19000000000000000000000000' + dev_account_address[2:] + '000000000000000000000000000000000000000000084595161401484a000000' + mint_dai_tx = { + 'from': dev_account_address, + 'data': dai_mint_data, + 'to': dai_address, + 'value': 0, + 'gas': 11000000, + 'maxFeePerGas': 2000000000, + 'maxPriorityFeePerGas': 1000000000, + } + + tx_hash = w3.eth.send_transaction(mint_dai_tx) + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + print("Minted DAI: ", tx_receipt["status"] == 1 and "Success" or "Failed") + + # Approve the router to spend tokens + router_address = deployed_contracts["uniswapV2Router02"]["address"] + + # Approve WETH mint transaction + # approve(router_address, 10000000 * 10**18) + weth_approve_data = '086c40f6000000000000000000000000' + router_address[2:] + '000000000000000000000000000000000000000000084595161401484a000000' + weth_approve_tx = { + 'from': dev_account_address, + 'data': weth_approve_data, + 'to': weth_address, + 'value': 0, + 'gas': 11000000, + 'maxFeePerGas': 2000000000, + 'maxPriorityFeePerGas': 1000000000, + } + + tx_hash = w3.eth.send_transaction(weth_approve_tx) + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + print("Approved WETH: ", tx_receipt["status"] == 1 and "Success" or "Failed") + + # Approve DAI mint transaction + # approve(router_address, 10000000 * 10**18) + dai_approve_data = '086c40f6000000000000000000000000' + router_address[2:] + '000000000000000000000000000000000000000000084595161401484a000000' + dai_approve_tx = { + 'from': dev_account_address, + 'data': dai_approve_data, + 'to': dai_address, + 'value': 0, + 'gas': 11000000, + 'maxFeePerGas': 2000000000, + 'maxPriorityFeePerGas': 1000000000, + } + + tx_hash = w3.eth.send_transaction(dai_approve_tx) + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + print("Approved DAI: ", tx_receipt["status"] == 1 and "Success" or "Failed") + + # Add liquidity to pools + router_abi = deployed_contracts["uniswapV2Router02"]["abi"] + router = w3.eth.contract(address=router_address, abi=router_abi) + + # Add liquidity to (WETH, DAI) + tx_hash = router.functions.addLiquidity( + weth_address, + dai_address, + 200 * 10**18, + 500000 * 10**18, + 0, + 0, + dev_account_address, + ).transact( + { + "from": dev_account_address, + "gas": 3000000, + "gasPrice": Web3.to_wei("20", "gwei"), + } + ) + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + print("Added liquidity to WETH-DAI") + + # Perform a single-hop swap (WETH to DAI) + swap_meta = deployed_contracts["uniswapV2Swap"] + swap_address, swap_abi = swap_meta["address"], swap_meta["abi"] + swap = w3.eth.contract(address=swap_address, abi=swap_abi) + + tx_hash = swap.functions.swapSingleHopExactAmountIn( + 1 * 10**18, + 2500 * 10**18, + ).transact( + { + "from": dev_account_address, + "gas": 3000000, + "gasPrice": Web3.to_wei("20", "gwei"), + } + ) + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + print("Swapped WETH to DAI") + + +if __name__ == "__main__": + main() From f62bf6c8c6a862204f1b3db73e43ef7f8e160adc Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Wed, 30 Oct 2024 13:44:51 -0500 Subject: [PATCH 25/41] Commented out functions of UniswapV2SwapRenamed.sol (as needed to run the demo script) --- test/examples/swaps/UniswapV2SwapRenamed.sol | 222 +++++++++---------- 1 file changed, 111 insertions(+), 111 deletions(-) diff --git a/test/examples/swaps/UniswapV2SwapRenamed.sol b/test/examples/swaps/UniswapV2SwapRenamed.sol index 9ff57c3..bd0e53c 100644 --- a/test/examples/swaps/UniswapV2SwapRenamed.sol +++ b/test/examples/swaps/UniswapV2SwapRenamed.sol @@ -719,115 +719,115 @@ contract uniswapV2SwapTest { assert(daiAmountOut >= daiAmountMin); } - function testSwapMultiHopExactAmountIn() public { - uint256 wethAmount = 1e18; - - vidWeth.deposit{value: 4*wethAmount}(); - vidWeth.approve(address(vidUni), 8*wethAmount); - vidDai.mint(address(this), 3*wethAmount); - vidDai.approve(address(vidUni), 3*wethAmount); - vidUsdc.mint(address(this), 2*wethAmount); - vidUsdc.approve(address(vidUni), 2*wethAmount); - - vidWeth.transfer(vidUni.router().getLocalPair(address(vidWeth), address(vidDai)), wethAmount); - vidDai.transfer(vidUni.router().getLocalPair(address(vidWeth), address(vidDai)), wethAmount); - - vidUni.router().syncLocalPair(address(vidWeth), address(vidDai)); - - uint256 daiAmountMin = 1; - vidUni.swapSingleHopExactAmountIn(wethAmount, daiAmountMin); - - uint256 daiAmountIn = 1e18; - - vidDai.transfer(vidUni.router().getLocalPair(address(vidDai), address(vidWeth)), daiAmountIn); - vidWeth.transfer(vidUni.router().getLocalPair(address(vidDai), address(vidWeth)), daiAmountIn); - vidWeth.transfer(vidUni.router().getLocalPair(address(vidWeth), address(vidUsdc)), daiAmountIn); - vidUsdc.transfer(vidUni.router().getLocalPair(address(vidWeth), address(vidUsdc)), daiAmountIn); - - vidUni.router().syncLocalPair(address(vidDai), address(vidWeth)); - vidUni.router().syncLocalPair(address(vidWeth), address(vidUsdc)); - - uint256 usdcAmountOutMin = 1; - uint256 usdcAmountOut = - vidUni.swapMultiHopExactAmountIn(daiAmountIn, usdcAmountOutMin); - - assert(usdcAmountOut >= usdcAmountOutMin); - } - - function testSwapSingleHopExactAmountOut() public { - uint256 wethAmount = 1e18; - vidWeth.deposit{value: 10*wethAmount}(); - vidWeth.approve(address(vidUni), 6*wethAmount); - vidDai.mint(address(this), 10*wethAmount); - vidDai.approve(address(vidUni), 4*wethAmount); - - vidWeth.transfer(vidUni.router().getLocalPair(address(vidWeth), address(vidDai)), 4*wethAmount); - vidDai.transfer(vidUni.router().getLocalPair(address(vidWeth), address(vidDai)), 4*wethAmount); - - vidUni.router().syncLocalPair(address(vidWeth), address(vidDai)); - - uint256 daiAmountDesired = 1e18; - uint256 daiAmountOut = - vidUni.swapSingleHopExactAmountOut(daiAmountDesired, 2*wethAmount); - - assert(daiAmountOut == daiAmountDesired); - } - - function testSwapMultiHopExactAmountOut() public { - uint256 wethAmount = 1e18; - vidWeth.deposit{value: 20*wethAmount}(); - vidWeth.approve(address(vidUni), 20*wethAmount); - vidDai.mint(address(this), 20*wethAmount); - vidDai.approve(address(vidUni), 20*wethAmount); - vidUsdc.mint(address(this), 10*wethAmount); - vidUsdc.approve(address(vidUni), 10*wethAmount); - - vidWeth.transfer(vidUni.router().getLocalPair(address(vidWeth), address(vidDai)), 8*wethAmount); - vidDai.transfer(vidUni.router().getLocalPair(address(vidWeth), address(vidDai)), 8*wethAmount); - - vidUni.router().syncLocalPair(address(vidWeth), address(vidDai)); - - uint256 daiAmountOut = 2 * 1e18; - vidUni.swapSingleHopExactAmountOut(daiAmountOut, 4*wethAmount); - - vidDai.transfer(vidUni.router().getLocalPair(address(vidDai), address(vidWeth)), 2*daiAmountOut); - vidWeth.transfer(vidUni.router().getLocalPair(address(vidDai), address(vidWeth)), 2*daiAmountOut); - vidWeth.transfer(vidUni.router().getLocalPair(address(vidWeth), address(vidUsdc)), 2*daiAmountOut); - vidUsdc.transfer(vidUni.router().getLocalPair(address(vidWeth), address(vidUsdc)), 2*daiAmountOut); - vidUni.router().syncLocalPair(address(vidDai), address(vidWeth)); - vidUni.router().syncLocalPair(address(vidWeth), address(vidUsdc)); - - uint256 amountOutDesired = 1e6; - uint256 amountOut = - vidUni.swapMultiHopExactAmountOut(amountOutDesired, daiAmountOut); - - assert(amountOut == amountOutDesired); - } - - function testRouterAddLiquidity() public { - uint256 testAmount = 131072; // Hex: 0x20000 - uint desiredA = 10000; - uint desiredB = 10000; - uint minA = 0; - uint minB = 0; - - vidRouter = new uniswapV2Router02(); - - vidRouter.setLocalPair(address(vidWeth), address(vidDai)); - vidRouter.setLocalPair(address(vidWeth), address(vidUsdc)); - vidRouter.setLocalPair(address(vidUsdc), address(vidDai)); - - vidDai.mint(address(this), testAmount); - vidDai.approve(address(vidRouter), testAmount); - vidUsdc.mint(address(this), testAmount); - vidUsdc.approve(address(vidRouter), testAmount); - - vidRouter.addLiquidity(address(vidDai), address(vidUsdc), desiredA, desiredB, minA, minB, address(this)); - - assert(vidDai.balanceOf(address(this)) == 121072); - assert(vidUsdc.balanceOf(address(this)) == 121072); - assert(vidDai.balanceOf(vidRouter.getLocalPair(address(vidDai), address(vidUsdc))) == 10000); - assert(vidUsdc.balanceOf(vidRouter.getLocalPair(address(vidDai), address(vidUsdc))) == 10000); - assert(uniswapV2Pair(vidRouter.getLocalPair(address(vidDai), address(vidUsdc))).balanceOf(address(this)) == 9000); - } +// function testSwapMultiHopExactAmountIn() public { +// uint256 wethAmount = 1e18; +// +// vidWeth.deposit{value: 4*wethAmount}(); +// vidWeth.approve(address(vidUni), 8*wethAmount); +// vidDai.mint(address(this), 3*wethAmount); +// vidDai.approve(address(vidUni), 3*wethAmount); +// vidUsdc.mint(address(this), 2*wethAmount); +// vidUsdc.approve(address(vidUni), 2*wethAmount); +// +// vidWeth.transfer(vidUni.router().getLocalPair(address(vidWeth), address(vidDai)), wethAmount); +// vidDai.transfer(vidUni.router().getLocalPair(address(vidWeth), address(vidDai)), wethAmount); +// +// vidUni.router().syncLocalPair(address(vidWeth), address(vidDai)); +// +// uint256 daiAmountMin = 1; +// vidUni.swapSingleHopExactAmountIn(wethAmount, daiAmountMin); +// +// uint256 daiAmountIn = 1e18; +// +// vidDai.transfer(vidUni.router().getLocalPair(address(vidDai), address(vidWeth)), daiAmountIn); +// vidWeth.transfer(vidUni.router().getLocalPair(address(vidDai), address(vidWeth)), daiAmountIn); +// vidWeth.transfer(vidUni.router().getLocalPair(address(vidWeth), address(vidUsdc)), daiAmountIn); +// vidUsdc.transfer(vidUni.router().getLocalPair(address(vidWeth), address(vidUsdc)), daiAmountIn); +// +// vidUni.router().syncLocalPair(address(vidDai), address(vidWeth)); +// vidUni.router().syncLocalPair(address(vidWeth), address(vidUsdc)); +// +// uint256 usdcAmountOutMin = 1; +// uint256 usdcAmountOut = +// vidUni.swapMultiHopExactAmountIn(daiAmountIn, usdcAmountOutMin); +// +// assert(usdcAmountOut >= usdcAmountOutMin); +// } +// +// function testSwapSingleHopExactAmountOut() public { +// uint256 wethAmount = 1e18; +// vidWeth.deposit{value: 10*wethAmount}(); +// vidWeth.approve(address(vidUni), 6*wethAmount); +// vidDai.mint(address(this), 10*wethAmount); +// vidDai.approve(address(vidUni), 4*wethAmount); +// +// vidWeth.transfer(vidUni.router().getLocalPair(address(vidWeth), address(vidDai)), 4*wethAmount); +// vidDai.transfer(vidUni.router().getLocalPair(address(vidWeth), address(vidDai)), 4*wethAmount); +// +// vidUni.router().syncLocalPair(address(vidWeth), address(vidDai)); +// +// uint256 daiAmountDesired = 1e18; +// uint256 daiAmountOut = +// vidUni.swapSingleHopExactAmountOut(daiAmountDesired, 2*wethAmount); +// +// assert(daiAmountOut == daiAmountDesired); +// } +// +// function testSwapMultiHopExactAmountOut() public { +// uint256 wethAmount = 1e18; +// vidWeth.deposit{value: 20*wethAmount}(); +// vidWeth.approve(address(vidUni), 20*wethAmount); +// vidDai.mint(address(this), 20*wethAmount); +// vidDai.approve(address(vidUni), 20*wethAmount); +// vidUsdc.mint(address(this), 10*wethAmount); +// vidUsdc.approve(address(vidUni), 10*wethAmount); +// +// vidWeth.transfer(vidUni.router().getLocalPair(address(vidWeth), address(vidDai)), 8*wethAmount); +// vidDai.transfer(vidUni.router().getLocalPair(address(vidWeth), address(vidDai)), 8*wethAmount); +// +// vidUni.router().syncLocalPair(address(vidWeth), address(vidDai)); +// +// uint256 daiAmountOut = 2 * 1e18; +// vidUni.swapSingleHopExactAmountOut(daiAmountOut, 4*wethAmount); +// +// vidDai.transfer(vidUni.router().getLocalPair(address(vidDai), address(vidWeth)), 2*daiAmountOut); +// vidWeth.transfer(vidUni.router().getLocalPair(address(vidDai), address(vidWeth)), 2*daiAmountOut); +// vidWeth.transfer(vidUni.router().getLocalPair(address(vidWeth), address(vidUsdc)), 2*daiAmountOut); +// vidUsdc.transfer(vidUni.router().getLocalPair(address(vidWeth), address(vidUsdc)), 2*daiAmountOut); +// vidUni.router().syncLocalPair(address(vidDai), address(vidWeth)); +// vidUni.router().syncLocalPair(address(vidWeth), address(vidUsdc)); +// +// uint256 amountOutDesired = 1e6; +// uint256 amountOut = +// vidUni.swapMultiHopExactAmountOut(amountOutDesired, daiAmountOut); +// +// assert(amountOut == amountOutDesired); +// } +// +// function testRouterAddLiquidity() public { +// uint256 testAmount = 131072; // Hex: 0x20000 +// uint desiredA = 10000; +// uint desiredB = 10000; +// uint minA = 0; +// uint minB = 0; +// +// vidRouter = new uniswapV2Router02(); +// +// vidRouter.setLocalPair(address(vidWeth), address(vidDai)); +// vidRouter.setLocalPair(address(vidWeth), address(vidUsdc)); +// vidRouter.setLocalPair(address(vidUsdc), address(vidDai)); +// +// vidDai.mint(address(this), testAmount); +// vidDai.approve(address(vidRouter), testAmount); +// vidUsdc.mint(address(this), testAmount); +// vidUsdc.approve(address(vidRouter), testAmount); +// +// vidRouter.addLiquidity(address(vidDai), address(vidUsdc), desiredA, desiredB, minA, minB, address(this)); +// +// assert(vidDai.balanceOf(address(this)) == 121072); +// assert(vidUsdc.balanceOf(address(this)) == 121072); +// assert(vidDai.balanceOf(vidRouter.getLocalPair(address(vidDai), address(vidUsdc))) == 10000); +// assert(vidUsdc.balanceOf(vidRouter.getLocalPair(address(vidDai), address(vidUsdc))) == 10000); +// assert(uniswapV2Pair(vidRouter.getLocalPair(address(vidDai), address(vidUsdc))).balanceOf(address(this)) == 9000); +// } } From 0f1f1c93b40764927426603e7c85d87f2e72161d Mon Sep 17 00:00:00 2001 From: Roberto Rosmaninho Date: Fri, 1 Nov 2024 01:12:18 -0300 Subject: [PATCH 26/41] Updating script with OO-like refactoring + `addLiquidity` and `SwapSingleHopExactAmountIn` working --- WEth_to_DAi_Solidity_Tokens_Swap_script.py | 299 ++++++++++++++++----- 1 file changed, 229 insertions(+), 70 deletions(-) mode change 100755 => 100644 WEth_to_DAi_Solidity_Tokens_Swap_script.py diff --git a/WEth_to_DAi_Solidity_Tokens_Swap_script.py b/WEth_to_DAi_Solidity_Tokens_Swap_script.py old mode 100755 new mode 100644 index 627d6de..d7d6a02 --- a/WEth_to_DAi_Solidity_Tokens_Swap_script.py +++ b/WEth_to_DAi_Solidity_Tokens_Swap_script.py @@ -11,7 +11,10 @@ w3 = Web3(Web3.HTTPProvider(GETH_URL)) dev_account_address = w3.eth.accounts[0] w3.eth.default_account = dev_account_address +print(f"Dev account address: {dev_account_address}") +BALANCES=True +RECEIPTS=False def compile_contract(filename): with open(filename, "r") as file: @@ -20,33 +23,36 @@ def compile_contract(filename): contract_source, output_values=["abi", "bin"], optimize=True ) print(f"Compilation units: {len(compiled_sol)}") + print("") return compiled_sol +def balanceOf(contract_name, token_address, owner_Address): + balanceOf_data = '70a08231000000000000000000000000' + owner_Address[2:] -def main(): - print(f"Starting block number: {w3.eth.block_number}") + balanceOf_tx = { + 'from': owner_Address, + 'data': balanceOf_data, + 'to': token_address, + 'value': 0, + 'gas': 11000000, + 'maxFeePerGas': 2000000000, + 'maxPriorityFeePerGas': 1000000000, + } - # Compile our Uniswap contract - compiled_sol = compile_contract("test/examples/swaps/UniswapV2SwapRenamed.sol") + balance = w3.eth.call(balanceOf_tx) + print(f' > Balance of {contract_name}: {int(balance.hex(), 16)}') - # List of contracts to deploy (in this order) - contract_ids = [ - "uniswapV2Pair", - "uniswapV2Router02", - "uniswapV2Swap", - "uniswapV2SwapTest", - ] - +def deploy_tokens(owner_address): solidity_usdc_hex = open('test/demo-contracts/UniswapV2SwapRenamed.USDC.kore.bin').read().rstrip() solidity_dai_hex = open('test/demo-contracts/UniswapV2SwapRenamed.DAI.kore.bin').read().rstrip() solidity_weth_hex = open('test/demo-contracts/UniswapV2SwapRenamed.WETH.kore.bin').read().rstrip() - + solidity_contracts = {"uSDCMock": solidity_usdc_hex, "dAIMock": solidity_dai_hex, "wETHMock": solidity_weth_hex} solidity_contracts_address = {} - + for sol_contract_name, sol_contract_hex in solidity_contracts.items(): deploy_solidity_tx = { - 'from': dev_account_address, + 'from': owner_address, 'data': sol_contract_hex, 'to': '', 'value': 0, @@ -54,14 +60,21 @@ def main(): 'maxFeePerGas': 2000000000, 'maxPriorityFeePerGas': 1000000000, } - + tx_hash = w3.eth.send_transaction(deploy_solidity_tx) receipt = w3.eth.wait_for_transaction_receipt(tx_hash) solidity_contracts_address[sol_contract_name] = receipt['contractAddress'] - print(f"Contract {sol_contract_name} deployed with address: {receipt['contractAddress']}") - + print(f"Contract {sol_contract_name} deployed with address: {solidity_contracts_address[sol_contract_name]}") - # Deploy contracts + if RECEIPTS: + print(receipt) + + if BALANCES: + balanceOf(sol_contract_name, solidity_contracts_address[sol_contract_name], owner_address) + + return solidity_contracts_address + +def deploy_contracts(compiled_sol, contract_ids, solidity_contracts_address): deployed_contracts = {} for id in contract_ids: interface = compiled_sol[":" + id] @@ -124,19 +137,16 @@ def main(): deployed_contracts[id] = {"address": tx_receipt.contractAddress, "abi": abi} print(f"Contract {id} deployed with address: {tx_receipt.contractAddress}") - # Mint tokens to dev account - weth_address = solidity_contracts_address["wETHMock"] - dai_address = solidity_contracts_address["dAIMock"] - #usdc_address = solidity_contracts_address["uSDCMock"] + return deployed_contracts - # Mint WETH (Deposit, as WETH doesn't have mint function) +def deposit_weth(owner_Address, weth_address, amount): deposit_weth_data = 'd0e30db0' deposit_weth_tx = { "chainId": w3.eth.chain_id, - "from": dev_account_address, + "from": owner_Address, 'data': deposit_weth_data, 'to': weth_address, - "value": w3.to_wei(10000000, "ether"), + "value": amount, "gas": 200000, "gasPrice": w3.to_wei(20, "gwei"), "nonce": w3.eth.get_transaction_count(dev_account_address), @@ -145,64 +155,172 @@ def main(): tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) print("Minted WETH: ", tx_receipt["status"] == 1 and "Success" or "Failed") - # Mint DAI - # mint(dev_account_address, 10000000 * 10**18) - dai_mint_data = '40c10f19000000000000000000000000' + dev_account_address[2:] + '000000000000000000000000000000000000000000084595161401484a000000' - mint_dai_tx = { - 'from': dev_account_address, - 'data': dai_mint_data, - 'to': dai_address, + if RECEIPTS: + print(tx_receipt) + + if BALANCES: + balanceOf("WETH", weth_address, dev_account_address) + +def mint_token(token_name, token_address, owner_Address, amount): + token_mint_data = '40c10f19000000000000000000000000' + owner_Address[2:] + amount + mint_token_tx = { + 'from': owner_Address, + 'data': token_mint_data, + 'to': token_address, 'value': 0, 'gas': 11000000, 'maxFeePerGas': 2000000000, 'maxPriorityFeePerGas': 1000000000, } - - tx_hash = w3.eth.send_transaction(mint_dai_tx) + + tx_hash = w3.eth.send_transaction(mint_token_tx) tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) - print("Minted DAI: ", tx_receipt["status"] == 1 and "Success" or "Failed") + print("Minted ", token_name, ": ", tx_receipt["status"] == 1 and "Success" or "Failed") - # Approve the router to spend tokens - router_address = deployed_contracts["uniswapV2Router02"]["address"] - - # Approve WETH mint transaction - # approve(router_address, 10000000 * 10**18) - weth_approve_data = '086c40f6000000000000000000000000' + router_address[2:] + '000000000000000000000000000000000000000000084595161401484a000000' - weth_approve_tx = { - 'from': dev_account_address, - 'data': weth_approve_data, - 'to': weth_address, + if RECEIPTS: + print(tx_receipt) + + if BALANCES: + balanceOf(token_name, token_address, owner_Address) + +def approve(token_name, token_address, owner_address, spender_address, amount): + token_approve_data = '095ea7b3000000000000000000000000' + spender_address[2:] + amount + token_approve_tx = { + 'from': owner_address, + 'data': token_approve_data, + 'to': token_address, 'value': 0, 'gas': 11000000, 'maxFeePerGas': 2000000000, 'maxPriorityFeePerGas': 1000000000, } - tx_hash = w3.eth.send_transaction(weth_approve_tx) + tx_hash = w3.eth.send_transaction(token_approve_tx) tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) - print("Approved WETH: ", tx_receipt["status"] == 1 and "Success" or "Failed") - - # Approve DAI mint transaction - # approve(router_address, 10000000 * 10**18) - dai_approve_data = '086c40f6000000000000000000000000' + router_address[2:] + '000000000000000000000000000000000000000000084595161401484a000000' - dai_approve_tx = { - 'from': dev_account_address, - 'data': dai_approve_data, - 'to': dai_address, + print("Approved ", token_name,": ", tx_receipt["status"] == 1 and "Success" or "Failed") + if RECEIPTS: + print(tx_receipt) + +def allowance(token_name, token_address, owner_address, spender_address): + token_allowance_data = 'dd62ed3e000000000000000000000000' + owner_address[2:] + '000000000000000000000000' + spender_address[2:] + token_allowance_tx = { + 'from': owner_address, + 'data': token_allowance_data, + 'to': token_address, 'value': 0, 'gas': 11000000, 'maxFeePerGas': 2000000000, 'maxPriorityFeePerGas': 1000000000, } - - tx_hash = w3.eth.send_transaction(dai_approve_tx) + + allowance = w3.eth.call(token_allowance_tx) + print(f' > Allowance of {token_name}: {int(allowance.hex(), 16)}') + +def transfer(token_name, token_address, owner_address, to_name, to_address, amount): + token_transfer_data = 'a9059cbb000000000000000000000000' + to_address[2:] + amount + token_transfer_tx = { + 'from': owner_address, + 'data': token_transfer_data, + 'to': token_address, + 'value': 0, + 'gas': 11000000, + 'maxFeePerGas': 2000000000, + 'maxPriorityFeePerGas': 1000000000, + } + tx_hash = w3.eth.send_transaction(token_transfer_tx) tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) - print("Approved DAI: ", tx_receipt["status"] == 1 and "Success" or "Failed") + print("Transferred ", token_name, "to", to_name, ": ", tx_receipt["status"] == 1 and "Success" or "Failed") + if RECEIPTS: + print(tx_receipt) + + + +def main(): + print(f"Starting block number: {w3.eth.block_number}") + + # Compile our Uniswap contract + compiled_sol = compile_contract("test/examples/swaps/UniswapV2SwapRenamed.sol") + + # List of contracts to deploy (in this order) + contract_ids = [ + "uniswapV2Pair", + "uniswapV2Router02", + "uniswapV2Swap", + "uniswapV2SwapTest", + ] + + # Deploy tokens + solidity_contracts_address = deploy_tokens(dev_account_address) + + # Deploy contracts + print("") + deployed_contracts = deploy_contracts(compiled_sol, contract_ids, solidity_contracts_address) + + # Instantiate Uniswap contracts + swap_meta = deployed_contracts["uniswapV2Swap"] + swap_address, swap_abi = swap_meta["address"], swap_meta["abi"] + swap = w3.eth.contract(address=swap_address, abi=swap_abi) - # Add liquidity to pools router_abi = deployed_contracts["uniswapV2Router02"]["abi"] + router_address = swap.functions.router().call() router = w3.eth.contract(address=router_address, abi=router_abi) + # 10000000 * 10**18 = '000000000000000000000000000000000000000000084595161401484a000000' + eth_10000000_hex = "{:064x}".format(10000000 * 10**18) + eth_10000000 = w3.to_wei(10000000, "ether") + + # Mint tokens to dev account + weth_address = solidity_contracts_address["wETHMock"] + dai_address = solidity_contracts_address["dAIMock"] + usdc_address = solidity_contracts_address["uSDCMock"] + + # WETH + print("") + print("WETH") + + # Mint WETH (Deposit, as WETH doesn't have mint function) + deposit_weth(dev_account_address, weth_address, eth_10000000) + + # approve(router_address, 10000000 * 10**18) + approve("WETH", weth_address, dev_account_address, router_address, eth_10000000_hex) + + #call allowance + allowance("WETH", weth_address, dev_account_address, router_address) + + # USDC + print("") + print("USDC") + + # Mint USDC + # mint(dev_account_address, 10000000 * 10**18) + mint_token("USDC", usdc_address, dev_account_address, eth_10000000_hex) + + # Approve USDC mint transaction + # approve(router_address, 10000000 * 10**18) + approve("USDC", usdc_address, dev_account_address, router_address, eth_10000000_hex) + + #call allowance + allowance("USDC", usdc_address, dev_account_address, router_address) + + # DAI + print("") + print("DAI") + + # Mint DAI + # mint(dev_account_address, 10000000 * 10**18) + mint_token("DAI", dai_address, dev_account_address, eth_10000000_hex) + + # Approve DAI mint transaction + # approve(router_address, 10000000 * 10**18) + approve("DAI", dai_address, dev_account_address, router_address, eth_10000000_hex) + + # call allowance + allowance("DAI", dai_address, dev_account_address, router_address) + + + print("") + print("TESTS") + # Add liquidity to (WETH, DAI) tx_hash = router.functions.addLiquidity( weth_address, @@ -220,17 +338,39 @@ def main(): } ) tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) - print("Added liquidity to WETH-DAI") + print("Added liquidity to WETH-DAI: ", tx_receipt["status"] == 1 and "Success" or "Failed") + if RECEIPTS: + print(tx_receipt) - # Perform a single-hop swap (WETH to DAI) - swap_meta = deployed_contracts["uniswapV2Swap"] - swap_address, swap_abi = swap_meta["address"], swap_meta["abi"] - swap = w3.eth.contract(address=swap_address, abi=swap_abi) + ######################################### SwapSingleHopExactAmountIn Test ########################################## + print("") + print("Starting SwapSingleHopExactAmountIn Test...") + + weth_amount = 1 * 10**18 + weth_amount_hex = "{:064x}".format(weth_amount) + two_weth_amount = 2 * weth_amount + two_weth_amount_hex = "{:064x}".format(two_weth_amount) + dai_amount_min = 1 - tx_hash = swap.functions.swapSingleHopExactAmountIn( - 1 * 10**18, - 2500 * 10**18, - ).transact( + # Approve WETH transaction to uniswapV2Swap contract + # approve(swap_address, two_weth_amount_hex) + approve("WETH", weth_address, dev_account_address, swap_address, two_weth_amount_hex) + + # Approve DAI transaction to uniswapV2Swap contract + # approve(swap_address, weth_amount_hex) + approve("DAI", dai_address, dev_account_address, swap_address, weth_amount_hex) + + # Get local pair address for WETH-DAI so we can transfer WETH and DAI to it + address_local_pair_weth_dai = router.functions.getLocalPair(weth_address, dai_address).call() + + # WETH transfer to address_local_pair_weth_dai + transfer("WETH", weth_address, dev_account_address, "Local Pair WETH-DAI", address_local_pair_weth_dai, two_weth_amount_hex) + + # DAI transfer to address_local_pair_weth_dai + transfer("DAI", dai_address, dev_account_address, "Local Pair WETH-DAI", address_local_pair_weth_dai, weth_amount_hex) + + # Sync local pair + tx_hash = router.functions.syncLocalPair(weth_address, dai_address).transact( { "from": dev_account_address, "gas": 3000000, @@ -238,8 +378,27 @@ def main(): } ) tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) - print("Swapped WETH to DAI") + print("Synced WETH-DAI pair: ", tx_receipt["status"] == 1 and "Success" or "Failed") + if RECEIPTS: + print(tx_receipt) + + # Swap WETH to DAI + daiAmountOut = swap.functions.swapSingleHopExactAmountIn(weth_amount,dai_amount_min).call() + print(f'Sucessfully swapped {weth_amount} WETH to DAI: {daiAmountOut}') + + # Here is the transaction of swap WETH to DAI just for reference + # tx_hash = swap.functions.swapSingleHopExactAmountIn(weth_amount,dai_amount_min).transact( + # { + # "from": dev_account_address, + # "gas": 3000000, + # "gasPrice": Web3.to_wei("20", "gwei"), + # } + # ) + # tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + # print("Swapped WETH to DAI: ", tx_receipt["status"] == 1 and "Success" or "Failed") + # if RECEIPTS: + # print(tx_receipt) if __name__ == "__main__": main() From f1204ebfed3b3c133735efe5186bcc02cf288074 Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Fri, 1 Nov 2024 11:18:26 -0500 Subject: [PATCH 27/41] Mint WETH -> Deposit WETH, and edited spaces. --- WEth_to_DAi_Solidity_Tokens_Swap_script.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/WEth_to_DAi_Solidity_Tokens_Swap_script.py b/WEth_to_DAi_Solidity_Tokens_Swap_script.py index d7d6a02..d46ebfa 100644 --- a/WEth_to_DAi_Solidity_Tokens_Swap_script.py +++ b/WEth_to_DAi_Solidity_Tokens_Swap_script.py @@ -153,7 +153,7 @@ def deposit_weth(owner_Address, weth_address, amount): } tx_hash = w3.eth.send_transaction(deposit_weth_tx) tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) - print("Minted WETH: ", tx_receipt["status"] == 1 and "Success" or "Failed") + print("Deposited WETH:", tx_receipt["status"] == 1 and "Success" or "Failed") if RECEIPTS: print(tx_receipt) @@ -175,7 +175,7 @@ def mint_token(token_name, token_address, owner_Address, amount): tx_hash = w3.eth.send_transaction(mint_token_tx) tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) - print("Minted ", token_name, ": ", tx_receipt["status"] == 1 and "Success" or "Failed") + print("Minted " + token_name + ":", tx_receipt["status"] == 1 and "Success" or "Failed") if RECEIPTS: print(tx_receipt) @@ -197,7 +197,7 @@ def approve(token_name, token_address, owner_address, spender_address, amount): tx_hash = w3.eth.send_transaction(token_approve_tx) tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) - print("Approved ", token_name,": ", tx_receipt["status"] == 1 and "Success" or "Failed") + print("Approved " + token_name + ":", tx_receipt["status"] == 1 and "Success" or "Failed") if RECEIPTS: print(tx_receipt) @@ -229,7 +229,7 @@ def transfer(token_name, token_address, owner_address, to_name, to_address, amou } tx_hash = w3.eth.send_transaction(token_transfer_tx) tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) - print("Transferred ", token_name, "to", to_name, ": ", tx_receipt["status"] == 1 and "Success" or "Failed") + print("Transferred", token_name, "to", to_name + ":", tx_receipt["status"] == 1 and "Success" or "Failed") if RECEIPTS: print(tx_receipt) From 75c4e73a2e1ab9da20b32e7a8ab0f4685b53eaa4 Mon Sep 17 00:00:00 2001 From: Roberto Rosmaninho Date: Mon, 4 Nov 2024 22:41:24 -0300 Subject: [PATCH 28/41] Working version of solidity_rust addLiq and swap with small numbers --- ...Solidity_to_DAi_Rust_Tokens_Swap_script.py | 404 ++++++++++++++++++ 1 file changed, 404 insertions(+) create mode 100644 WEth_Solidity_to_DAi_Rust_Tokens_Swap_script.py diff --git a/WEth_Solidity_to_DAi_Rust_Tokens_Swap_script.py b/WEth_Solidity_to_DAi_Rust_Tokens_Swap_script.py new file mode 100644 index 0000000..55c6c2c --- /dev/null +++ b/WEth_Solidity_to_DAi_Rust_Tokens_Swap_script.py @@ -0,0 +1,404 @@ +import json +from web3 import Web3 +from web3.exceptions import ContractLogicError +from solcx import install_solc, compile_source + +install_solc(version="latest") + +# Set Geth's URL +GETH_URL = "http://localhost:8545" + +w3 = Web3(Web3.HTTPProvider(GETH_URL)) +dev_account_address = w3.eth.accounts[0] +w3.eth.default_account = dev_account_address +print(f"Dev account address: {dev_account_address}") + +BALANCES=True +RECEIPTS=False + +def compile_contract(filename): + with open(filename, "r") as file: + contract_source = file.read().strip() + compiled_sol = compile_source( + contract_source, output_values=["abi", "bin"], optimize=True + ) + print(f"Compilation units: {len(compiled_sol)}") + print("") + return compiled_sol + +def balanceOf(contract_name, token_address, owner_Address): + balanceOf_data = '70a08231000000000000000000000000' + owner_Address[2:] + + balanceOf_tx = { + 'from': owner_Address, + 'data': balanceOf_data, + 'to': token_address, + 'value': 0, + 'gas': 11000000, + 'maxFeePerGas': 2000000000, + 'maxPriorityFeePerGas': 1000000000, + } + + balance = w3.eth.call(balanceOf_tx) + print(f' > Balance of {contract_name}: {int(balance.hex(), 16)}') + +def deploy_tokens(owner_address): + solidity_usdc_hex = open('test/demo-contracts/UniswapV2SwapRenamed.USDC.kore.bin').read().rstrip() + solidity_dai_hex = open('/home/robertorosmaninho/pi2-inc/rust-demo-semantics/.build/erc20/rust-token.bin').read().rstrip() + solidity_weth_hex = open('test/demo-contracts/UniswapV2SwapRenamed.WETH.kore.bin').read().rstrip() + + solidity_contracts = {"uSDCMock": solidity_usdc_hex, "dAIMock": solidity_dai_hex, "wETHMock": solidity_weth_hex} + solidity_contracts_address = {} + + for sol_contract_name, sol_contract_hex in solidity_contracts.items(): + deploy_solidity_tx = { + 'from': owner_address, + 'data': sol_contract_hex, + 'to': '', + 'value': 0, + 'gas': 11000000, + 'maxFeePerGas': 2000000000, + 'maxPriorityFeePerGas': 1000000000, + } + + tx_hash = w3.eth.send_transaction(deploy_solidity_tx) + receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + solidity_contracts_address[sol_contract_name] = receipt['contractAddress'] + print(f"Contract {sol_contract_name} deployed with address: {solidity_contracts_address[sol_contract_name]}") + + if RECEIPTS: + print(receipt) + + if BALANCES: + balanceOf(sol_contract_name, solidity_contracts_address[sol_contract_name], owner_address) + + return solidity_contracts_address + +def deploy_contracts(compiled_sol, contract_ids, solidity_contracts_address): + deployed_contracts = {} + for id in contract_ids: + interface = compiled_sol[":" + id] + abi, binary = interface["abi"], interface["bin"] + Contract = w3.eth.contract(abi=abi, bytecode="6B65766D" + binary) + if id in {"uniswapV2Swap", "uniswapV2Pair"}: + # We know by now token contracts were already deployed + weth_address = solidity_contracts_address["wETHMock"] + dai_address = solidity_contracts_address["dAIMock"] + usdc_address = solidity_contracts_address["uSDCMock"] + if id == "uniswapV2Swap": + tx_hash = Contract.constructor( + weth_address, dai_address, usdc_address + ).transact() + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + deployed_contracts[id] = { + "address": tx_receipt.contractAddress, + "abi": abi, + } + print( + f"Contract {id} deployed with address: {tx_receipt.contractAddress}" + ) + elif id == "uniswapV2Pair": + # Deploy (weth, dai) + tx_hash = Contract.constructor(weth_address, dai_address).transact() + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + deployed_contracts[id + ":WETH-DAI"] = { + "address": tx_receipt.contractAddress, + "abi": abi, + } + print( + f"Contract {id}:WETH-DAI deployed with address: {tx_receipt.contractAddress}" + ) + + # Deploy (weth, usdc) + tx_hash = Contract.constructor(weth_address, usdc_address).transact() + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + deployed_contracts[id + ":WETH-USDC"] = { + "address": tx_receipt.contractAddress, + "abi": abi, + } + print( + f"Contract {id}:WETH-USDC deployed with address: {tx_receipt.contractAddress}" + ) + + # Deploy (usdc, dai) + tx_hash = Contract.constructor(usdc_address, dai_address).transact() + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + deployed_contracts[id + ":USDC-DAI"] = { + "address": tx_receipt.contractAddress, + "abi": abi, + } + print( + f"Contract {id}:USDC-DAI deployed with address: {tx_receipt.contractAddress}" + ) + else: + # Token, router or test contracts + tx_hash = Contract.constructor().transact() + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + deployed_contracts[id] = {"address": tx_receipt.contractAddress, "abi": abi} + print(f"Contract {id} deployed with address: {tx_receipt.contractAddress}") + + return deployed_contracts + +def deposit_weth(owner_Address, weth_address, amount): + deposit_weth_data = 'd0e30db0' + deposit_weth_tx = { + "chainId": w3.eth.chain_id, + "from": owner_Address, + 'data': deposit_weth_data, + 'to': weth_address, + "value": amount, + "gas": 200000, + "gasPrice": w3.to_wei(20, "gwei"), + "nonce": w3.eth.get_transaction_count(dev_account_address), + } + tx_hash = w3.eth.send_transaction(deposit_weth_tx) + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + print("Deposited WETH:", tx_receipt["status"] == 1 and "Success" or "Failed") + + if RECEIPTS: + print(tx_receipt) + + if BALANCES: + balanceOf("WETH", weth_address, dev_account_address) + +def mint_token(token_name, token_address, owner_Address, amount): + token_mint_data = '40c10f19000000000000000000000000' + owner_Address[2:] + amount + mint_token_tx = { + 'from': owner_Address, + 'data': token_mint_data, + 'to': token_address, + 'value': 0, + 'gas': 11000000, + 'maxFeePerGas': 2000000000, + 'maxPriorityFeePerGas': 1000000000, + } + + tx_hash = w3.eth.send_transaction(mint_token_tx) + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + print("Minted " + token_name + ":", tx_receipt["status"] == 1 and "Success" or "Failed") + + if RECEIPTS: + print(tx_receipt) + + if BALANCES: + balanceOf(token_name, token_address, owner_Address) + +def approve(token_name, token_address, owner_address, spender_address, amount): + token_approve_data = '095ea7b3000000000000000000000000' + spender_address[2:] + amount + token_approve_tx = { + 'from': owner_address, + 'data': token_approve_data, + 'to': token_address, + 'value': 0, + 'gas': 11000000, + 'maxFeePerGas': 2000000000, + 'maxPriorityFeePerGas': 1000000000, + } + + tx_hash = w3.eth.send_transaction(token_approve_tx) + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + print("Approved " + token_name + ":", tx_receipt["status"] == 1 and "Success" or "Failed") + if RECEIPTS: + print(tx_receipt) + +def allowance(token_name, token_address, owner_address, spender_address): + token_allowance_data = 'dd62ed3e000000000000000000000000' + owner_address[2:] + '000000000000000000000000' + spender_address[2:] + token_allowance_tx = { + 'from': owner_address, + 'data': token_allowance_data, + 'to': token_address, + 'value': 0, + 'gas': 11000000, + 'maxFeePerGas': 2000000000, + 'maxPriorityFeePerGas': 1000000000, + } + + allowance = w3.eth.call(token_allowance_tx) + print(f' > Allowance of {token_name}: {int(allowance.hex(), 16)}') + +def transfer(token_name, token_address, owner_address, to_name, to_address, amount): + token_transfer_data = 'a9059cbb000000000000000000000000' + to_address[2:] + amount + token_transfer_tx = { + 'from': owner_address, + 'data': token_transfer_data, + 'to': token_address, + 'value': 0, + 'gas': 11000000, + 'maxFeePerGas': 2000000000, + 'maxPriorityFeePerGas': 1000000000, + } + tx_hash = w3.eth.send_transaction(token_transfer_tx) + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + print("Transferred", token_name, "to", to_name + ":", tx_receipt["status"] == 1 and "Success" or "Failed") + if RECEIPTS: + print(tx_receipt) + + + +def main(): + print(f"Starting block number: {w3.eth.block_number}") + + # Compile our Uniswap contract + compiled_sol = compile_contract("test/examples/swaps/UniswapV2SwapRenamed.sol") + + # List of contracts to deploy (in this order) + contract_ids = [ + "uniswapV2Pair", + "uniswapV2Router02", + "uniswapV2Swap", + "uniswapV2SwapTest", + ] + + # Deploy tokens + solidity_contracts_address = deploy_tokens(dev_account_address) + + # Deploy contracts + print("") + deployed_contracts = deploy_contracts(compiled_sol, contract_ids, solidity_contracts_address) + + # Instantiate Uniswap contracts + swap_meta = deployed_contracts["uniswapV2Swap"] + swap_address, swap_abi = swap_meta["address"], swap_meta["abi"] + swap = w3.eth.contract(address=swap_address, abi=swap_abi) + + router_abi = deployed_contracts["uniswapV2Router02"]["abi"] + router_address = swap.functions.router().call() + router = w3.eth.contract(address=router_address, abi=router_abi) + + # 10000000 * 10**18 = '000000000000000000000000000000000000000000084595161401484a000000' + eth_10000000_hex = "{:064x}".format(10**10) + eth_10000000 = 10**10 #w3.to_wei(10000000, "ether") + + # Mint tokens to dev account + weth_address = solidity_contracts_address["wETHMock"] + dai_address = solidity_contracts_address["dAIMock"] + usdc_address = solidity_contracts_address["uSDCMock"] + + # WETH + print("") + print("WETH") + + # Mint WETH (Deposit, as WETH doesn't have mint function) + deposit_weth(dev_account_address, weth_address, eth_10000000) + + # approve(router_address, 10000000 * 10**18) + approve("WETH", weth_address, dev_account_address, router_address, eth_10000000_hex) + + #call allowance + allowance("WETH", weth_address, dev_account_address, router_address) + + # USDC + print("") + print("USDC") + + # Mint USDC + # mint(dev_account_address, 10000000 * 10**18) + mint_token("USDC", usdc_address, dev_account_address, eth_10000000_hex) + + # Approve USDC mint transaction + # approve(router_address, 10000000 * 10**18) + approve("USDC", usdc_address, dev_account_address, router_address, eth_10000000_hex) + + #call allowance + allowance("USDC", usdc_address, dev_account_address, router_address) + + # DAI + print("") + print("DAI") + + # Mint DAI + # mint(dev_account_address, 10000000 * 10**18) + mint_token("DAI", dai_address, dev_account_address, eth_10000000_hex) + + # Approve DAI mint transaction + # approve(router_address, 10000000 * 10**18) + approve("DAI", dai_address, dev_account_address, router_address, eth_10000000_hex) + + # call allowance + allowance("DAI", dai_address, dev_account_address, router_address) + + + print("") + print("TESTS") + + # Add liquidity to (WETH, DAI) + tx_hash = router.functions.addLiquidity( + weth_address, + dai_address, + 2 * 10**5, + 50 * 10**5, + 0, + 0, + dev_account_address, + ).transact( + { + "from": dev_account_address, + "gas": 3000000, + "gasPrice": Web3.to_wei("20", "gwei"), + } + ) + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + print("Added liquidity to WETH-DAI: ", tx_receipt["status"] == 1 and "Success" or "Failed") + if RECEIPTS: + print(tx_receipt) + + ######################################### SwapSingleHopExactAmountIn Test ########################################## + print("") + print("Starting SwapSingleHopExactAmountIn Test...") + + weth_amount = 1 * 5**10 + weth_amount_hex = "{:064x}".format(weth_amount) + two_weth_amount = 2 * weth_amount + two_weth_amount_hex = "{:064x}".format(two_weth_amount) + dai_amount_min = 1 + + # Approve WETH transaction to uniswapV2Swap contract + # approve(swap_address, two_weth_amount_hex) + approve("WETH", weth_address, dev_account_address, swap_address, two_weth_amount_hex) + + # Approve DAI transaction to uniswapV2Swap contract + # approve(swap_address, weth_amount_hex) + approve("DAI", dai_address, dev_account_address, swap_address, weth_amount_hex) + + # Get local pair address for WETH-DAI so we can transfer WETH and DAI to it + address_local_pair_weth_dai = router.functions.getLocalPair(weth_address, dai_address).call() + + # WETH transfer to address_local_pair_weth_dai + transfer("WETH", weth_address, dev_account_address, "Local Pair WETH-DAI", address_local_pair_weth_dai, two_weth_amount_hex) + + # DAI transfer to address_local_pair_weth_dai + transfer("DAI", dai_address, dev_account_address, "Local Pair WETH-DAI", address_local_pair_weth_dai, weth_amount_hex) + + # Sync local pair + tx_hash = router.functions.syncLocalPair(weth_address, dai_address).transact( + { + "from": dev_account_address, + "gas": 3000000, + "gasPrice": Web3.to_wei("20", "gwei"), + } + ) + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + print("Synced WETH-DAI pair: ", tx_receipt["status"] == 1 and "Success" or "Failed") + if RECEIPTS: + print(tx_receipt) + + # Swap WETH to DAI + daiAmountOut = swap.functions.swapSingleHopExactAmountIn(weth_amount,dai_amount_min).call() + print(f'Sucessfully swapped {weth_amount} WETH to DAI: {daiAmountOut}') + + + # Here is the transaction of swap WETH to DAI just for reference + tx_hash = swap.functions.swapSingleHopExactAmountIn(weth_amount,dai_amount_min).transact( + { + "from": dev_account_address, + "gas": 3000000, + "gasPrice": Web3.to_wei("20", "gwei"), + } + ) + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + print("Swapped WETH to DAI: ", tx_receipt["status"] == 1 and "Success" or "Failed") + if RECEIPTS: + print(tx_receipt) + +if __name__ == "__main__": + main() From edb5c4050581743d9e09a9aca3e5265e5a58567a Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Tue, 5 Nov 2024 05:57:51 -0600 Subject: [PATCH 29/41] Rule for missing function selector. --- src/solidity.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/solidity.md b/src/solidity.md index 6fedb0a..7443c15 100644 --- a/src/solidity.md +++ b/src/solidity.md @@ -100,6 +100,7 @@ module SOLIDITY-CONFIGURATION // The active contract should be the last one in the list of contracts as // decoded by the provided $PGM. + // When the function selector is found, call the corresponding function rule execute(false, B) => #let ARGS::CallArgumentList = decodeArgs(substrBytes(B, 4, lengthBytes(B)), ParamTypes) #in F ( ARGS ) @@ -111,6 +112,9 @@ module SOLIDITY-CONFIGURATION F ParamTypes + // When the function selector is not found, fail. + rule execute(false, _B:Bytes) => require(v(false, bool), "Missing function selector") [owise] + syntax TypedVal ::= decodeArg(Bytes, Int, ElementaryTypeName) [function] rule decodeArg(B:Bytes, I:Int, uint256) => v(Int2MInt(Bytes2Int(substrBytes(B, I, I +Int 32), BE, Unsigned))::MInt{256}, uint256) From 97c33ebfb732d668cdaf1c69983d87cc88431bd9 Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Tue, 5 Nov 2024 06:23:42 -0600 Subject: [PATCH 30/41] New module execute, in order to import expression. --- src/solidity.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/solidity.md b/src/solidity.md index 7443c15..cf17b75 100644 --- a/src/solidity.md +++ b/src/solidity.md @@ -13,6 +13,7 @@ requires "plugin/krypto.md" module SOLIDITY-CONFIGURATION imports SOLIDITY-DATA imports SOLIDITY-SYNTAX + imports SOLIDITY-ULM-EXECUTE-SYNTAX imports BYTES imports K-EQUAL imports ULM @@ -81,8 +82,28 @@ module SOLIDITY-CONFIGURATION $GAS:Int +endmodule +``` + +```k +module SOLIDITY-ULM-EXECUTE-SYNTAX + imports BOOL + imports BYTES + syntax KItem ::= execute(Bool, Bytes) +endmodule +``` + +```k +module SOLIDITY-ULM-EXECUTE + imports SOLIDITY-CONFIGURATION + imports SOLIDITY-DATA + imports SOLIDITY-SYNTAX + imports SOLIDITY-EXPRESSION + imports BYTES + imports K-EQUAL + // The active contract should be the last one in the list of contracts as // decoded by the provided $PGM. rule execute(true, B) => List2Statements(INIT) ~> B @@ -289,6 +310,7 @@ module SOLIDITY imports SOLIDITY-STATEMENT imports SOLIDITY-FUNCTION-SELECTORS imports SOLIDITY-ULM-SIGNATURE-IMPLEMENTATION + imports SOLIDITY-ULM-EXECUTE rule _:PragmaDefinition Ss:SourceUnits => Ss ... rule S:SourceUnit Ss:SourceUnits => S ~> Ss From 4bc3d364f8930801872e87dec8995fb32dafa99d Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Tue, 5 Nov 2024 06:32:27 -0600 Subject: [PATCH 31/41] Added missing import. --- src/solidity.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/solidity.md b/src/solidity.md index cf17b75..f51e188 100644 --- a/src/solidity.md +++ b/src/solidity.md @@ -97,6 +97,7 @@ endmodule ```k module SOLIDITY-ULM-EXECUTE + imports SOLIDITY-ULM-EXECUTE-SYNTAX imports SOLIDITY-CONFIGURATION imports SOLIDITY-DATA imports SOLIDITY-SYNTAX From ef003522e8318fd0545295cc529b7ea9f99bb6dd Mon Sep 17 00:00:00 2001 From: Roberto Rosmaninho Date: Tue, 5 Nov 2024 13:50:06 -0300 Subject: [PATCH 32/41] Returning the values of the script to use u256 --- ...Solidity_to_DAi_Rust_Tokens_Swap_script.py | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/WEth_Solidity_to_DAi_Rust_Tokens_Swap_script.py b/WEth_Solidity_to_DAi_Rust_Tokens_Swap_script.py index 55c6c2c..c2afa64 100644 --- a/WEth_Solidity_to_DAi_Rust_Tokens_Swap_script.py +++ b/WEth_Solidity_to_DAi_Rust_Tokens_Swap_script.py @@ -5,6 +5,8 @@ install_solc(version="latest") +print('Swapping Solidity wETH Token to Rust DAI Token') + # Set Geth's URL GETH_URL = "http://localhost:8545" @@ -266,8 +268,8 @@ def main(): router = w3.eth.contract(address=router_address, abi=router_abi) # 10000000 * 10**18 = '000000000000000000000000000000000000000000084595161401484a000000' - eth_10000000_hex = "{:064x}".format(10**10) - eth_10000000 = 10**10 #w3.to_wei(10000000, "ether") + eth_10000000_hex = "{:064x}".format(10000000 * 10**18) + eth_10000000 = w3.to_wei(10000000, "ether") # Mint tokens to dev account weth_address = solidity_contracts_address["wETHMock"] @@ -325,8 +327,8 @@ def main(): tx_hash = router.functions.addLiquidity( weth_address, dai_address, - 2 * 10**5, - 50 * 10**5, + 200 * 10**18, + 500000 * 10**18, 0, 0, dev_account_address, @@ -346,7 +348,7 @@ def main(): print("") print("Starting SwapSingleHopExactAmountIn Test...") - weth_amount = 1 * 5**10 + weth_amount = 1 * 10**18 weth_amount_hex = "{:064x}".format(weth_amount) two_weth_amount = 2 * weth_amount two_weth_amount_hex = "{:064x}".format(two_weth_amount) @@ -388,17 +390,17 @@ def main(): # Here is the transaction of swap WETH to DAI just for reference - tx_hash = swap.functions.swapSingleHopExactAmountIn(weth_amount,dai_amount_min).transact( - { - "from": dev_account_address, - "gas": 3000000, - "gasPrice": Web3.to_wei("20", "gwei"), - } - ) - tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) - print("Swapped WETH to DAI: ", tx_receipt["status"] == 1 and "Success" or "Failed") - if RECEIPTS: - print(tx_receipt) + # tx_hash = swap.functions.swapSingleHopExactAmountIn(weth_amount,dai_amount_min).transact( + # { + # "from": dev_account_address, + # "gas": 3000000, + # "gasPrice": Web3.to_wei("20", "gwei"), + # } + # ) + # tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + # print("Swapped WETH to DAI: ", tx_receipt["status"] == 1 and "Success" or "Failed") + # if RECEIPTS: + # print(tx_receipt) if __name__ == "__main__": main() From 08d98cd7e7d0b7de872958d583d568584e5f60a6 Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Tue, 5 Nov 2024 11:28:24 -0600 Subject: [PATCH 33/41] getOutput handles uint8. --- src/solidity.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/solidity.md b/src/solidity.md index f51e188..ccbb924 100644 --- a/src/solidity.md +++ b/src/solidity.md @@ -193,6 +193,9 @@ module SOLIDITY-ULM-SIGNATURE-IMPLEMENTATION rule getOutput(... v(V:MInt{256}, uint256) ... ...) => Int2Bytes(32, MInt2Unsigned(V), BE) + rule getOutput(... + v(V:MInt{8}, uint8) ... + ...) => Int2Bytes(32, MInt2Unsigned(V), BE) rule getOutput(... v(true, bool) ... ...) => Int2Bytes(32, 1, BE) From abb647465d97eac2042724d8aabe5f98afe3cfe5 Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Tue, 5 Nov 2024 11:58:04 -0600 Subject: [PATCH 34/41] decimals implementation: return TypedVal instead of literal --- test/demo-contracts/UniswapV2SwapRenamed.DAI.sol | 3 ++- test/demo-contracts/UniswapV2SwapRenamed.USDC.sol | 3 ++- test/demo-contracts/UniswapV2SwapRenamed.WETH.sol | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/test/demo-contracts/UniswapV2SwapRenamed.DAI.sol b/test/demo-contracts/UniswapV2SwapRenamed.DAI.sol index abc875a..7605879 100644 --- a/test/demo-contracts/UniswapV2SwapRenamed.DAI.sol +++ b/test/demo-contracts/UniswapV2SwapRenamed.DAI.sol @@ -18,7 +18,8 @@ contract dAIMock { event transferEvent(address indexed src, address indexed dst, uint wad); function decimals() external returns (uint8) { - return 18; + uint8 dec = 18; + return dec; } function mint(address usr, uint wad) public { diff --git a/test/demo-contracts/UniswapV2SwapRenamed.USDC.sol b/test/demo-contracts/UniswapV2SwapRenamed.USDC.sol index b9985c0..36108b8 100644 --- a/test/demo-contracts/UniswapV2SwapRenamed.USDC.sol +++ b/test/demo-contracts/UniswapV2SwapRenamed.USDC.sol @@ -17,7 +17,8 @@ contract uSDCMock { event approvalEvent(address indexed owner, address indexed spender, uint256 value); function decimals() external returns (uint8) { - return 18; + uint8 dec = 18; + return dec; } function mint(address account, uint256 value) public { diff --git a/test/demo-contracts/UniswapV2SwapRenamed.WETH.sol b/test/demo-contracts/UniswapV2SwapRenamed.WETH.sol index 31184a0..f078118 100644 --- a/test/demo-contracts/UniswapV2SwapRenamed.WETH.sol +++ b/test/demo-contracts/UniswapV2SwapRenamed.WETH.sol @@ -16,7 +16,8 @@ contract wETHMock { event transferEvent(address indexed from, address indexed to, uint256 value); function decimals() external returns (uint8) { - return 18; + uint8 dec = 18; + return dec; } function deposit() external payable { From adf56fa8633f175d70fe92af5774b776a653d513 Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Wed, 6 Nov 2024 13:15:05 -0600 Subject: [PATCH 35/41] Added equivalent original (non-renamed) versions of Mock tokens. --- test/demo-contracts/DAIMock.sol | 72 ++++++++++++++++++++++ test/demo-contracts/USDCMock.sol | 102 +++++++++++++++++++++++++++++++ test/demo-contracts/WETHMock.sol | 86 ++++++++++++++++++++++++++ 3 files changed, 260 insertions(+) create mode 100644 test/demo-contracts/DAIMock.sol create mode 100644 test/demo-contracts/USDCMock.sol create mode 100644 test/demo-contracts/WETHMock.sol diff --git a/test/demo-contracts/DAIMock.sol b/test/demo-contracts/DAIMock.sol new file mode 100644 index 0000000..963a46b --- /dev/null +++ b/test/demo-contracts/DAIMock.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT + +// The source code of this contract uses the following contracts +// UniswapV2SwapExamples: https://solidity-by-example.org/defi/uniswap-v2/ + +pragma solidity ^0.8.24; + +contract DAIMock { + + uint private UINT_MAX = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; + + uint256 public totalSupply; + + mapping (address => uint) public balanceOf; + mapping (address => mapping (address => uint)) public allowance; + + event Approval(address indexed src, address indexed guy, uint wad); + event Transfer(address indexed src, address indexed dst, uint wad); + + function decimals() external returns (uint8) { + uint8 dec = 18; + return dec; + } + + function mint(address usr, uint wad) public { + balanceOf[usr] = balanceOf[usr] + wad; + totalSupply = totalSupply + wad; + emit Transfer(address(0), usr, wad); + } + + function mintOnDeposit(address usr, uint wad) public { + mint(usr, wad); + } + + function burn(address usr, uint wad) public { + if(balanceOf[usr] >= wad){ + balanceOf[usr] = balanceOf[usr] - wad; + totalSupply = totalSupply - wad; + } + } + + function approve(address usr, uint wad) external returns (bool) { + allowance[msg.sender][usr] = wad; + emit Approval(msg.sender, usr, wad); + return true; + } + + + function transfer(address dst, uint wad) public returns (bool) { + return transferFrom(msg.sender, dst, wad); + } + + function transferFrom(address src, address dst, uint wad) + public returns (bool) + { + require(balanceOf[src] >= wad, "Dai/insufficient-balance"); + if (src != msg.sender && allowance[src][msg.sender] != UINT_MAX) { + require(allowance[src][msg.sender] >= wad, "Dai/insufficient-allowance"); + allowance[src][msg.sender] = allowance[src][msg.sender] - wad; + } + balanceOf[src] = balanceOf[src] - wad; + balanceOf[dst] = balanceOf[dst] + wad; + emit Transfer(src, dst, wad); + return true; + } + + function safeTransferFrom(address from, address to, uint256 value) external{ + transferFrom(from, to, value); + } + + +} diff --git a/test/demo-contracts/USDCMock.sol b/test/demo-contracts/USDCMock.sol new file mode 100644 index 0000000..109b1fe --- /dev/null +++ b/test/demo-contracts/USDCMock.sol @@ -0,0 +1,102 @@ +// SPDX-License-Identifier: MIT + +// The source code of this contract uses the following contracts +// UniswapV2SwapExamples: https://solidity-by-example.org/defi/uniswap-v2/ + +pragma solidity ^0.8.24; + +contract USDCMock { + uint256 private UINT256_MAX = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; + + uint256 private _totalSupply; + + mapping(address account => uint256) private _balances; + mapping(address account => mapping(address spender => uint256)) private _allowances; + + event Transfer(address indexed from, address indexed to, uint256 value); + event Approval(address indexed owner, address indexed spender, uint256 value); + + function decimals() external returns (uint8) { + uint8 dec = 18; + return dec; + } + + function mint(address account, uint256 value) public { + require(account != address(0), "USDC: invalid receiver"); + _update(address(0), account, value); + } + + function balanceOf(address account) public returns (uint256) { + return _balances[account]; + } + + function transfer(address to, uint256 value) public returns (bool) { + address owner = msg.sender; + _transfer(owner, to, value); + return true; + } + + function allowance(address owner, address spender) public returns (uint256) { + return _allowances[owner][spender]; + } + + function approve(address spender, uint256 value) public returns (bool) { + address owner = msg.sender; + _approve(owner, spender, value, true); + return true; + } + + function transferFrom(address from, address to, uint256 value) public returns (bool) { + address spender = msg.sender; + _spendAllowance(from, spender, value); + _transfer(from, to, value); + return true; + } + + function _transfer(address from, address to, uint256 value) private { + require(from != address(0), "USDC: invalid sender"); + require(to != address(0), "USDC: invalid receiver"); + _update(from, to, value); + } + + function _update(address from, address to, uint256 value) private { + if (from == address(0)) { + _totalSupply = _totalSupply + value; + } else { + uint256 fromBalance = _balances[from]; + require(fromBalance >= value, "USDC: insufficient balance"); + _balances[from] = fromBalance - value; + + } + + if (to == address(0)) { + _totalSupply = _totalSupply - value; + + } else { + _balances[to] = _balances[to] + value; + } + + emit Transfer(from, to, value); + } + + + function _approve(address owner, address spender, uint256 value, bool emitEvent) private { + require(owner != address(0), "USDC: invalid approver"); + require(spender != address(0), "USDC: invalid spender"); + _allowances[owner][spender] = value; + if (emitEvent) { + emit Approval(owner, spender, value); + } + } + + function _spendAllowance(address owner, address spender, uint256 value) private { + uint256 currentAllowance = allowance(owner, spender); + if (currentAllowance != UINT256_MAX) { + require(currentAllowance >= value, "USDC: insufficient allowance"); + _approve(owner, spender, currentAllowance - value, false); + + } + } + + +} diff --git a/test/demo-contracts/WETHMock.sol b/test/demo-contracts/WETHMock.sol new file mode 100644 index 0000000..95b3fbf --- /dev/null +++ b/test/demo-contracts/WETHMock.sol @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT + +// The source code of this contract uses the following contracts +// UniswapV2SwapExamples: https://solidity-by-example.org/defi/uniswap-v2/ + +pragma solidity ^0.8.24; + +contract WETHMock { + + uint256 private UINT256_MAX = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; + + mapping (address => uint256) public balanceOf; + mapping (address => mapping (address => uint256)) public allowance; + + event Approval(address indexed owner, address indexed spender, uint256 value); + event Transfer(address indexed from, address indexed to, uint256 value); + + function decimals() external returns (uint8) { + uint8 dec = 18; + return dec; + } + + function deposit() external payable { + balanceOf[msg.sender] = balanceOf[msg.sender] + msg.value; + emit Transfer(address(0), msg.sender, msg.value); + } + + function approve(address spender, uint256 value) external returns (bool) { + allowance[msg.sender][spender] = value; + emit Approval(msg.sender, spender, value); + + return true; + } + + function transfer(address to, uint256 value) external returns (bool) { + if (to != address(0) && to != address(this)) { // Transfer + uint256 balance = balanceOf[msg.sender]; + require(balance >= value, "WETH: transfer amount exceeds balance"); + + balanceOf[msg.sender] = balance - value; + balanceOf[to] = balanceOf[to] + value; + emit Transfer(msg.sender, to, value); + } else { // Withdraw + uint256 balance = balanceOf[msg.sender]; + require(balance >= value, "WETH: burn amount exceeds balance"); + balanceOf[msg.sender] = balance - value; + emit Transfer(msg.sender, address(0), value); + + (bool success, ) = msg.sender.call{value: value}(""); + require(success, "WETH: ETH transfer failed"); + } + + return true; + } + + function transferFrom(address from, address to, uint256 value) external returns (bool) { + if (from != msg.sender) { + uint256 allowed = allowance[from][msg.sender]; + if (allowed != UINT256_MAX) { + require(allowed >= value, "WETH: request exceeds allowance"); + uint256 reduced = allowed - value; + allowance[from][msg.sender] = reduced; + emit Approval(from, msg.sender, reduced); + } + } + + if (to != address(0) && to != address(this)) { + uint256 balance = balanceOf[from]; + require(balance >= value, "WETH: transfer amount exceeds balance"); + + balanceOf[from] = balance - value; + balanceOf[to] = balanceOf[to] + value; + emit Transfer(from, to, value); + } else { + uint256 balance = balanceOf[from]; + require(balance >= value, "WETH: burn amount exceeds balance"); + balanceOf[from] = balance - value; + emit Transfer(from, address(0), value); + + (bool success, ) = msg.sender.call{value: value}(""); + require(success, "WETH: ETH transfer failed"); + } + + return true; + } +} From 07441276fc8bc4d86e56ff300f620c168959c8ed Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Wed, 6 Nov 2024 13:33:56 -0600 Subject: [PATCH 36/41] Modified byol_solidity_py to use non renamed version of USDC mock. --- byol_solidity.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/byol_solidity.py b/byol_solidity.py index 80ef2bc..5ec5c58 100755 --- a/byol_solidity.py +++ b/byol_solidity.py @@ -3,7 +3,7 @@ from web3.middleware import SignAndSendRawMiddlewareBuilder import time -simple_usdc_hex = open('test/demo-contracts/UniswapV2SwapRenamed.USDC.kore.bin').read().rstrip() +simple_usdc_hex = open('test/demo-contracts/USDCMock.kore.bin').read().rstrip() w3 = Web3(Web3.HTTPProvider('http://localhost:8545')) sender = w3.eth.account.create() From 50696eaa4c6d0784b7b0e93d3fee294bf97a176c Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Wed, 6 Nov 2024 15:15:37 -0600 Subject: [PATCH 37/41] Changed script for EVM-Solidity test to use non-renamed contracts. --- WEth_to_DAi_Solidity_Tokens_Swap_script.py | 48 ++--- test/examples/swaps/UniswapV2Swap.sol | 224 ++++++++++----------- 2 files changed, 136 insertions(+), 136 deletions(-) diff --git a/WEth_to_DAi_Solidity_Tokens_Swap_script.py b/WEth_to_DAi_Solidity_Tokens_Swap_script.py index d46ebfa..52c16f5 100644 --- a/WEth_to_DAi_Solidity_Tokens_Swap_script.py +++ b/WEth_to_DAi_Solidity_Tokens_Swap_script.py @@ -43,11 +43,11 @@ def balanceOf(contract_name, token_address, owner_Address): print(f' > Balance of {contract_name}: {int(balance.hex(), 16)}') def deploy_tokens(owner_address): - solidity_usdc_hex = open('test/demo-contracts/UniswapV2SwapRenamed.USDC.kore.bin').read().rstrip() - solidity_dai_hex = open('test/demo-contracts/UniswapV2SwapRenamed.DAI.kore.bin').read().rstrip() - solidity_weth_hex = open('test/demo-contracts/UniswapV2SwapRenamed.WETH.kore.bin').read().rstrip() + solidity_usdc_hex = open('test/demo-contracts/USDCMock.kore.bin').read().rstrip() + solidity_dai_hex = open('test/demo-contracts/DAIMock.kore.bin').read().rstrip() + solidity_weth_hex = open('test/demo-contracts/WETHMock.kore.bin').read().rstrip() - solidity_contracts = {"uSDCMock": solidity_usdc_hex, "dAIMock": solidity_dai_hex, "wETHMock": solidity_weth_hex} + solidity_contracts = {"USDCMock": solidity_usdc_hex, "DAIMock": solidity_dai_hex, "WETHMock": solidity_weth_hex} solidity_contracts_address = {} for sol_contract_name, sol_contract_hex in solidity_contracts.items(): @@ -80,12 +80,12 @@ def deploy_contracts(compiled_sol, contract_ids, solidity_contracts_address): interface = compiled_sol[":" + id] abi, binary = interface["abi"], interface["bin"] Contract = w3.eth.contract(abi=abi, bytecode="6B65766D" + binary) - if id in {"uniswapV2Swap", "uniswapV2Pair"}: + if id in {"UniswapV2Swap", "UniswapV2Pair"}: # We know by now token contracts were already deployed - weth_address = solidity_contracts_address["wETHMock"] - dai_address = solidity_contracts_address["dAIMock"] - usdc_address = solidity_contracts_address["uSDCMock"] - if id == "uniswapV2Swap": + weth_address = solidity_contracts_address["WETHMock"] + dai_address = solidity_contracts_address["DAIMock"] + usdc_address = solidity_contracts_address["USDCMock"] + if id == "UniswapV2Swap": tx_hash = Contract.constructor( weth_address, dai_address, usdc_address ).transact() @@ -97,7 +97,7 @@ def deploy_contracts(compiled_sol, contract_ids, solidity_contracts_address): print( f"Contract {id} deployed with address: {tx_receipt.contractAddress}" ) - elif id == "uniswapV2Pair": + elif id == "UniswapV2Pair": # Deploy (weth, dai) tx_hash = Contract.constructor(weth_address, dai_address).transact() tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) @@ -239,14 +239,14 @@ def main(): print(f"Starting block number: {w3.eth.block_number}") # Compile our Uniswap contract - compiled_sol = compile_contract("test/examples/swaps/UniswapV2SwapRenamed.sol") + compiled_sol = compile_contract("test/examples/swaps/UniswapV2Swap.sol") # List of contracts to deploy (in this order) contract_ids = [ - "uniswapV2Pair", - "uniswapV2Router02", - "uniswapV2Swap", - "uniswapV2SwapTest", + "UniswapV2Pair", + "UniswapV2Router02", + "UniswapV2Swap", + "UniswapV2SwapTest", ] # Deploy tokens @@ -257,11 +257,11 @@ def main(): deployed_contracts = deploy_contracts(compiled_sol, contract_ids, solidity_contracts_address) # Instantiate Uniswap contracts - swap_meta = deployed_contracts["uniswapV2Swap"] + swap_meta = deployed_contracts["UniswapV2Swap"] swap_address, swap_abi = swap_meta["address"], swap_meta["abi"] swap = w3.eth.contract(address=swap_address, abi=swap_abi) - router_abi = deployed_contracts["uniswapV2Router02"]["abi"] + router_abi = deployed_contracts["UniswapV2Router02"]["abi"] router_address = swap.functions.router().call() router = w3.eth.contract(address=router_address, abi=router_abi) @@ -270,9 +270,9 @@ def main(): eth_10000000 = w3.to_wei(10000000, "ether") # Mint tokens to dev account - weth_address = solidity_contracts_address["wETHMock"] - dai_address = solidity_contracts_address["dAIMock"] - usdc_address = solidity_contracts_address["uSDCMock"] + weth_address = solidity_contracts_address["WETHMock"] + dai_address = solidity_contracts_address["DAIMock"] + usdc_address = solidity_contracts_address["USDCMock"] # WETH print("") @@ -352,16 +352,16 @@ def main(): two_weth_amount_hex = "{:064x}".format(two_weth_amount) dai_amount_min = 1 - # Approve WETH transaction to uniswapV2Swap contract + # Approve WETH transaction to UniswapV2Swap contract # approve(swap_address, two_weth_amount_hex) approve("WETH", weth_address, dev_account_address, swap_address, two_weth_amount_hex) - # Approve DAI transaction to uniswapV2Swap contract + # Approve DAI transaction to UniswapV2Swap contract # approve(swap_address, weth_amount_hex) approve("DAI", dai_address, dev_account_address, swap_address, weth_amount_hex) # Get local pair address for WETH-DAI so we can transfer WETH and DAI to it - address_local_pair_weth_dai = router.functions.getLocalPair(weth_address, dai_address).call() + address_local_pair_weth_dai = router.functions.get_local_pair(weth_address, dai_address).call() # WETH transfer to address_local_pair_weth_dai transfer("WETH", weth_address, dev_account_address, "Local Pair WETH-DAI", address_local_pair_weth_dai, two_weth_amount_hex) @@ -370,7 +370,7 @@ def main(): transfer("DAI", dai_address, dev_account_address, "Local Pair WETH-DAI", address_local_pair_weth_dai, weth_amount_hex) # Sync local pair - tx_hash = router.functions.syncLocalPair(weth_address, dai_address).transact( + tx_hash = router.functions.sync_local_pair(weth_address, dai_address).transact( { "from": dev_account_address, "gas": 3000000, diff --git a/test/examples/swaps/UniswapV2Swap.sol b/test/examples/swaps/UniswapV2Swap.sol index 14fccdc..d02ac99 100644 --- a/test/examples/swaps/UniswapV2Swap.sol +++ b/test/examples/swaps/UniswapV2Swap.sol @@ -719,115 +719,115 @@ contract UniswapV2SwapTest { assert(daiAmountOut >= daiAmountMin); } - function testSwapMultiHopExactAmountIn() public { - uint256 wethAmount = 1e18; - - _weth.deposit{value: 4*wethAmount}(); - _weth.approve(address(_uni), 8*wethAmount); - _dai.mint(address(this), 3*wethAmount); - _dai.approve(address(_uni), 3*wethAmount); - _usdc.mint(address(this), 2*wethAmount); - _usdc.approve(address(_uni), 2*wethAmount); - - _weth.transfer(_uni.router().get_local_pair(address(_weth), address(_dai)), wethAmount); - _dai.transfer(_uni.router().get_local_pair(address(_weth), address(_dai)), wethAmount); - - _uni.router().sync_local_pair(address(_weth), address(_dai)); - - uint256 daiAmountMin = 1; - _uni.swapSingleHopExactAmountIn(wethAmount, daiAmountMin); - - uint256 daiAmountIn = 1e18; - - _dai.transfer(_uni.router().get_local_pair(address(_dai), address(_weth)), daiAmountIn); - _weth.transfer(_uni.router().get_local_pair(address(_dai), address(_weth)), daiAmountIn); - _weth.transfer(_uni.router().get_local_pair(address(_weth), address(_usdc)), daiAmountIn); - _usdc.transfer(_uni.router().get_local_pair(address(_weth), address(_usdc)), daiAmountIn); - - _uni.router().sync_local_pair(address(_dai), address(_weth)); - _uni.router().sync_local_pair(address(_weth), address(_usdc)); - - uint256 usdcAmountOutMin = 1; - uint256 usdcAmountOut = - _uni.swapMultiHopExactAmountIn(daiAmountIn, usdcAmountOutMin); - - assert(usdcAmountOut >= usdcAmountOutMin); - } - - function testSwapSingleHopExactAmountOut() public { - uint256 wethAmount = 1e18; - _weth.deposit{value: 10*wethAmount}(); - _weth.approve(address(_uni), 6*wethAmount); - _dai.mint(address(this), 10*wethAmount); - _dai.approve(address(_uni), 4*wethAmount); - - _weth.transfer(_uni.router().get_local_pair(address(_weth), address(_dai)), 4*wethAmount); - _dai.transfer(_uni.router().get_local_pair(address(_weth), address(_dai)), 4*wethAmount); - - _uni.router().sync_local_pair(address(_weth), address(_dai)); - - uint256 daiAmountDesired = 1e18; - uint256 daiAmountOut = - _uni.swapSingleHopExactAmountOut(daiAmountDesired, 2*wethAmount); - - assert(daiAmountOut == daiAmountDesired); - } - - function testSwapMultiHopExactAmountOut() public { - uint256 wethAmount = 1e18; - _weth.deposit{value: 20*wethAmount}(); - _weth.approve(address(_uni), 20*wethAmount); - _dai.mint(address(this), 20*wethAmount); - _dai.approve(address(_uni), 20*wethAmount); - _usdc.mint(address(this), 10*wethAmount); - _usdc.approve(address(_uni), 10*wethAmount); - - _weth.transfer(_uni.router().get_local_pair(address(_weth), address(_dai)), 8*wethAmount); - _dai.transfer(_uni.router().get_local_pair(address(_weth), address(_dai)), 8*wethAmount); - - _uni.router().sync_local_pair(address(_weth), address(_dai)); - - uint256 daiAmountOut = 2 * 1e18; - _uni.swapSingleHopExactAmountOut(daiAmountOut, 4*wethAmount); - - _dai.transfer(_uni.router().get_local_pair(address(_dai), address(_weth)), 2*daiAmountOut); - _weth.transfer(_uni.router().get_local_pair(address(_dai), address(_weth)), 2*daiAmountOut); - _weth.transfer(_uni.router().get_local_pair(address(_weth), address(_usdc)), 2*daiAmountOut); - _usdc.transfer(_uni.router().get_local_pair(address(_weth), address(_usdc)), 2*daiAmountOut); - _uni.router().sync_local_pair(address(_dai), address(_weth)); - _uni.router().sync_local_pair(address(_weth), address(_usdc)); - - uint256 amountOutDesired = 1e6; - uint256 amountOut = - _uni.swapMultiHopExactAmountOut(amountOutDesired, daiAmountOut); - - assert(amountOut == amountOutDesired); - } - - function testRouterAddLiquidity() public { - uint256 testAmount = 131072; // Hex: 0x20000 - uint desiredA = 10000; - uint desiredB = 10000; - uint minA = 0; - uint minB = 0; - - _router = new UniswapV2Router02(); - - _router.set_local_pair(address(_weth), address(_dai)); - _router.set_local_pair(address(_weth), address(_usdc)); - _router.set_local_pair(address(_usdc), address(_dai)); - - _dai.mint(address(this), testAmount); - _dai.approve(address(_router), testAmount); - _usdc.mint(address(this), testAmount); - _usdc.approve(address(_router), testAmount); - - _router.addLiquidity(address(_dai), address(_usdc), desiredA, desiredB, minA, minB, address(this)); - - assert(_dai.balanceOf(address(this)) == 121072); - assert(_usdc.balanceOf(address(this)) == 121072); - assert(_dai.balanceOf(_router.get_local_pair(address(_dai), address(_usdc))) == 10000); - assert(_usdc.balanceOf(_router.get_local_pair(address(_dai), address(_usdc))) == 10000); - assert(UniswapV2Pair(_router.get_local_pair(address(_dai), address(_usdc))).balanceOf(address(this)) == 9000); - } -} \ No newline at end of file +// function testSwapMultiHopExactAmountIn() public { +// uint256 wethAmount = 1e18; +// +// _weth.deposit{value: 4*wethAmount}(); +// _weth.approve(address(_uni), 8*wethAmount); +// _dai.mint(address(this), 3*wethAmount); +// _dai.approve(address(_uni), 3*wethAmount); +// _usdc.mint(address(this), 2*wethAmount); +// _usdc.approve(address(_uni), 2*wethAmount); +// +// _weth.transfer(_uni.router().get_local_pair(address(_weth), address(_dai)), wethAmount); +// _dai.transfer(_uni.router().get_local_pair(address(_weth), address(_dai)), wethAmount); +// +// _uni.router().sync_local_pair(address(_weth), address(_dai)); +// +// uint256 daiAmountMin = 1; +// _uni.swapSingleHopExactAmountIn(wethAmount, daiAmountMin); +// +// uint256 daiAmountIn = 1e18; +// +// _dai.transfer(_uni.router().get_local_pair(address(_dai), address(_weth)), daiAmountIn); +// _weth.transfer(_uni.router().get_local_pair(address(_dai), address(_weth)), daiAmountIn); +// _weth.transfer(_uni.router().get_local_pair(address(_weth), address(_usdc)), daiAmountIn); +// _usdc.transfer(_uni.router().get_local_pair(address(_weth), address(_usdc)), daiAmountIn); +// +// _uni.router().sync_local_pair(address(_dai), address(_weth)); +// _uni.router().sync_local_pair(address(_weth), address(_usdc)); +// +// uint256 usdcAmountOutMin = 1; +// uint256 usdcAmountOut = +// _uni.swapMultiHopExactAmountIn(daiAmountIn, usdcAmountOutMin); +// +// assert(usdcAmountOut >= usdcAmountOutMin); +// } +// +// function testSwapSingleHopExactAmountOut() public { +// uint256 wethAmount = 1e18; +// _weth.deposit{value: 10*wethAmount}(); +// _weth.approve(address(_uni), 6*wethAmount); +// _dai.mint(address(this), 10*wethAmount); +// _dai.approve(address(_uni), 4*wethAmount); +// +// _weth.transfer(_uni.router().get_local_pair(address(_weth), address(_dai)), 4*wethAmount); +// _dai.transfer(_uni.router().get_local_pair(address(_weth), address(_dai)), 4*wethAmount); +// +// _uni.router().sync_local_pair(address(_weth), address(_dai)); +// +// uint256 daiAmountDesired = 1e18; +// uint256 daiAmountOut = +// _uni.swapSingleHopExactAmountOut(daiAmountDesired, 2*wethAmount); +// +// assert(daiAmountOut == daiAmountDesired); +// } +// +// function testSwapMultiHopExactAmountOut() public { +// uint256 wethAmount = 1e18; +// _weth.deposit{value: 20*wethAmount}(); +// _weth.approve(address(_uni), 20*wethAmount); +// _dai.mint(address(this), 20*wethAmount); +// _dai.approve(address(_uni), 20*wethAmount); +// _usdc.mint(address(this), 10*wethAmount); +// _usdc.approve(address(_uni), 10*wethAmount); +// +// _weth.transfer(_uni.router().get_local_pair(address(_weth), address(_dai)), 8*wethAmount); +// _dai.transfer(_uni.router().get_local_pair(address(_weth), address(_dai)), 8*wethAmount); +// +// _uni.router().sync_local_pair(address(_weth), address(_dai)); +// +// uint256 daiAmountOut = 2 * 1e18; +// _uni.swapSingleHopExactAmountOut(daiAmountOut, 4*wethAmount); +// +// _dai.transfer(_uni.router().get_local_pair(address(_dai), address(_weth)), 2*daiAmountOut); +// _weth.transfer(_uni.router().get_local_pair(address(_dai), address(_weth)), 2*daiAmountOut); +// _weth.transfer(_uni.router().get_local_pair(address(_weth), address(_usdc)), 2*daiAmountOut); +// _usdc.transfer(_uni.router().get_local_pair(address(_weth), address(_usdc)), 2*daiAmountOut); +// _uni.router().sync_local_pair(address(_dai), address(_weth)); +// _uni.router().sync_local_pair(address(_weth), address(_usdc)); +// +// uint256 amountOutDesired = 1e6; +// uint256 amountOut = +// _uni.swapMultiHopExactAmountOut(amountOutDesired, daiAmountOut); +// +// assert(amountOut == amountOutDesired); +// } +// +// function testRouterAddLiquidity() public { +// uint256 testAmount = 131072; // Hex: 0x20000 +// uint desiredA = 10000; +// uint desiredB = 10000; +// uint minA = 0; +// uint minB = 0; +// +// _router = new UniswapV2Router02(); +// +// _router.set_local_pair(address(_weth), address(_dai)); +// _router.set_local_pair(address(_weth), address(_usdc)); +// _router.set_local_pair(address(_usdc), address(_dai)); +// +// _dai.mint(address(this), testAmount); +// _dai.approve(address(_router), testAmount); +// _usdc.mint(address(this), testAmount); +// _usdc.approve(address(_router), testAmount); +// +// _router.addLiquidity(address(_dai), address(_usdc), desiredA, desiredB, minA, minB, address(this)); +// +// assert(_dai.balanceOf(address(this)) == 121072); +// assert(_usdc.balanceOf(address(this)) == 121072); +// assert(_dai.balanceOf(_router.get_local_pair(address(_dai), address(_usdc))) == 10000); +// assert(_usdc.balanceOf(_router.get_local_pair(address(_dai), address(_usdc))) == 10000); +// assert(UniswapV2Pair(_router.get_local_pair(address(_dai), address(_usdc))).balanceOf(address(this)) == 9000); +// } +} From 0514c975fed8b32ff5403199c2281c2c6420301d Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Thu, 7 Nov 2024 15:11:46 -0600 Subject: [PATCH 38/41] String encoding for ULM return (#65) * String encoding & test. * Updated contracts: added name and symbol functions. * Renamed according to review comments. * Added comment. * updated WETHMock token's name function --------- Co-authored-by: Theodoros Kasampalis --- byol_solidity.py | 64 +++++++++++++++++++ src/solidity.md | 4 ++ test/demo-contracts/DAIMock.sol | 8 +++ test/demo-contracts/USDCMock.sol | 8 +++ .../UniswapV2SwapRenamed.DAI.sol | 8 +++ .../UniswapV2SwapRenamed.USDC.sol | 8 +++ .../UniswapV2SwapRenamed.WETH.sol | 8 +++ test/demo-contracts/WETHMock.sol | 8 +++ 8 files changed, 116 insertions(+) diff --git a/byol_solidity.py b/byol_solidity.py index 5ec5c58..aeed9f3 100755 --- a/byol_solidity.py +++ b/byol_solidity.py @@ -26,6 +26,9 @@ 'maxPriorityFeePerGas': 1000000000, } +# deploy USDC +print("Deploying USDC...") + tx_hash = w3.eth.send_transaction(deploy_usdc_tx) print(tx_hash) receipt = w3.eth.wait_for_transaction_receipt(tx_hash) @@ -44,10 +47,14 @@ 'maxPriorityFeePerGas': 1000000000, } +# mint USDC +print("Minting USDC...") + tx_hash = w3.eth.send_transaction(mint_usdc_tx) print(tx_hash) receipt = w3.eth.wait_for_transaction_receipt(tx_hash) print(receipt) +print("USDC Address:", usdc_address) balanceOf_usdc_data = '70a08231000000000000000000000000' + sender.address[2:] @@ -61,6 +68,9 @@ 'maxPriorityFeePerGas': 1000000000, } +# balanceOf USDC +print("balanceOf USDC...") + balance = w3.eth.call(balanceOf_usdc_tx) print(balance) @@ -76,11 +86,17 @@ 'maxPriorityFeePerGas': 1000000000, } +# transfer USDC +print("transfer USDC...") + tx_hash = w3.eth.send_transaction(transfer_usdc_tx) print(tx_hash) receipt = w3.eth.wait_for_transaction_receipt(tx_hash) print(receipt) +# balanceOf USDC +print("balanceOf USDC...") + balance = w3.eth.call(balanceOf_usdc_tx) print(balance) @@ -89,3 +105,51 @@ balance = w3.eth.call(balanceOf_usdc_tx) print(balance) + +# decimals USDC +decimals_usdc_data = '313ce567' +decimals_usdc_tx = { + 'from': sender.address, + 'data': decimals_usdc_data, + 'to': usdc_address, + 'value': 0, + 'gas': 11000000, + 'maxFeePerGas': 2000000000, + 'maxPriorityFeePerGas': 1000000000, +} + +decimals = w3.eth.call(decimals_usdc_tx) +print("Decimals:", int(decimals.hex(), 16)) + +# name +name_usdc_data = '06fdde03' +name_usdc_tx = { + 'from': sender.address, + 'data': name_usdc_data, + 'to': usdc_address, + 'value': 0, + 'gas': 11000000, + 'maxFeePerGas': 2000000000, + 'maxPriorityFeePerGas': 1000000000, +} + +name = w3.eth.call(name_usdc_tx) +name = w3.to_text(name) +print("Name:", name) + +# symbol +symbol_usdc_data = '95d89b41' +symbol_usdc_tx = { + 'from': sender.address, + 'data': symbol_usdc_data, + 'to': usdc_address, + 'value': 0, + 'gas': 11000000, + 'maxFeePerGas': 2000000000, + 'maxPriorityFeePerGas': 1000000000, +} + +symbol = w3.eth.call(symbol_usdc_tx) +symbol = w3.to_text(symbol) +print("Symbol:", symbol) + diff --git a/src/solidity.md b/src/solidity.md index ccbb924..6c3dd9e 100644 --- a/src/solidity.md +++ b/src/solidity.md @@ -202,6 +202,10 @@ module SOLIDITY-ULM-SIGNATURE-IMPLEMENTATION rule getOutput(... v(false, bool) ... ...) => Int2Bytes(32, 0, BE) + // This rule handles only the case where the return type is exactly one string. + rule getOutput(... + S:String ... + ...) => Int2Bytes(32, 32, BE) +Bytes Int2Bytes(32, lengthString(S), BE) +Bytes padRightBytes(String2Bytes(S), 32, 0) // TODO: All strings in the EVM ABI must be UTF-8 encoded to bytes // getGasLeft returns the amount of gas left by reading it from the cell . // The semantics currently initialize the gas by reading the appropriate ULM diff --git a/test/demo-contracts/DAIMock.sol b/test/demo-contracts/DAIMock.sol index 963a46b..9c436e8 100644 --- a/test/demo-contracts/DAIMock.sol +++ b/test/demo-contracts/DAIMock.sol @@ -22,6 +22,14 @@ contract DAIMock { return dec; } + function name() public returns (string memory) { + return "Dai Stablecoin"; + } + + function symbol() public returns (string memory) { + return "DAI"; + } + function mint(address usr, uint wad) public { balanceOf[usr] = balanceOf[usr] + wad; totalSupply = totalSupply + wad; diff --git a/test/demo-contracts/USDCMock.sol b/test/demo-contracts/USDCMock.sol index 109b1fe..ed9d9cf 100644 --- a/test/demo-contracts/USDCMock.sol +++ b/test/demo-contracts/USDCMock.sol @@ -21,6 +21,14 @@ contract USDCMock { return dec; } + function name() public returns (string memory) { + return "USD Coin"; + } + + function symbol() public returns (string memory) { + return "USDC"; + } + function mint(address account, uint256 value) public { require(account != address(0), "USDC: invalid receiver"); _update(address(0), account, value); diff --git a/test/demo-contracts/UniswapV2SwapRenamed.DAI.sol b/test/demo-contracts/UniswapV2SwapRenamed.DAI.sol index 7605879..15fd0da 100644 --- a/test/demo-contracts/UniswapV2SwapRenamed.DAI.sol +++ b/test/demo-contracts/UniswapV2SwapRenamed.DAI.sol @@ -22,6 +22,14 @@ contract dAIMock { return dec; } + function name() public returns (string memory) { + return "Dai Stablecoin"; + } + + function symbol() public returns (string memory) { + return "DAI"; + } + function mint(address usr, uint wad) public { balanceOf[usr] = balanceOf[usr] + wad; totalSupply = totalSupply + wad; diff --git a/test/demo-contracts/UniswapV2SwapRenamed.USDC.sol b/test/demo-contracts/UniswapV2SwapRenamed.USDC.sol index 36108b8..873375e 100644 --- a/test/demo-contracts/UniswapV2SwapRenamed.USDC.sol +++ b/test/demo-contracts/UniswapV2SwapRenamed.USDC.sol @@ -21,6 +21,14 @@ contract uSDCMock { return dec; } + function name() public returns (string memory) { + return "USD Coin"; + } + + function symbol() public returns (string memory) { + return "USDC"; + } + function mint(address account, uint256 value) public { require(account != address(0), "USDC: invalid receiver"); fidUpdate(address(0), account, value); diff --git a/test/demo-contracts/UniswapV2SwapRenamed.WETH.sol b/test/demo-contracts/UniswapV2SwapRenamed.WETH.sol index f078118..e4306bf 100644 --- a/test/demo-contracts/UniswapV2SwapRenamed.WETH.sol +++ b/test/demo-contracts/UniswapV2SwapRenamed.WETH.sol @@ -20,6 +20,14 @@ contract wETHMock { return dec; } + function name() public returns (string memory) { + return "Wrapped Ethereum"; + } + + function symbol() public returns (string memory) { + return "WETH"; + } + function deposit() external payable { balanceOf[msg.sender] = balanceOf[msg.sender] + msg.value; emit transferEvent(address(0), msg.sender, msg.value); diff --git a/test/demo-contracts/WETHMock.sol b/test/demo-contracts/WETHMock.sol index 95b3fbf..953e0ea 100644 --- a/test/demo-contracts/WETHMock.sol +++ b/test/demo-contracts/WETHMock.sol @@ -20,6 +20,14 @@ contract WETHMock { return dec; } + function name() public returns (string memory) { + return "Wrapped Ethereum"; + } + + function symbol() public returns (string memory) { + return "WETH"; + } + function deposit() external payable { balanceOf[msg.sender] = balanceOf[msg.sender] + msg.value; emit Transfer(address(0), msg.sender, msg.value); From 250f96914aea0ad8471022660f50e82de48019a9 Mon Sep 17 00:00:00 2001 From: Musab Alturki <42160792+malturki@users.noreply.github.com> Date: Thu, 7 Nov 2024 16:44:27 -0600 Subject: [PATCH 39/41] Fix swap call (#66) * Replace Swap call with transact * Add an EVM-only script * Re-added call to get transaction result, and wait for transaction. --------- Co-authored-by: Maria Kotsifakou --- ...Solidity_to_DAi_Rust_Tokens_Swap_script.py | 9 +- WEth_to_DAi_EVM_Tokens_Swap_script.py | 472 ++++++++++++++++++ WEth_to_DAi_Solidity_Tokens_Swap_script.py | 9 +- 3 files changed, 486 insertions(+), 4 deletions(-) create mode 100644 WEth_to_DAi_EVM_Tokens_Swap_script.py diff --git a/WEth_Solidity_to_DAi_Rust_Tokens_Swap_script.py b/WEth_Solidity_to_DAi_Rust_Tokens_Swap_script.py index c2afa64..50717c1 100644 --- a/WEth_Solidity_to_DAi_Rust_Tokens_Swap_script.py +++ b/WEth_Solidity_to_DAi_Rust_Tokens_Swap_script.py @@ -347,7 +347,7 @@ def main(): ######################################### SwapSingleHopExactAmountIn Test ########################################## print("") print("Starting SwapSingleHopExactAmountIn Test...") - + weth_amount = 1 * 10**18 weth_amount_hex = "{:064x}".format(weth_amount) two_weth_amount = 2 * weth_amount @@ -383,10 +383,15 @@ def main(): print("Synced WETH-DAI pair: ", tx_receipt["status"] == 1 and "Success" or "Failed") if RECEIPTS: print(tx_receipt) - + # Swap WETH to DAI daiAmountOut = swap.functions.swapSingleHopExactAmountIn(weth_amount,dai_amount_min).call() + + tx_hash = swap.functions.swapSingleHopExactAmountIn(weth_amount,dai_amount_min).transact({'from': dev_account_address}) + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) print(f'Sucessfully swapped {weth_amount} WETH to DAI: {daiAmountOut}') + if RECEIPTS: + print(tx_receipt) # Here is the transaction of swap WETH to DAI just for reference diff --git a/WEth_to_DAi_EVM_Tokens_Swap_script.py b/WEth_to_DAi_EVM_Tokens_Swap_script.py new file mode 100644 index 0000000..5cbdd91 --- /dev/null +++ b/WEth_to_DAi_EVM_Tokens_Swap_script.py @@ -0,0 +1,472 @@ +import json +from web3 import Web3 +from web3.exceptions import ContractLogicError +from solcx import install_solc, compile_source + +install_solc(version="latest") + +# Set Geth's URL +GETH_URL = "http://localhost:8545" + +w3 = Web3(Web3.HTTPProvider(GETH_URL)) +dev_account_address = w3.eth.accounts[0] +w3.eth.default_account = dev_account_address +print(f"Dev account address: {dev_account_address}") + +BALANCES = True +RECEIPTS = False + + +def compile_contract(filename): + with open(filename, "r") as file: + contract_source = file.read().strip() + compiled_sol = compile_source( + contract_source, output_values=["abi", "bin"], optimize=True + ) + print(f"Compilation units: {len(compiled_sol)}") + print("") + return compiled_sol + + +def balanceOf(contract_name, token_address, owner_Address): + balanceOf_data = "70a08231000000000000000000000000" + owner_Address[2:] + + balanceOf_tx = { + "from": owner_Address, + "data": balanceOf_data, + "to": token_address, + "value": 0, + "gas": 11000000, + "maxFeePerGas": 2000000000, + "maxPriorityFeePerGas": 1000000000, + } + + balance = w3.eth.call(balanceOf_tx) + print(f" > Balance of {contract_name}: {int(balance.hex(), 16)}") + + +def deploy_evm_tokens(owner_address): + token_contract_ids = [ + "USDCMock", + "DAIMock", + "WETHMock", + ] + evm_contracts = {} + for id in token_contract_ids: + compiled_contract = compile_contract("test/demo-contracts/" + id + ".sol") + interface = compiled_contract[":" + id] + evm_contracts[id] = "kevm".encode("utf-8").hex() + interface["bin"] + + evm_contracts_address = {} + + for evm_contract_name, evm_contract_hex in evm_contracts.items(): + deploy_evm_tx = { + "from": owner_address, + "data": evm_contract_hex, + "to": "", + "value": 0, + "gas": 11000000, + "maxFeePerGas": 2000000000, + "maxPriorityFeePerGas": 1000000000, + } + + tx_hash = w3.eth.send_transaction(deploy_evm_tx) + receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + evm_contracts_address[evm_contract_name] = receipt["contractAddress"] + print( + f"Contract {evm_contract_name} deployed with address: {evm_contracts_address[evm_contract_name]}" + ) + + if RECEIPTS: + print(receipt) + + if BALANCES: + balanceOf( + evm_contract_name, + evm_contracts_address[evm_contract_name], + owner_address, + ) + + return evm_contracts_address + + +def deploy_contracts(compiled_sol, contract_ids, solidity_contracts_address): + deployed_contracts = {} + for id in contract_ids: + interface = compiled_sol[":" + id] + abi, binary = interface["abi"], interface["bin"] + Contract = w3.eth.contract(abi=abi, bytecode="6B65766D" + binary) + if id in {"UniswapV2Swap", "UniswapV2Pair"}: + # We know by now token contracts were already deployed + weth_address = solidity_contracts_address["WETHMock"] + dai_address = solidity_contracts_address["DAIMock"] + usdc_address = solidity_contracts_address["USDCMock"] + if id == "UniswapV2Swap": + tx_hash = Contract.constructor( + weth_address, dai_address, usdc_address + ).transact() + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + deployed_contracts[id] = { + "address": tx_receipt.contractAddress, + "abi": abi, + } + print( + f"Contract {id} deployed with address: {tx_receipt.contractAddress}" + ) + elif id == "UniswapV2Pair": + # Deploy (weth, dai) + tx_hash = Contract.constructor(weth_address, dai_address).transact() + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + deployed_contracts[id + ":WETH-DAI"] = { + "address": tx_receipt.contractAddress, + "abi": abi, + } + print( + f"Contract {id}:WETH-DAI deployed with address: {tx_receipt.contractAddress}" + ) + + # Deploy (weth, usdc) + tx_hash = Contract.constructor(weth_address, usdc_address).transact() + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + deployed_contracts[id + ":WETH-USDC"] = { + "address": tx_receipt.contractAddress, + "abi": abi, + } + print( + f"Contract {id}:WETH-USDC deployed with address: {tx_receipt.contractAddress}" + ) + + # Deploy (usdc, dai) + tx_hash = Contract.constructor(usdc_address, dai_address).transact() + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + deployed_contracts[id + ":USDC-DAI"] = { + "address": tx_receipt.contractAddress, + "abi": abi, + } + print( + f"Contract {id}:USDC-DAI deployed with address: {tx_receipt.contractAddress}" + ) + else: + # Token, router or test contracts + tx_hash = Contract.constructor().transact() + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + deployed_contracts[id] = {"address": tx_receipt.contractAddress, "abi": abi} + print(f"Contract {id} deployed with address: {tx_receipt.contractAddress}") + + return deployed_contracts + + +def deposit_weth(owner_Address, weth_address, amount): + deposit_weth_data = "d0e30db0" + deposit_weth_tx = { + "chainId": w3.eth.chain_id, + "from": owner_Address, + "data": deposit_weth_data, + "to": weth_address, + "value": amount, + "gas": 200000, + "gasPrice": w3.to_wei(20, "gwei"), + "nonce": w3.eth.get_transaction_count(dev_account_address), + } + tx_hash = w3.eth.send_transaction(deposit_weth_tx) + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + print("Deposited WETH:", tx_receipt["status"] == 1 and "Success" or "Failed") + + if RECEIPTS: + print(tx_receipt) + + if BALANCES: + balanceOf("WETH", weth_address, dev_account_address) + + +def mint_token(token_name, token_address, owner_Address, amount): + token_mint_data = "40c10f19000000000000000000000000" + owner_Address[2:] + amount + mint_token_tx = { + "from": owner_Address, + "data": token_mint_data, + "to": token_address, + "value": 0, + "gas": 11000000, + "maxFeePerGas": 2000000000, + "maxPriorityFeePerGas": 1000000000, + } + + tx_hash = w3.eth.send_transaction(mint_token_tx) + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + print( + "Minted " + token_name + ":", + tx_receipt["status"] == 1 and "Success" or "Failed", + ) + + if RECEIPTS: + print(tx_receipt) + + if BALANCES: + balanceOf(token_name, token_address, owner_Address) + + +def approve(token_name, token_address, owner_address, spender_address, amount): + token_approve_data = ( + "095ea7b3000000000000000000000000" + spender_address[2:] + amount + ) + token_approve_tx = { + "from": owner_address, + "data": token_approve_data, + "to": token_address, + "value": 0, + "gas": 11000000, + "maxFeePerGas": 2000000000, + "maxPriorityFeePerGas": 1000000000, + } + + tx_hash = w3.eth.send_transaction(token_approve_tx) + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + print( + "Approved " + token_name + ":", + tx_receipt["status"] == 1 and "Success" or "Failed", + ) + if RECEIPTS: + print(tx_receipt) + + +def allowance(token_name, token_address, owner_address, spender_address): + token_allowance_data = ( + "dd62ed3e000000000000000000000000" + + owner_address[2:] + + "000000000000000000000000" + + spender_address[2:] + ) + token_allowance_tx = { + "from": owner_address, + "data": token_allowance_data, + "to": token_address, + "value": 0, + "gas": 11000000, + "maxFeePerGas": 2000000000, + "maxPriorityFeePerGas": 1000000000, + } + + allowance = w3.eth.call(token_allowance_tx) + print(f" > Allowance of {token_name}: {int(allowance.hex(), 16)}") + + +def transfer(token_name, token_address, owner_address, to_name, to_address, amount): + token_transfer_data = "a9059cbb000000000000000000000000" + to_address[2:] + amount + token_transfer_tx = { + "from": owner_address, + "data": token_transfer_data, + "to": token_address, + "value": 0, + "gas": 11000000, + "maxFeePerGas": 2000000000, + "maxPriorityFeePerGas": 1000000000, + } + tx_hash = w3.eth.send_transaction(token_transfer_tx) + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + print( + "Transferred", + token_name, + "to", + to_name + ":", + tx_receipt["status"] == 1 and "Success" or "Failed", + ) + if RECEIPTS: + print(tx_receipt) + + +def main(): + print(f"Starting block number: {w3.eth.block_number}") + + # Compile and deploy tokens + evm_contracts_address = deploy_evm_tokens(dev_account_address) + + # Compile our Uniswap contract + compiled_sol = compile_contract("test/examples/swaps/UniswapV2Swap.sol") + + # List of contracts to deploy (in this order) + contract_ids = [ + "UniswapV2Pair", + "UniswapV2Router02", + "UniswapV2Swap", + "UniswapV2SwapTest", + ] + + # Deploy contracts + print("") + deployed_contracts = deploy_contracts( + compiled_sol, contract_ids, evm_contracts_address + ) + + # Instantiate Uniswap contracts + swap_meta = deployed_contracts["UniswapV2Swap"] + swap_address, swap_abi = swap_meta["address"], swap_meta["abi"] + swap = w3.eth.contract(address=swap_address, abi=swap_abi) + + router_abi = deployed_contracts["UniswapV2Router02"]["abi"] + router_address = swap.functions.router().call() + router = w3.eth.contract(address=router_address, abi=router_abi) + + # 10000000 * 10**18 = '000000000000000000000000000000000000000000084595161401484a000000' + eth_10000000_hex = "{:064x}".format(10000000 * 10**18) + eth_10000000 = w3.to_wei(10000000, "ether") + + # Mint tokens to dev account + weth_address = evm_contracts_address["WETHMock"] + dai_address = evm_contracts_address["DAIMock"] + usdc_address = evm_contracts_address["USDCMock"] + + # WETH + print("") + print("WETH") + + # Mint WETH (Deposit, as WETH doesn't have mint function) + deposit_weth(dev_account_address, weth_address, eth_10000000) + + # approve(router_address, 10000000 * 10**18) + approve("WETH", weth_address, dev_account_address, router_address, eth_10000000_hex) + + # call allowance + allowance("WETH", weth_address, dev_account_address, router_address) + + # USDC + print("") + print("USDC") + + # Mint USDC + # mint(dev_account_address, 10000000 * 10**18) + mint_token("USDC", usdc_address, dev_account_address, eth_10000000_hex) + + # Approve USDC mint transaction + # approve(router_address, 10000000 * 10**18) + approve("USDC", usdc_address, dev_account_address, router_address, eth_10000000_hex) + + # call allowance + allowance("USDC", usdc_address, dev_account_address, router_address) + + # DAI + print("") + print("DAI") + + # Mint DAI + # mint(dev_account_address, 10000000 * 10**18) + mint_token("DAI", dai_address, dev_account_address, eth_10000000_hex) + + # Approve DAI mint transaction + # approve(router_address, 10000000 * 10**18) + approve("DAI", dai_address, dev_account_address, router_address, eth_10000000_hex) + + # call allowance + allowance("DAI", dai_address, dev_account_address, router_address) + + print("") + print("TESTS") + + # Add liquidity to (WETH, DAI) + tx_hash = router.functions.addLiquidity( + weth_address, + dai_address, + 200 * 10**18, + 500000 * 10**18, + 0, + 0, + dev_account_address, + ).transact( + { + "from": dev_account_address, + "gas": 3000000, + "gasPrice": Web3.to_wei("20", "gwei"), + } + ) + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + print( + "Added liquidity to WETH-DAI: ", + tx_receipt["status"] == 1 and "Success" or "Failed", + ) + if RECEIPTS: + print(tx_receipt) + + ######################################### SwapSingleHopExactAmountIn Test ########################################## + print("") + print("Starting SwapSingleHopExactAmountIn Test...") + + weth_amount = 1 * 10**18 + weth_amount_hex = "{:064x}".format(weth_amount) + two_weth_amount = 2 * weth_amount + two_weth_amount_hex = "{:064x}".format(two_weth_amount) + dai_amount_min = 1 + + # Approve WETH transaction to UniswapV2Swap contract + # approve(swap_address, two_weth_amount_hex) + approve( + "WETH", weth_address, dev_account_address, swap_address, two_weth_amount_hex + ) + + # Approve DAI transaction to UniswapV2Swap contract + # approve(swap_address, weth_amount_hex) + approve("DAI", dai_address, dev_account_address, swap_address, weth_amount_hex) + + # Get local pair address for WETH-DAI so we can transfer WETH and DAI to it + address_local_pair_weth_dai = router.functions.get_local_pair( + weth_address, dai_address + ).call() + + # WETH transfer to address_local_pair_weth_dai + transfer( + "WETH", + weth_address, + dev_account_address, + "Local Pair WETH-DAI", + address_local_pair_weth_dai, + two_weth_amount_hex, + ) + + # DAI transfer to address_local_pair_weth_dai + transfer( + "DAI", + dai_address, + dev_account_address, + "Local Pair WETH-DAI", + address_local_pair_weth_dai, + weth_amount_hex, + ) + + # Sync local pair + tx_hash = router.functions.sync_local_pair(weth_address, dai_address).transact( + { + "from": dev_account_address, + "gas": 3000000, + "gasPrice": Web3.to_wei("20", "gwei"), + } + ) + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + print("Synced WETH-DAI pair: ", tx_receipt["status"] == 1 and "Success" or "Failed") + if RECEIPTS: + print(tx_receipt) + + # Swap WETH to DAI + daiAmountOut = swap.functions.swapSingleHopExactAmountIn(weth_amount,dai_amount_min).call() + + tx_hash = swap.functions.swapSingleHopExactAmountIn( + weth_amount, dai_amount_min + ).transact({'from': dev_account_address}) + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + print(f"Sucessfully swapped {weth_amount} WETH to DAI: {daiAmountOut}") + if RECEIPTS: + print(tx_receipt) + + # Here is the transaction of swap WETH to DAI just for reference + # tx_hash = swap.functions.swapSingleHopExactAmountIn(weth_amount,dai_amount_min).transact( + # { + # "from": dev_account_address, + # "gas": 3000000, + # "gasPrice": Web3.to_wei("20", "gwei"), + # } + # ) + # tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + # print("Swapped WETH to DAI: ", tx_receipt["status"] == 1 and "Success" or "Failed") + # if RECEIPTS: + # print(tx_receipt) + + +if __name__ == "__main__": + main() diff --git a/WEth_to_DAi_Solidity_Tokens_Swap_script.py b/WEth_to_DAi_Solidity_Tokens_Swap_script.py index 52c16f5..54967cf 100644 --- a/WEth_to_DAi_Solidity_Tokens_Swap_script.py +++ b/WEth_to_DAi_Solidity_Tokens_Swap_script.py @@ -345,7 +345,7 @@ def main(): ######################################### SwapSingleHopExactAmountIn Test ########################################## print("") print("Starting SwapSingleHopExactAmountIn Test...") - + weth_amount = 1 * 10**18 weth_amount_hex = "{:064x}".format(weth_amount) two_weth_amount = 2 * weth_amount @@ -381,10 +381,15 @@ def main(): print("Synced WETH-DAI pair: ", tx_receipt["status"] == 1 and "Success" or "Failed") if RECEIPTS: print(tx_receipt) - + # Swap WETH to DAI daiAmountOut = swap.functions.swapSingleHopExactAmountIn(weth_amount,dai_amount_min).call() + + tx_hash = swap.functions.swapSingleHopExactAmountIn(weth_amount,dai_amount_min).transact({'from': dev_account_address}) + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) print(f'Sucessfully swapped {weth_amount} WETH to DAI: {daiAmountOut}') + if RECEIPTS: + print(tx_receipt) # Here is the transaction of swap WETH to DAI just for reference From 30f4fc613f62aeac847d6b5537571ea2006eafe7 Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Fri, 8 Nov 2024 17:16:52 -0600 Subject: [PATCH 40/41] Changed path to bytes of DAIMock.rs. (#67) --- WEth_Solidity_to_DAi_Rust_Tokens_Swap_script.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WEth_Solidity_to_DAi_Rust_Tokens_Swap_script.py b/WEth_Solidity_to_DAi_Rust_Tokens_Swap_script.py index 50717c1..da7d379 100644 --- a/WEth_Solidity_to_DAi_Rust_Tokens_Swap_script.py +++ b/WEth_Solidity_to_DAi_Rust_Tokens_Swap_script.py @@ -46,7 +46,7 @@ def balanceOf(contract_name, token_address, owner_Address): def deploy_tokens(owner_address): solidity_usdc_hex = open('test/demo-contracts/UniswapV2SwapRenamed.USDC.kore.bin').read().rstrip() - solidity_dai_hex = open('/home/robertorosmaninho/pi2-inc/rust-demo-semantics/.build/erc20/rust-token.bin').read().rstrip() + solidity_dai_hex = open('../rust-ulm/tests/ulm-contracts/DAIMock.kore.bin').read().rstrip() solidity_weth_hex = open('test/demo-contracts/UniswapV2SwapRenamed.WETH.kore.bin').read().rstrip() solidity_contracts = {"uSDCMock": solidity_usdc_hex, "dAIMock": solidity_dai_hex, "wETHMock": solidity_weth_hex} From b9644b01a6ecea8d55aa08aea250dc0375f752f3 Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou Date: Mon, 25 Nov 2024 16:29:00 -0600 Subject: [PATCH 41/41] ULM integration documentation. --- ULM-INTEGRATION.md | 268 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 268 insertions(+) create mode 100644 ULM-INTEGRATION.md diff --git a/ULM-INTEGRATION.md b/ULM-INTEGRATION.md new file mode 100644 index 0000000..caf012b --- /dev/null +++ b/ULM-INTEGRATION.md @@ -0,0 +1,268 @@ +## Configuration of ULM-Version of Solidity Lite Semantics + +We first explain the main cells of the configuration of the solidity semantics. +``` + configuration +``` +The contents of the k cell are explained in more detail later, in the section +about handling creation and call. +``` + // The program and the transaction to be executed. + decodeProgram($PGM:Bytes) ~> execute($CREATE:Bool, #if $CREATE:Bool #then $PGM:Bytes #else CallData() #fi) + // The compile cell contains information about the solidity program, e.g. + // its contracts and interfaces. It is populated as rules match and + // execute decodeProgram($PGM:Bytes) + + // Contains the type of the contract whose body we are currently in. + Id + // Cell containing a subcell per interface in the program. + + // Maintain information related to an interface + + Id // Interface type + // Interface functions + // A cell per interface function + + Id // Interface function name + // Interface function argument types + .List + // Interface function return types + .List + + + + + // Cell containing a subcell per contract in the program. + + // Maintain information related to a contract + + // Contract type + Id + // Map from contract state variable names to their types + .Map +``` +The usage of the cells `` and `` +is explained in more detail below, in the section about changing the storage according +to the ULM interface. +``` + // Contains the next available Int that will correspond to a state variable + 0:Int + // Map from contract state variables to their corresponding unique Int. + .Map + // Code initializing the contract state variables. + .List + // Map from computed function selectors to their corresponding contract functions. + .Map + // Contract functions + // A cell per contract function + + // Contract function name + Id + public + .List + .List + .List + .List + false + // Statements corresponding to the function's body. + .Statements + + + // Events defined within the contract + // A cell per event + + // Event name + Id + .List + .List + // A set containing Ints corresponding to the positions, in the + // argument list of the event, of indexed parameters. + .Set + + + + + + // The exec cell maintains information about the transaction being executed. + + // Sender, value, origin, timestamp. Inititialized using the ULM interface. + Int2MInt(Caller())::MInt{160} + Int2MInt(CallValue())::MInt{256} + Int2MInt(Origin())::MInt{160} + Int2MInt(BlockTimestamp())::MInt{256} + // Address of this (active contract) + Int2MInt($ACCTCODE:Int)::MInt{160} + // Type of this (active contract) + Id + // Enviroment: a map from Identifiers for variables to Ints, representing locations in the store + .Map + // Store: a list, that in each position holds an Int representing a Value + .List + // Name of function that is currently being executed + Id + .List // Stack of call frames + EVMC_SUCCESS // Status code to be returned + $GAS:Int // Available gass + +``` + +## ULM Integration for Solidity Lite Semantics + +The next sections describe the main steps taken to integrate the ULM +functionality with the solidity semantics. + +### Removing all summarization +This is specific to the solidity semantics alone. Before starting the ULM +integration we had applied manual CSE for the contract UniswapV2SwapRenamed.sol, +a process that resulted in additional rules (in src/uniswap-summaries.md). As +part of the ULM integration, we removed all changes related to summarization, +which included: +- importing the module that included the summarized rules, `imports SOLIDITY-UNISWAP-SUMMARIES`, + from the module SOLIDITY in src/solidity.md. +- removing the `requires "uniswap-summaries.md"` from src/solidity.md. +- removed the cell ``, and all its uses. + +### Change contract storage to correspond to the ULM interface. Implement assignment and access of state variables accordingly. +The ULM interfaces to access and edit a contract's storage are +``` +syntax Int ::= GetAccountStorage(key: Int) +syntax K ::= SetAccountStorage(key: Int, value: Int) +``` +. They provide an Int as a key to the storage, as per the EVM memory model, and +store an Int value. In contrast, the Solidity semantics were implemented +- with Identifiers as keys to each contract's storage. +- Sort Value as values. Aggregate types, e.g. arrays and mappings, were stored + as K Lists and K Maps respectively, still with a single key. +Therefore, in order to be able to make use of the ULM interface, we needed to +reimplement the layout of mappings (arrays are TODO, as they were not needed for +the demo) as well as access and assignement to state variables in a way that +stored values are of sort Int and each stored value would correspond to a unique +integer address. To that end, we implemented a hash-based schema, where we +assign a unique integer `I` to each state variable `V`. If `V` is scalar, then +`I` is its address. If `V` is a mapping, then `V[i]` is accessed by appending +`i` to `I` and obtaining the keccack hash. For a multidimensional mapping, the +process of appending the next index and hashing is repeated. +The cell `` is used to track which unique number +should be assigned to a state variable. The cell `contract-statevar-addresses` +maps the variable Identifiers to their assigned addresses. + +### Removing all the maintained/emulated "blockchain" and use ULM interface instead +The solidity lite semantics were initially designed to "emulate", or locally +maintain, the blockchain state needed to execute the requested transactions. The +live contracts were maintained in a cell (``) that, for each +contract contained a cell `` with its address (``), +its type (``), and its storage (``). These +cells were used by the rules for assignment and lookup, in order to find the +appropriate contract's storage, and either update it or return a value. +As part of the ULM integration, we removed this locally maintained state from +the configuration, because we would now be accessing it instead through the ULM +interface. +We edited the rule for assignment to state variables to no longer match the +removed cells, using the `SetAccountStorage(key: Int, value: Int)` instead. The +key to the store DB is the unique address for each state variable/mapping +element, the computation of which is described in the previous section. The +value is the value to be assigned (which is the same as in the assignment rule +prior to the ULM integration modifications) converted to Int. There are +different rules to match and convert to Int from differend types. Currrently, we +handle assignment to state variables that are of type uint8, unit32, uint112, +uint256/uint, address (uint160), bool, contract, and mapping with uint256 or +address value types. +We similarly edit the rule for state variable lookup to also not match the +removed cells and instead use `GetAccountStorage(key: Int)`with the same key. +The Int obtained by `GetAccountStorage` is converted to a Value of the +appropriate type. Currently, we support lookup of state variables of type uint8, +unit32, uint112, uint256/uint, address (uint160), bool, contract, and mapping +with uint256 or address value types. + +NOTE: There are additional rules in the semantics that need to be updated by +removing the usage of the `` cell and instead use ULM interfaces +(e.g., rules for new, external call). They have been commented out and are +TODO, since they were not needed for the demo. + +### Compute and store function selectors for public/external functions. +In order to be able to call a function `F` with function selector `S`, provided +as part of the calldata, the solidity semantics needs to precompute the function +selectors for all public/external functions of the contracts in `$PGM`. This +includes the contract functions with public/external visibility, and the +automatically generated getter functions for public state variables. The +function selectors are stored per contract in the subcell ``, +which contains a Map with function selectors as keys and Identifiers +(corresponding to function names) as values. +For a function `F`, we construct its function selector according to the solidity +ABI, as follows: +- We first create the function signature `Sig`, by combining the function name + `F`, `"("`, the canonical name of the formal parameter types followed by `","` + unless it is the last, and `")"`. We properly handle geneating the correct + canonical type name for uint256/uint, uint112, uint32, uint8, address and + bool, needed for the demo. +- We compute the keccak hash of `Sig`. +- We get the first four bytes. + + +### Implement getGasLeft +We added a cell ``, and initialize it with the gas sent with the +transaction. We then implement the function `getGasLeft` of ULM, making it match +and return the contents of the `` cell. +Note that the Solidity semantics does not do gas computation. Therefore, at the +moment the returned gas is always equal to the gas that was sent. + +### Implement getStatus +We added a cell ``, and initialize it with the status code for +successfull execution, `EVMC_SUCCESS`. We also edit the rules for a failed +`require` and `assert` to include rewriting the contents of the `` cell +to `EVMC_REVERT` and `EVMC_FAILURE` respectively. Finally, we implement the +function `getStatus` of ULM, making it match and return the contents of the +`` cell. + +### Implement getOutput +We implement the function `getOutput` of ULM, making it match and return the top +of the `` cell, encoded as required by the Solidity ABI. We handle return +types of Bytes, uint8, uint256, bool, and string (limited to returning a single +string of length < 32). + +### Handle creation ($CREATE=true) and call ($SREATE=false) + +The k cell comprises (1) the contract(s) and (2) the requested transaction. +1. The contracts are contained in the conriguration variable `$PGM` as Bytes. + `$PGM` is decoded using `decodeProgram`, which simply hooks into + `ULM.decode` and returns Sort Program. The rewrite rules executing the + provided Program result in updating the contents of the `` cell as + needed to represent the provided contract(s). We require that, while `$PGM` + may contain one or more contracts, the active contract must be the last on + the list. This ensures that the cell `` ends up containing the + type of the active contract. +2. The requested transaction is either a contract creation or a function call, + as dictated by the value of the cponfiguration variable `$CREATE`. If + `$CREATE==true`, this is a contract creation and the contract bytes is + provided to the `execute` function. If `$CREATE==false`, this is a call and + the calldata is provided to `execute` instead. + +#### execute function +- case `true` + This is a contract creation, thus `execute(true, B)` must be rewritten to + initializing the contract and return the resulting Bytes. The contracts for + the demo do not have constructors, therefore we did not need to add a call to + the constructor. We only need to match and execute `INIT`, which is the code + initializing the contract's state variables, and return the contract bytes. +- case `false` + This is a call to one of the functions of the active contract. + `execute(false, B)` identifies the called function `F` of the active contract + using the function selector (first four bytes of `B`). It decodes the provided + arguments (remaining `B`) using the types of the parameters of `F`. We + currently support decoding for the types uint256/uint, uint112, uint32, uint8 + and bool. + +### Event logging + +We handle event encoding (as needed for the demo), restricting ourselves to the +following cases: +- no unnamed events. In this case, topic 0 is the keccak hash of the event + signature, computed the same way as the function signature above. +- event argument types of only uint256 and uint160 (address). + +We use the cell `` that contains the indexed +parameters. If a parameter is indexed, we create an Int for its value and it +will become a topic. Otherwise we append its value to the end of an initially +empty byte string with all other non indexed parameters. Depending on the number +of topics, we call the appropriate ULM interface `Log1`, `Log2`, `Log3`, or +`Log4`.