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();
+ }
+
+}