@@ -216,7 +216,15 @@ contract Bridge is ReentrancyGuardTransient, Initializable, OwnableRoles {
216216 return ;
217217 }
218218
219- // Get (and deploy if needed) the Twin contract.
219+ // For simple transfers, skip the twin logic.
220+ // This avoids the need to deploy a Twin contract for users that only want to transfer tokens.
221+ if (message.ty == MessageType.Transfer) {
222+ Transfer memory transfer = abi.decode (message.data, (Transfer));
223+ TokenLib.finalizeTransfer ({transfer: transfer, crossChainErc20Factory: CROSS_CHAIN_ERC20_FACTORY});
224+ return ;
225+ }
226+
227+ // For calls, get (and deploy if needed) the Twin contract.
220228 address twinAddress = twins[message.sender];
221229 if (twinAddress == address (0 )) {
222230 twinAddress = LibClone.deployDeterministicERC1967BeaconProxy ({
@@ -228,14 +236,11 @@ contract Bridge is ReentrancyGuardTransient, Initializable, OwnableRoles {
228236
229237 if (message.ty == MessageType.Call) {
230238 Call memory call = abi.decode (message.data, (Call));
231- Twin (payable (twins[message.sender])).execute (call);
232- } else if (message.ty == MessageType.Transfer) {
233- Transfer memory transfer = abi.decode (message.data, (Transfer));
234- TokenLib.finalizeTransfer ({transfer: transfer, crossChainErc20Factory: CROSS_CHAIN_ERC20_FACTORY});
239+ Twin (payable (twinAddress)).execute (call);
235240 } else if (message.ty == MessageType.TransferAndCall) {
236241 (Transfer memory transfer , Call memory call ) = abi.decode (message.data, (Transfer, Call));
237242 TokenLib.finalizeTransfer ({transfer: transfer, crossChainErc20Factory: CROSS_CHAIN_ERC20_FACTORY});
238- Twin (payable (twins[message.sender] )).execute (call);
243+ Twin (payable (twinAddress )).execute (call);
239244 }
240245 }
241246
0 commit comments