From a1b0a4fc0a87fb2f19888218c94a91c035fe4e01 Mon Sep 17 00:00:00 2001 From: David Campbell Date: Wed, 24 Jun 2026 23:04:48 +0100 Subject: [PATCH 1/2] feat: implement automatic chunking for FileCreate and FileUpdate transactions (#1983) Signed-off-by: David Campbell --- .../hashgraph/sdk/ChunkedTransaction.java | 45 ++++++ .../hashgraph/sdk/FileAppendTransaction.java | 24 ++- .../hashgraph/sdk/FileCreateTransaction.java | 122 +++++++++------- .../hashgraph/sdk/FileUpdateTransaction.java | 137 ++++++++++-------- .../sdk/FileCreateTransactionTest.snap | 4 + .../sdk/FileUpdateTransactionTest.snap | 4 + 6 files changed, 201 insertions(+), 135 deletions(-) diff --git a/sdk/src/main/java/com/hedera/hashgraph/sdk/ChunkedTransaction.java b/sdk/src/main/java/com/hedera/hashgraph/sdk/ChunkedTransaction.java index 57993a8c9f..e667348613 100644 --- a/sdk/src/main/java/com/hedera/hashgraph/sdk/ChunkedTransaction.java +++ b/sdk/src/main/java/com/hedera/hashgraph/sdk/ChunkedTransaction.java @@ -118,6 +118,51 @@ T setData(String text) { // noinspection unchecked return (T) this; } + + /** + * Checks whether {@code innerSignedTransactions} is not empty. + * + * @return {@code true} if {@code innerSignedTransactions} is not empty; otherwise {@code false} + */ + boolean hasInnerSignedTransactions(){ + return (!innerSignedTransactions.isEmpty()); + } + + /** + * Assigns the data via {@code innerSignedTransactions}. + * + * @return {@code this} + * @throws IllegalArgumentException if {@code innerSignedTransactions} is empty + */ + T setDataFromInnerSignedTransactions() { + if (!innerSignedTransactions.isEmpty()) { + try { + for (var i = 0; i < innerSignedTransactions.size(); i += nodeAccountIds.isEmpty() ? 1 : nodeAccountIds.size()) { + ByteString content = extractContents(TransactionBody.parseFrom(innerSignedTransactions.get(i).getBodyBytes())); + data = data.concat(content); + } + return (T) this; + } catch (InvalidProtocolBufferException exc) { + throw new IllegalArgumentException(exc.getMessage()); + } + } + return (T) this; + } + + /** + * Extracts the content bytes from a {@link TransactionBody}. + *

+ * This is a template method used by + * {@link #setDataFromInnerSignedTransactions()} to consolidate content from + * multiple inner signed transactions. Because different transaction types + * (e.g., FileCreate, FileUpdate, FileAppend) store their content in different + * fields of the protobuf body, child classes must implement this method to + * specify the correct field to extract. + * + * @param body The protobuf transaction body to extract data from. + * @return The {@link ByteString} representing the content of the transaction. + */ + protected abstract ByteString extractContents(TransactionBody body); /** * Retrieve the maximum number of chunks. diff --git a/sdk/src/main/java/com/hedera/hashgraph/sdk/FileAppendTransaction.java b/sdk/src/main/java/com/hedera/hashgraph/sdk/FileAppendTransaction.java index 04842cad5c..b0d0a283e6 100644 --- a/sdk/src/main/java/com/hedera/hashgraph/sdk/FileAppendTransaction.java +++ b/sdk/src/main/java/com/hedera/hashgraph/sdk/FileAppendTransaction.java @@ -186,23 +186,17 @@ void initFromTransactionBody() { fileId = FileId.fromProtobuf(body.getFileID()); } - if (!innerSignedTransactions.isEmpty()) { - try { - for (var i = 0; - i < innerSignedTransactions.size(); - i += nodeAccountIds.isEmpty() ? 1 : nodeAccountIds.size()) { - data = data.concat(TransactionBody.parseFrom( - innerSignedTransactions.get(i).getBodyBytes()) - .getFileAppend() - .getContents()); - } - } catch (InvalidProtocolBufferException exc) { - throw new IllegalArgumentException(exc.getMessage()); - } + if (hasInnerSignedTransactions()) { + setDataFromInnerSignedTransactions(); } else { - data = body.getContents(); + setData(body.getContents().toByteArray()); } } + + @Override + protected ByteString extractContents(TransactionBody body) { + return body.getFileAppend().getContents(); + } /** * Build the transaction body. @@ -214,7 +208,7 @@ FileAppendTransactionBody.Builder build() { if (fileId != null) { builder.setFileID(fileId.toProtobuf()); } - builder.setContents(data); + builder.setContents(getData()); return builder; } diff --git a/sdk/src/main/java/com/hedera/hashgraph/sdk/FileCreateTransaction.java b/sdk/src/main/java/com/hedera/hashgraph/sdk/FileCreateTransaction.java index ea2417c4f4..fe999c3fc9 100644 --- a/sdk/src/main/java/com/hedera/hashgraph/sdk/FileCreateTransaction.java +++ b/sdk/src/main/java/com/hedera/hashgraph/sdk/FileCreateTransaction.java @@ -23,7 +23,7 @@ * Create a new file. * * If successful, the new file SHALL contain the (possibly empty) content - * provided in the `contents` field.
+ * provided in the `data` field in {@link ChunkedTransaction}.
* When the current consensus time exceeds the `expirationTime` value, the * network SHALL expire the file, and MAY archive the state entry. * @@ -60,7 +60,7 @@ * After the file is created, the FileID for it SHALL be returned in the * transaction receipt, and SHALL be recorded in the transaction record. */ -public final class FileCreateTransaction extends Transaction { +public final class FileCreateTransaction extends ChunkedTransaction { @Nullable private Instant expirationTime = null; @@ -70,7 +70,6 @@ public final class FileCreateTransaction extends TransactionSet the given byte array as the file's contents. - * - *

This may be omitted to create an empty file. - * - *

Note that total size for a given transaction is limited to 6KiB (as of March 2020) by the - * network; if you exceed this you may receive a {@link PrecheckStatusException} - * with {@link com.hedera.hashgraph.sdk.Status#TRANSACTION_OVERSIZE}. - * - *

In this case, you can use {@link FileAppendTransaction}, which automatically breaks the contents - * into chunks for you, to append contents of arbitrary size. - * - * @param bytes the contents of the file. - * @return {@code this} - */ - public FileCreateTransaction setContents(byte[] bytes) { - requireNotFrozen(); - Objects.requireNonNull(bytes); - contents = Arrays.copyOf(bytes, bytes.length); - return this; - } + *

+ * Set the given byte array as the file's contents. + * + *

+ * This may be omitted to create an empty file. + * + * @param bytes the contents of the file. + * @return {@code this} + */ + public FileCreateTransaction setContents(byte[] bytes) { + requireNotFrozen(); + Objects.requireNonNull(bytes); + return setData(bytes); + } /** - *

Encode the given {@link String} as UTF-8 and set it as the file's contents. - * - *

This may be omitted to create an empty file. - * - *

The string can later be recovered from {@link FileContentsQuery#execute(Client)} - * via {@link String#String(byte[], java.nio.charset.Charset)} using - * {@link java.nio.charset.StandardCharsets#UTF_8}. - * - *

Note that total size for a given transaction is limited to 6KiB (as of March 2020) by the - * network; if you exceed this you may receive a {@link PrecheckStatusException} - * with {@link com.hedera.hashgraph.sdk.Status#TRANSACTION_OVERSIZE}. - * - *

In this case, you can use {@link FileAppendTransaction}, which automatically breaks the contents - * into chunks for you, to append contents of arbitrary size. - * - * @param text the contents of the file. - * @return {@code this} - */ - public FileCreateTransaction setContents(String text) { - requireNotFrozen(); - Objects.requireNonNull(text); - contents = text.getBytes(StandardCharsets.UTF_8); - return this; - } + *

+ * Encode the given {@link String} as UTF-8 and set it as the file's contents. + * + *

+ * This may be omitted to create an empty file. + * + *

+ * The string can later be recovered from + * {@link FileContentsQuery#execute(Client)} via + * {@link String#String(byte[], java.nio.charset.Charset)} using + * {@link java.nio.charset.StandardCharsets#UTF_8}. + * + * @param text the contents of the file. + * @return {@code this} + */ + public FileCreateTransaction setContents(String text) { + requireNotFrozen(); + Objects.requireNonNull(text); + return setData(text); + } /** * Extract the file's memo field. @@ -274,8 +263,18 @@ void initFromTransactionBody() { if (body.hasKeys()) { keys = KeyList.fromProtobuf(body.getKeys(), null); } - contents = body.getContents().toByteArray(); fileMemo = body.getMemo(); + + if (hasInnerSignedTransactions()) { + setDataFromInnerSignedTransactions(); + } else { + setData(body.getContents().toByteArray()); + } + } + + @Override + protected ByteString extractContents(TransactionBody body) { + return body.getFileCreate().getContents(); } /** @@ -295,11 +294,22 @@ FileCreateTransactionBody.Builder build() { if (keys != null) { builder.setKeys(keys.toProtobuf()); } - builder.setContents(ByteString.copyFrom(contents)); + builder.setContents(getData()); builder.setMemo(fileMemo); return builder; } + + @Override + void onFreezeChunk( + TransactionBody.Builder body, + @Nullable TransactionID initialTransactionId, + int startIndex, + int endIndex, + int chunk, + int total) { + body.setFileCreate(build().setContents(data.substring(startIndex, endIndex))); + } @Override void onFreeze(TransactionBody.Builder bodyBuilder) { diff --git a/sdk/src/main/java/com/hedera/hashgraph/sdk/FileUpdateTransaction.java b/sdk/src/main/java/com/hedera/hashgraph/sdk/FileUpdateTransaction.java index 1aff1ce0be..a76692e3b7 100644 --- a/sdk/src/main/java/com/hedera/hashgraph/sdk/FileUpdateTransaction.java +++ b/sdk/src/main/java/com/hedera/hashgraph/sdk/FileUpdateTransaction.java @@ -44,7 +44,7 @@ * * See Hedera Documentation */ -public final class FileUpdateTransaction extends Transaction { +public final class FileUpdateTransaction extends ChunkedTransaction { @Nullable private FileId fileId = null; @@ -57,8 +57,6 @@ public final class FileUpdateTransaction extends Transaction - * If the contents of the file are longer than the given byte array, then the file will - * be truncated. - *

- * Note that total size for a given transaction is limited to 6KiB (as of March 2020) by the - * network; if you exceed this you may receive a {@link Status#TRANSACTION_OVERSIZE}. - *

- * In this case, you will need to keep the initial file contents under ~6KiB and - * then use {@link FileAppendTransaction}, which automatically breaks the contents - * into chunks for you, to append contents of arbitrary size. - * - * @param bytes the bytes to replace the contents of the file with. - * @return {@code this} - * @see #setContents(String) for an overload which takes a String. - * @see FileAppendTransaction if you merely want to add data to a file's existing contents. - */ - public FileUpdateTransaction setContents(byte[] bytes) { - requireNotFrozen(); - Objects.requireNonNull(bytes); - contents = Arrays.copyOf(bytes, bytes.length); - return this; - } + *

+ * If set, replace contents of the file identified by {@link #setFileId(FileId)} + * with the given bytes. + * + *

+ * If the contents of the file are longer than the given byte array, then the + * file will be truncated. + * + * @param bytes the bytes to replace the contents of the file with. + * @return {@code this} + * @see #setContents(String) for an overload which takes a String. + * @see FileAppendTransaction if you merely want to add data to a file's + * existing contents. + */ + public FileUpdateTransaction setContents(byte[] bytes) { + requireNotFrozen(); + Objects.requireNonNull(bytes); + return setData(bytes); + } /** - * If set, encode the given {@link String} as UTF-8 and replace the contents of the file - * identified by {@link #setFileId(FileId)}. - *

- * If the contents of the file are longer than the UTF-8 encoding of the given string, then the - * file will be truncated. - *

- * The string can later be recovered from {@link FileContentsQuery#execute(Client)} - * via {@link String#String(byte[], java.nio.charset.Charset)} using - * {@link java.nio.charset.StandardCharsets#UTF_8}. - *

- * Note that total size for a given transaction is limited to 6KiB (as of March 2020) by the - * network; if you exceed this you may receive a {@link Status#TRANSACTION_OVERSIZE}. - *

- * In this case, you will need to keep the initial file contents under ~6KiB and - * then use {@link FileAppendTransaction}, which automatically breaks the contents - * into chunks for you, to append contents of arbitrary size. - * - * @param text the string to replace the contents of the file with. - * @return {@code this} - * @see #setContents(byte[]) for replacing the contents with arbitrary data. - * @see FileAppendTransaction if you merely want to add data to a file's existing contents. - */ - public FileUpdateTransaction setContents(String text) { - Objects.requireNonNull(text); - requireNotFrozen(); - contents = text.getBytes(StandardCharsets.UTF_8); - return this; - } + * If set, encode the given {@link String} as UTF-8 and replace the contents of + * the file identified by {@link #setFileId(FileId)}. + *

+ * If the contents of the file are longer than the UTF-8 encoding of the given + * string, then the file will be truncated. + *

+ * The string can later be recovered from + * {@link FileContentsQuery#execute(Client)} via + * {@link String#String(byte[], java.nio.charset.Charset)} using + * {@link java.nio.charset.StandardCharsets#UTF_8}. + * + * @param text the string to replace the contents of the file with. + * @return {@code this} + * @see #setContents(byte[]) for replacing the contents with arbitrary data. + * @see FileAppendTransaction if you merely want to add data to a file's + * existing contents. + */ + public FileUpdateTransaction setContents(String text) { + requireNotFrozen(); + Objects.requireNonNull(text); + return setData(text); + + } /** * Extract the file's memo up to 100 bytes. @@ -302,7 +290,17 @@ void initFromTransactionBody() { if (body.hasMemo()) { fileMemo = body.getMemo().getValue(); } - contents = body.getContents().toByteArray(); + + if (hasInnerSignedTransactions()) { + setDataFromInnerSignedTransactions(); + } else { + setData(body.getContents().toByteArray()); + } + } + + @Override + protected ByteString extractContents(TransactionBody body) { + return body.getFileUpdate().getContents(); } /** @@ -324,13 +322,24 @@ FileUpdateTransactionBody.Builder build() { if (expirationTimeDuration != null) { builder.setExpirationTime(InstantConverter.toProtobuf(expirationTimeDuration)); } - builder.setContents(ByteString.copyFrom(contents)); + builder.setContents(getData()); if (fileMemo != null) { builder.setMemo(StringValue.of(fileMemo)); } return builder; } + + @Override + void onFreezeChunk( + TransactionBody.Builder body, + @Nullable TransactionID initialTransactionId, + int startIndex, + int endIndex, + int chunk, + int total) { + body.setFileUpdate(build().setContents(data.substring(startIndex, endIndex))); + } @Override void validateChecksums(Client client) throws BadEntityIdException { diff --git a/sdk/src/test/java/com/hedera/hashgraph/sdk/FileCreateTransactionTest.snap b/sdk/src/test/java/com/hedera/hashgraph/sdk/FileCreateTransactionTest.snap index d94af7c73b..da955a710b 100644 --- a/sdk/src/test/java/com/hedera/hashgraph/sdk/FileCreateTransactionTest.snap +++ b/sdk/src/test/java/com/hedera/hashgraph/sdk/FileCreateTransactionTest.snap @@ -1,3 +1,7 @@ com.hedera.hashgraph.sdk.FileCreateTransactionTest.shouldSerialize=[ "# com.hedera.hashgraph.sdk.proto.TransactionBody\nfile_create {\n contents: \"\\001\\002\\003\\004\"\n expiration_time {\n seconds: 1554158728\n }\n keys {\n keys {\n ed25519: \"\\340\\310\\354\\'X\\245\\207\\237\\372\\302&\\241<\\fQky\\236r\\343QA\\240\\335\\202\\217\\224\\323y\\210\\244\\267\"\n }\n }\n memo: \"Hello memo\"\n}\nnode_account_i_d {\n account_num: 5005\n realm_num: 0\n shard_num: 0\n}\ntransaction_fee: 100000\ntransaction_i_d {\n account_i_d {\n account_num: 5006\n realm_num: 0\n shard_num: 0\n }\n transaction_valid_start {\n seconds: 1554158542\n }\n}\ntransaction_valid_duration {\n seconds: 120\n}" ] + +com.hedera.hashgraph.sdk.FileCreateTransactionTest.shouldSerializeBigContents=[ + "# com.hedera.hashgraph.sdk.proto.TransactionBody\nfile_create {\n contents: \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur aliquam augue sem, ut mattis dui laoreet a. Curabitur consequat est euismod, scelerisque metus et, tristique dui. Nulla commodo mauris ut faucibus ultricies. Quisque venenatis nisl nec augue tempus, at efficitur elit eleifend. Duis pharetra felis metus, sed dapibus urna vehicula id. Duis non venenatis turpis, sit amet ornare orci. Donec non interdum quam. Sed finibus nunc et risus finibus, non sagittis lorem cursus. Proin pellentesque tempor aliquam. Sed congue nisl in enim bibendum, condimentum vehicula nisi feugiat.\\n\\nSuspendisse non sodales arcu. Suspendisse sodales, lorem ac mollis blandit, ipsum neque porttitor nulla, et sodales arcu ante fermentum tellus. Integer sagittis dolor sed augue fringilla accumsan. Cras vitae finibus arcu, sit amet varius dolor. Etiam id finibus dolor, vitae luctus velit. Proin efficitur augue nec pharetra accumsan. Aliquam lobortis nisl diam, vel fermentum purus finibus id. Etiam at finibus orci, et tincidunt turpis. Aliquam imperdiet congue lacus vel facilisis. Phasellus id magna vitae enim dapibus vestibulum vitae quis augue. Morbi eu consequat enim. Maecenas neque nulla, pulvinar sit amet consequat sed, tempor sed magna. Mauris lacinia sem feugiat faucibus aliquet. Etiam congue non turpis at commodo. Nulla facilisi.\\n\\nNunc velit turpis, cursus ornare fringilla eu, lacinia posuere leo. Mauris rutrum ultricies dui et suscipit. Curabitur in euismod ligula. Curabitur vitae faucibus orci. Phasellus volutpat vestibulum diam sit amet vestibulum. In vel purus leo. Nulla condimentum lectus vestibulum lectus faucibus, id lobortis eros consequat. Proin mollis libero elit, vel aliquet nisi imperdiet et. Morbi ornare est velit, in vehicula nunc malesuada quis. Donec vehicula convallis interdum.\\n\\nInteger pellentesque in nibh vitae aliquet. Ut at justo id libero dignissim hendrerit. Interdum et malesuada fames ac ante ipsum primis in faucibus. Praesent quis ornare lectus. Nam malesuada non diam quis cursus. Phasellus a libero ligula. Suspendisse ligula elit, congue et nisi sit amet, cursus euismod dolor. Morbi aliquam, nulla a posuere pellentesque, diam massa ornare risus, nec eleifend neque eros et elit.\\n\\nPellentesque a sodales dui. Sed in efficitur ante. Duis eget volutpat elit, et ornare est. Nam felis dolor, placerat mattis diam id, maximus lobortis quam. Sed pellentesque lobortis sem sed placerat. Pellentesque augue odio, molestie sed lectus sit amet, congue volutpat massa. Quisque congue consequat nunc id fringilla. Duis semper nulla eget enim venenatis dapibus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Pellentesque varius turpis nibh, sit amet malesuada mauris malesuada quis. Vivamus dictum egestas placerat. Vivamus id augue elit.\\n\\nCras fermentum volutpat eros, vitae euismod lorem viverra nec. Donec lectus augue, porta eleifend odio sit amet, condimentum rhoncus urna. Nunc sed odio velit. Morbi non cursus odio, eget imperdiet erat. Nunc rhoncus massa non neque volutpat, sit amet faucibus ante congue. Phasellus nec lorem vel leo accumsan lobortis. Maecenas id ligula bibendum purus suscipit posuere ac eget diam. Nam in quam pretium, semper erat auctor, iaculis odio. Maecenas placerat, nisi ac elementum tempor, felis nulla porttitor orci, ac rhoncus diam justo in elit. Etiam lobortis fermentum ligula in tincidunt. Donec quis vestibulum nunc. Sed eros diam, interdum in porta lobortis, gravida eu magna. Donec diam purus, finibus et sollicitudin quis, fringilla nec nisi. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Curabitur ultricies sagittis dapibus. Etiam ullamcorper aliquet libero, eu venenatis mauris suscipit id.\\n\\nUt interdum eleifend sem, vel bibendum ipsum volutpat eget. Nunc ac dignissim augue. Aliquam ornare aliquet magna id dignissim. Vestibulum velit sem, lacinia eu rutrum in, rhoncus vitae mauris. Pellentesque scelerisque pulvinar mauris non cursus. Integer id dolor porta, bibendum sem vel, pretium tortor. Fusce a nisi convallis, interdum quam condimentum, suscipit dolor. Sed magna diam, efficitur non nunc in, tincidunt varius mi. Aliquam ullamcorper nulla eu fermentum bibendum. Vivamus a felis pretium, hendrerit enim vitae, hendrerit leo. Suspendisse lacinia lectus a diam consectetur suscipit. Aenean hendrerit nisl sed diam venenatis pellentesque. Nullam egestas lectus a consequat pharetra. Vivamus ornare tellus auctor, facilisis lacus id, feugiat dui. Nam id est ut est rhoncus varius.\\n\\nAenean vel vehicula erat. Aenean gravida risus vitae purus sodales, quis dictum enim porta. Ut elit elit, fermentum sed posuere non, accumsan eu justo. Integer porta malesuada quam, et elementum massa suscipit nec. Donec in elit diam. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis suscipit vel ante volutpat vestibulum.\\n\\nPellentesque ex arcu, euismod et sapien ut, vulputate suscipit enim. Donec mattis sagittis augue, et mattis lacus. Cras placerat consequat lorem sed luctus. Nam suscipit aliquam sem ac imperdiet. Mauris a semper augue, pulvinar fringilla magna. Integer pretium massa non risus commodo hendrerit. Sed dictum libero id erat sodales mattis. Etiam auctor dolor lectus, ut sagittis enim lobortis vitae. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Curabitur nec orci lobortis, cursus risus eget, sollicitudin massa. Integer vel tincidunt mi, id eleifend quam. Nullam facilisis nisl eu mauris congue, vitae euismod nisi malesuada. Vivamus sit amet urna et libero sagittis dictum.\\n\\nIn hac habitasse platea dictumst. Aliquam erat volutpat. Ut dictum, mi a viverra venenatis, mi urna pulvinar nisi, nec gravida lectus diam eget urna. Ut dictum sit amet nisl ut dignissim. Sed sed mauris scelerisque, efficitur augue in, vulputate turpis. Proin dolor justo, bibendum et sollicitudin feugiat, imperdiet sed mi. Sed elementum vitae massa vel lobortis. Cras vitae massa sit amet libero dictum tempus.\\n\\nVivamus ut mauris lectus. Curabitur placerat ornare scelerisque. Cras malesuada nunc quis tortor pretium bibendum vel sed dui. Cras lobortis nibh eu erat blandit, sit amet consequat neque fermentum. Phasellus imperdiet molestie tristique. Cras auctor purus erat, id mollis ligula porttitor eget. Mauris porta pharetra odio et finibus. Suspendisse eu est a ligula bibendum cursus. Mauris ac laoreet libero. Nullam volutpat sem quis rhoncus gravida.\\n\\nDonec malesuada lacus ac iaculis cursus. Sed sem orci, feugiat ac est ut, ultricies posuere nisi. Suspendisse potenti. Phasellus ut ultricies purus. Etiam sem tortor, fermentum quis aliquam eget, consequat ut nulla. Aliquam dictum metus in mi fringilla, vel gravida nulla accumsan. Cras aliquam eget leo vel posuere. Vivamus vitae malesuada nunc. Morbi placerat magna mi, id suscipit lacus auctor quis. Nam at lorem vel odio finibus fringilla ut ac velit. Donec laoreet at nibh quis vehicula.\\n\\nFusce ac tristique nisi. Donec leo nisi, consectetur at tellus sit amet, consectetur ultrices dui. Quisque gravida mollis tempor. Maecenas semper, sapien ut dignissim feugiat, massa enim viverra dolor, non varius eros nulla nec felis. Nunc massa lacus, ornare et feugiat id, bibendum quis purus. Praesent viverra elit sit amet purus consectetur venenatis. Maecenas nibh risus, elementum sit amet enim sagittis, ultrices malesuada lectus. Vivamus non felis ante. Ut vulputate ex arcu. Aliquam porta gravida porta. Aliquam eros leo, malesuada quis eros non, maximus tristique neque. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Etiam ligula orci, mollis vel luctus nec, venenatis vitae est. Fusce rutrum convallis nisi.\\n\\nNunc laoreet eget nibh in feugiat. Pellentesque nec arcu cursus, gravida dolor a, pellentesque nisi. Praesent vel justo blandit, placerat risus eget, consectetur orci. Sed maximus metus mi, ut euismod augue ultricies in. Nunc id risus hendrerit, aliquet lorem nec, congue justo. Vestibulum vel nunc ac est euismod mattis ac vitae nulla. Donec blandit luctus mauris, sit amet bibendum dui egestas et. Aenean nec lorem nec elit ornare rutrum nec eget ligula. Fusce a ipsum vitae neque elementum pharetra. Pellentesque ullamcorper ullamcorper libero, vitae porta sem sagittis vel. Interdum et malesuada fames ac ante ipsum primis in faucibus.\\n\\nDuis at massa sit amet risus pellentesque varius sit amet vitae eros. Cras tempor aliquet sapien, vehicula varius neque volutpat et. Donec purus nibh, pellentesque ut lobortis nec, ultricies ultricies nisl. Sed accumsan ut dui sit amet vulputate. Suspendisse eu facilisis massa, a hendrerit mauris. Nulla elementum molestie tincidunt. Donec mi justo, ornare vel tempor id, gravida et orci. Nam molestie erat nec nisi bibendum accumsan. Duis vitae tempor ante. Morbi congue mauris vel sagittis facilisis. Vivamus vehicula odio orci, a tempor nibh euismod in. Proin mattis, nibh at feugiat porta, purus velit posuere felis, quis volutpat sapien dui vel odio. Nam fermentum sem nec euismod aliquet. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aliquam erat volutpat.\\n\\nMauris congue lacus tortor. Pellentesque arcu eros, accumsan imperdiet porttitor vitae, mattis nec justo. Nullam ac aliquam mauris. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse potenti. Fusce accumsan tempus felis a sagittis. Maecenas et velit odio. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Aliquam eros lacus, volutpat non urna sed, tincidunt ullamcorper elit. Sed sit amet gravida libero. In varius mi vel diam sollicitudin mollis.\\n\\nAenean varius, diam vitae hendrerit feugiat, libero augue ultrices odio, eget consequat sem tellus eu nisi. Nam dapibus enim et auctor sollicitudin. Nunc iaculis eros orci, ac accumsan eros malesuada ut. Ut semper augue felis, nec sodales lorem consectetur non. Cras gravida eleifend est, et sagittis eros imperdiet congue. Fusce id tellus dapibus nunc scelerisque tempus. Donec tempor placerat libero, in commodo nisi bibendum eu. Donec id eros non est sollicitudin luctus. Duis bibendum bibendum tellus nec viverra. Aliquam non faucibus ex, nec luctus dui. Curabitur efficitur varius urna non dignissim. Suspendisse elit elit, ultrices in elementum eu, tempor at magna.\\n\\nNunc in purus sit amet mi laoreet pulvinar placerat eget sapien. Donec vel felis at dui ultricies euismod quis vel neque. Donec tincidunt urna non eros pretium blandit. Nullam congue tincidunt condimentum. Curabitur et libero nibh. Proin ultricies risus id imperdiet scelerisque. Suspendisse purus mi, viverra vitae risus ut, tempus tincidunt enim. Ut luctus lobortis nisl, eget venenatis tortor cursus non. Mauris finibus nisl quis gravida ultricies. Fusce elementum lacus sit amet nunc congue, in porta nulla tincidunt.\\n\\nMauris ante risus, imperdiet blandit posuere in, blandit eu ipsum. Integer et auctor arcu. Integer quis elementum purus. Nunc in ultricies nisl, sed rutrum risus. Suspendisse venenatis eros nec lorem rhoncus, in scelerisque velit condimentum. Etiam condimentum quam felis, in elementum odio mattis et. In ut nibh porttitor, hendrerit tellus vel, luctus magna. Vestibulum et ligula et dolor pellentesque porta. Aenean efficitur porta massa et bibendum. Nulla vehicula sem in risus volutpat, a eleifend elit maximus.\\n\\nProin orci lorem, auctor a felis eu, pretium lobortis nulla. Phasellus aliquam efficitur interdum. Sed sit amet velit rutrum est dictum facilisis. Duis cursus enim at nisl tincidunt, eu molestie elit vehicula. Cras pellentesque nisl id enim feugiat fringilla. In quis tincidunt neque. Nam eu consectetur dolor. Ut id interdum mauris. Mauris nunc tortor, placerat in tempor ut, vestibulum eu nisl. Integer vel dapibus ipsum. Nunc id erat pulvinar, tincidunt magna id, condimentum massa. Pellentesque consequat est eget odio placerat vehicula. Etiam augue neque, sagittis non leo eu, tristique scelerisque dui. Ut dui urna, blandit quis urna ac, tincidunt tristique turpis.\\n\\nSuspendisse venenatis rhoncus ligula ultrices condimentum. In id laoreet eros. Suspendisse suscipit fringilla leo id euismod. Sed in quam libero. Ut at ligula tellus. Sed tristique gravida dui, at egestas odio aliquam iaculis. Praesent imperdiet velit quis nibh consequat, quis pretium sem sagittis. Donec tortor ex, congue sit amet pulvinar ac, rutrum non est. Praesent ipsum magna, venenatis sit amet vulputate id, eleifend ac ipsum.\\n\\nIn consequat, nisi iaculis laoreet elementum, massa mauris varius nisi, et porta nisi velit at urna. Maecenas sit amet aliquet eros, a rhoncus nisl. Maecenas convallis enim nunc. Morbi purus nisl, aliquam ac tincidunt sed, mattis in augue. Quisque et elementum quam, vitae maximus orci. Suspendisse hendrerit risus nec vehicula placerat. Nulla et lectus nunc. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.\\n\\nEtiam ut sodales ex. Nulla luctus, magna eu scelerisque sagittis, nibh quam consectetur neque, non rutrum dolor metus nec ex. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed egestas augue elit, sollicitudin accumsan massa lobortis ac. Curabitur placerat, dolor a aliquam maximus, velit ipsum laoreet ligula, id ullamcorper lacus nibh eget nisl. Donec eget lacus venenatis enim consequat auctor vel in.\\n\"\n expiration_time {\n seconds: 1554158728\n }\n keys {\n keys {\n ed25519: \"\\340\\310\\354\\'X\\245\\207\\237\\372\\302&\\241<\\fQky\\236r\\343QA\\240\\335\\202\\217\\224\\323y\\210\\244\\267\"\n }\n }\n memo: \"Hello memo\"\n}\nnode_account_i_d {\n account_num: 5005\n realm_num: 0\n shard_num: 0\n}\ntransaction_fee: 100000\ntransaction_i_d {\n account_i_d {\n account_num: 5006\n realm_num: 0\n shard_num: 0\n }\n transaction_valid_start {\n seconds: 1554158542\n }\n}\ntransaction_valid_duration {\n seconds: 120\n}" +] \ No newline at end of file diff --git a/sdk/src/test/java/com/hedera/hashgraph/sdk/FileUpdateTransactionTest.snap b/sdk/src/test/java/com/hedera/hashgraph/sdk/FileUpdateTransactionTest.snap index ec656308c0..6d7a01c5b8 100644 --- a/sdk/src/test/java/com/hedera/hashgraph/sdk/FileUpdateTransactionTest.snap +++ b/sdk/src/test/java/com/hedera/hashgraph/sdk/FileUpdateTransactionTest.snap @@ -1,3 +1,7 @@ com.hedera.hashgraph.sdk.FileUpdateTransactionTest.shouldSerialize=[ "# com.hedera.hashgraph.sdk.proto.TransactionBody\nfile_update {\n contents: \"\\001\\002\\003\\004\\005\"\n expiration_time {\n seconds: 1554158728\n }\n file_i_d {\n file_num: 6006\n realm_num: 0\n shard_num: 0\n }\n keys {\n keys {\n ed25519: \"\\340\\310\\354\\'X\\245\\207\\237\\372\\302&\\241<\\fQky\\236r\\343QA\\240\\335\\202\\217\\224\\323y\\210\\244\\267\"\n }\n }\n memo {\n value: \"Hello memo\"\n }\n}\nnode_account_i_d {\n account_num: 5005\n realm_num: 0\n shard_num: 0\n}\ntransaction_fee: 100000\ntransaction_i_d {\n account_i_d {\n account_num: 5006\n realm_num: 0\n shard_num: 0\n }\n transaction_valid_start {\n seconds: 1554158542\n }\n}\ntransaction_valid_duration {\n seconds: 120\n}" ] + +com.hedera.hashgraph.sdk.FileUpdateTransactionTest.shouldSerializeBigContents=[ + "# com.hedera.hashgraph.sdk.proto.TransactionBody\nfile_update {\n contents: \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur aliquam augue sem, ut mattis dui laoreet a. Curabitur consequat est euismod, scelerisque metus et, tristique dui. Nulla commodo mauris ut faucibus ultricies. Quisque venenatis nisl nec augue tempus, at efficitur elit eleifend. Duis pharetra felis metus, sed dapibus urna vehicula id. Duis non venenatis turpis, sit amet ornare orci. Donec non interdum quam. Sed finibus nunc et risus finibus, non sagittis lorem cursus. Proin pellentesque tempor aliquam. Sed congue nisl in enim bibendum, condimentum vehicula nisi feugiat.\\n\\nSuspendisse non sodales arcu. Suspendisse sodales, lorem ac mollis blandit, ipsum neque porttitor nulla, et sodales arcu ante fermentum tellus. Integer sagittis dolor sed augue fringilla accumsan. Cras vitae finibus arcu, sit amet varius dolor. Etiam id finibus dolor, vitae luctus velit. Proin efficitur augue nec pharetra accumsan. Aliquam lobortis nisl diam, vel fermentum purus finibus id. Etiam at finibus orci, et tincidunt turpis. Aliquam imperdiet congue lacus vel facilisis. Phasellus id magna vitae enim dapibus vestibulum vitae quis augue. Morbi eu consequat enim. Maecenas neque nulla, pulvinar sit amet consequat sed, tempor sed magna. Mauris lacinia sem feugiat faucibus aliquet. Etiam congue non turpis at commodo. Nulla facilisi.\\n\\nNunc velit turpis, cursus ornare fringilla eu, lacinia posuere leo. Mauris rutrum ultricies dui et suscipit. Curabitur in euismod ligula. Curabitur vitae faucibus orci. Phasellus volutpat vestibulum diam sit amet vestibulum. In vel purus leo. Nulla condimentum lectus vestibulum lectus faucibus, id lobortis eros consequat. Proin mollis libero elit, vel aliquet nisi imperdiet et. Morbi ornare est velit, in vehicula nunc malesuada quis. Donec vehicula convallis interdum.\\n\\nInteger pellentesque in nibh vitae aliquet. Ut at justo id libero dignissim hendrerit. Interdum et malesuada fames ac ante ipsum primis in faucibus. Praesent quis ornare lectus. Nam malesuada non diam quis cursus. Phasellus a libero ligula. Suspendisse ligula elit, congue et nisi sit amet, cursus euismod dolor. Morbi aliquam, nulla a posuere pellentesque, diam massa ornare risus, nec eleifend neque eros et elit.\\n\\nPellentesque a sodales dui. Sed in efficitur ante. Duis eget volutpat elit, et ornare est. Nam felis dolor, placerat mattis diam id, maximus lobortis quam. Sed pellentesque lobortis sem sed placerat. Pellentesque augue odio, molestie sed lectus sit amet, congue volutpat massa. Quisque congue consequat nunc id fringilla. Duis semper nulla eget enim venenatis dapibus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Pellentesque varius turpis nibh, sit amet malesuada mauris malesuada quis. Vivamus dictum egestas placerat. Vivamus id augue elit.\\n\\nCras fermentum volutpat eros, vitae euismod lorem viverra nec. Donec lectus augue, porta eleifend odio sit amet, condimentum rhoncus urna. Nunc sed odio velit. Morbi non cursus odio, eget imperdiet erat. Nunc rhoncus massa non neque volutpat, sit amet faucibus ante congue. Phasellus nec lorem vel leo accumsan lobortis. Maecenas id ligula bibendum purus suscipit posuere ac eget diam. Nam in quam pretium, semper erat auctor, iaculis odio. Maecenas placerat, nisi ac elementum tempor, felis nulla porttitor orci, ac rhoncus diam justo in elit. Etiam lobortis fermentum ligula in tincidunt. Donec quis vestibulum nunc. Sed eros diam, interdum in porta lobortis, gravida eu magna. Donec diam purus, finibus et sollicitudin quis, fringilla nec nisi. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Curabitur ultricies sagittis dapibus. Etiam ullamcorper aliquet libero, eu venenatis mauris suscipit id.\\n\\nUt interdum eleifend sem, vel bibendum ipsum volutpat eget. Nunc ac dignissim augue. Aliquam ornare aliquet magna id dignissim. Vestibulum velit sem, lacinia eu rutrum in, rhoncus vitae mauris. Pellentesque scelerisque pulvinar mauris non cursus. Integer id dolor porta, bibendum sem vel, pretium tortor. Fusce a nisi convallis, interdum quam condimentum, suscipit dolor. Sed magna diam, efficitur non nunc in, tincidunt varius mi. Aliquam ullamcorper nulla eu fermentum bibendum. Vivamus a felis pretium, hendrerit enim vitae, hendrerit leo. Suspendisse lacinia lectus a diam consectetur suscipit. Aenean hendrerit nisl sed diam venenatis pellentesque. Nullam egestas lectus a consequat pharetra. Vivamus ornare tellus auctor, facilisis lacus id, feugiat dui. Nam id est ut est rhoncus varius.\\n\\nAenean vel vehicula erat. Aenean gravida risus vitae purus sodales, quis dictum enim porta. Ut elit elit, fermentum sed posuere non, accumsan eu justo. Integer porta malesuada quam, et elementum massa suscipit nec. Donec in elit diam. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis suscipit vel ante volutpat vestibulum.\\n\\nPellentesque ex arcu, euismod et sapien ut, vulputate suscipit enim. Donec mattis sagittis augue, et mattis lacus. Cras placerat consequat lorem sed luctus. Nam suscipit aliquam sem ac imperdiet. Mauris a semper augue, pulvinar fringilla magna. Integer pretium massa non risus commodo hendrerit. Sed dictum libero id erat sodales mattis. Etiam auctor dolor lectus, ut sagittis enim lobortis vitae. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Curabitur nec orci lobortis, cursus risus eget, sollicitudin massa. Integer vel tincidunt mi, id eleifend quam. Nullam facilisis nisl eu mauris congue, vitae euismod nisi malesuada. Vivamus sit amet urna et libero sagittis dictum.\\n\\nIn hac habitasse platea dictumst. Aliquam erat volutpat. Ut dictum, mi a viverra venenatis, mi urna pulvinar nisi, nec gravida lectus diam eget urna. Ut dictum sit amet nisl ut dignissim. Sed sed mauris scelerisque, efficitur augue in, vulputate turpis. Proin dolor justo, bibendum et sollicitudin feugiat, imperdiet sed mi. Sed elementum vitae massa vel lobortis. Cras vitae massa sit amet libero dictum tempus.\\n\\nVivamus ut mauris lectus. Curabitur placerat ornare scelerisque. Cras malesuada nunc quis tortor pretium bibendum vel sed dui. Cras lobortis nibh eu erat blandit, sit amet consequat neque fermentum. Phasellus imperdiet molestie tristique. Cras auctor purus erat, id mollis ligula porttitor eget. Mauris porta pharetra odio et finibus. Suspendisse eu est a ligula bibendum cursus. Mauris ac laoreet libero. Nullam volutpat sem quis rhoncus gravida.\\n\\nDonec malesuada lacus ac iaculis cursus. Sed sem orci, feugiat ac est ut, ultricies posuere nisi. Suspendisse potenti. Phasellus ut ultricies purus. Etiam sem tortor, fermentum quis aliquam eget, consequat ut nulla. Aliquam dictum metus in mi fringilla, vel gravida nulla accumsan. Cras aliquam eget leo vel posuere. Vivamus vitae malesuada nunc. Morbi placerat magna mi, id suscipit lacus auctor quis. Nam at lorem vel odio finibus fringilla ut ac velit. Donec laoreet at nibh quis vehicula.\\n\\nFusce ac tristique nisi. Donec leo nisi, consectetur at tellus sit amet, consectetur ultrices dui. Quisque gravida mollis tempor. Maecenas semper, sapien ut dignissim feugiat, massa enim viverra dolor, non varius eros nulla nec felis. Nunc massa lacus, ornare et feugiat id, bibendum quis purus. Praesent viverra elit sit amet purus consectetur venenatis. Maecenas nibh risus, elementum sit amet enim sagittis, ultrices malesuada lectus. Vivamus non felis ante. Ut vulputate ex arcu. Aliquam porta gravida porta. Aliquam eros leo, malesuada quis eros non, maximus tristique neque. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Etiam ligula orci, mollis vel luctus nec, venenatis vitae est. Fusce rutrum convallis nisi.\\n\\nNunc laoreet eget nibh in feugiat. Pellentesque nec arcu cursus, gravida dolor a, pellentesque nisi. Praesent vel justo blandit, placerat risus eget, consectetur orci. Sed maximus metus mi, ut euismod augue ultricies in. Nunc id risus hendrerit, aliquet lorem nec, congue justo. Vestibulum vel nunc ac est euismod mattis ac vitae nulla. Donec blandit luctus mauris, sit amet bibendum dui egestas et. Aenean nec lorem nec elit ornare rutrum nec eget ligula. Fusce a ipsum vitae neque elementum pharetra. Pellentesque ullamcorper ullamcorper libero, vitae porta sem sagittis vel. Interdum et malesuada fames ac ante ipsum primis in faucibus.\\n\\nDuis at massa sit amet risus pellentesque varius sit amet vitae eros. Cras tempor aliquet sapien, vehicula varius neque volutpat et. Donec purus nibh, pellentesque ut lobortis nec, ultricies ultricies nisl. Sed accumsan ut dui sit amet vulputate. Suspendisse eu facilisis massa, a hendrerit mauris. Nulla elementum molestie tincidunt. Donec mi justo, ornare vel tempor id, gravida et orci. Nam molestie erat nec nisi bibendum accumsan. Duis vitae tempor ante. Morbi congue mauris vel sagittis facilisis. Vivamus vehicula odio orci, a tempor nibh euismod in. Proin mattis, nibh at feugiat porta, purus velit posuere felis, quis volutpat sapien dui vel odio. Nam fermentum sem nec euismod aliquet. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aliquam erat volutpat.\\n\\nMauris congue lacus tortor. Pellentesque arcu eros, accumsan imperdiet porttitor vitae, mattis nec justo. Nullam ac aliquam mauris. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse potenti. Fusce accumsan tempus felis a sagittis. Maecenas et velit odio. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Aliquam eros lacus, volutpat non urna sed, tincidunt ullamcorper elit. Sed sit amet gravida libero. In varius mi vel diam sollicitudin mollis.\\n\\nAenean varius, diam vitae hendrerit feugiat, libero augue ultrices odio, eget consequat sem tellus eu nisi. Nam dapibus enim et auctor sollicitudin. Nunc iaculis eros orci, ac accumsan eros malesuada ut. Ut semper augue felis, nec sodales lorem consectetur non. Cras gravida eleifend est, et sagittis eros imperdiet congue. Fusce id tellus dapibus nunc scelerisque tempus. Donec tempor placerat libero, in commodo nisi bibendum eu. Donec id eros non est sollicitudin luctus. Duis bibendum bibendum tellus nec viverra. Aliquam non faucibus ex, nec luctus dui. Curabitur efficitur varius urna non dignissim. Suspendisse elit elit, ultrices in elementum eu, tempor at magna.\\n\\nNunc in purus sit amet mi laoreet pulvinar placerat eget sapien. Donec vel felis at dui ultricies euismod quis vel neque. Donec tincidunt urna non eros pretium blandit. Nullam congue tincidunt condimentum. Curabitur et libero nibh. Proin ultricies risus id imperdiet scelerisque. Suspendisse purus mi, viverra vitae risus ut, tempus tincidunt enim. Ut luctus lobortis nisl, eget venenatis tortor cursus non. Mauris finibus nisl quis gravida ultricies. Fusce elementum lacus sit amet nunc congue, in porta nulla tincidunt.\\n\\nMauris ante risus, imperdiet blandit posuere in, blandit eu ipsum. Integer et auctor arcu. Integer quis elementum purus. Nunc in ultricies nisl, sed rutrum risus. Suspendisse venenatis eros nec lorem rhoncus, in scelerisque velit condimentum. Etiam condimentum quam felis, in elementum odio mattis et. In ut nibh porttitor, hendrerit tellus vel, luctus magna. Vestibulum et ligula et dolor pellentesque porta. Aenean efficitur porta massa et bibendum. Nulla vehicula sem in risus volutpat, a eleifend elit maximus.\\n\\nProin orci lorem, auctor a felis eu, pretium lobortis nulla. Phasellus aliquam efficitur interdum. Sed sit amet velit rutrum est dictum facilisis. Duis cursus enim at nisl tincidunt, eu molestie elit vehicula. Cras pellentesque nisl id enim feugiat fringilla. In quis tincidunt neque. Nam eu consectetur dolor. Ut id interdum mauris. Mauris nunc tortor, placerat in tempor ut, vestibulum eu nisl. Integer vel dapibus ipsum. Nunc id erat pulvinar, tincidunt magna id, condimentum massa. Pellentesque consequat est eget odio placerat vehicula. Etiam augue neque, sagittis non leo eu, tristique scelerisque dui. Ut dui urna, blandit quis urna ac, tincidunt tristique turpis.\\n\\nSuspendisse venenatis rhoncus ligula ultrices condimentum. In id laoreet eros. Suspendisse suscipit fringilla leo id euismod. Sed in quam libero. Ut at ligula tellus. Sed tristique gravida dui, at egestas odio aliquam iaculis. Praesent imperdiet velit quis nibh consequat, quis pretium sem sagittis. Donec tortor ex, congue sit amet pulvinar ac, rutrum non est. Praesent ipsum magna, venenatis sit amet vulputate id, eleifend ac ipsum.\\n\\nIn consequat, nisi iaculis laoreet elementum, massa mauris varius nisi, et porta nisi velit at urna. Maecenas sit amet aliquet eros, a rhoncus nisl. Maecenas convallis enim nunc. Morbi purus nisl, aliquam ac tincidunt sed, mattis in augue. Quisque et elementum quam, vitae maximus orci. Suspendisse hendrerit risus nec vehicula placerat. Nulla et lectus nunc. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.\\n\\nEtiam ut sodales ex. Nulla luctus, magna eu scelerisque sagittis, nibh quam consectetur neque, non rutrum dolor metus nec ex. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed egestas augue elit, sollicitudin accumsan massa lobortis ac. Curabitur placerat, dolor a aliquam maximus, velit ipsum laoreet ligula, id ullamcorper lacus nibh eget nisl. Donec eget lacus venenatis enim consequat auctor vel in.\\n\"\n expiration_time {\n seconds: 1554158728\n }\n file_i_d {\n file_num: 6006\n realm_num: 0\n shard_num: 0\n }\n keys {\n keys {\n ed25519: \"\\340\\310\\354\\'X\\245\\207\\237\\372\\302&\\241<\\fQky\\236r\\343QA\\240\\335\\202\\217\\224\\323y\\210\\244\\267\"\n }\n }\n memo {\n value: \"Hello memo\"\n }\n}\nnode_account_i_d {\n account_num: 5005\n realm_num: 0\n shard_num: 0\n}\ntransaction_fee: 100000\ntransaction_i_d {\n account_i_d {\n account_num: 5006\n realm_num: 0\n shard_num: 0\n }\n transaction_valid_start {\n seconds: 1554158542\n }\n}\ntransaction_valid_duration {\n seconds: 120\n}" +] \ No newline at end of file From 650872d260528b811ec2fa6499ee9e1e33eb0bc5 Mon Sep 17 00:00:00 2001 From: David Campbell Date: Wed, 24 Jun 2026 23:04:48 +0100 Subject: [PATCH 2/2] feat: implement automatic chunking for FileCreate and FileUpdate transactions (#1983) Signed-off-by: David Campbell --- .../hashgraph/sdk/ChunkedTransaction.java | 45 ++++++ .../hashgraph/sdk/FileAppendTransaction.java | 24 ++- .../hashgraph/sdk/FileCreateTransaction.java | 123 +++++++++------- .../hashgraph/sdk/FileUpdateTransaction.java | 138 ++++++++++-------- .../sdk/TopicMessageSubmitTransaction.java | 5 + .../sdk/FileCreateTransactionTest.snap | 4 + .../sdk/FileUpdateTransactionTest.snap | 4 + 7 files changed, 208 insertions(+), 135 deletions(-) diff --git a/sdk/src/main/java/com/hedera/hashgraph/sdk/ChunkedTransaction.java b/sdk/src/main/java/com/hedera/hashgraph/sdk/ChunkedTransaction.java index 57993a8c9f..e667348613 100644 --- a/sdk/src/main/java/com/hedera/hashgraph/sdk/ChunkedTransaction.java +++ b/sdk/src/main/java/com/hedera/hashgraph/sdk/ChunkedTransaction.java @@ -118,6 +118,51 @@ T setData(String text) { // noinspection unchecked return (T) this; } + + /** + * Checks whether {@code innerSignedTransactions} is not empty. + * + * @return {@code true} if {@code innerSignedTransactions} is not empty; otherwise {@code false} + */ + boolean hasInnerSignedTransactions(){ + return (!innerSignedTransactions.isEmpty()); + } + + /** + * Assigns the data via {@code innerSignedTransactions}. + * + * @return {@code this} + * @throws IllegalArgumentException if {@code innerSignedTransactions} is empty + */ + T setDataFromInnerSignedTransactions() { + if (!innerSignedTransactions.isEmpty()) { + try { + for (var i = 0; i < innerSignedTransactions.size(); i += nodeAccountIds.isEmpty() ? 1 : nodeAccountIds.size()) { + ByteString content = extractContents(TransactionBody.parseFrom(innerSignedTransactions.get(i).getBodyBytes())); + data = data.concat(content); + } + return (T) this; + } catch (InvalidProtocolBufferException exc) { + throw new IllegalArgumentException(exc.getMessage()); + } + } + return (T) this; + } + + /** + * Extracts the content bytes from a {@link TransactionBody}. + *

+ * This is a template method used by + * {@link #setDataFromInnerSignedTransactions()} to consolidate content from + * multiple inner signed transactions. Because different transaction types + * (e.g., FileCreate, FileUpdate, FileAppend) store their content in different + * fields of the protobuf body, child classes must implement this method to + * specify the correct field to extract. + * + * @param body The protobuf transaction body to extract data from. + * @return The {@link ByteString} representing the content of the transaction. + */ + protected abstract ByteString extractContents(TransactionBody body); /** * Retrieve the maximum number of chunks. diff --git a/sdk/src/main/java/com/hedera/hashgraph/sdk/FileAppendTransaction.java b/sdk/src/main/java/com/hedera/hashgraph/sdk/FileAppendTransaction.java index 04842cad5c..b0d0a283e6 100644 --- a/sdk/src/main/java/com/hedera/hashgraph/sdk/FileAppendTransaction.java +++ b/sdk/src/main/java/com/hedera/hashgraph/sdk/FileAppendTransaction.java @@ -186,23 +186,17 @@ void initFromTransactionBody() { fileId = FileId.fromProtobuf(body.getFileID()); } - if (!innerSignedTransactions.isEmpty()) { - try { - for (var i = 0; - i < innerSignedTransactions.size(); - i += nodeAccountIds.isEmpty() ? 1 : nodeAccountIds.size()) { - data = data.concat(TransactionBody.parseFrom( - innerSignedTransactions.get(i).getBodyBytes()) - .getFileAppend() - .getContents()); - } - } catch (InvalidProtocolBufferException exc) { - throw new IllegalArgumentException(exc.getMessage()); - } + if (hasInnerSignedTransactions()) { + setDataFromInnerSignedTransactions(); } else { - data = body.getContents(); + setData(body.getContents().toByteArray()); } } + + @Override + protected ByteString extractContents(TransactionBody body) { + return body.getFileAppend().getContents(); + } /** * Build the transaction body. @@ -214,7 +208,7 @@ FileAppendTransactionBody.Builder build() { if (fileId != null) { builder.setFileID(fileId.toProtobuf()); } - builder.setContents(data); + builder.setContents(getData()); return builder; } diff --git a/sdk/src/main/java/com/hedera/hashgraph/sdk/FileCreateTransaction.java b/sdk/src/main/java/com/hedera/hashgraph/sdk/FileCreateTransaction.java index ea2417c4f4..6cc8462ff2 100644 --- a/sdk/src/main/java/com/hedera/hashgraph/sdk/FileCreateTransaction.java +++ b/sdk/src/main/java/com/hedera/hashgraph/sdk/FileCreateTransaction.java @@ -7,6 +7,7 @@ import com.hedera.hashgraph.sdk.proto.FileServiceGrpc; import com.hedera.hashgraph.sdk.proto.SchedulableTransactionBody; import com.hedera.hashgraph.sdk.proto.TransactionBody; +import com.hedera.hashgraph.sdk.proto.TransactionID; import com.hedera.hashgraph.sdk.proto.TransactionResponse; import io.grpc.MethodDescriptor; import java.nio.charset.StandardCharsets; @@ -23,7 +24,7 @@ * Create a new file. * * If successful, the new file SHALL contain the (possibly empty) content - * provided in the `contents` field.
+ * provided in the `data` field in {@link ChunkedTransaction}.
* When the current consensus time exceeds the `expirationTime` value, the * network SHALL expire the file, and MAY archive the state entry. * @@ -60,7 +61,7 @@ * After the file is created, the FileID for it SHALL be returned in the * transaction receipt, and SHALL be recorded in the transaction record. */ -public final class FileCreateTransaction extends Transaction { +public final class FileCreateTransaction extends ChunkedTransaction { @Nullable private Instant expirationTime = null; @@ -70,7 +71,6 @@ public final class FileCreateTransaction extends TransactionSet the given byte array as the file's contents. - * - *

This may be omitted to create an empty file. - * - *

Note that total size for a given transaction is limited to 6KiB (as of March 2020) by the - * network; if you exceed this you may receive a {@link PrecheckStatusException} - * with {@link com.hedera.hashgraph.sdk.Status#TRANSACTION_OVERSIZE}. - * - *

In this case, you can use {@link FileAppendTransaction}, which automatically breaks the contents - * into chunks for you, to append contents of arbitrary size. - * - * @param bytes the contents of the file. - * @return {@code this} - */ - public FileCreateTransaction setContents(byte[] bytes) { - requireNotFrozen(); - Objects.requireNonNull(bytes); - contents = Arrays.copyOf(bytes, bytes.length); - return this; - } + *

+ * Set the given byte array as the file's contents. + * + *

+ * This may be omitted to create an empty file. + * + * @param bytes the contents of the file. + * @return {@code this} + */ + public FileCreateTransaction setContents(byte[] bytes) { + requireNotFrozen(); + Objects.requireNonNull(bytes); + return setData(bytes); + } /** - *

Encode the given {@link String} as UTF-8 and set it as the file's contents. - * - *

This may be omitted to create an empty file. - * - *

The string can later be recovered from {@link FileContentsQuery#execute(Client)} - * via {@link String#String(byte[], java.nio.charset.Charset)} using - * {@link java.nio.charset.StandardCharsets#UTF_8}. - * - *

Note that total size for a given transaction is limited to 6KiB (as of March 2020) by the - * network; if you exceed this you may receive a {@link PrecheckStatusException} - * with {@link com.hedera.hashgraph.sdk.Status#TRANSACTION_OVERSIZE}. - * - *

In this case, you can use {@link FileAppendTransaction}, which automatically breaks the contents - * into chunks for you, to append contents of arbitrary size. - * - * @param text the contents of the file. - * @return {@code this} - */ - public FileCreateTransaction setContents(String text) { - requireNotFrozen(); - Objects.requireNonNull(text); - contents = text.getBytes(StandardCharsets.UTF_8); - return this; - } + *

+ * Encode the given {@link String} as UTF-8 and set it as the file's contents. + * + *

+ * This may be omitted to create an empty file. + * + *

+ * The string can later be recovered from + * {@link FileContentsQuery#execute(Client)} via + * {@link String#String(byte[], java.nio.charset.Charset)} using + * {@link java.nio.charset.StandardCharsets#UTF_8}. + * + * @param text the contents of the file. + * @return {@code this} + */ + public FileCreateTransaction setContents(String text) { + requireNotFrozen(); + Objects.requireNonNull(text); + return setData(text); + } /** * Extract the file's memo field. @@ -274,8 +264,18 @@ void initFromTransactionBody() { if (body.hasKeys()) { keys = KeyList.fromProtobuf(body.getKeys(), null); } - contents = body.getContents().toByteArray(); fileMemo = body.getMemo(); + + if (hasInnerSignedTransactions()) { + setDataFromInnerSignedTransactions(); + } else { + setData(body.getContents().toByteArray()); + } + } + + @Override + protected ByteString extractContents(TransactionBody body) { + return body.getFileCreate().getContents(); } /** @@ -295,11 +295,22 @@ FileCreateTransactionBody.Builder build() { if (keys != null) { builder.setKeys(keys.toProtobuf()); } - builder.setContents(ByteString.copyFrom(contents)); + builder.setContents(getData()); builder.setMemo(fileMemo); return builder; } + + @Override + void onFreezeChunk( + TransactionBody.Builder body, + @Nullable TransactionID initialTransactionId, + int startIndex, + int endIndex, + int chunk, + int total) { + body.setFileCreate(build().setContents(data.substring(startIndex, endIndex))); + } @Override void onFreeze(TransactionBody.Builder bodyBuilder) { diff --git a/sdk/src/main/java/com/hedera/hashgraph/sdk/FileUpdateTransaction.java b/sdk/src/main/java/com/hedera/hashgraph/sdk/FileUpdateTransaction.java index 1aff1ce0be..a7f6576afe 100644 --- a/sdk/src/main/java/com/hedera/hashgraph/sdk/FileUpdateTransaction.java +++ b/sdk/src/main/java/com/hedera/hashgraph/sdk/FileUpdateTransaction.java @@ -8,6 +8,7 @@ import com.hedera.hashgraph.sdk.proto.FileUpdateTransactionBody; import com.hedera.hashgraph.sdk.proto.SchedulableTransactionBody; import com.hedera.hashgraph.sdk.proto.TransactionBody; +import com.hedera.hashgraph.sdk.proto.TransactionID; import com.hedera.hashgraph.sdk.proto.TransactionResponse; import io.grpc.MethodDescriptor; import java.nio.charset.StandardCharsets; @@ -44,7 +45,7 @@ * * See Hedera Documentation */ -public final class FileUpdateTransaction extends Transaction { +public final class FileUpdateTransaction extends ChunkedTransaction { @Nullable private FileId fileId = null; @@ -57,8 +58,6 @@ public final class FileUpdateTransaction extends Transaction - * If the contents of the file are longer than the given byte array, then the file will - * be truncated. - *

- * Note that total size for a given transaction is limited to 6KiB (as of March 2020) by the - * network; if you exceed this you may receive a {@link Status#TRANSACTION_OVERSIZE}. - *

- * In this case, you will need to keep the initial file contents under ~6KiB and - * then use {@link FileAppendTransaction}, which automatically breaks the contents - * into chunks for you, to append contents of arbitrary size. - * - * @param bytes the bytes to replace the contents of the file with. - * @return {@code this} - * @see #setContents(String) for an overload which takes a String. - * @see FileAppendTransaction if you merely want to add data to a file's existing contents. - */ - public FileUpdateTransaction setContents(byte[] bytes) { - requireNotFrozen(); - Objects.requireNonNull(bytes); - contents = Arrays.copyOf(bytes, bytes.length); - return this; - } + *

+ * If set, replace contents of the file identified by {@link #setFileId(FileId)} + * with the given bytes. + * + *

+ * If the contents of the file are longer than the given byte array, then the + * file will be truncated. + * + * @param bytes the bytes to replace the contents of the file with. + * @return {@code this} + * @see #setContents(String) for an overload which takes a String. + * @see FileAppendTransaction if you merely want to add data to a file's + * existing contents. + */ + public FileUpdateTransaction setContents(byte[] bytes) { + requireNotFrozen(); + Objects.requireNonNull(bytes); + return setData(bytes); + } /** - * If set, encode the given {@link String} as UTF-8 and replace the contents of the file - * identified by {@link #setFileId(FileId)}. - *

- * If the contents of the file are longer than the UTF-8 encoding of the given string, then the - * file will be truncated. - *

- * The string can later be recovered from {@link FileContentsQuery#execute(Client)} - * via {@link String#String(byte[], java.nio.charset.Charset)} using - * {@link java.nio.charset.StandardCharsets#UTF_8}. - *

- * Note that total size for a given transaction is limited to 6KiB (as of March 2020) by the - * network; if you exceed this you may receive a {@link Status#TRANSACTION_OVERSIZE}. - *

- * In this case, you will need to keep the initial file contents under ~6KiB and - * then use {@link FileAppendTransaction}, which automatically breaks the contents - * into chunks for you, to append contents of arbitrary size. - * - * @param text the string to replace the contents of the file with. - * @return {@code this} - * @see #setContents(byte[]) for replacing the contents with arbitrary data. - * @see FileAppendTransaction if you merely want to add data to a file's existing contents. - */ - public FileUpdateTransaction setContents(String text) { - Objects.requireNonNull(text); - requireNotFrozen(); - contents = text.getBytes(StandardCharsets.UTF_8); - return this; - } + * If set, encode the given {@link String} as UTF-8 and replace the contents of + * the file identified by {@link #setFileId(FileId)}. + *

+ * If the contents of the file are longer than the UTF-8 encoding of the given + * string, then the file will be truncated. + *

+ * The string can later be recovered from + * {@link FileContentsQuery#execute(Client)} via + * {@link String#String(byte[], java.nio.charset.Charset)} using + * {@link java.nio.charset.StandardCharsets#UTF_8}. + * + * @param text the string to replace the contents of the file with. + * @return {@code this} + * @see #setContents(byte[]) for replacing the contents with arbitrary data. + * @see FileAppendTransaction if you merely want to add data to a file's + * existing contents. + */ + public FileUpdateTransaction setContents(String text) { + requireNotFrozen(); + Objects.requireNonNull(text); + return setData(text); + + } /** * Extract the file's memo up to 100 bytes. @@ -302,7 +291,17 @@ void initFromTransactionBody() { if (body.hasMemo()) { fileMemo = body.getMemo().getValue(); } - contents = body.getContents().toByteArray(); + + if (hasInnerSignedTransactions()) { + setDataFromInnerSignedTransactions(); + } else { + setData(body.getContents().toByteArray()); + } + } + + @Override + protected ByteString extractContents(TransactionBody body) { + return body.getFileUpdate().getContents(); } /** @@ -324,13 +323,24 @@ FileUpdateTransactionBody.Builder build() { if (expirationTimeDuration != null) { builder.setExpirationTime(InstantConverter.toProtobuf(expirationTimeDuration)); } - builder.setContents(ByteString.copyFrom(contents)); + builder.setContents(getData()); if (fileMemo != null) { builder.setMemo(StringValue.of(fileMemo)); } return builder; } + + @Override + void onFreezeChunk( + TransactionBody.Builder body, + @Nullable TransactionID initialTransactionId, + int startIndex, + int endIndex, + int chunk, + int total) { + body.setFileUpdate(build().setContents(data.substring(startIndex, endIndex))); + } @Override void validateChecksums(Client client) throws BadEntityIdException { diff --git a/sdk/src/main/java/com/hedera/hashgraph/sdk/TopicMessageSubmitTransaction.java b/sdk/src/main/java/com/hedera/hashgraph/sdk/TopicMessageSubmitTransaction.java index f9c8a4e196..18c833b06f 100644 --- a/sdk/src/main/java/com/hedera/hashgraph/sdk/TopicMessageSubmitTransaction.java +++ b/sdk/src/main/java/com/hedera/hashgraph/sdk/TopicMessageSubmitTransaction.java @@ -194,6 +194,11 @@ void initFromTransactionBody() { } } + @Override + protected ByteString extractContents(TransactionBody body) { + return body.getConsensusSubmitMessage().getContents(); + } + /** * Build the transaction body. * diff --git a/sdk/src/test/java/com/hedera/hashgraph/sdk/FileCreateTransactionTest.snap b/sdk/src/test/java/com/hedera/hashgraph/sdk/FileCreateTransactionTest.snap index d94af7c73b..da955a710b 100644 --- a/sdk/src/test/java/com/hedera/hashgraph/sdk/FileCreateTransactionTest.snap +++ b/sdk/src/test/java/com/hedera/hashgraph/sdk/FileCreateTransactionTest.snap @@ -1,3 +1,7 @@ com.hedera.hashgraph.sdk.FileCreateTransactionTest.shouldSerialize=[ "# com.hedera.hashgraph.sdk.proto.TransactionBody\nfile_create {\n contents: \"\\001\\002\\003\\004\"\n expiration_time {\n seconds: 1554158728\n }\n keys {\n keys {\n ed25519: \"\\340\\310\\354\\'X\\245\\207\\237\\372\\302&\\241<\\fQky\\236r\\343QA\\240\\335\\202\\217\\224\\323y\\210\\244\\267\"\n }\n }\n memo: \"Hello memo\"\n}\nnode_account_i_d {\n account_num: 5005\n realm_num: 0\n shard_num: 0\n}\ntransaction_fee: 100000\ntransaction_i_d {\n account_i_d {\n account_num: 5006\n realm_num: 0\n shard_num: 0\n }\n transaction_valid_start {\n seconds: 1554158542\n }\n}\ntransaction_valid_duration {\n seconds: 120\n}" ] + +com.hedera.hashgraph.sdk.FileCreateTransactionTest.shouldSerializeBigContents=[ + "# com.hedera.hashgraph.sdk.proto.TransactionBody\nfile_create {\n contents: \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur aliquam augue sem, ut mattis dui laoreet a. Curabitur consequat est euismod, scelerisque metus et, tristique dui. Nulla commodo mauris ut faucibus ultricies. Quisque venenatis nisl nec augue tempus, at efficitur elit eleifend. Duis pharetra felis metus, sed dapibus urna vehicula id. Duis non venenatis turpis, sit amet ornare orci. Donec non interdum quam. Sed finibus nunc et risus finibus, non sagittis lorem cursus. Proin pellentesque tempor aliquam. Sed congue nisl in enim bibendum, condimentum vehicula nisi feugiat.\\n\\nSuspendisse non sodales arcu. Suspendisse sodales, lorem ac mollis blandit, ipsum neque porttitor nulla, et sodales arcu ante fermentum tellus. Integer sagittis dolor sed augue fringilla accumsan. Cras vitae finibus arcu, sit amet varius dolor. Etiam id finibus dolor, vitae luctus velit. Proin efficitur augue nec pharetra accumsan. Aliquam lobortis nisl diam, vel fermentum purus finibus id. Etiam at finibus orci, et tincidunt turpis. Aliquam imperdiet congue lacus vel facilisis. Phasellus id magna vitae enim dapibus vestibulum vitae quis augue. Morbi eu consequat enim. Maecenas neque nulla, pulvinar sit amet consequat sed, tempor sed magna. Mauris lacinia sem feugiat faucibus aliquet. Etiam congue non turpis at commodo. Nulla facilisi.\\n\\nNunc velit turpis, cursus ornare fringilla eu, lacinia posuere leo. Mauris rutrum ultricies dui et suscipit. Curabitur in euismod ligula. Curabitur vitae faucibus orci. Phasellus volutpat vestibulum diam sit amet vestibulum. In vel purus leo. Nulla condimentum lectus vestibulum lectus faucibus, id lobortis eros consequat. Proin mollis libero elit, vel aliquet nisi imperdiet et. Morbi ornare est velit, in vehicula nunc malesuada quis. Donec vehicula convallis interdum.\\n\\nInteger pellentesque in nibh vitae aliquet. Ut at justo id libero dignissim hendrerit. Interdum et malesuada fames ac ante ipsum primis in faucibus. Praesent quis ornare lectus. Nam malesuada non diam quis cursus. Phasellus a libero ligula. Suspendisse ligula elit, congue et nisi sit amet, cursus euismod dolor. Morbi aliquam, nulla a posuere pellentesque, diam massa ornare risus, nec eleifend neque eros et elit.\\n\\nPellentesque a sodales dui. Sed in efficitur ante. Duis eget volutpat elit, et ornare est. Nam felis dolor, placerat mattis diam id, maximus lobortis quam. Sed pellentesque lobortis sem sed placerat. Pellentesque augue odio, molestie sed lectus sit amet, congue volutpat massa. Quisque congue consequat nunc id fringilla. Duis semper nulla eget enim venenatis dapibus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Pellentesque varius turpis nibh, sit amet malesuada mauris malesuada quis. Vivamus dictum egestas placerat. Vivamus id augue elit.\\n\\nCras fermentum volutpat eros, vitae euismod lorem viverra nec. Donec lectus augue, porta eleifend odio sit amet, condimentum rhoncus urna. Nunc sed odio velit. Morbi non cursus odio, eget imperdiet erat. Nunc rhoncus massa non neque volutpat, sit amet faucibus ante congue. Phasellus nec lorem vel leo accumsan lobortis. Maecenas id ligula bibendum purus suscipit posuere ac eget diam. Nam in quam pretium, semper erat auctor, iaculis odio. Maecenas placerat, nisi ac elementum tempor, felis nulla porttitor orci, ac rhoncus diam justo in elit. Etiam lobortis fermentum ligula in tincidunt. Donec quis vestibulum nunc. Sed eros diam, interdum in porta lobortis, gravida eu magna. Donec diam purus, finibus et sollicitudin quis, fringilla nec nisi. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Curabitur ultricies sagittis dapibus. Etiam ullamcorper aliquet libero, eu venenatis mauris suscipit id.\\n\\nUt interdum eleifend sem, vel bibendum ipsum volutpat eget. Nunc ac dignissim augue. Aliquam ornare aliquet magna id dignissim. Vestibulum velit sem, lacinia eu rutrum in, rhoncus vitae mauris. Pellentesque scelerisque pulvinar mauris non cursus. Integer id dolor porta, bibendum sem vel, pretium tortor. Fusce a nisi convallis, interdum quam condimentum, suscipit dolor. Sed magna diam, efficitur non nunc in, tincidunt varius mi. Aliquam ullamcorper nulla eu fermentum bibendum. Vivamus a felis pretium, hendrerit enim vitae, hendrerit leo. Suspendisse lacinia lectus a diam consectetur suscipit. Aenean hendrerit nisl sed diam venenatis pellentesque. Nullam egestas lectus a consequat pharetra. Vivamus ornare tellus auctor, facilisis lacus id, feugiat dui. Nam id est ut est rhoncus varius.\\n\\nAenean vel vehicula erat. Aenean gravida risus vitae purus sodales, quis dictum enim porta. Ut elit elit, fermentum sed posuere non, accumsan eu justo. Integer porta malesuada quam, et elementum massa suscipit nec. Donec in elit diam. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis suscipit vel ante volutpat vestibulum.\\n\\nPellentesque ex arcu, euismod et sapien ut, vulputate suscipit enim. Donec mattis sagittis augue, et mattis lacus. Cras placerat consequat lorem sed luctus. Nam suscipit aliquam sem ac imperdiet. Mauris a semper augue, pulvinar fringilla magna. Integer pretium massa non risus commodo hendrerit. Sed dictum libero id erat sodales mattis. Etiam auctor dolor lectus, ut sagittis enim lobortis vitae. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Curabitur nec orci lobortis, cursus risus eget, sollicitudin massa. Integer vel tincidunt mi, id eleifend quam. Nullam facilisis nisl eu mauris congue, vitae euismod nisi malesuada. Vivamus sit amet urna et libero sagittis dictum.\\n\\nIn hac habitasse platea dictumst. Aliquam erat volutpat. Ut dictum, mi a viverra venenatis, mi urna pulvinar nisi, nec gravida lectus diam eget urna. Ut dictum sit amet nisl ut dignissim. Sed sed mauris scelerisque, efficitur augue in, vulputate turpis. Proin dolor justo, bibendum et sollicitudin feugiat, imperdiet sed mi. Sed elementum vitae massa vel lobortis. Cras vitae massa sit amet libero dictum tempus.\\n\\nVivamus ut mauris lectus. Curabitur placerat ornare scelerisque. Cras malesuada nunc quis tortor pretium bibendum vel sed dui. Cras lobortis nibh eu erat blandit, sit amet consequat neque fermentum. Phasellus imperdiet molestie tristique. Cras auctor purus erat, id mollis ligula porttitor eget. Mauris porta pharetra odio et finibus. Suspendisse eu est a ligula bibendum cursus. Mauris ac laoreet libero. Nullam volutpat sem quis rhoncus gravida.\\n\\nDonec malesuada lacus ac iaculis cursus. Sed sem orci, feugiat ac est ut, ultricies posuere nisi. Suspendisse potenti. Phasellus ut ultricies purus. Etiam sem tortor, fermentum quis aliquam eget, consequat ut nulla. Aliquam dictum metus in mi fringilla, vel gravida nulla accumsan. Cras aliquam eget leo vel posuere. Vivamus vitae malesuada nunc. Morbi placerat magna mi, id suscipit lacus auctor quis. Nam at lorem vel odio finibus fringilla ut ac velit. Donec laoreet at nibh quis vehicula.\\n\\nFusce ac tristique nisi. Donec leo nisi, consectetur at tellus sit amet, consectetur ultrices dui. Quisque gravida mollis tempor. Maecenas semper, sapien ut dignissim feugiat, massa enim viverra dolor, non varius eros nulla nec felis. Nunc massa lacus, ornare et feugiat id, bibendum quis purus. Praesent viverra elit sit amet purus consectetur venenatis. Maecenas nibh risus, elementum sit amet enim sagittis, ultrices malesuada lectus. Vivamus non felis ante. Ut vulputate ex arcu. Aliquam porta gravida porta. Aliquam eros leo, malesuada quis eros non, maximus tristique neque. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Etiam ligula orci, mollis vel luctus nec, venenatis vitae est. Fusce rutrum convallis nisi.\\n\\nNunc laoreet eget nibh in feugiat. Pellentesque nec arcu cursus, gravida dolor a, pellentesque nisi. Praesent vel justo blandit, placerat risus eget, consectetur orci. Sed maximus metus mi, ut euismod augue ultricies in. Nunc id risus hendrerit, aliquet lorem nec, congue justo. Vestibulum vel nunc ac est euismod mattis ac vitae nulla. Donec blandit luctus mauris, sit amet bibendum dui egestas et. Aenean nec lorem nec elit ornare rutrum nec eget ligula. Fusce a ipsum vitae neque elementum pharetra. Pellentesque ullamcorper ullamcorper libero, vitae porta sem sagittis vel. Interdum et malesuada fames ac ante ipsum primis in faucibus.\\n\\nDuis at massa sit amet risus pellentesque varius sit amet vitae eros. Cras tempor aliquet sapien, vehicula varius neque volutpat et. Donec purus nibh, pellentesque ut lobortis nec, ultricies ultricies nisl. Sed accumsan ut dui sit amet vulputate. Suspendisse eu facilisis massa, a hendrerit mauris. Nulla elementum molestie tincidunt. Donec mi justo, ornare vel tempor id, gravida et orci. Nam molestie erat nec nisi bibendum accumsan. Duis vitae tempor ante. Morbi congue mauris vel sagittis facilisis. Vivamus vehicula odio orci, a tempor nibh euismod in. Proin mattis, nibh at feugiat porta, purus velit posuere felis, quis volutpat sapien dui vel odio. Nam fermentum sem nec euismod aliquet. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aliquam erat volutpat.\\n\\nMauris congue lacus tortor. Pellentesque arcu eros, accumsan imperdiet porttitor vitae, mattis nec justo. Nullam ac aliquam mauris. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse potenti. Fusce accumsan tempus felis a sagittis. Maecenas et velit odio. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Aliquam eros lacus, volutpat non urna sed, tincidunt ullamcorper elit. Sed sit amet gravida libero. In varius mi vel diam sollicitudin mollis.\\n\\nAenean varius, diam vitae hendrerit feugiat, libero augue ultrices odio, eget consequat sem tellus eu nisi. Nam dapibus enim et auctor sollicitudin. Nunc iaculis eros orci, ac accumsan eros malesuada ut. Ut semper augue felis, nec sodales lorem consectetur non. Cras gravida eleifend est, et sagittis eros imperdiet congue. Fusce id tellus dapibus nunc scelerisque tempus. Donec tempor placerat libero, in commodo nisi bibendum eu. Donec id eros non est sollicitudin luctus. Duis bibendum bibendum tellus nec viverra. Aliquam non faucibus ex, nec luctus dui. Curabitur efficitur varius urna non dignissim. Suspendisse elit elit, ultrices in elementum eu, tempor at magna.\\n\\nNunc in purus sit amet mi laoreet pulvinar placerat eget sapien. Donec vel felis at dui ultricies euismod quis vel neque. Donec tincidunt urna non eros pretium blandit. Nullam congue tincidunt condimentum. Curabitur et libero nibh. Proin ultricies risus id imperdiet scelerisque. Suspendisse purus mi, viverra vitae risus ut, tempus tincidunt enim. Ut luctus lobortis nisl, eget venenatis tortor cursus non. Mauris finibus nisl quis gravida ultricies. Fusce elementum lacus sit amet nunc congue, in porta nulla tincidunt.\\n\\nMauris ante risus, imperdiet blandit posuere in, blandit eu ipsum. Integer et auctor arcu. Integer quis elementum purus. Nunc in ultricies nisl, sed rutrum risus. Suspendisse venenatis eros nec lorem rhoncus, in scelerisque velit condimentum. Etiam condimentum quam felis, in elementum odio mattis et. In ut nibh porttitor, hendrerit tellus vel, luctus magna. Vestibulum et ligula et dolor pellentesque porta. Aenean efficitur porta massa et bibendum. Nulla vehicula sem in risus volutpat, a eleifend elit maximus.\\n\\nProin orci lorem, auctor a felis eu, pretium lobortis nulla. Phasellus aliquam efficitur interdum. Sed sit amet velit rutrum est dictum facilisis. Duis cursus enim at nisl tincidunt, eu molestie elit vehicula. Cras pellentesque nisl id enim feugiat fringilla. In quis tincidunt neque. Nam eu consectetur dolor. Ut id interdum mauris. Mauris nunc tortor, placerat in tempor ut, vestibulum eu nisl. Integer vel dapibus ipsum. Nunc id erat pulvinar, tincidunt magna id, condimentum massa. Pellentesque consequat est eget odio placerat vehicula. Etiam augue neque, sagittis non leo eu, tristique scelerisque dui. Ut dui urna, blandit quis urna ac, tincidunt tristique turpis.\\n\\nSuspendisse venenatis rhoncus ligula ultrices condimentum. In id laoreet eros. Suspendisse suscipit fringilla leo id euismod. Sed in quam libero. Ut at ligula tellus. Sed tristique gravida dui, at egestas odio aliquam iaculis. Praesent imperdiet velit quis nibh consequat, quis pretium sem sagittis. Donec tortor ex, congue sit amet pulvinar ac, rutrum non est. Praesent ipsum magna, venenatis sit amet vulputate id, eleifend ac ipsum.\\n\\nIn consequat, nisi iaculis laoreet elementum, massa mauris varius nisi, et porta nisi velit at urna. Maecenas sit amet aliquet eros, a rhoncus nisl. Maecenas convallis enim nunc. Morbi purus nisl, aliquam ac tincidunt sed, mattis in augue. Quisque et elementum quam, vitae maximus orci. Suspendisse hendrerit risus nec vehicula placerat. Nulla et lectus nunc. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.\\n\\nEtiam ut sodales ex. Nulla luctus, magna eu scelerisque sagittis, nibh quam consectetur neque, non rutrum dolor metus nec ex. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed egestas augue elit, sollicitudin accumsan massa lobortis ac. Curabitur placerat, dolor a aliquam maximus, velit ipsum laoreet ligula, id ullamcorper lacus nibh eget nisl. Donec eget lacus venenatis enim consequat auctor vel in.\\n\"\n expiration_time {\n seconds: 1554158728\n }\n keys {\n keys {\n ed25519: \"\\340\\310\\354\\'X\\245\\207\\237\\372\\302&\\241<\\fQky\\236r\\343QA\\240\\335\\202\\217\\224\\323y\\210\\244\\267\"\n }\n }\n memo: \"Hello memo\"\n}\nnode_account_i_d {\n account_num: 5005\n realm_num: 0\n shard_num: 0\n}\ntransaction_fee: 100000\ntransaction_i_d {\n account_i_d {\n account_num: 5006\n realm_num: 0\n shard_num: 0\n }\n transaction_valid_start {\n seconds: 1554158542\n }\n}\ntransaction_valid_duration {\n seconds: 120\n}" +] \ No newline at end of file diff --git a/sdk/src/test/java/com/hedera/hashgraph/sdk/FileUpdateTransactionTest.snap b/sdk/src/test/java/com/hedera/hashgraph/sdk/FileUpdateTransactionTest.snap index ec656308c0..6d7a01c5b8 100644 --- a/sdk/src/test/java/com/hedera/hashgraph/sdk/FileUpdateTransactionTest.snap +++ b/sdk/src/test/java/com/hedera/hashgraph/sdk/FileUpdateTransactionTest.snap @@ -1,3 +1,7 @@ com.hedera.hashgraph.sdk.FileUpdateTransactionTest.shouldSerialize=[ "# com.hedera.hashgraph.sdk.proto.TransactionBody\nfile_update {\n contents: \"\\001\\002\\003\\004\\005\"\n expiration_time {\n seconds: 1554158728\n }\n file_i_d {\n file_num: 6006\n realm_num: 0\n shard_num: 0\n }\n keys {\n keys {\n ed25519: \"\\340\\310\\354\\'X\\245\\207\\237\\372\\302&\\241<\\fQky\\236r\\343QA\\240\\335\\202\\217\\224\\323y\\210\\244\\267\"\n }\n }\n memo {\n value: \"Hello memo\"\n }\n}\nnode_account_i_d {\n account_num: 5005\n realm_num: 0\n shard_num: 0\n}\ntransaction_fee: 100000\ntransaction_i_d {\n account_i_d {\n account_num: 5006\n realm_num: 0\n shard_num: 0\n }\n transaction_valid_start {\n seconds: 1554158542\n }\n}\ntransaction_valid_duration {\n seconds: 120\n}" ] + +com.hedera.hashgraph.sdk.FileUpdateTransactionTest.shouldSerializeBigContents=[ + "# com.hedera.hashgraph.sdk.proto.TransactionBody\nfile_update {\n contents: \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur aliquam augue sem, ut mattis dui laoreet a. Curabitur consequat est euismod, scelerisque metus et, tristique dui. Nulla commodo mauris ut faucibus ultricies. Quisque venenatis nisl nec augue tempus, at efficitur elit eleifend. Duis pharetra felis metus, sed dapibus urna vehicula id. Duis non venenatis turpis, sit amet ornare orci. Donec non interdum quam. Sed finibus nunc et risus finibus, non sagittis lorem cursus. Proin pellentesque tempor aliquam. Sed congue nisl in enim bibendum, condimentum vehicula nisi feugiat.\\n\\nSuspendisse non sodales arcu. Suspendisse sodales, lorem ac mollis blandit, ipsum neque porttitor nulla, et sodales arcu ante fermentum tellus. Integer sagittis dolor sed augue fringilla accumsan. Cras vitae finibus arcu, sit amet varius dolor. Etiam id finibus dolor, vitae luctus velit. Proin efficitur augue nec pharetra accumsan. Aliquam lobortis nisl diam, vel fermentum purus finibus id. Etiam at finibus orci, et tincidunt turpis. Aliquam imperdiet congue lacus vel facilisis. Phasellus id magna vitae enim dapibus vestibulum vitae quis augue. Morbi eu consequat enim. Maecenas neque nulla, pulvinar sit amet consequat sed, tempor sed magna. Mauris lacinia sem feugiat faucibus aliquet. Etiam congue non turpis at commodo. Nulla facilisi.\\n\\nNunc velit turpis, cursus ornare fringilla eu, lacinia posuere leo. Mauris rutrum ultricies dui et suscipit. Curabitur in euismod ligula. Curabitur vitae faucibus orci. Phasellus volutpat vestibulum diam sit amet vestibulum. In vel purus leo. Nulla condimentum lectus vestibulum lectus faucibus, id lobortis eros consequat. Proin mollis libero elit, vel aliquet nisi imperdiet et. Morbi ornare est velit, in vehicula nunc malesuada quis. Donec vehicula convallis interdum.\\n\\nInteger pellentesque in nibh vitae aliquet. Ut at justo id libero dignissim hendrerit. Interdum et malesuada fames ac ante ipsum primis in faucibus. Praesent quis ornare lectus. Nam malesuada non diam quis cursus. Phasellus a libero ligula. Suspendisse ligula elit, congue et nisi sit amet, cursus euismod dolor. Morbi aliquam, nulla a posuere pellentesque, diam massa ornare risus, nec eleifend neque eros et elit.\\n\\nPellentesque a sodales dui. Sed in efficitur ante. Duis eget volutpat elit, et ornare est. Nam felis dolor, placerat mattis diam id, maximus lobortis quam. Sed pellentesque lobortis sem sed placerat. Pellentesque augue odio, molestie sed lectus sit amet, congue volutpat massa. Quisque congue consequat nunc id fringilla. Duis semper nulla eget enim venenatis dapibus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Pellentesque varius turpis nibh, sit amet malesuada mauris malesuada quis. Vivamus dictum egestas placerat. Vivamus id augue elit.\\n\\nCras fermentum volutpat eros, vitae euismod lorem viverra nec. Donec lectus augue, porta eleifend odio sit amet, condimentum rhoncus urna. Nunc sed odio velit. Morbi non cursus odio, eget imperdiet erat. Nunc rhoncus massa non neque volutpat, sit amet faucibus ante congue. Phasellus nec lorem vel leo accumsan lobortis. Maecenas id ligula bibendum purus suscipit posuere ac eget diam. Nam in quam pretium, semper erat auctor, iaculis odio. Maecenas placerat, nisi ac elementum tempor, felis nulla porttitor orci, ac rhoncus diam justo in elit. Etiam lobortis fermentum ligula in tincidunt. Donec quis vestibulum nunc. Sed eros diam, interdum in porta lobortis, gravida eu magna. Donec diam purus, finibus et sollicitudin quis, fringilla nec nisi. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Curabitur ultricies sagittis dapibus. Etiam ullamcorper aliquet libero, eu venenatis mauris suscipit id.\\n\\nUt interdum eleifend sem, vel bibendum ipsum volutpat eget. Nunc ac dignissim augue. Aliquam ornare aliquet magna id dignissim. Vestibulum velit sem, lacinia eu rutrum in, rhoncus vitae mauris. Pellentesque scelerisque pulvinar mauris non cursus. Integer id dolor porta, bibendum sem vel, pretium tortor. Fusce a nisi convallis, interdum quam condimentum, suscipit dolor. Sed magna diam, efficitur non nunc in, tincidunt varius mi. Aliquam ullamcorper nulla eu fermentum bibendum. Vivamus a felis pretium, hendrerit enim vitae, hendrerit leo. Suspendisse lacinia lectus a diam consectetur suscipit. Aenean hendrerit nisl sed diam venenatis pellentesque. Nullam egestas lectus a consequat pharetra. Vivamus ornare tellus auctor, facilisis lacus id, feugiat dui. Nam id est ut est rhoncus varius.\\n\\nAenean vel vehicula erat. Aenean gravida risus vitae purus sodales, quis dictum enim porta. Ut elit elit, fermentum sed posuere non, accumsan eu justo. Integer porta malesuada quam, et elementum massa suscipit nec. Donec in elit diam. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis suscipit vel ante volutpat vestibulum.\\n\\nPellentesque ex arcu, euismod et sapien ut, vulputate suscipit enim. Donec mattis sagittis augue, et mattis lacus. Cras placerat consequat lorem sed luctus. Nam suscipit aliquam sem ac imperdiet. Mauris a semper augue, pulvinar fringilla magna. Integer pretium massa non risus commodo hendrerit. Sed dictum libero id erat sodales mattis. Etiam auctor dolor lectus, ut sagittis enim lobortis vitae. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Curabitur nec orci lobortis, cursus risus eget, sollicitudin massa. Integer vel tincidunt mi, id eleifend quam. Nullam facilisis nisl eu mauris congue, vitae euismod nisi malesuada. Vivamus sit amet urna et libero sagittis dictum.\\n\\nIn hac habitasse platea dictumst. Aliquam erat volutpat. Ut dictum, mi a viverra venenatis, mi urna pulvinar nisi, nec gravida lectus diam eget urna. Ut dictum sit amet nisl ut dignissim. Sed sed mauris scelerisque, efficitur augue in, vulputate turpis. Proin dolor justo, bibendum et sollicitudin feugiat, imperdiet sed mi. Sed elementum vitae massa vel lobortis. Cras vitae massa sit amet libero dictum tempus.\\n\\nVivamus ut mauris lectus. Curabitur placerat ornare scelerisque. Cras malesuada nunc quis tortor pretium bibendum vel sed dui. Cras lobortis nibh eu erat blandit, sit amet consequat neque fermentum. Phasellus imperdiet molestie tristique. Cras auctor purus erat, id mollis ligula porttitor eget. Mauris porta pharetra odio et finibus. Suspendisse eu est a ligula bibendum cursus. Mauris ac laoreet libero. Nullam volutpat sem quis rhoncus gravida.\\n\\nDonec malesuada lacus ac iaculis cursus. Sed sem orci, feugiat ac est ut, ultricies posuere nisi. Suspendisse potenti. Phasellus ut ultricies purus. Etiam sem tortor, fermentum quis aliquam eget, consequat ut nulla. Aliquam dictum metus in mi fringilla, vel gravida nulla accumsan. Cras aliquam eget leo vel posuere. Vivamus vitae malesuada nunc. Morbi placerat magna mi, id suscipit lacus auctor quis. Nam at lorem vel odio finibus fringilla ut ac velit. Donec laoreet at nibh quis vehicula.\\n\\nFusce ac tristique nisi. Donec leo nisi, consectetur at tellus sit amet, consectetur ultrices dui. Quisque gravida mollis tempor. Maecenas semper, sapien ut dignissim feugiat, massa enim viverra dolor, non varius eros nulla nec felis. Nunc massa lacus, ornare et feugiat id, bibendum quis purus. Praesent viverra elit sit amet purus consectetur venenatis. Maecenas nibh risus, elementum sit amet enim sagittis, ultrices malesuada lectus. Vivamus non felis ante. Ut vulputate ex arcu. Aliquam porta gravida porta. Aliquam eros leo, malesuada quis eros non, maximus tristique neque. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Etiam ligula orci, mollis vel luctus nec, venenatis vitae est. Fusce rutrum convallis nisi.\\n\\nNunc laoreet eget nibh in feugiat. Pellentesque nec arcu cursus, gravida dolor a, pellentesque nisi. Praesent vel justo blandit, placerat risus eget, consectetur orci. Sed maximus metus mi, ut euismod augue ultricies in. Nunc id risus hendrerit, aliquet lorem nec, congue justo. Vestibulum vel nunc ac est euismod mattis ac vitae nulla. Donec blandit luctus mauris, sit amet bibendum dui egestas et. Aenean nec lorem nec elit ornare rutrum nec eget ligula. Fusce a ipsum vitae neque elementum pharetra. Pellentesque ullamcorper ullamcorper libero, vitae porta sem sagittis vel. Interdum et malesuada fames ac ante ipsum primis in faucibus.\\n\\nDuis at massa sit amet risus pellentesque varius sit amet vitae eros. Cras tempor aliquet sapien, vehicula varius neque volutpat et. Donec purus nibh, pellentesque ut lobortis nec, ultricies ultricies nisl. Sed accumsan ut dui sit amet vulputate. Suspendisse eu facilisis massa, a hendrerit mauris. Nulla elementum molestie tincidunt. Donec mi justo, ornare vel tempor id, gravida et orci. Nam molestie erat nec nisi bibendum accumsan. Duis vitae tempor ante. Morbi congue mauris vel sagittis facilisis. Vivamus vehicula odio orci, a tempor nibh euismod in. Proin mattis, nibh at feugiat porta, purus velit posuere felis, quis volutpat sapien dui vel odio. Nam fermentum sem nec euismod aliquet. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aliquam erat volutpat.\\n\\nMauris congue lacus tortor. Pellentesque arcu eros, accumsan imperdiet porttitor vitae, mattis nec justo. Nullam ac aliquam mauris. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse potenti. Fusce accumsan tempus felis a sagittis. Maecenas et velit odio. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Aliquam eros lacus, volutpat non urna sed, tincidunt ullamcorper elit. Sed sit amet gravida libero. In varius mi vel diam sollicitudin mollis.\\n\\nAenean varius, diam vitae hendrerit feugiat, libero augue ultrices odio, eget consequat sem tellus eu nisi. Nam dapibus enim et auctor sollicitudin. Nunc iaculis eros orci, ac accumsan eros malesuada ut. Ut semper augue felis, nec sodales lorem consectetur non. Cras gravida eleifend est, et sagittis eros imperdiet congue. Fusce id tellus dapibus nunc scelerisque tempus. Donec tempor placerat libero, in commodo nisi bibendum eu. Donec id eros non est sollicitudin luctus. Duis bibendum bibendum tellus nec viverra. Aliquam non faucibus ex, nec luctus dui. Curabitur efficitur varius urna non dignissim. Suspendisse elit elit, ultrices in elementum eu, tempor at magna.\\n\\nNunc in purus sit amet mi laoreet pulvinar placerat eget sapien. Donec vel felis at dui ultricies euismod quis vel neque. Donec tincidunt urna non eros pretium blandit. Nullam congue tincidunt condimentum. Curabitur et libero nibh. Proin ultricies risus id imperdiet scelerisque. Suspendisse purus mi, viverra vitae risus ut, tempus tincidunt enim. Ut luctus lobortis nisl, eget venenatis tortor cursus non. Mauris finibus nisl quis gravida ultricies. Fusce elementum lacus sit amet nunc congue, in porta nulla tincidunt.\\n\\nMauris ante risus, imperdiet blandit posuere in, blandit eu ipsum. Integer et auctor arcu. Integer quis elementum purus. Nunc in ultricies nisl, sed rutrum risus. Suspendisse venenatis eros nec lorem rhoncus, in scelerisque velit condimentum. Etiam condimentum quam felis, in elementum odio mattis et. In ut nibh porttitor, hendrerit tellus vel, luctus magna. Vestibulum et ligula et dolor pellentesque porta. Aenean efficitur porta massa et bibendum. Nulla vehicula sem in risus volutpat, a eleifend elit maximus.\\n\\nProin orci lorem, auctor a felis eu, pretium lobortis nulla. Phasellus aliquam efficitur interdum. Sed sit amet velit rutrum est dictum facilisis. Duis cursus enim at nisl tincidunt, eu molestie elit vehicula. Cras pellentesque nisl id enim feugiat fringilla. In quis tincidunt neque. Nam eu consectetur dolor. Ut id interdum mauris. Mauris nunc tortor, placerat in tempor ut, vestibulum eu nisl. Integer vel dapibus ipsum. Nunc id erat pulvinar, tincidunt magna id, condimentum massa. Pellentesque consequat est eget odio placerat vehicula. Etiam augue neque, sagittis non leo eu, tristique scelerisque dui. Ut dui urna, blandit quis urna ac, tincidunt tristique turpis.\\n\\nSuspendisse venenatis rhoncus ligula ultrices condimentum. In id laoreet eros. Suspendisse suscipit fringilla leo id euismod. Sed in quam libero. Ut at ligula tellus. Sed tristique gravida dui, at egestas odio aliquam iaculis. Praesent imperdiet velit quis nibh consequat, quis pretium sem sagittis. Donec tortor ex, congue sit amet pulvinar ac, rutrum non est. Praesent ipsum magna, venenatis sit amet vulputate id, eleifend ac ipsum.\\n\\nIn consequat, nisi iaculis laoreet elementum, massa mauris varius nisi, et porta nisi velit at urna. Maecenas sit amet aliquet eros, a rhoncus nisl. Maecenas convallis enim nunc. Morbi purus nisl, aliquam ac tincidunt sed, mattis in augue. Quisque et elementum quam, vitae maximus orci. Suspendisse hendrerit risus nec vehicula placerat. Nulla et lectus nunc. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.\\n\\nEtiam ut sodales ex. Nulla luctus, magna eu scelerisque sagittis, nibh quam consectetur neque, non rutrum dolor metus nec ex. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed egestas augue elit, sollicitudin accumsan massa lobortis ac. Curabitur placerat, dolor a aliquam maximus, velit ipsum laoreet ligula, id ullamcorper lacus nibh eget nisl. Donec eget lacus venenatis enim consequat auctor vel in.\\n\"\n expiration_time {\n seconds: 1554158728\n }\n file_i_d {\n file_num: 6006\n realm_num: 0\n shard_num: 0\n }\n keys {\n keys {\n ed25519: \"\\340\\310\\354\\'X\\245\\207\\237\\372\\302&\\241<\\fQky\\236r\\343QA\\240\\335\\202\\217\\224\\323y\\210\\244\\267\"\n }\n }\n memo {\n value: \"Hello memo\"\n }\n}\nnode_account_i_d {\n account_num: 5005\n realm_num: 0\n shard_num: 0\n}\ntransaction_fee: 100000\ntransaction_i_d {\n account_i_d {\n account_num: 5006\n realm_num: 0\n shard_num: 0\n }\n transaction_valid_start {\n seconds: 1554158542\n }\n}\ntransaction_valid_duration {\n seconds: 120\n}" +] \ No newline at end of file