diff --git a/bmc/src/main/java/foundation/icon/btp/bmc/BTPMessageCenter.java b/bmc/src/main/java/foundation/icon/btp/bmc/BTPMessageCenter.java index 645a202..3e66838 100644 --- a/bmc/src/main/java/foundation/icon/btp/bmc/BTPMessageCenter.java +++ b/bmc/src/main/java/foundation/icon/btp/bmc/BTPMessageCenter.java @@ -44,6 +44,8 @@ import java.util.List; import java.util.Map; +import static foundation.icon.score.util.Encode.encode; + public class BTPMessageCenter implements BMC, ICONSpecific, OwnerManager { private static final Logger logger = Logger.getLogger(BTPMessageCenter.class); @@ -359,6 +361,7 @@ public void setFeeTable(String[] _dst, BigInteger[][] _value) { fees.remove(dstNet); } } + SetFeeTable(encode(_dst), encode(_value)); } private BigInteger[] getFeeList(String net, boolean includeBackward) { @@ -1189,4 +1192,8 @@ private void requireNormalMode() { @EventLog public void RelayMessage(String _prev, BigInteger _count) { } + + @EventLog + public void SetFeeTable(byte[] _dst, byte[] _value) { + } } diff --git a/bmc/src/main/java/foundation/icon/btp/bmc/ICONSpecific.java b/bmc/src/main/java/foundation/icon/btp/bmc/ICONSpecific.java index 8f7d5d0..e01fca4 100644 --- a/bmc/src/main/java/foundation/icon/btp/bmc/ICONSpecific.java +++ b/bmc/src/main/java/foundation/icon/btp/bmc/ICONSpecific.java @@ -160,4 +160,16 @@ public interface ICONSpecific { */ @EventLog void RelayMessage(String _prev, BigInteger _count); + + /** + * (EventLog) Logs the event that handle the fee table + * The tracker monitors this event. + *

+ * indexed: 0 + * + * @param _dst String[] ( Rlp encoded of list of BTP Network Address of the destination BMC ) + * @param _value Integer[][] ( Rlp encoded of lists of relay fees in the path including return path ) + */ + @EventLog + void SetFeeTable(byte[] _dst, byte[] _value); } diff --git a/bmc/src/test/java/foundation/icon/btp/bmc/BMCIntegrationTest.java b/bmc/src/test/java/foundation/icon/btp/bmc/BMCIntegrationTest.java index de06333..c4eed6e 100644 --- a/bmc/src/test/java/foundation/icon/btp/bmc/BMCIntegrationTest.java +++ b/bmc/src/test/java/foundation/icon/btp/bmc/BMCIntegrationTest.java @@ -145,4 +145,12 @@ static Consumer relayMessageEvent( ICONSpecificScoreClient.RelayMessage::eventLogs, consumer, null); } + + static Consumer setFeeTableEvent( + Consumer consumer) { + return eventLogChecker( + ICONSpecificScoreClient.SetFeeTable::eventLogs, + consumer, null); + } + } diff --git a/bmc/src/test/java/foundation/icon/btp/bmc/FeeManagementTest.java b/bmc/src/test/java/foundation/icon/btp/bmc/FeeManagementTest.java index 7ae00d3..8eace38 100644 --- a/bmc/src/test/java/foundation/icon/btp/bmc/FeeManagementTest.java +++ b/bmc/src/test/java/foundation/icon/btp/bmc/FeeManagementTest.java @@ -20,17 +20,23 @@ import foundation.icon.btp.test.BTPIntegrationTest; import foundation.icon.btp.test.MockBMVIntegrationTest; import foundation.icon.jsonrpc.Address; +import foundation.icon.jsonrpc.model.TransactionResult; import foundation.icon.score.test.ScoreIntegrationTest; import foundation.icon.score.util.ArrayUtil; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import score.ByteArrayObjectWriter; +import score.Context; +import score.ObjectReader; import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.function.Consumer; +import static foundation.icon.score.util.Encode.encode; import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -108,8 +114,10 @@ static void setFeeTable(List fees) { BigInteger[][] _value = fees.stream() .map(FeeInfo::getValues) .toArray(BigInteger[][]::new); - bmc.setFeeTable(_dst, _value); + + Consumer checker = setFeeTableEventChecker(_dst, _value); + bmc.setFeeTable(checker, _dst, _value); BigInteger[][] ret = bmc.getFeeTable(_dst); assertArrayEquals(_value, ret); } @@ -151,4 +159,15 @@ void getFeeShouldReturnsSumOfFee() { assertEquals(ArrayUtil.sum(forward(reachableFee.getValues())), bmc.getFee(reachable.net(), false)); assertEquals(ArrayUtil.sum(reachableFee.getValues()), bmc.getFee(reachable.net(), true)); } + + static Consumer setFeeTableEventChecker( + String[] _dst, BigInteger[][] _value) { + + return BMCIntegrationTest.setFeeTableEvent( + (el) -> { + assertArrayEquals(encode(_dst), el.get_dst()); + assertArrayEquals(encode(_value), el.get_value()); + }); + } + } diff --git a/lib/src/main/java/foundation/icon/score/util/Encode.java b/lib/src/main/java/foundation/icon/score/util/Encode.java new file mode 100644 index 0000000..b39623b --- /dev/null +++ b/lib/src/main/java/foundation/icon/score/util/Encode.java @@ -0,0 +1,43 @@ +package foundation.icon.score.util; + +import score.ByteArrayObjectWriter; +import score.Context; + +import java.math.BigInteger; + +public class Encode { + public static byte[] encode(BigInteger[] arr) { + ByteArrayObjectWriter w = Context.newByteArrayObjectWriter("RLPn"); + w.beginList(arr.length); + for (BigInteger v : arr) { + w.write(v); + } + w.end(); + return w.toByteArray(); + } + + public static byte[] encode(BigInteger[][] twoDimArr) { + ByteArrayObjectWriter w = Context.newByteArrayObjectWriter("RLPn"); + w.beginList(twoDimArr.length); + for (BigInteger[] arr : twoDimArr) { + w.beginList(arr.length); + for (BigInteger v : arr) { + w.write(v); + } + w.end(); + } + w.end(); + return w.toByteArray(); + } + + public static byte[] encode(String[] arr) { + ByteArrayObjectWriter w = Context.newByteArrayObjectWriter("RLPn"); + w.beginList(arr.length); + for (String v : arr) { + w.write(v); + } + w.end(); + return w.toByteArray(); + } + +}