@hyperlane-xyz/core 0.5.2 → 0.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/contracts/middleware/token-bridge/TokenBridgeRouter.sol +135 -0
- package/contracts/middleware/token-bridge/adapters/CircleBridgeAdapter.sol +248 -0
- package/contracts/middleware/token-bridge/interfaces/ITokenBridgeAdapter.sol +18 -0
- package/contracts/middleware/token-bridge/interfaces/ITokenBridgeMessageRecipient.sol +12 -0
- package/contracts/middleware/token-bridge/interfaces/circle/ICircleBridge.sol +59 -0
- package/contracts/middleware/token-bridge/interfaces/circle/ICircleMessageTransmitter.sol +38 -0
- package/contracts/mock/MockToken.sol +14 -0
- package/contracts/mock/MockTokenBridgeAdapter.sol +46 -0
- package/contracts/test/TestTokenBridgeMessageRecipient.sol +24 -0
- package/contracts/test/TestTokenRecipient.sol +44 -0
- package/dist/@openzeppelin/contracts/index.d.ts +2 -0
- package/dist/@openzeppelin/contracts/index.d.ts.map +1 -1
- package/dist/@openzeppelin/contracts/token/ERC20/IERC20.d.ts +139 -0
- package/dist/@openzeppelin/contracts/token/ERC20/IERC20.d.ts.map +1 -0
- package/dist/@openzeppelin/contracts/token/ERC20/IERC20.js +4 -0
- package/dist/@openzeppelin/contracts/token/ERC20/IERC20.js.map +1 -0
- package/dist/@openzeppelin/contracts/token/ERC20/index.d.ts +2 -0
- package/dist/@openzeppelin/contracts/token/ERC20/index.d.ts.map +1 -0
- package/dist/@openzeppelin/contracts/token/ERC20/index.js +3 -0
- package/dist/@openzeppelin/contracts/token/ERC20/index.js.map +1 -0
- package/dist/@openzeppelin/contracts/token/index.d.ts +3 -0
- package/dist/@openzeppelin/contracts/token/index.d.ts.map +1 -0
- package/dist/@openzeppelin/contracts/token/index.js +4 -0
- package/dist/@openzeppelin/contracts/token/index.js.map +1 -0
- package/dist/@openzeppelin/contracts-upgradeable/index.d.ts +2 -0
- package/dist/@openzeppelin/contracts-upgradeable/index.d.ts.map +1 -1
- package/dist/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.d.ts +204 -0
- package/dist/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.d.ts.map +1 -0
- package/dist/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.js +4 -0
- package/dist/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.js.map +1 -0
- package/dist/@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.d.ts +139 -0
- package/dist/@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.d.ts.map +1 -0
- package/dist/@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.js +4 -0
- package/dist/@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.js.map +1 -0
- package/dist/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.d.ts +163 -0
- package/dist/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.d.ts.map +1 -0
- package/dist/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.js +4 -0
- package/dist/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.js.map +1 -0
- package/dist/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/index.d.ts +2 -0
- package/dist/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/index.d.ts.map +1 -0
- package/dist/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/index.js +3 -0
- package/dist/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/index.js.map +1 -0
- package/dist/@openzeppelin/contracts-upgradeable/token/ERC20/index.d.ts +5 -0
- package/dist/@openzeppelin/contracts-upgradeable/token/ERC20/index.d.ts.map +1 -0
- package/dist/@openzeppelin/contracts-upgradeable/token/ERC20/index.js +4 -0
- package/dist/@openzeppelin/contracts-upgradeable/token/ERC20/index.js.map +1 -0
- package/dist/@openzeppelin/contracts-upgradeable/token/index.d.ts +3 -0
- package/dist/@openzeppelin/contracts-upgradeable/token/index.d.ts.map +1 -0
- package/dist/@openzeppelin/contracts-upgradeable/token/index.js +4 -0
- package/dist/@openzeppelin/contracts-upgradeable/token/index.js.map +1 -0
- package/dist/contracts/middleware/index.d.ts +2 -0
- package/dist/contracts/middleware/index.d.ts.map +1 -1
- package/dist/contracts/middleware/index.js +1 -0
- package/dist/contracts/middleware/index.js.map +1 -1
- package/dist/contracts/middleware/token-bridge/TokenBridgeRouter.d.ts +291 -0
- package/dist/contracts/middleware/token-bridge/TokenBridgeRouter.d.ts.map +1 -0
- package/dist/contracts/middleware/token-bridge/TokenBridgeRouter.js +4 -0
- package/dist/contracts/middleware/token-bridge/TokenBridgeRouter.js.map +1 -0
- package/dist/contracts/middleware/token-bridge/adapters/CircleBridgeAdapter.d.ts +416 -0
- package/dist/contracts/middleware/token-bridge/adapters/CircleBridgeAdapter.d.ts.map +1 -0
- package/dist/contracts/middleware/token-bridge/adapters/CircleBridgeAdapter.js +4 -0
- package/dist/contracts/middleware/token-bridge/adapters/CircleBridgeAdapter.js.map +1 -0
- package/dist/contracts/middleware/token-bridge/adapters/index.d.ts +2 -0
- package/dist/contracts/middleware/token-bridge/adapters/index.d.ts.map +1 -0
- package/dist/contracts/middleware/token-bridge/adapters/index.js +3 -0
- package/dist/contracts/middleware/token-bridge/adapters/index.js.map +1 -0
- package/dist/contracts/middleware/token-bridge/index.d.ts +6 -0
- package/dist/contracts/middleware/token-bridge/index.d.ts.map +1 -0
- package/dist/contracts/middleware/token-bridge/index.js +4 -0
- package/dist/contracts/middleware/token-bridge/index.js.map +1 -0
- package/dist/contracts/middleware/token-bridge/interfaces/ITokenBridgeAdapter.d.ts +67 -0
- package/dist/contracts/middleware/token-bridge/interfaces/ITokenBridgeAdapter.d.ts.map +1 -0
- package/dist/contracts/middleware/token-bridge/interfaces/ITokenBridgeAdapter.js +4 -0
- package/dist/contracts/middleware/token-bridge/interfaces/ITokenBridgeAdapter.js.map +1 -0
- package/dist/contracts/middleware/token-bridge/interfaces/ITokenBridgeMessageRecipient.d.ts +51 -0
- package/dist/contracts/middleware/token-bridge/interfaces/ITokenBridgeMessageRecipient.d.ts.map +1 -0
- package/dist/contracts/middleware/token-bridge/interfaces/ITokenBridgeMessageRecipient.js +4 -0
- package/dist/contracts/middleware/token-bridge/interfaces/ITokenBridgeMessageRecipient.js.map +1 -0
- package/dist/contracts/middleware/token-bridge/interfaces/circle/ICircleBridge.d.ts +78 -0
- package/dist/contracts/middleware/token-bridge/interfaces/circle/ICircleBridge.d.ts.map +1 -0
- package/dist/contracts/middleware/token-bridge/interfaces/circle/ICircleBridge.js +4 -0
- package/dist/contracts/middleware/token-bridge/interfaces/circle/ICircleBridge.js.map +1 -0
- package/dist/contracts/middleware/token-bridge/interfaces/circle/ICircleMessageTransmitter.d.ts +59 -0
- package/dist/contracts/middleware/token-bridge/interfaces/circle/ICircleMessageTransmitter.d.ts.map +1 -0
- package/dist/contracts/middleware/token-bridge/interfaces/circle/ICircleMessageTransmitter.js +4 -0
- package/dist/contracts/middleware/token-bridge/interfaces/circle/ICircleMessageTransmitter.js.map +1 -0
- package/dist/contracts/middleware/token-bridge/interfaces/circle/index.d.ts +3 -0
- package/dist/contracts/middleware/token-bridge/interfaces/circle/index.d.ts.map +1 -0
- package/dist/contracts/middleware/token-bridge/interfaces/circle/index.js +3 -0
- package/dist/contracts/middleware/token-bridge/interfaces/circle/index.js.map +1 -0
- package/dist/contracts/middleware/token-bridge/interfaces/index.d.ts +5 -0
- package/dist/contracts/middleware/token-bridge/interfaces/index.d.ts.map +1 -0
- package/dist/contracts/middleware/token-bridge/interfaces/index.js +4 -0
- package/dist/contracts/middleware/token-bridge/interfaces/index.js.map +1 -0
- package/dist/contracts/mock/MockToken.d.ts +236 -0
- package/dist/contracts/mock/MockToken.d.ts.map +1 -0
- package/dist/contracts/mock/MockToken.js +4 -0
- package/dist/contracts/mock/MockToken.js.map +1 -0
- package/dist/contracts/mock/MockTokenBridgeAdapter.d.ts +99 -0
- package/dist/contracts/mock/MockTokenBridgeAdapter.d.ts.map +1 -0
- package/dist/contracts/mock/MockTokenBridgeAdapter.js +4 -0
- package/dist/contracts/mock/MockTokenBridgeAdapter.js.map +1 -0
- package/dist/contracts/mock/index.d.ts +2 -0
- package/dist/contracts/mock/index.d.ts.map +1 -1
- package/dist/contracts/test/TestTokenBridgeMessageRecipient.d.ts +72 -0
- package/dist/contracts/test/TestTokenBridgeMessageRecipient.d.ts.map +1 -0
- package/dist/contracts/test/TestTokenBridgeMessageRecipient.js +4 -0
- package/dist/contracts/test/TestTokenBridgeMessageRecipient.js.map +1 -0
- package/dist/contracts/test/TestTokenRecipient.d.ts +151 -0
- package/dist/contracts/test/TestTokenRecipient.d.ts.map +1 -0
- package/dist/contracts/test/TestTokenRecipient.js +4 -0
- package/dist/contracts/test/TestTokenRecipient.js.map +1 -0
- package/dist/contracts/test/index.d.ts +2 -0
- package/dist/contracts/test/index.d.ts.map +1 -1
- package/dist/factories/@openzeppelin/contracts/index.d.ts +1 -0
- package/dist/factories/@openzeppelin/contracts/index.d.ts.map +1 -1
- package/dist/factories/@openzeppelin/contracts/index.js +2 -1
- package/dist/factories/@openzeppelin/contracts/index.js.map +1 -1
- package/dist/factories/@openzeppelin/contracts/token/ERC20/IERC20__factory.d.ts +36 -0
- package/dist/factories/@openzeppelin/contracts/token/ERC20/IERC20__factory.d.ts.map +1 -0
- package/dist/factories/@openzeppelin/contracts/token/ERC20/IERC20__factory.js +201 -0
- package/dist/factories/@openzeppelin/contracts/token/ERC20/IERC20__factory.js.map +1 -0
- package/dist/factories/@openzeppelin/contracts/token/ERC20/index.d.ts +2 -0
- package/dist/factories/@openzeppelin/contracts/token/ERC20/index.d.ts.map +1 -0
- package/dist/factories/@openzeppelin/contracts/token/ERC20/index.js +9 -0
- package/dist/factories/@openzeppelin/contracts/token/ERC20/index.js.map +1 -0
- package/dist/factories/@openzeppelin/contracts/token/index.d.ts +2 -0
- package/dist/factories/@openzeppelin/contracts/token/index.d.ts.map +1 -0
- package/dist/factories/@openzeppelin/contracts/token/index.js +31 -0
- package/dist/factories/@openzeppelin/contracts/token/index.js.map +1 -0
- package/dist/factories/@openzeppelin/contracts-upgradeable/index.d.ts +1 -0
- package/dist/factories/@openzeppelin/contracts-upgradeable/index.d.ts.map +1 -1
- package/dist/factories/@openzeppelin/contracts-upgradeable/index.js +2 -1
- package/dist/factories/@openzeppelin/contracts-upgradeable/index.js.map +1 -1
- package/dist/factories/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable__factory.d.ts +48 -0
- package/dist/factories/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable__factory.d.ts.map +1 -0
- package/dist/factories/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable__factory.js +324 -0
- package/dist/factories/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable__factory.js.map +1 -0
- package/dist/factories/@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable__factory.d.ts +36 -0
- package/dist/factories/@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable__factory.d.ts.map +1 -0
- package/dist/factories/@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable__factory.js +201 -0
- package/dist/factories/@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable__factory.js.map +1 -0
- package/dist/factories/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable__factory.d.ts +36 -0
- package/dist/factories/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable__factory.d.ts.map +1 -0
- package/dist/factories/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable__factory.js +240 -0
- package/dist/factories/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable__factory.js.map +1 -0
- package/dist/factories/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/index.d.ts +2 -0
- package/dist/factories/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/index.d.ts.map +1 -0
- package/dist/factories/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/index.js +9 -0
- package/dist/factories/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/index.js.map +1 -0
- package/dist/factories/@openzeppelin/contracts-upgradeable/token/ERC20/index.d.ts +4 -0
- package/dist/factories/@openzeppelin/contracts-upgradeable/token/ERC20/index.d.ts.map +1 -0
- package/dist/factories/@openzeppelin/contracts-upgradeable/token/ERC20/index.js +35 -0
- package/dist/factories/@openzeppelin/contracts-upgradeable/token/ERC20/index.js.map +1 -0
- package/dist/factories/@openzeppelin/contracts-upgradeable/token/index.d.ts +2 -0
- package/dist/factories/@openzeppelin/contracts-upgradeable/token/index.d.ts.map +1 -0
- package/dist/factories/@openzeppelin/contracts-upgradeable/token/index.js +31 -0
- package/dist/factories/@openzeppelin/contracts-upgradeable/token/index.js.map +1 -0
- package/dist/factories/contracts/middleware/index.d.ts +1 -0
- package/dist/factories/contracts/middleware/index.d.ts.map +1 -1
- package/dist/factories/contracts/middleware/index.js +25 -1
- package/dist/factories/contracts/middleware/index.js.map +1 -1
- package/dist/factories/contracts/middleware/token-bridge/TokenBridgeRouter__factory.d.ts +48 -0
- package/dist/factories/contracts/middleware/token-bridge/TokenBridgeRouter__factory.d.ts.map +1 -0
- package/dist/factories/contracts/middleware/token-bridge/TokenBridgeRouter__factory.js +380 -0
- package/dist/factories/contracts/middleware/token-bridge/TokenBridgeRouter__factory.js.map +1 -0
- package/dist/factories/contracts/middleware/token-bridge/adapters/CircleBridgeAdapter__factory.d.ts +48 -0
- package/dist/factories/contracts/middleware/token-bridge/adapters/CircleBridgeAdapter__factory.d.ts.map +1 -0
- package/dist/factories/contracts/middleware/token-bridge/adapters/CircleBridgeAdapter__factory.js +584 -0
- package/dist/factories/contracts/middleware/token-bridge/adapters/CircleBridgeAdapter__factory.js.map +1 -0
- package/dist/factories/contracts/middleware/token-bridge/adapters/index.d.ts +2 -0
- package/dist/factories/contracts/middleware/token-bridge/adapters/index.d.ts.map +1 -0
- package/dist/factories/contracts/middleware/token-bridge/adapters/index.js +9 -0
- package/dist/factories/contracts/middleware/token-bridge/adapters/index.js.map +1 -0
- package/dist/factories/contracts/middleware/token-bridge/index.d.ts +4 -0
- package/dist/factories/contracts/middleware/token-bridge/index.d.ts.map +1 -0
- package/dist/factories/contracts/middleware/token-bridge/index.js +34 -0
- package/dist/factories/contracts/middleware/token-bridge/index.js.map +1 -0
- package/dist/factories/contracts/middleware/token-bridge/interfaces/ITokenBridgeAdapter__factory.d.ts +23 -0
- package/dist/factories/contracts/middleware/token-bridge/interfaces/ITokenBridgeAdapter__factory.d.ts.map +1 -0
- package/dist/factories/contracts/middleware/token-bridge/interfaces/ITokenBridgeAdapter__factory.js +91 -0
- package/dist/factories/contracts/middleware/token-bridge/interfaces/ITokenBridgeAdapter__factory.js.map +1 -0
- package/dist/factories/contracts/middleware/token-bridge/interfaces/ITokenBridgeMessageRecipient__factory.d.ts +19 -0
- package/dist/factories/contracts/middleware/token-bridge/interfaces/ITokenBridgeMessageRecipient__factory.d.ts.map +1 -0
- package/dist/factories/contracts/middleware/token-bridge/interfaces/ITokenBridgeMessageRecipient__factory.js +51 -0
- package/dist/factories/contracts/middleware/token-bridge/interfaces/ITokenBridgeMessageRecipient__factory.js.map +1 -0
- package/dist/factories/contracts/middleware/token-bridge/interfaces/circle/ICircleBridge__factory.d.ts +36 -0
- package/dist/factories/contracts/middleware/token-bridge/interfaces/circle/ICircleBridge__factory.d.ts.map +1 -0
- package/dist/factories/contracts/middleware/token-bridge/interfaces/circle/ICircleBridge__factory.js +104 -0
- package/dist/factories/contracts/middleware/token-bridge/interfaces/circle/ICircleBridge__factory.js.map +1 -0
- package/dist/factories/contracts/middleware/token-bridge/interfaces/circle/ICircleMessageTransmitter__factory.d.ts +23 -0
- package/dist/factories/contracts/middleware/token-bridge/interfaces/circle/ICircleMessageTransmitter__factory.d.ts.map +1 -0
- package/dist/factories/contracts/middleware/token-bridge/interfaces/circle/ICircleMessageTransmitter__factory.js +61 -0
- package/dist/factories/contracts/middleware/token-bridge/interfaces/circle/ICircleMessageTransmitter__factory.js.map +1 -0
- package/dist/factories/contracts/middleware/token-bridge/interfaces/circle/index.d.ts +3 -0
- package/dist/factories/contracts/middleware/token-bridge/interfaces/circle/index.d.ts.map +1 -0
- package/dist/factories/contracts/middleware/token-bridge/interfaces/circle/index.js +11 -0
- package/dist/factories/contracts/middleware/token-bridge/interfaces/circle/index.js.map +1 -0
- package/dist/factories/contracts/middleware/token-bridge/interfaces/index.d.ts +4 -0
- package/dist/factories/contracts/middleware/token-bridge/interfaces/index.d.ts.map +1 -0
- package/dist/factories/contracts/middleware/token-bridge/interfaces/index.js +35 -0
- package/dist/factories/contracts/middleware/token-bridge/interfaces/index.js.map +1 -0
- package/dist/factories/contracts/mock/MockTokenBridgeAdapter__factory.d.ts +45 -0
- package/dist/factories/contracts/mock/MockTokenBridgeAdapter__factory.d.ts.map +1 -0
- package/dist/factories/contracts/mock/MockTokenBridgeAdapter__factory.js +170 -0
- package/dist/factories/contracts/mock/MockTokenBridgeAdapter__factory.js.map +1 -0
- package/dist/factories/contracts/mock/MockToken__factory.d.ts +48 -0
- package/dist/factories/contracts/mock/MockToken__factory.d.ts.map +1 -0
- package/dist/factories/contracts/mock/MockToken__factory.js +355 -0
- package/dist/factories/contracts/mock/MockToken__factory.js.map +1 -0
- package/dist/factories/contracts/mock/index.d.ts +2 -0
- package/dist/factories/contracts/mock/index.d.ts.map +1 -1
- package/dist/factories/contracts/mock/index.js +5 -1
- package/dist/factories/contracts/mock/index.js.map +1 -1
- package/dist/factories/contracts/test/TestTokenBridgeMessageRecipient__factory.d.ts +44 -0
- package/dist/factories/contracts/test/TestTokenBridgeMessageRecipient__factory.d.ts.map +1 -0
- package/dist/factories/contracts/test/TestTokenBridgeMessageRecipient__factory.js +111 -0
- package/dist/factories/contracts/test/TestTokenBridgeMessageRecipient__factory.js.map +1 -0
- package/dist/factories/contracts/test/TestTokenRecipient__factory.d.ts +55 -0
- package/dist/factories/contracts/test/TestTokenRecipient__factory.d.ts.map +1 -0
- package/dist/factories/contracts/test/TestTokenRecipient__factory.js +232 -0
- package/dist/factories/contracts/test/TestTokenRecipient__factory.js.map +1 -0
- package/dist/factories/contracts/test/index.d.ts +2 -0
- package/dist/factories/contracts/test/index.d.ts.map +1 -1
- package/dist/factories/contracts/test/index.js +5 -1
- package/dist/factories/contracts/test/index.js.map +1 -1
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
pragma solidity ^0.8.13;
|
|
3
|
+
|
|
4
|
+
import {Router} from "../../Router.sol";
|
|
5
|
+
|
|
6
|
+
import {IMessageRecipient} from "../../../interfaces/IMessageRecipient.sol";
|
|
7
|
+
import {ICircleBridge} from "./interfaces/circle/ICircleBridge.sol";
|
|
8
|
+
import {ICircleMessageTransmitter} from "./interfaces/circle/ICircleMessageTransmitter.sol";
|
|
9
|
+
import {ITokenBridgeAdapter} from "./interfaces/ITokenBridgeAdapter.sol";
|
|
10
|
+
import {ITokenBridgeMessageRecipient} from "./interfaces/ITokenBridgeMessageRecipient.sol";
|
|
11
|
+
|
|
12
|
+
import {TypeCasts} from "../../libs/TypeCasts.sol";
|
|
13
|
+
|
|
14
|
+
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
|
|
15
|
+
|
|
16
|
+
contract TokenBridgeRouter is Router {
|
|
17
|
+
// Token bridge => adapter address
|
|
18
|
+
mapping(string => address) public tokenBridgeAdapters;
|
|
19
|
+
|
|
20
|
+
event TokenBridgeAdapterSet(string indexed bridge, address adapter);
|
|
21
|
+
|
|
22
|
+
function initialize(
|
|
23
|
+
address _owner,
|
|
24
|
+
address _abacusConnectionManager,
|
|
25
|
+
address _interchainGasPaymaster
|
|
26
|
+
) public initializer {
|
|
27
|
+
// Transfer ownership of the contract to deployer
|
|
28
|
+
_transferOwnership(_owner);
|
|
29
|
+
// Set the addresses for the ACM and IGP
|
|
30
|
+
// Alternatively, this could be done later in an initialize method
|
|
31
|
+
_setAbacusConnectionManager(_abacusConnectionManager);
|
|
32
|
+
_setInterchainGasPaymaster(_interchainGasPaymaster);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function dispatchWithTokens(
|
|
36
|
+
uint32 _destinationDomain,
|
|
37
|
+
bytes32 _recipientAddress,
|
|
38
|
+
bytes calldata _messageBody,
|
|
39
|
+
address _token,
|
|
40
|
+
uint256 _amount,
|
|
41
|
+
string calldata _bridge
|
|
42
|
+
) external payable {
|
|
43
|
+
ITokenBridgeAdapter _adapter = _getAdapter(_bridge);
|
|
44
|
+
|
|
45
|
+
// Transfer the tokens to the adapter
|
|
46
|
+
// TODO: use safeTransferFrom
|
|
47
|
+
// TODO: Are there scenarios where a transferFrom fails and it doesn't revert?
|
|
48
|
+
require(
|
|
49
|
+
IERC20(_token).transferFrom(msg.sender, address(_adapter), _amount),
|
|
50
|
+
"!transfer in"
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
// Reverts if the bridge was unsuccessful.
|
|
54
|
+
// Gets adapter-specific data that is encoded into the message
|
|
55
|
+
// ultimately sent via Hyperlane.
|
|
56
|
+
bytes memory _adapterData = _adapter.sendTokens(
|
|
57
|
+
_destinationDomain,
|
|
58
|
+
_recipientAddress,
|
|
59
|
+
_token,
|
|
60
|
+
_amount
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
// The user's message "wrapped" with metadata required by this middleware
|
|
64
|
+
bytes memory _messageWithMetadata = abi.encode(
|
|
65
|
+
TypeCasts.addressToBytes32(msg.sender),
|
|
66
|
+
_recipientAddress, // The "user" recipient
|
|
67
|
+
_amount, // The amount of the tokens sent over the bridge
|
|
68
|
+
_bridge, // The destination token bridge ID
|
|
69
|
+
_adapterData, // The adapter-specific data
|
|
70
|
+
_messageBody // The "user" message
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
// Dispatch the _messageWithMetadata to the destination's TokenBridgeRouter.
|
|
74
|
+
_dispatchWithGas(_destinationDomain, _messageWithMetadata, msg.value);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Handles a message from an enrolled remote TokenBridgeRouter
|
|
78
|
+
function _handle(
|
|
79
|
+
uint32 _origin,
|
|
80
|
+
bytes32, // _sender, unused
|
|
81
|
+
bytes calldata _message
|
|
82
|
+
) internal override {
|
|
83
|
+
// Decode the message with metadata, "unwrapping" the user's message body
|
|
84
|
+
(
|
|
85
|
+
bytes32 _originalSender,
|
|
86
|
+
bytes32 _userRecipientAddress,
|
|
87
|
+
uint256 _amount,
|
|
88
|
+
string memory _bridge,
|
|
89
|
+
bytes memory _adapterData,
|
|
90
|
+
bytes memory _userMessageBody
|
|
91
|
+
) = abi.decode(
|
|
92
|
+
_message,
|
|
93
|
+
(bytes32, bytes32, uint256, string, bytes, bytes)
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
ITokenBridgeMessageRecipient _userRecipient = ITokenBridgeMessageRecipient(
|
|
97
|
+
TypeCasts.bytes32ToAddress(_userRecipientAddress)
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
// Reverts if the adapter hasn't received the bridged tokens yet
|
|
101
|
+
(address _token, uint256 _receivedAmount) = _getAdapter(_bridge)
|
|
102
|
+
.receiveTokens(
|
|
103
|
+
_origin,
|
|
104
|
+
address(_userRecipient),
|
|
105
|
+
_amount,
|
|
106
|
+
_adapterData
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
_userRecipient.handleWithTokens(
|
|
110
|
+
_origin,
|
|
111
|
+
_originalSender,
|
|
112
|
+
_userMessageBody,
|
|
113
|
+
_token,
|
|
114
|
+
_receivedAmount
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function setTokenBridgeAdapter(string calldata _bridge, address _adapter)
|
|
119
|
+
external
|
|
120
|
+
onlyOwner
|
|
121
|
+
{
|
|
122
|
+
tokenBridgeAdapters[_bridge] = _adapter;
|
|
123
|
+
emit TokenBridgeAdapterSet(_bridge, _adapter);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function _getAdapter(string memory _bridge)
|
|
127
|
+
internal
|
|
128
|
+
view
|
|
129
|
+
returns (ITokenBridgeAdapter _adapter)
|
|
130
|
+
{
|
|
131
|
+
_adapter = ITokenBridgeAdapter(tokenBridgeAdapters[_bridge]);
|
|
132
|
+
// Require the adapter to have been set
|
|
133
|
+
require(address(_adapter) != address(0), "No adapter found for bridge");
|
|
134
|
+
}
|
|
135
|
+
}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
pragma solidity ^0.8.13;
|
|
3
|
+
|
|
4
|
+
import {Router} from "../../../Router.sol";
|
|
5
|
+
|
|
6
|
+
import {ICircleBridge} from "../interfaces/circle/ICircleBridge.sol";
|
|
7
|
+
import {ICircleMessageTransmitter} from "../interfaces/circle/ICircleMessageTransmitter.sol";
|
|
8
|
+
import {ITokenBridgeAdapter} from "../interfaces/ITokenBridgeAdapter.sol";
|
|
9
|
+
|
|
10
|
+
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
|
|
11
|
+
|
|
12
|
+
contract CircleBridgeAdapter is ITokenBridgeAdapter, Router {
|
|
13
|
+
/// @notice The CircleBridge contract.
|
|
14
|
+
ICircleBridge public circleBridge;
|
|
15
|
+
|
|
16
|
+
/// @notice The Circle MessageTransmitter contract.
|
|
17
|
+
ICircleMessageTransmitter public circleMessageTransmitter;
|
|
18
|
+
|
|
19
|
+
/// @notice The TokenBridgeRouter contract.
|
|
20
|
+
address public tokenBridgeRouter;
|
|
21
|
+
|
|
22
|
+
/// @notice Hyperlane domain => Circle domain.
|
|
23
|
+
/// ATM, known Circle domains are Ethereum = 0 and Avalanche = 1.
|
|
24
|
+
/// Note this could result in ambiguity between the Circle domain being
|
|
25
|
+
/// Ethereum or unknown. TODO fix?
|
|
26
|
+
mapping(uint32 => uint32) public hyperlaneDomainToCircleDomain;
|
|
27
|
+
|
|
28
|
+
/// @notice Token symbol => address of token on local chain.
|
|
29
|
+
mapping(string => IERC20) public tokenSymbolToAddress;
|
|
30
|
+
|
|
31
|
+
/// @notice Local chain token address => token symbol.
|
|
32
|
+
mapping(address => string) public tokenAddressToSymbol;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* @notice Emits the nonce of the Circle message when a token is bridged.
|
|
36
|
+
* @param nonce The nonce of the Circle message.
|
|
37
|
+
*/
|
|
38
|
+
event BridgedToken(uint64 nonce);
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* @notice Emitted when the Hyperlane domain to Circle domain mapping is updated.
|
|
42
|
+
* @param hyperlaneDomain The Hyperlane domain.
|
|
43
|
+
* @param circleDomain The Circle domain.
|
|
44
|
+
*/
|
|
45
|
+
event DomainAdded(uint32 indexed hyperlaneDomain, uint32 circleDomain);
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* @notice Emitted when a local token and its token symbol have been added.
|
|
49
|
+
*/
|
|
50
|
+
event TokenAdded(address indexed token, string indexed symbol);
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* @notice Emitted when a local token and its token symbol have been removed.
|
|
54
|
+
*/
|
|
55
|
+
event TokenRemoved(address indexed token, string indexed symbol);
|
|
56
|
+
|
|
57
|
+
modifier onlyTokenBridgeRouter() {
|
|
58
|
+
require(msg.sender == tokenBridgeRouter, "!tokenBridgeRouter");
|
|
59
|
+
_;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* @param _owner The new owner.
|
|
64
|
+
* @param _circleBridge The CircleBridge contract.
|
|
65
|
+
* @param _circleMessageTransmitter The Circle MessageTransmitter contract.
|
|
66
|
+
* @param _tokenBridgeRouter The TokenBridgeRouter contract.
|
|
67
|
+
*/
|
|
68
|
+
function initialize(
|
|
69
|
+
address _owner,
|
|
70
|
+
address _circleBridge,
|
|
71
|
+
address _circleMessageTransmitter,
|
|
72
|
+
address _tokenBridgeRouter
|
|
73
|
+
) public initializer {
|
|
74
|
+
// Transfer ownership of the contract to deployer
|
|
75
|
+
_transferOwnership(_owner);
|
|
76
|
+
|
|
77
|
+
// Set the addresses for the ACM and IGP to address(0) - they aren't used.
|
|
78
|
+
_setAbacusConnectionManager(address(0));
|
|
79
|
+
_setInterchainGasPaymaster(address(0));
|
|
80
|
+
|
|
81
|
+
circleBridge = ICircleBridge(_circleBridge);
|
|
82
|
+
circleMessageTransmitter = ICircleMessageTransmitter(
|
|
83
|
+
_circleMessageTransmitter
|
|
84
|
+
);
|
|
85
|
+
tokenBridgeRouter = _tokenBridgeRouter;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function sendTokens(
|
|
89
|
+
uint32 _destinationDomain,
|
|
90
|
+
bytes32, // _recipientAddress, unused
|
|
91
|
+
address _token,
|
|
92
|
+
uint256 _amount
|
|
93
|
+
) external onlyTokenBridgeRouter returns (bytes memory) {
|
|
94
|
+
string memory _tokenSymbol = tokenAddressToSymbol[_token];
|
|
95
|
+
require(
|
|
96
|
+
bytes(_tokenSymbol).length > 0,
|
|
97
|
+
"CircleBridgeAdapter: Unknown token"
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
uint32 _circleDomain = hyperlaneDomainToCircleDomain[
|
|
101
|
+
_destinationDomain
|
|
102
|
+
];
|
|
103
|
+
bytes32 _remoteRouter = routers[_destinationDomain];
|
|
104
|
+
require(
|
|
105
|
+
_remoteRouter != bytes32(0),
|
|
106
|
+
"CircleBridgeAdapter: No router for domain"
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
// Approve the token to Circle. We assume that the TokenBridgeRouter
|
|
110
|
+
// has already transferred the token to this contract.
|
|
111
|
+
require(
|
|
112
|
+
IERC20(_token).approve(address(circleBridge), _amount),
|
|
113
|
+
"!approval"
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
uint64 _nonce = circleBridge.depositForBurn(
|
|
117
|
+
_amount,
|
|
118
|
+
_circleDomain,
|
|
119
|
+
_remoteRouter, // Mint to the remote router
|
|
120
|
+
_token
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
emit BridgedToken(_nonce);
|
|
124
|
+
|
|
125
|
+
return abi.encodePacked(_nonce, _tokenSymbol);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Returns the token and amount sent
|
|
129
|
+
function receiveTokens(
|
|
130
|
+
uint32 _originDomain, // Hyperlane domain
|
|
131
|
+
address _recipient,
|
|
132
|
+
uint256 _amount,
|
|
133
|
+
bytes calldata _adapterData // The adapter data from the message
|
|
134
|
+
) external onlyTokenBridgeRouter returns (address, uint256) {
|
|
135
|
+
// The origin Circle domain
|
|
136
|
+
uint32 _originCircleDomain = hyperlaneDomainToCircleDomain[
|
|
137
|
+
_originDomain
|
|
138
|
+
];
|
|
139
|
+
// Get the token symbol and nonce of the transfer from the _adapterData
|
|
140
|
+
(uint64 _nonce, string memory _tokenSymbol) = abi.decode(
|
|
141
|
+
_adapterData,
|
|
142
|
+
(uint64, string)
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
// Require the circle message to have been processed
|
|
146
|
+
bytes32 _nonceId = _circleNonceId(_originCircleDomain, _nonce);
|
|
147
|
+
require(
|
|
148
|
+
circleMessageTransmitter.usedNonces(_nonceId),
|
|
149
|
+
"Circle message not processed yet"
|
|
150
|
+
);
|
|
151
|
+
|
|
152
|
+
IERC20 _token = tokenSymbolToAddress[_tokenSymbol];
|
|
153
|
+
require(
|
|
154
|
+
address(_token) != address(0),
|
|
155
|
+
"CircleBridgeAdapter: Unknown token"
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
// Transfer the token out to the recipient
|
|
159
|
+
// TODO: use safeTransfer
|
|
160
|
+
// Circle doesn't charge any fee, so we can safely transfer out the
|
|
161
|
+
// exact amount that was bridged over.
|
|
162
|
+
require(_token.transfer(_recipient, _amount), "!transfer out");
|
|
163
|
+
|
|
164
|
+
return (address(_token), _amount);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// This contract is only a Router to be aware of remote router addresses,
|
|
168
|
+
// and doesn't actually send/handle Hyperlane messages directly
|
|
169
|
+
function _handle(
|
|
170
|
+
uint32, // origin
|
|
171
|
+
bytes32, // sender
|
|
172
|
+
bytes calldata // message
|
|
173
|
+
) internal pure override {
|
|
174
|
+
revert("No messages expected");
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function addDomain(uint32 _hyperlaneDomain, uint32 _circleDomain)
|
|
178
|
+
external
|
|
179
|
+
onlyOwner
|
|
180
|
+
{
|
|
181
|
+
hyperlaneDomainToCircleDomain[_hyperlaneDomain] = _circleDomain;
|
|
182
|
+
|
|
183
|
+
emit DomainAdded(_hyperlaneDomain, _circleDomain);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function addToken(address _token, string calldata _tokenSymbol)
|
|
187
|
+
external
|
|
188
|
+
onlyOwner
|
|
189
|
+
{
|
|
190
|
+
require(
|
|
191
|
+
_token != address(0) && bytes(_tokenSymbol).length > 0,
|
|
192
|
+
"Cannot add default values"
|
|
193
|
+
);
|
|
194
|
+
|
|
195
|
+
// Require the token and token symbol to be unset.
|
|
196
|
+
address _existingToken = address(tokenSymbolToAddress[_tokenSymbol]);
|
|
197
|
+
require(_existingToken == address(0), "token symbol already has token");
|
|
198
|
+
|
|
199
|
+
string memory _existingSymbol = tokenAddressToSymbol[_token];
|
|
200
|
+
require(
|
|
201
|
+
bytes(_existingSymbol).length == 0,
|
|
202
|
+
"token already has token symbol"
|
|
203
|
+
);
|
|
204
|
+
|
|
205
|
+
tokenAddressToSymbol[_token] = _tokenSymbol;
|
|
206
|
+
tokenSymbolToAddress[_tokenSymbol] = IERC20(_token);
|
|
207
|
+
|
|
208
|
+
emit TokenAdded(_token, _tokenSymbol);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
function removeToken(address _token, string calldata _tokenSymbol)
|
|
212
|
+
external
|
|
213
|
+
onlyOwner
|
|
214
|
+
{
|
|
215
|
+
// Require the provided token and token symbols match what's in storage.
|
|
216
|
+
address _existingToken = address(tokenSymbolToAddress[_tokenSymbol]);
|
|
217
|
+
require(_existingToken == _token, "Token mismatch");
|
|
218
|
+
|
|
219
|
+
string memory _existingSymbol = tokenAddressToSymbol[_token];
|
|
220
|
+
require(
|
|
221
|
+
keccak256(bytes(_existingSymbol)) == keccak256(bytes(_tokenSymbol)),
|
|
222
|
+
"Token symbol mismatch"
|
|
223
|
+
);
|
|
224
|
+
|
|
225
|
+
// Delete them from storage.
|
|
226
|
+
delete tokenSymbolToAddress[_tokenSymbol];
|
|
227
|
+
delete tokenAddressToSymbol[_token];
|
|
228
|
+
|
|
229
|
+
emit TokenRemoved(_token, _tokenSymbol);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* @notice Gets the Circle nonce ID by hashing _originCircleDomain and _nonce.
|
|
234
|
+
* @param _originCircleDomain Domain of chain where the transfer originated
|
|
235
|
+
* @param _nonce The unique identifier for the message from source to
|
|
236
|
+
destination
|
|
237
|
+
* @return hash of source and nonce
|
|
238
|
+
*/
|
|
239
|
+
function _circleNonceId(uint32 _originCircleDomain, uint64 _nonce)
|
|
240
|
+
internal
|
|
241
|
+
pure
|
|
242
|
+
returns (bytes32)
|
|
243
|
+
{
|
|
244
|
+
// The hash is of a uint256 nonce, not a uint64 one.
|
|
245
|
+
return
|
|
246
|
+
keccak256(abi.encodePacked(_originCircleDomain, uint256(_nonce)));
|
|
247
|
+
}
|
|
248
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
pragma solidity ^0.8.13;
|
|
3
|
+
|
|
4
|
+
interface ITokenBridgeAdapter {
|
|
5
|
+
function sendTokens(
|
|
6
|
+
uint32 _destinationDomain,
|
|
7
|
+
bytes32 _recipientAddress,
|
|
8
|
+
address _token,
|
|
9
|
+
uint256 _amount
|
|
10
|
+
) external returns (bytes memory _adapterData);
|
|
11
|
+
|
|
12
|
+
function receiveTokens(
|
|
13
|
+
uint32 _originDomain, // Hyperlane domain
|
|
14
|
+
address _recipientAddress,
|
|
15
|
+
uint256 _amount,
|
|
16
|
+
bytes calldata _adapterData // The adapter data from the message
|
|
17
|
+
) external returns (address, uint256);
|
|
18
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
pragma solidity ^0.8.13;
|
|
3
|
+
|
|
4
|
+
interface ITokenBridgeMessageRecipient {
|
|
5
|
+
function handleWithTokens(
|
|
6
|
+
uint32 _origin,
|
|
7
|
+
bytes32 _sender,
|
|
8
|
+
bytes calldata _message,
|
|
9
|
+
address _token,
|
|
10
|
+
uint256 _amount
|
|
11
|
+
) external;
|
|
12
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
pragma solidity ^0.8.13;
|
|
3
|
+
|
|
4
|
+
interface ICircleBridge {
|
|
5
|
+
event MessageSent(bytes message);
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @notice Deposits and burns tokens from sender to be minted on destination domain.
|
|
9
|
+
* Emits a `DepositForBurn` event.
|
|
10
|
+
* @dev reverts if:
|
|
11
|
+
* - given burnToken is not supported
|
|
12
|
+
* - given destinationDomain has no CircleBridge registered
|
|
13
|
+
* - transferFrom() reverts. For example, if sender's burnToken balance or approved allowance
|
|
14
|
+
* to this contract is less than `amount`.
|
|
15
|
+
* - burn() reverts. For example, if `amount` is 0.
|
|
16
|
+
* - MessageTransmitter returns false or reverts.
|
|
17
|
+
* @param _amount amount of tokens to burn
|
|
18
|
+
* @param _destinationDomain destination domain (ETH = 0, AVAX = 1)
|
|
19
|
+
* @param _mintRecipient address of mint recipient on destination domain
|
|
20
|
+
* @param _burnToken address of contract to burn deposited tokens, on local domain
|
|
21
|
+
* @return _nonce unique nonce reserved by message
|
|
22
|
+
*/
|
|
23
|
+
function depositForBurn(
|
|
24
|
+
uint256 _amount,
|
|
25
|
+
uint32 _destinationDomain,
|
|
26
|
+
bytes32 _mintRecipient,
|
|
27
|
+
address _burnToken
|
|
28
|
+
) external returns (uint64 _nonce);
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* @notice Deposits and burns tokens from sender to be minted on destination domain. The mint
|
|
32
|
+
* on the destination domain must be called by `_destinationCaller`.
|
|
33
|
+
* WARNING: if the `_destinationCaller` does not represent a valid address as bytes32, then it will not be possible
|
|
34
|
+
* to broadcast the message on the destination domain. This is an advanced feature, and the standard
|
|
35
|
+
* depositForBurn() should be preferred for use cases where a specific destination caller is not required.
|
|
36
|
+
* Emits a `DepositForBurn` event.
|
|
37
|
+
* @dev reverts if:
|
|
38
|
+
* - given destinationCaller is zero address
|
|
39
|
+
* - given burnToken is not supported
|
|
40
|
+
* - given destinationDomain has no CircleBridge registered
|
|
41
|
+
* - transferFrom() reverts. For example, if sender's burnToken balance or approved allowance
|
|
42
|
+
* to this contract is less than `amount`.
|
|
43
|
+
* - burn() reverts. For example, if `amount` is 0.
|
|
44
|
+
* - MessageTransmitter returns false or reverts.
|
|
45
|
+
* @param _amount amount of tokens to burn
|
|
46
|
+
* @param _destinationDomain destination domain
|
|
47
|
+
* @param _mintRecipient address of mint recipient on destination domain
|
|
48
|
+
* @param _burnToken address of contract to burn deposited tokens, on local domain
|
|
49
|
+
* @param _destinationCaller caller on the destination domain, as bytes32
|
|
50
|
+
* @return _nonce unique nonce reserved by message
|
|
51
|
+
*/
|
|
52
|
+
function depositForBurnWithCaller(
|
|
53
|
+
uint256 _amount,
|
|
54
|
+
uint32 _destinationDomain,
|
|
55
|
+
bytes32 _mintRecipient,
|
|
56
|
+
address _burnToken,
|
|
57
|
+
bytes32 _destinationCaller
|
|
58
|
+
) external returns (uint64 _nonce);
|
|
59
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
pragma solidity ^0.8.13;
|
|
3
|
+
|
|
4
|
+
interface ICircleMessageTransmitter {
|
|
5
|
+
/**
|
|
6
|
+
* @notice Receive a message. Messages with a given nonce
|
|
7
|
+
* can only be broadcast once for a (sourceDomain, destinationDomain)
|
|
8
|
+
* pair. The message body of a valid message is passed to the
|
|
9
|
+
* specified recipient for further processing.
|
|
10
|
+
*
|
|
11
|
+
* @dev Attestation format:
|
|
12
|
+
* A valid attestation is the concatenated 65-byte signature(s) of exactly
|
|
13
|
+
* `thresholdSignature` signatures, in increasing order of attester address.
|
|
14
|
+
* ***If the attester addresses recovered from signatures are not in
|
|
15
|
+
* increasing order, signature verification will fail.***
|
|
16
|
+
* If incorrect number of signatures or duplicate signatures are supplied,
|
|
17
|
+
* signature verification will fail.
|
|
18
|
+
*
|
|
19
|
+
* Message format:
|
|
20
|
+
* Field Bytes Type Index
|
|
21
|
+
* version 4 uint32 0
|
|
22
|
+
* sourceDomain 4 uint32 4
|
|
23
|
+
* destinationDomain 4 uint32 8
|
|
24
|
+
* nonce 8 uint64 12
|
|
25
|
+
* sender 32 bytes32 20
|
|
26
|
+
* recipient 32 bytes32 52
|
|
27
|
+
* messageBody dynamic bytes 84
|
|
28
|
+
* @param _message Message bytes
|
|
29
|
+
* @param _attestation Concatenated 65-byte signature(s) of `_message`, in increasing order
|
|
30
|
+
* of the attester address recovered from signatures.
|
|
31
|
+
* @return success bool, true if successful
|
|
32
|
+
*/
|
|
33
|
+
function receiveMessage(bytes memory _message, bytes calldata _attestation)
|
|
34
|
+
external
|
|
35
|
+
returns (bool success);
|
|
36
|
+
|
|
37
|
+
function usedNonces(bytes32 _nonceId) external view returns (bool);
|
|
38
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
pragma solidity ^0.8.13;
|
|
3
|
+
|
|
4
|
+
import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";
|
|
5
|
+
|
|
6
|
+
contract MockToken is ERC20Upgradeable {
|
|
7
|
+
function mint(address account, uint256 amount) external {
|
|
8
|
+
_mint(account, amount);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function burn(uint256 _amount) external {
|
|
12
|
+
_burn(msg.sender, _amount);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
pragma solidity ^0.8.13;
|
|
3
|
+
|
|
4
|
+
import {ITokenBridgeAdapter} from "../middleware/token-bridge/interfaces/ITokenBridgeAdapter.sol";
|
|
5
|
+
import {MockToken} from "./MockToken.sol";
|
|
6
|
+
|
|
7
|
+
contract MockTokenBridgeAdapter is ITokenBridgeAdapter {
|
|
8
|
+
uint256 public nonce = 0;
|
|
9
|
+
MockToken token;
|
|
10
|
+
|
|
11
|
+
mapping(uint256 => bool) public isProcessed;
|
|
12
|
+
|
|
13
|
+
constructor(MockToken _token) {
|
|
14
|
+
token = _token;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function sendTokens(
|
|
18
|
+
uint32,
|
|
19
|
+
bytes32,
|
|
20
|
+
address _token,
|
|
21
|
+
uint256 _amount
|
|
22
|
+
) external override returns (bytes memory _adapterData) {
|
|
23
|
+
require(_token == address(token), "cant bridge this token");
|
|
24
|
+
token.burn(_amount);
|
|
25
|
+
nonce = nonce + 1;
|
|
26
|
+
return abi.encode(nonce);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function process(uint256 _nonce) public {
|
|
30
|
+
isProcessed[_nonce] = true;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function receiveTokens(
|
|
34
|
+
uint32 _originDomain, // Hyperlane domain
|
|
35
|
+
address _recipientAddress,
|
|
36
|
+
uint256 _amount,
|
|
37
|
+
bytes calldata _adapterData // The adapter data from the message
|
|
38
|
+
) external override returns (address, uint256) {
|
|
39
|
+
_originDomain;
|
|
40
|
+
uint256 _nonce = abi.decode(_adapterData, (uint256));
|
|
41
|
+
// Check if the transfer was processed first
|
|
42
|
+
require(isProcessed[_nonce], "Transfer has not been processed yet");
|
|
43
|
+
token.mint(_recipientAddress, _amount);
|
|
44
|
+
return (address(0), 0);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
pragma solidity ^0.8.13;
|
|
3
|
+
|
|
4
|
+
import {ITokenBridgeMessageRecipient} from "../middleware/token-bridge/interfaces/ITokenBridgeMessageRecipient.sol";
|
|
5
|
+
|
|
6
|
+
contract TestTokenBridgeMessageRecipient is ITokenBridgeMessageRecipient {
|
|
7
|
+
event HandledWithTokens(
|
|
8
|
+
uint32 origin,
|
|
9
|
+
bytes32 sender,
|
|
10
|
+
bytes message,
|
|
11
|
+
address token,
|
|
12
|
+
uint256 amount
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
function handleWithTokens(
|
|
16
|
+
uint32 _origin,
|
|
17
|
+
bytes32 _sender,
|
|
18
|
+
bytes calldata _message,
|
|
19
|
+
address _token,
|
|
20
|
+
uint256 _amount
|
|
21
|
+
) external {
|
|
22
|
+
emit HandledWithTokens(_origin, _sender, _message, _token, _amount);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT OR Apache-2.0
|
|
2
|
+
pragma solidity >=0.8.0;
|
|
3
|
+
|
|
4
|
+
import {ITokenBridgeMessageRecipient} from "../middleware/token-bridge/interfaces/ITokenBridgeMessageRecipient.sol";
|
|
5
|
+
|
|
6
|
+
contract TestTokenRecipient is ITokenBridgeMessageRecipient {
|
|
7
|
+
bytes32 public lastSender;
|
|
8
|
+
bytes public lastData;
|
|
9
|
+
address public lastToken;
|
|
10
|
+
uint256 public lastAmount;
|
|
11
|
+
|
|
12
|
+
address public lastCaller;
|
|
13
|
+
string public lastCallMessage;
|
|
14
|
+
|
|
15
|
+
event ReceivedMessage(
|
|
16
|
+
uint32 indexed origin,
|
|
17
|
+
bytes32 indexed sender,
|
|
18
|
+
string message,
|
|
19
|
+
address token,
|
|
20
|
+
uint256 amount
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
event ReceivedCall(address indexed caller, uint256 amount, string message);
|
|
24
|
+
|
|
25
|
+
function handleWithTokens(
|
|
26
|
+
uint32 _origin,
|
|
27
|
+
bytes32 _sender,
|
|
28
|
+
bytes calldata _data,
|
|
29
|
+
address _token,
|
|
30
|
+
uint256 _amount
|
|
31
|
+
) external override {
|
|
32
|
+
emit ReceivedMessage(_origin, _sender, string(_data), _token, _amount);
|
|
33
|
+
lastSender = _sender;
|
|
34
|
+
lastData = _data;
|
|
35
|
+
lastToken = _token;
|
|
36
|
+
lastAmount = _amount;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function fooBar(uint256 amount, string calldata message) external {
|
|
40
|
+
emit ReceivedCall(msg.sender, amount, message);
|
|
41
|
+
lastCaller = msg.sender;
|
|
42
|
+
lastCallMessage = message;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../types/@openzeppelin/contracts/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../types/@openzeppelin/contracts/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,MAAM,UAAU,CAAC;AACxC,OAAO,KAAK,KAAK,KAAK,MAAM,SAAS,CAAC;AAEtC,YAAY,EAAE,MAAM,EAAE,CAAC;AAEvB,YAAY,EAAE,KAAK,EAAE,CAAC"}
|