Skip to content

Commit d32ea30

Browse files
committed
fix: optimized flow of recvPacket
1 parent a6b487c commit d32ea30

File tree

2 files changed

+43
-93
lines changed

2 files changed

+43
-93
lines changed

contracts/javascore/ics20/src/main/java/ibc/ics20/ICS20Transfer.java

+43-52
Original file line numberDiff line numberDiff line change
@@ -305,33 +305,17 @@ public byte[] onRecvPacket(byte[] packet, Address relayer) {
305305

306306
Address receiverAddr = Address.fromString(data.receiver);
307307

308-
if (isSource) {
309-
String denomOnly = data.denom.substring(denomPrefix.length());
310-
311-
if (isNativeAsset(denomOnly)) {
312-
try {
313-
Context.transfer(receiverAddr, data.amount);
314-
} catch (Exception e) {
315-
ack = ICS20Lib.FAILED_ACKNOWLEDGEMENT_JSON;
316-
}
308+
try {
309+
if (isSource) {
310+
String denomOnly = data.denom.substring(denomPrefix.length());
311+
handleSourceToken(denomOnly, receiverAddr, data.amount, data.memo);
317312
} else {
318-
try {
319-
Address tokenContractAddress = getTokenContractAddress(denomOnly);
320-
Context.call(tokenContractAddress, "transfer", receiverAddr, data.amount, data.memo.getBytes());
321-
} catch (Exception e) {
322-
ack = ICS20Lib.FAILED_ACKNOWLEDGEMENT_JSON;
323-
}
324-
}
325-
} else {
326-
denomPrefix = getDenomPrefix(packetDb.getDestinationPort(), packetDb.getDestinationChannel());
327-
String prefixedDenom = denomPrefix + data.denom;
328-
329-
try {
330-
Address tokenContractAddress = getTokenContractAddress(prefixedDenom);
331-
Context.call(tokenContractAddress, "mint", receiverAddr, data.amount);
332-
} catch (Exception e) {
333-
ack = ICS20Lib.FAILED_ACKNOWLEDGEMENT_JSON;
313+
denomPrefix = getDenomPrefix(packetDb.getDestinationPort(), packetDb.getDestinationChannel());
314+
String prefixedDenom = denomPrefix + data.denom;
315+
handleDestinationToken(prefixedDenom, receiverAddr, data.amount);
334316
}
317+
} catch (Exception e) {
318+
ack = ICS20Lib.FAILED_ACKNOWLEDGEMENT_JSON;
335319
}
336320

337321
return ack;
@@ -366,6 +350,40 @@ public void onTimeoutPacket(byte[] packet, Address relayer) {
366350
refundTokens(packetDb);
367351
}
368352

353+
/**
354+
* Refunds tokens based on the provided packet.
355+
*
356+
* @param packet the packet containing the token data
357+
*/
358+
private void refundTokens(Packet packet) {
359+
ICS20Lib.FungibleTokenPacketData data = ICS20Lib.unmarshalFungibleTokenPacketData(packet.getData());
360+
361+
String denomPrefix = getDenomPrefix(packet.getSourcePort(), packet.getSourceChannel());
362+
boolean isSource = !data.denom.startsWith(denomPrefix);
363+
364+
Address sender = Address.fromString(data.sender);
365+
366+
if (isSource) {
367+
handleSourceToken(data.denom, sender, data.amount, data.memo);
368+
} else {
369+
handleDestinationToken(data.denom, sender, data.amount);
370+
}
371+
}
372+
373+
private void handleSourceToken(String denom, Address address, BigInteger amount, String memo) {
374+
if (isNativeAsset(denom)) {
375+
Context.transfer(address, amount);
376+
} else {
377+
Address tokenContractAddress = getTokenContractAddress(denom);
378+
Context.call(tokenContractAddress, "transfer", address, amount, memo.getBytes());
379+
}
380+
}
381+
382+
private void handleDestinationToken(String denom, Address address, BigInteger amount) {
383+
Address tokenContractAddress = getTokenContractAddress(denom);
384+
Context.call(tokenContractAddress, "mint", address, amount);
385+
}
386+
369387
/**
370388
* Initializes the channel opening process.
371389
*
@@ -461,33 +479,6 @@ public void onChanCloseConfirm(String portId, String channelId) {
461479
onlyIBC();
462480
}
463481

464-
/**
465-
* Refunds tokens based on the provided packet.
466-
*
467-
* @param packet the packet containing the token data
468-
*/
469-
private void refundTokens(Packet packet) {
470-
ICS20Lib.FungibleTokenPacketData data = ICS20Lib.unmarshalFungibleTokenPacketData(packet.getData());
471-
472-
String denomPrefix = getDenomPrefix(packet.getSourcePort(), packet.getSourceChannel());
473-
boolean isSource = !data.denom.startsWith(denomPrefix);
474-
475-
Address sender = Address.fromString(data.sender);
476-
477-
if (isSource) {
478-
if (isNativeAsset(data.denom)) {
479-
Context.transfer(sender, data.amount);
480-
return;
481-
}
482-
483-
Address tokenContractAddress = getTokenContractAddress(data.denom);
484-
Context.call(tokenContractAddress, "transfer", sender, data.amount, data.memo.getBytes());
485-
} else {
486-
Address tokenContractAddress = getTokenContractAddress(data.denom);
487-
Context.call(tokenContractAddress, "mint", sender, data.amount);
488-
}
489-
}
490-
491482
private static String getDenomPrefix(String port, String channel) {
492483
return port + "/" + channel + "/";
493484
}

contracts/javascore/lib/src/main/java/ibc/icon/interfaces/IICS20Bank.java

-41
This file was deleted.

0 commit comments

Comments
 (0)