diff --git a/.changeset/short-bananas-promise.md b/.changeset/short-bananas-promise.md
new file mode 100644
index 00000000..f5fdbffb
--- /dev/null
+++ b/.changeset/short-bananas-promise.md
@@ -0,0 +1,5 @@
+---
+'@axelar-network/axelar-cgp-sui': patch
+---
+
+added access to set flow limit on its and a corresponding event
diff --git a/move/its/sources/events.move b/move/its/sources/events.move
index 8bbb7231..f0c54e7c 100644
--- a/move/its/sources/events.move
+++ b/move/its/sources/events.move
@@ -48,6 +48,11 @@ public struct UnregisteredCoinReceived<phantom T> has copy, drop {
     decimals: u8,
 }
 
+public struct FlowLimitSet<phantom T> has copy, drop {
+    token_id: TokenId,
+    flow_limit: u64,
+}
+
 // -----------------
 // Package Functions
 // -----------------
@@ -124,3 +129,13 @@ public(package) fun unregistered_coin_received<T>(
         decimals,
     });
 }
+
+public(package) fun flow_limit_set<T>(
+    token_id: TokenId,
+    flow_limit: u64,
+) {
+    event::emit(FlowLimitSet<T> {
+        token_id,
+        flow_limit
+    });
+}
diff --git a/move/its/sources/its.move b/move/its/sources/its.move
index 5c15f18b..38fd761b 100644
--- a/move/its/sources/its.move
+++ b/move/its/sources/its.move
@@ -232,6 +232,21 @@ public fun burn_as_distributor<T>(
     );
 }
 
+public fun set_flow_limit<T>(
+    self: &mut ITS,
+    channel: &Channel,
+    token_id: TokenId,
+    limit: u64,
+) {
+    let value = self.value_mut!(b"set_flow_limit");
+
+    value.set_flow_limit<T>(
+        channel,
+        token_id,
+        limit,
+    );
+}
+
 // ---------------
 // Owner Functions
 // ---------------
@@ -308,6 +323,7 @@ fun version_control(): VersionControl {
             b"set_trusted_addresses",
             b"remove_trusted_addresses",
             b"register_transaction",
+            b"set_flow_limit",
         ].map!(|function_name| function_name.to_ascii_string()),
     ])
 }
@@ -830,6 +846,33 @@ fun test_set_trusted_address() {
     sui::test_utils::destroy(owner_cap);
 }
 
+#[test]
+fun test_set_flow_limit() {
+    let ctx = &mut tx_context::dummy();
+    let mut its = create_for_testing(ctx);
+    let symbol = b"COIN";
+    let decimals = 9;
+    let limit = 1234;
+
+    let (
+        treasury_cap,
+        coin_metadata,
+    ) = its::coin::create_treasury_and_metadata(symbol, decimals, ctx);
+    let coin_info = its::coin_info::from_metadata<COIN>(
+        coin_metadata,
+    );
+    let mut coin_management = its::coin_management::new_with_cap(treasury_cap);
+
+    let channel = channel::new(ctx);
+    coin_management.add_operator(channel.to_address());
+
+    let token_id = register_coin(&mut its, coin_info, coin_management);
+    its.set_flow_limit<COIN>(&channel, token_id, limit);
+
+    sui::test_utils::destroy(its);
+    channel.destroy();
+}
+
 #[test]
 fun test_init() {
     let mut ts = sui::test_scenario::begin(@0x0);
diff --git a/move/its/sources/types/coin_management.move b/move/its/sources/types/coin_management.move
index 54f7d0f6..5f6f94ad 100644
--- a/move/its/sources/types/coin_management.move
+++ b/move/its/sources/types/coin_management.move
@@ -73,19 +73,6 @@ public fun add_operator<T>(self: &mut CoinManagement<T>, operator: address) {
     self.operator.fill(operator);
 }
 
-/// Adds a rate limit to the `CoinManagement`.
-/// Note that this rate limit will be calculated for the remote decimals of the
-/// token, not for the native decimals.
-/// To be used by the designated operator of the contract.
-public fun set_flow_limit<T>(
-    self: &mut CoinManagement<T>,
-    channel: &Channel,
-    flow_limit: u64,
-) {
-    assert!(self.operator.contains(&channel.to_address()), ENotOperator);
-    self.flow_limit.set_flow_limit(flow_limit);
-}
-
 // === Protected Methods ===
 
 /// Takes the given amount of Coins from user. Returns the amount that the ITS
@@ -134,6 +121,17 @@ public(package) fun mint<T>(
 public(package) fun burn<T>(self: &mut CoinManagement<T>, balance: Balance<T>) {
     self.treasury_cap.borrow_mut().supply_mut().decrease_supply(balance);
 }
+
+/// Adds a rate limit to the `CoinManagement`.
+public(package) fun set_flow_limit<T>(
+    self: &mut CoinManagement<T>,
+    channel: &Channel,
+    flow_limit: u64,
+) {
+    assert!(self.operator.contains(&channel.to_address()), ENotOperator);
+    self.flow_limit.set_flow_limit(flow_limit);
+}
+
 // === Views ===
 
 /// Checks if the given address is a `distributor`.
diff --git a/move/its/sources/versioned/its_v0.move b/move/its/sources/versioned/its_v0.move
index e516fd1d..91ebe9e4 100644
--- a/move/its/sources/versioned/its_v0.move
+++ b/move/its/sources/versioned/its_v0.move
@@ -482,6 +482,16 @@ public(package) fun burn_as_distributor<T>(
     coin_management.burn(coin.into_balance());
 }
 
+public(package) fun set_flow_limit<T>(
+    self: &mut ITS_v0,
+    channel: &Channel,
+    token_id: TokenId,
+    limit: u64,
+) {
+    self.coin_management_mut<T>(token_id).set_flow_limit(channel, limit);
+    events::flow_limit_set<T>(token_id, limit);
+}
+
 // -----------------
 // Private Functions
 // -----------------