Skip to content
This repository was archived by the owner on Jun 16, 2025. It is now read-only.

Commit 3b08683

Browse files
authored
evm: add FillRedeemed event (#182)
Co-authored-by: gator-boi <[email protected]>
1 parent 850519d commit 3b08683

File tree

6 files changed

+37
-12
lines changed

6 files changed

+37
-12
lines changed

evm/env/localnet/Base.env

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export RELEASE_OWNER_ASSISTANT_ADDRESS=0xACa94ef8bD5ffEE41947b4585a84BdA5a3d3DA6
3636

3737

3838
### Token Router Proxy (evm address)
39-
export RELEASE_TOKEN_ROUTER_ADDRESS=0x27D44c7337ce4D67b7cd573e9c36bDEED2b2162a
39+
export RELEASE_TOKEN_ROUTER_ADDRESS=0x1943bd00e3a4f46b10e6657dd9236be95e20398a
4040

4141

4242
############################### Matching Engine ###############################

evm/forge/tests/TokenRouter.t.sol

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@ import {Messages} from "src/shared/Messages.sol";
2929
import {Utils} from "src/shared/Utils.sol";
3030

3131
import "src/interfaces/ITokenRouter.sol";
32+
import "src/interfaces/ITokenRouterEvents.sol";
3233
import {FastTransferParameters, Endpoint} from "src/interfaces/ITokenRouterTypes.sol";
33-
3434
import {WormholeCctpMessages} from "src/shared/WormholeCctpMessages.sol";
3535

36-
contract TokenRouterTest is Test {
36+
contract TokenRouterTest is Test, ITokenRouterEvents {
3737
using BytesParsing for bytes;
3838
using WormholeCctpMessages for *;
3939
using Messages for *;
@@ -933,7 +933,7 @@ contract TokenRouterTest is Test {
933933
encoded, // redeemerMessage
934934
address(this) // refundAddress
935935
);
936-
}
936+
}
937937

938938
function testCannotPlaceMarketOrderErrUnsupportedChain() public {
939939
uint64 amountIn = 69;
@@ -1811,6 +1811,10 @@ contract TokenRouterTest is Test {
18111811
);
18121812

18131813
uint256 balanceBefore = _router.orderToken().balanceOf(address(this));
1814+
(IWormhole.VM memory _vm) = wormhole.parseVM(redeemParams.encodedWormholeMessage);
1815+
1816+
vm.expectEmit();
1817+
emit FillRedeemed(_vm.emitterChainId, _vm.emitterAddress, _vm.sequence);
18141818

18151819
RedeemedFill memory redeemed = _router.redeemFill(
18161820
OrderResponse({

evm/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
"build:esm": "tsc -p tsconfig.esm.json",
1515
"build:cjs": "tsc -p tsconfig.cjs.json",
1616
"build": "npm run build:esm && npm run build:cjs",
17-
"generate": "typechain --target=ethers-v5 --out-dir=ts/src/types out/*/*.json",
17+
"generate": "typechain --target=ethers-v5 --out-dir=ts/src/types out/[!build-info]*/*.json",
1818
"clean": "rm -rf dist && rm -rf node_modules && rm -f ./*.tsbuildinfo"
1919
},
2020
"exports": {
@@ -50,4 +50,4 @@
5050
"ts-mocha": "^10.0.0",
5151
"typechain": "^8.1.1"
5252
}
53-
}
53+
}

evm/src/TokenRouter/assets/RedeemFill.sol

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,30 @@ import "./Errors.sol";
1616
import {State} from "./State.sol";
1717

1818
import "src/interfaces/IRedeemFill.sol";
19+
import "src/interfaces/ITokenRouterEvents.sol";
1920

20-
abstract contract RedeemFill is IRedeemFill, Admin, State {
21+
abstract contract RedeemFill is IRedeemFill, ITokenRouterEvents, Admin, State {
2122
using Messages for *;
2223
using Utils for *;
2324

2425
/// @inheritdoc IRedeemFill
25-
function redeemFill(OrderResponse calldata response) external returns (RedeemedFill memory) {
26-
uint16 emitterChain = response.encodedWormholeMessage.unsafeEmitterChainFromVaa();
27-
bytes32 emitterAddress = response.encodedWormholeMessage.unsafeEmitterAddressFromVaa();
26+
function redeemFill(OrderResponse calldata response) external returns (RedeemedFill memory fill) {
27+
(, uint16 emitterChain, bytes32 emitterAddress, uint64 sequence) =
28+
response.encodedWormholeMessage.unsafeVaaKeyFromVaa();
2829

2930
// If the emitter is the matching engine, and this TokenRouter is on the same chain
3031
// as the matching engine, then this is a fast fill.
32+
3133
if (
3234
(emitterChain == _matchingEngineChain && _chainId == _matchingEngineChain)
3335
&& emitterAddress == _matchingEngineAddress
3436
) {
35-
return _handleFastFill(response.encodedWormholeMessage);
37+
fill = _handleFastFill(response.encodedWormholeMessage);
3638
} else {
37-
return _handleFill(emitterChain, response);
39+
fill = _handleFill(emitterChain, response);
3840
}
41+
42+
emit FillRedeemed(emitterChain, emitterAddress, sequence);
3943
}
4044

4145
// ------------------------------- Private ---------------------------------

evm/src/interfaces/ITokenRouter.sol

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import "./IPlaceMarketOrder.sol";
77
import "./IRedeemFill.sol";
88
import "./ITokenRouterState.sol";
99
import "./ITokenRouterAdmin.sol";
10+
import "./ITokenRouterEvents.sol";
1011
import "./IAdmin.sol";
1112

1213
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
@@ -16,5 +17,6 @@ interface ITokenRouter is
1617
IRedeemFill,
1718
ITokenRouterState,
1819
ITokenRouterAdmin,
20+
ITokenRouterEvents,
1921
IAdmin
2022
{}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// SPDX-License-Identifier: Apache 2
2+
3+
pragma solidity ^0.8.0;
4+
5+
interface ITokenRouterEvents {
6+
/**
7+
* @notice Emitted when a fill is redeemed by this contract.
8+
* @param emitterChainId Wormhole chain ID of emitter on the source chain.
9+
* @param emitterAddress Address (bytes32 zero-left-padded) of emitter on the source chain.
10+
* @param sequence Sequence of the Wormhole message.
11+
*/
12+
event FillRedeemed(
13+
uint16 indexed emitterChainId, bytes32 indexed emitterAddress, uint64 indexed sequence
14+
);
15+
}

0 commit comments

Comments
 (0)