diff --git a/src/transactions/test/InvokeHostFunctionTests.cpp b/src/transactions/test/InvokeHostFunctionTests.cpp index 0032492534..b022b78469 100644 --- a/src/transactions/test/InvokeHostFunctionTests.cpp +++ b/src/transactions/test/InvokeHostFunctionTests.cpp @@ -908,22 +908,6 @@ TEST_CASE("contract storage", "[tx][soroban]") put("key1", 0, ContractDataDurability::PERSISTENT); put("key2", 21, ContractDataDurability::PERSISTENT); - // Failure: contract data isn't in footprint - putWithFootprint("key1", 88, contractKeys, {}, 1000, false, - ContractDataDurability::PERSISTENT); - delWithFootprint("key1", contractKeys, {}, false, - ContractDataDurability::PERSISTENT); - - // Failure: contract data is read only - auto readOnlyFootprint = contractKeys; - readOnlyFootprint.push_back( - contractDataKey(contractID, makeSymbolSCVal("key2"), - ContractDataDurability::PERSISTENT, DATA_ENTRY)); - putWithFootprint("key2", 888888, readOnlyFootprint, {}, 1000, false, - ContractDataDurability::PERSISTENT); - delWithFootprint("key2", readOnlyFootprint, {}, false, - ContractDataDurability::PERSISTENT); - // Failure: insufficient write bytes putWithFootprint( "key2", 88888, contractKeys, @@ -1199,6 +1183,46 @@ TEST_CASE("contract storage", "[tx][soroban]") ContractDataDurability::PERSISTENT) == maxExpiration); } + SECTION("footprint tests") + { + put("key1", 0, ContractDataDurability::PERSISTENT); + put("key2", 21, ContractDataDurability::PERSISTENT); + SECTION("unused readWrite key") + { + auto acc = root.create( + "acc", app->getLedgerManager().getLastMinBalance(1)); + + REQUIRE(doesAccountExist(*app, acc)); + + putWithFootprint( + "key1", 0, contractKeys, + {contractDataKey(contractID, makeSymbolSCVal("key1"), + ContractDataDurability::PERSISTENT, + DATA_ENTRY), + accountKey(acc)}, + 1000, true, ContractDataDurability::PERSISTENT); + // make sure account still exists and hasn't change + REQUIRE(doesAccountExist(*app, acc)); + } + SECTION("incorrect footprint") + { + // Failure: contract data isn't in footprint + putWithFootprint("key1", 88, contractKeys, {}, 1000, false, + ContractDataDurability::PERSISTENT); + delWithFootprint("key1", contractKeys, {}, false, + ContractDataDurability::PERSISTENT); + + // Failure: contract data is read only + auto readOnlyFootprint = contractKeys; + readOnlyFootprint.push_back(contractDataKey( + contractID, makeSymbolSCVal("key2"), + ContractDataDurability::PERSISTENT, DATA_ENTRY)); + putWithFootprint("key2", 888888, readOnlyFootprint, {}, 1000, false, + ContractDataDurability::PERSISTENT); + delWithFootprint("key2", readOnlyFootprint, {}, false, + ContractDataDurability::PERSISTENT); + } + } } TEST_CASE("failed invocation with diagnostics", "[tx][soroban]") diff --git a/test-tx-meta-baseline-next/InvokeHostFunctionTests.json b/test-tx-meta-baseline-next/InvokeHostFunctionTests.json new file mode 100644 index 0000000000..e9aa48bc80 --- /dev/null +++ b/test-tx-meta-baseline-next/InvokeHostFunctionTests.json @@ -0,0 +1,95 @@ + +{ + "!cfg protocol version" : 20, + "!rng seed" : 12345, + "!test all versions" : true, + "!versions to test" : + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20 + ], + "basic contract invocation|invalid footprint keys|readOnly" : + [ + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=" + ], + "basic contract invocation|invalid footprint keys|readWrite" : + [ + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=", + "3l7t9opHMbU=" + ], + "contract storage|footprint tests|unused readWrite key" : [ "PJ5bN6hAeFA=" ] +}