aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--SolidityEndToEndTest.cpp54
-rw-r--r--TestHelper.cpp2
-rw-r--r--blockchain.cpp4
-rw-r--r--transaction.cpp6
4 files changed, 60 insertions, 6 deletions
diff --git a/SolidityEndToEndTest.cpp b/SolidityEndToEndTest.cpp
index b169263d..4622e422 100644
--- a/SolidityEndToEndTest.cpp
+++ b/SolidityEndToEndTest.cpp
@@ -966,6 +966,60 @@ BOOST_AUTO_TEST_CASE(simple_accessor)
BOOST_CHECK(callContractFunction("data()") == encodeArgs(8));
}
+BOOST_AUTO_TEST_CASE(array_accessor)
+{
+ char const* sourceCode = R"(
+ contract test {
+ uint[8] public data;
+ uint[] public dynamicData;
+ uint24[] public smallTypeData;
+ struct st { uint a; uint[] finalArray; }
+ mapping(uint256 => mapping(uint256 => st[5])) public multiple_map;
+
+ function test() {
+ data[0] = 8;
+ dynamicData.length = 3;
+ dynamicData[2] = 8;
+ smallTypeData.length = 128;
+ smallTypeData[1] = 22;
+ smallTypeData[127] = 2;
+ multiple_map[2][1][2].a = 3;
+ multiple_map[2][1][2].finalArray.length = 4;
+ multiple_map[2][1][2].finalArray[3] = 5;
+ }
+ }
+ )";
+ compileAndRun(sourceCode);
+ BOOST_CHECK(callContractFunction("data(uint256)", 0) == encodeArgs(8));
+ BOOST_CHECK(callContractFunction("data(uint256)", 8) == encodeArgs());
+ BOOST_CHECK(callContractFunction("dynamicData(uint256)", 2) == encodeArgs(8));
+ BOOST_CHECK(callContractFunction("dynamicData(uint256)", 8) == encodeArgs());
+ BOOST_CHECK(callContractFunction("smallTypeData(uint256)", 1) == encodeArgs(22));
+ BOOST_CHECK(callContractFunction("smallTypeData(uint256)", 127) == encodeArgs(2));
+ BOOST_CHECK(callContractFunction("smallTypeData(uint256)", 128) == encodeArgs());
+ BOOST_CHECK(callContractFunction("multiple_map(uint256,uint256,uint256)", 2, 1, 2) == encodeArgs(3));
+}
+
+BOOST_AUTO_TEST_CASE(accessors_mapping_for_array)
+{
+ char const* sourceCode = R"(
+ contract test {
+ mapping(uint => uint[8]) public data;
+ mapping(uint => uint[]) public dynamicData;
+ function test() {
+ data[2][2] = 8;
+ dynamicData[2].length = 3;
+ dynamicData[2][2] = 8;
+ }
+ }
+ )";
+ compileAndRun(sourceCode);
+ BOOST_CHECK(callContractFunction("data(uint256,uint256)", 2, 2) == encodeArgs(8));
+ BOOST_CHECK(callContractFunction("data(uint256, 256)", 2, 8) == encodeArgs());
+ BOOST_CHECK(callContractFunction("dynamicData(uint256,uint256)", 2, 2) == encodeArgs(8));
+ BOOST_CHECK(callContractFunction("dynamicData(uint256,uint256)", 2, 8) == encodeArgs());
+}
+
BOOST_AUTO_TEST_CASE(multiple_elementary_accessors)
{
char const* sourceCode = "contract test {\n"
diff --git a/TestHelper.cpp b/TestHelper.cpp
index 4214796c..e86b84aa 100644
--- a/TestHelper.cpp
+++ b/TestHelper.cpp
@@ -208,7 +208,7 @@ void ImportTest::importTransaction(json_spirit::mObject& _o)
{
RLPStream transactionRLPStream = createRLPStreamFromTransactionFields(_o);
RLP transactionRLP(transactionRLPStream.out());
- m_transaction = Transaction(transactionRLP.data(), CheckSignature::Sender);
+ m_transaction = Transaction(transactionRLP.data(), CheckTransaction::Everything);
}
}
diff --git a/blockchain.cpp b/blockchain.cpp
index a223e8d4..6c1cfebd 100644
--- a/blockchain.cpp
+++ b/blockchain.cpp
@@ -383,7 +383,7 @@ void doBlockchainTests(json_spirit::mValue& _v, bool _fillin)
try
{
- Transaction t(createRLPStreamFromTransactionFields(tx).out(), CheckSignature::Sender);
+ Transaction t(createRLPStreamFromTransactionFields(tx).out(), CheckTransaction::Everything);
txsFromField.push_back(t);
}
catch (Exception const& _e)
@@ -400,7 +400,7 @@ void doBlockchainTests(json_spirit::mValue& _v, bool _fillin)
RLP root(blockRLP);
for (auto const& tr: root[1])
{
- Transaction tx(tr.data(), CheckSignature::Sender);
+ Transaction tx(tr.data(), CheckTransaction::Everything);
txsFromRlp.push_back(tx);
}
diff --git a/transaction.cpp b/transaction.cpp
index 4c57326b..7aa073f2 100644
--- a/transaction.cpp
+++ b/transaction.cpp
@@ -44,7 +44,7 @@ void doTransactionTests(json_spirit::mValue& _v, bool _fillin)
{
bytes stream = importByteArray(o["rlp"].get_str());
RLP rlp(stream);
- txFromRlp = Transaction(rlp.data(), CheckSignature::Sender);
+ txFromRlp = Transaction(rlp.data(), CheckTransaction::Everything);
if (!txFromRlp.signature().isValid())
BOOST_THROW_EXCEPTION(Exception() << errinfo_comment("transaction from RLP signature is invalid") );
}
@@ -64,7 +64,7 @@ void doTransactionTests(json_spirit::mValue& _v, bool _fillin)
BOOST_REQUIRE(o.count("transaction") > 0);
mObject tObj = o["transaction"].get_obj();
- Transaction txFromFields(createRLPStreamFromTransactionFields(tObj).out(), CheckSignature::Sender);
+ Transaction txFromFields(createRLPStreamFromTransactionFields(tObj).out(), CheckTransaction::Everything);
//Check the fields restored from RLP to original fields
BOOST_CHECK_MESSAGE(txFromFields.data() == txFromRlp.data(), "Data in given RLP not matching the Transaction data!");
@@ -91,7 +91,7 @@ void doTransactionTests(json_spirit::mValue& _v, bool _fillin)
try
{
- Transaction txFromFields(rlpStream.out(), CheckSignature::Sender);
+ Transaction txFromFields(rlpStream.out(), CheckTransaction::Everything);
if (!txFromFields.signature().isValid())
BOOST_THROW_EXCEPTION(Exception() << errinfo_comment("transaction from RLP signature is invalid") );