Skip to content

Commit 2601eff

Browse files
feat: add declineReward option to NodeCreate and NodeUpdate transactions (#2333)
Signed-off-by: Simi Hunjan <simi.hunjan.k@gmail.com> Signed-off-by: Naydenov <nikola.naydenov@limechain.tech> Co-authored-by: Naydenov <nikola.naydenov@limechain.tech>
1 parent 64c6eff commit 2601eff

6 files changed

Lines changed: 98 additions & 7 deletions

File tree

sdk/src/main/java/com/hedera/hashgraph/sdk/NodeCreateTransaction.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ public class NodeCreateTransaction extends Transaction<NodeCreateTransaction> {
5959
@Nullable
6060
private Key adminKey = null;
6161

62+
@Nullable
63+
private Boolean declineReward = null;
64+
6265
/**
6366
* Constructor.
6467
*/
@@ -307,6 +310,29 @@ public NodeCreateTransaction setAdminKey(Key adminKey) {
307310
return this;
308311
}
309312

313+
/**
314+
* Gets whether this node declines rewards.
315+
* If null, the default behavior is to decline rewards.
316+
*
317+
* @return true if rewards are declined; false if accepted; null if unset.
318+
*/
319+
@Nullable
320+
public Boolean getDeclineReward() {
321+
return declineReward;
322+
}
323+
324+
/**
325+
* Sets whether this node should decline rewards.
326+
*
327+
* @param decline true to decline rewards, false to accept.
328+
* @return {@code this}
329+
*/
330+
public NodeCreateTransaction setDeclineReward(boolean decline) {
331+
requireNotFrozen();
332+
this.declineReward = decline;
333+
return this;
334+
}
335+
310336
/**
311337
* Build the transaction body.
312338
*
@@ -341,6 +367,10 @@ NodeCreateTransactionBody.Builder build() {
341367
builder.setAdminKey(adminKey.toProtobufKey());
342368
}
343369

370+
if (declineReward != null) {
371+
builder.setDeclineReward(declineReward);
372+
}
373+
344374
return builder;
345375
}
346376

@@ -373,6 +403,8 @@ void initFromTransactionBody() {
373403
if (body.hasAdminKey()) {
374404
adminKey = Key.fromProtobufKey(body.getAdminKey());
375405
}
406+
407+
declineReward = body.getDeclineReward();
376408
}
377409

378410
@Override

sdk/src/main/java/com/hedera/hashgraph/sdk/NodeUpdateTransaction.java

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
// SPDX-License-Identifier: Apache-2.0
22
package com.hedera.hashgraph.sdk;
33

4-
import com.google.protobuf.ByteString;
5-
import com.google.protobuf.BytesValue;
6-
import com.google.protobuf.InvalidProtocolBufferException;
7-
import com.google.protobuf.StringValue;
4+
import com.google.protobuf.*;
85
import com.hedera.hashgraph.sdk.proto.AddressBookServiceGrpc;
96
import com.hedera.hashgraph.sdk.proto.NodeUpdateTransactionBody;
107
import com.hedera.hashgraph.sdk.proto.SchedulableTransactionBody;
@@ -60,6 +57,9 @@ public class NodeUpdateTransaction extends Transaction<NodeUpdateTransaction> {
6057
@Nullable
6158
private Key adminKey = null;
6259

60+
@Nullable
61+
private Boolean declineReward = null;
62+
6363
/**
6464
* Constructor.
6565
*/
@@ -362,6 +362,26 @@ public NodeUpdateTransaction setAdminKey(Key adminKey) {
362362
return this;
363363
}
364364

365+
/**
366+
* Gets whether this node declines rewards.
367+
* @return true if the node declines rewards; false if it accepts rewards.
368+
*/
369+
@Nullable
370+
public Boolean getDeclineReward() {
371+
return declineReward;
372+
}
373+
374+
/**
375+
* Sets whether this node should decline rewards.
376+
* @param decline true to decline rewards; false to accept them.
377+
* @return {@code this}
378+
*/
379+
public NodeUpdateTransaction setDeclineReward(boolean decline) {
380+
requireNotFrozen();
381+
this.declineReward = decline;
382+
return this;
383+
}
384+
365385
/**
366386
* Build the transaction body.
367387
*
@@ -400,6 +420,10 @@ NodeUpdateTransactionBody.Builder build() {
400420
builder.setAdminKey(adminKey.toProtobufKey());
401421
}
402422

423+
if (declineReward != null) {
424+
builder.setDeclineReward(BoolValue.of(declineReward));
425+
}
426+
403427
return builder;
404428
}
405429

@@ -438,6 +462,10 @@ void initFromTransactionBody() {
438462
if (body.hasAdminKey()) {
439463
adminKey = Key.fromProtobufKey(body.getAdminKey());
440464
}
465+
466+
if (body.hasDeclineReward()) {
467+
declineReward = body.getDeclineReward().getValue();
468+
}
441469
}
442470

443471
@Override

sdk/src/test/java/com/hedera/hashgraph/sdk/NodeCreateTransactionTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ private NodeCreateTransaction spawnTestTransaction() {
7878
.setGrpcCertificateHash(TEST_GRPC_CERTIFICATE_HASH)
7979
.setAdminKey(TEST_ADMIN_KEY)
8080
.setMaxTransactionFee(new Hbar(1))
81+
.setDeclineReward(false) // accepts the reward
8182
.freeze()
8283
.sign(TEST_PRIVATE_KEY);
8384
}
@@ -147,6 +148,8 @@ void constructNodeCreateTransactionFromTransactionBodyProtobuf() {
147148
transactionBodyBuilder.setGrpcCertificateHash(ByteString.copyFrom(TEST_GRPC_CERTIFICATE_HASH));
148149
transactionBodyBuilder.setAdminKey(TEST_ADMIN_KEY.toProtobufKey());
149150

151+
transactionBodyBuilder.setDeclineReward(true);
152+
150153
var tx = TransactionBody.newBuilder()
151154
.setNodeCreate(transactionBodyBuilder.build())
152155
.build();
@@ -244,4 +247,16 @@ void getSetAdminKeyFrozen() {
244247
var tx = spawnTestTransaction();
245248
assertThrows(IllegalStateException.class, () -> tx.setAdminKey(TEST_ADMIN_KEY));
246249
}
250+
251+
@Test
252+
void getSetDeclineReward() {
253+
var nodeCreateTransaction = new NodeCreateTransaction().setDeclineReward(true);
254+
assertThat(nodeCreateTransaction.getDeclineReward()).isTrue();
255+
}
256+
257+
@Test
258+
void getSetDeclineRewardFrozen() {
259+
var tx = spawnTestTransaction();
260+
assertThrows(IllegalStateException.class, () -> tx.setDeclineReward(false));
261+
}
247262
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
com.hedera.hashgraph.sdk.NodeCreateTransactionTest.shouldSerialize=[
22
"# com.hedera.hashgraph.sdk.proto.TransactionBody\nnode_account_i_d {\n account_num: 5005\n realm_num: 0\n shard_num: 0\n}\nnode_create {\n account_id {\n account_num: 9\n realm_num: 6\n shard_num: 0\n }\n admin_key {\n ed25519: \"\\030\\214\\252`\\231\\024#O\\b\\370\\342\\232\\321g\\274\\273\\346\\221}\\211m\\244R\\306\\017\\230\\017j,\\246\\206\\001\"\n }\n description: \"Test description\"\n gossip_ca_certificate: \"\\000\\001\\002\\003\\004\"\n gossip_endpoint {\n domain_name: \"0unit.test.com\"\n ip_address_v4: \"\\000\\001\\002\\003\"\n port: 42\n }\n gossip_endpoint {\n domain_name: \"1unit.test.com\"\n ip_address_v4: \"\\000\\001\\002\\003\"\n port: 43\n }\n gossip_endpoint {\n domain_name: \"2unit.test.com\"\n ip_address_v4: \"\\000\\001\\002\\003\"\n port: 44\n }\n grpc_certificate_hash: \"\\005\\006\\a\\b\\t\"\n service_endpoint {\n domain_name: \"3unit.test.com\"\n ip_address_v4: \"\\000\\001\\002\\003\"\n port: 45\n }\n service_endpoint {\n domain_name: \"4unit.test.com\"\n ip_address_v4: \"\\000\\001\\002\\003\"\n port: 46\n }\n service_endpoint {\n domain_name: \"5unit.test.com\"\n ip_address_v4: \"\\000\\001\\002\\003\"\n port: 47\n }\n service_endpoint {\n domain_name: \"6unit.test.com\"\n ip_address_v4: \"\\000\\001\\002\\003\"\n port: 48\n }\n}\ntransaction_fee: 100000000\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}"
3-
]
3+
]

sdk/src/test/java/com/hedera/hashgraph/sdk/NodeUpdateTransactionTest.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import static org.assertj.core.api.Assertions.assertThat;
55
import static org.junit.jupiter.api.Assertions.assertThrows;
66

7+
import com.google.protobuf.BoolValue;
78
import com.google.protobuf.ByteString;
89
import com.google.protobuf.BytesValue;
910
import com.google.protobuf.StringValue;
@@ -83,6 +84,7 @@ private NodeUpdateTransaction spawnTestTransaction() {
8384
.setGrpcCertificateHash(TEST_GRPC_CERTIFICATE_HASH)
8485
.setAdminKey(TEST_ADMIN_KEY)
8586
.setMaxTransactionFee(new Hbar(1))
87+
.setDeclineReward(true)
8688
.freeze()
8789
.sign(TEST_PRIVATE_KEY);
8890
}
@@ -163,6 +165,7 @@ void constructNodeUpdateTransactionFromTransactionBodyProtobuf() {
163165
transactionBodyBuilder.setGossipCaCertificate(BytesValue.of(ByteString.copyFrom(TEST_GOSSIP_CA_CERTIFICATE)));
164166
transactionBodyBuilder.setGrpcCertificateHash(BytesValue.of(ByteString.copyFrom(TEST_GRPC_CERTIFICATE_HASH)));
165167
transactionBodyBuilder.setAdminKey(TEST_ADMIN_KEY.toProtobufKey());
168+
transactionBodyBuilder.setDeclineReward(BoolValue.of(true));
166169

167170
var tx = TransactionBody.newBuilder()
168171
.setNodeUpdate(transactionBodyBuilder.build())
@@ -177,6 +180,7 @@ void constructNodeUpdateTransactionFromTransactionBodyProtobuf() {
177180
assertThat(nodeUpdateTransaction.getGossipCaCertificate()).isEqualTo(TEST_GOSSIP_CA_CERTIFICATE);
178181
assertThat(nodeUpdateTransaction.getGrpcCertificateHash()).isEqualTo(TEST_GRPC_CERTIFICATE_HASH);
179182
assertThat(nodeUpdateTransaction.getAdminKey()).isEqualTo(TEST_ADMIN_KEY);
183+
assertThat(nodeUpdateTransaction.getDeclineReward()).isEqualTo(true);
180184
}
181185

182186
@Test
@@ -274,4 +278,16 @@ void getSetAdminKeyFrozen() {
274278
var tx = spawnTestTransaction();
275279
assertThrows(IllegalStateException.class, () -> tx.setAdminKey(TEST_ADMIN_KEY));
276280
}
281+
282+
@Test
283+
void getSetDeclineReward() {
284+
var tx = new NodeUpdateTransaction().setDeclineReward(true);
285+
assertThat(tx.getDeclineReward()).isEqualTo(true);
286+
}
287+
288+
@Test
289+
void getSetDeclineRewardFrozen() {
290+
var tx = spawnTestTransaction();
291+
assertThrows(IllegalStateException.class, () -> tx.setDeclineReward(false));
292+
}
277293
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
com.hedera.hashgraph.sdk.NodeUpdateTransactionTest.shouldSerialize=[
2-
"# com.hedera.hashgraph.sdk.proto.TransactionBody\nnode_account_i_d {\n account_num: 5005\n realm_num: 0\n shard_num: 0\n}\nnode_update {\n account_id {\n account_num: 9\n realm_num: 6\n shard_num: 0\n }\n admin_key {\n ed25519: \"\\030\\214\\252`\\231\\024#O\\b\\370\\342\\232\\321g\\274\\273\\346\\221}\\211m\\244R\\306\\017\\230\\017j,\\246\\206\\001\"\n }\n description {\n value: \"Test description\"\n }\n gossip_ca_certificate {\n value: \"\\000\\001\\002\\003\\004\"\n }\n gossip_endpoint {\n domain_name: \"0unit.test.com\"\n ip_address_v4: \"\\000\\001\\002\\003\"\n port: 42\n }\n gossip_endpoint {\n domain_name: \"1unit.test.com\"\n ip_address_v4: \"\\000\\001\\002\\003\"\n port: 43\n }\n gossip_endpoint {\n domain_name: \"2unit.test.com\"\n ip_address_v4: \"\\000\\001\\002\\003\"\n port: 44\n }\n grpc_certificate_hash {\n value: \"\\005\\006\\a\\b\\t\"\n }\n node_id: 420\n service_endpoint {\n domain_name: \"3unit.test.com\"\n ip_address_v4: \"\\000\\001\\002\\003\"\n port: 45\n }\n service_endpoint {\n domain_name: \"4unit.test.com\"\n ip_address_v4: \"\\000\\001\\002\\003\"\n port: 46\n }\n service_endpoint {\n domain_name: \"5unit.test.com\"\n ip_address_v4: \"\\000\\001\\002\\003\"\n port: 47\n }\n service_endpoint {\n domain_name: \"6unit.test.com\"\n ip_address_v4: \"\\000\\001\\002\\003\"\n port: 48\n }\n}\ntransaction_fee: 100000000\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}"
3-
]
2+
"# com.hedera.hashgraph.sdk.proto.TransactionBody\nnode_account_i_d {\n account_num: 5005\n realm_num: 0\n shard_num: 0\n}\nnode_update {\n account_id {\n account_num: 9\n realm_num: 6\n shard_num: 0\n }\n admin_key {\n ed25519: \"\\030\\214\\252`\\231\\024#O\\b\\370\\342\\232\\321g\\274\\273\\346\\221}\\211m\\244R\\306\\017\\230\\017j,\\246\\206\\001\"\n }\n decline_reward {\n value: true\n }\n description {\n value: \"Test description\"\n }\n gossip_ca_certificate {\n value: \"\\000\\001\\002\\003\\004\"\n }\n gossip_endpoint {\n domain_name: \"0unit.test.com\"\n ip_address_v4: \"\\000\\001\\002\\003\"\n port: 42\n }\n gossip_endpoint {\n domain_name: \"1unit.test.com\"\n ip_address_v4: \"\\000\\001\\002\\003\"\n port: 43\n }\n gossip_endpoint {\n domain_name: \"2unit.test.com\"\n ip_address_v4: \"\\000\\001\\002\\003\"\n port: 44\n }\n grpc_certificate_hash {\n value: \"\\005\\006\\a\\b\\t\"\n }\n node_id: 420\n service_endpoint {\n domain_name: \"3unit.test.com\"\n ip_address_v4: \"\\000\\001\\002\\003\"\n port: 45\n }\n service_endpoint {\n domain_name: \"4unit.test.com\"\n ip_address_v4: \"\\000\\001\\002\\003\"\n port: 46\n }\n service_endpoint {\n domain_name: \"5unit.test.com\"\n ip_address_v4: \"\\000\\001\\002\\003\"\n port: 47\n }\n service_endpoint {\n domain_name: \"6unit.test.com\"\n ip_address_v4: \"\\000\\001\\002\\003\"\n port: 48\n }\n}\ntransaction_fee: 100000000\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}"
3+
]

0 commit comments

Comments
 (0)