编译器
0.8.13+commit.abaa5c0e
文件 1 的 11:ECDSA.sol
pragma solidity ^0.8.0;
import "../Strings.sol";
library ECDSA {
enum RecoverError {
NoError,
InvalidSignature,
InvalidSignatureLength,
InvalidSignatureS,
InvalidSignatureV
}
function _throwError(RecoverError error) private pure {
if (error == RecoverError.NoError) {
return;
} else if (error == RecoverError.InvalidSignature) {
revert("ECDSA: invalid signature");
} else if (error == RecoverError.InvalidSignatureLength) {
revert("ECDSA: invalid signature length");
} else if (error == RecoverError.InvalidSignatureS) {
revert("ECDSA: invalid signature 's' value");
}
}
function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
if (signature.length == 65) {
bytes32 r;
bytes32 s;
uint8 v;
assembly {
r := mload(add(signature, 0x20))
s := mload(add(signature, 0x40))
v := byte(0, mload(add(signature, 0x60)))
}
return tryRecover(hash, v, r, s);
} else {
return (address(0), RecoverError.InvalidSignatureLength);
}
}
function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, signature);
_throwError(error);
return recovered;
}
function tryRecover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address, RecoverError) {
bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
uint8 v = uint8((uint256(vs) >> 255) + 27);
return tryRecover(hash, v, r, s);
}
function recover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, r, vs);
_throwError(error);
return recovered;
}
function tryRecover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address, RecoverError) {
if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
return (address(0), RecoverError.InvalidSignatureS);
}
address signer = ecrecover(hash, v, r, s);
if (signer == address(0)) {
return (address(0), RecoverError.InvalidSignature);
}
return (signer, RecoverError.NoError);
}
function recover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, v, r, s);
_throwError(error);
return recovered;
}
function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
}
function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
}
function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
}
}
文件 2 的 11:ERC20.sol
pragma solidity >=0.8.0;
abstract contract ERC20 {
event Transfer(address indexed from, address indexed to, uint256 amount);
event Approval(address indexed owner, address indexed spender, uint256 amount);
string public name;
string public symbol;
uint8 public immutable decimals;
uint256 public totalSupply;
mapping(address => uint256) public balanceOf;
mapping(address => mapping(address => uint256)) public allowance;
uint256 internal immutable INITIAL_CHAIN_ID;
bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;
mapping(address => uint256) public nonces;
constructor(
string memory _name,
string memory _symbol,
uint8 _decimals
) {
name = _name;
symbol = _symbol;
decimals = _decimals;
INITIAL_CHAIN_ID = block.chainid;
INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
}
function approve(address spender, uint256 amount) public virtual returns (bool) {
allowance[msg.sender][spender] = amount;
emit Approval(msg.sender, spender, amount);
return true;
}
function transfer(address to, uint256 amount) public virtual returns (bool) {
balanceOf[msg.sender] -= amount;
unchecked {
balanceOf[to] += amount;
}
emit Transfer(msg.sender, to, amount);
return true;
}
function transferFrom(
address from,
address to,
uint256 amount
) public virtual returns (bool) {
uint256 allowed = allowance[from][msg.sender];
if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;
balanceOf[from] -= amount;
unchecked {
balanceOf[to] += amount;
}
emit Transfer(from, to, amount);
return true;
}
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) public virtual {
require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");
unchecked {
address recoveredAddress = ecrecover(
keccak256(
abi.encodePacked(
"\x19\x01",
DOMAIN_SEPARATOR(),
keccak256(
abi.encode(
keccak256(
"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
),
owner,
spender,
value,
nonces[owner]++,
deadline
)
)
)
),
v,
r,
s
);
require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");
allowance[recoveredAddress][spender] = value;
}
emit Approval(owner, spender, value);
}
function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
}
function computeDomainSeparator() internal view virtual returns (bytes32) {
return
keccak256(
abi.encode(
keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
keccak256(bytes(name)),
keccak256("1"),
block.chainid,
address(this)
)
);
}
function _mint(address to, uint256 amount) internal virtual {
totalSupply += amount;
unchecked {
balanceOf[to] += amount;
}
emit Transfer(address(0), to, amount);
}
function _burn(address from, uint256 amount) internal virtual {
balanceOf[from] -= amount;
unchecked {
totalSupply -= amount;
}
emit Transfer(from, address(0), amount);
}
}
文件 3 的 11:ISynapseImpl.sol
pragma solidity ^0.8.13;
interface ISynapseImpl {
struct SwapQuery {
address swapAdapter;
address tokenOut;
uint256 minAmountOut;
uint256 deadline;
bytes rawParams;
}
struct T2BRequest {
uint256 amount;
address recipient;
uint256 toChainId;
address token;
}
function bridgeERC20To(
uint256 amount,
bytes32 metadata,
address receiverAddress,
address token,
uint256 toChainId,
SwapQuery calldata originQuery,
SwapQuery calldata destinationQuery
) external view returns (T2BRequest memory);
function bridgeNativeTo(
uint256 amount,
bytes32 metadata,
address receiverAddress,
uint256 toChainId,
SwapQuery calldata originQuery,
SwapQuery calldata destinationQuery
) external view returns (T2BRequest memory);
}
文件 4 的 11:IT2BRequest.sol
pragma solidity ^0.8.13;
interface IT2BRequest {
struct T2BRequest {
uint256 amount;
address recipient;
uint256 toChainId;
address token;
}
}
文件 5 的 11:IT2BRouter.sol
pragma solidity ^0.8.4;
abstract contract IT2BRouter {
address[] public supportedTokens;
}
文件 6 的 11:Ownable.sol
pragma solidity ^0.8.4;
abstract contract Ownable {
address private _owner;
address private _nominee;
event OwnerNominated(address indexed nominee);
event OwnerClaimed(address indexed claimer);
error OnlyOwner();
error OnlyNominee();
constructor(address owner_) {
_claimOwner(owner_);
}
modifier onlyOwner() {
if (msg.sender != _owner) {
revert OnlyOwner();
}
_;
}
function owner() public view returns (address) {
return _owner;
}
function nominee() public view returns (address) {
return _nominee;
}
function nominateOwner(address nominee_) external {
if (msg.sender != _owner) {
revert OnlyOwner();
}
_nominee = nominee_;
emit OwnerNominated(_nominee);
}
function claimOwner() external {
if (msg.sender != _nominee) {
revert OnlyNominee();
}
_claimOwner(msg.sender);
}
function _claimOwner(address claimer_) internal {
_owner = claimer_;
_nominee = address(0);
}
}
文件 7 的 11:SafeTransferLib.sol
pragma solidity >=0.8.0;
import {ERC20} from "../tokens/ERC20.sol";
library SafeTransferLib {
function safeTransferETH(address to, uint256 amount) internal {
bool success;
assembly {
success := call(gas(), to, amount, 0, 0, 0, 0)
}
require(success, "ETH_TRANSFER_FAILED");
}
function safeTransferFrom(
ERC20 token,
address from,
address to,
uint256 amount
) internal {
bool success;
assembly {
let freeMemoryPointer := mload(0x40)
mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000)
mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff))
mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff))
mstore(add(freeMemoryPointer, 68), amount)
success := and(
or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
call(gas(), token, 0, freeMemoryPointer, 100, 0, 32)
)
}
require(success, "TRANSFER_FROM_FAILED");
}
function safeTransfer(
ERC20 token,
address to,
uint256 amount
) internal {
bool success;
assembly {
let freeMemoryPointer := mload(0x40)
mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)
mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff))
mstore(add(freeMemoryPointer, 36), amount)
success := and(
or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
)
}
require(success, "TRANSFER_FAILED");
}
function safeApprove(
ERC20 token,
address to,
uint256 amount
) internal {
bool success;
assembly {
let freeMemoryPointer := mload(0x40)
mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000)
mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff))
mstore(add(freeMemoryPointer, 36), amount)
success := and(
or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
)
}
require(success, "APPROVE_FAILED");
}
}
文件 8 的 11:Strings.sol
pragma solidity ^0.8.0;
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
function toString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
}
文件 9 的 11:SynapseVerifier.sol
pragma solidity ^0.8.13;
import "../interfaces/ISynapseImpl.sol";
contract SynapseVerifier {
address NATIVE_TOKEN_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
function bridgeERC20To(
uint256 amount,
bytes32 metadata,
address receiverAddress,
address token,
uint256 toChainId,
ISynapseImpl.SwapQuery calldata originQuery,
ISynapseImpl.SwapQuery calldata destinationQuery
) external payable returns (ISynapseImpl.T2BRequest memory) {
return
ISynapseImpl.T2BRequest(amount, receiverAddress, toChainId, token);
}
function bridgeNativeTo(
uint256 amount,
bytes32 metadata,
address receiverAddress,
uint256 toChainId,
ISynapseImpl.SwapQuery calldata originQuery,
ISynapseImpl.SwapQuery calldata destinationQuery
) external view returns (ISynapseImpl.T2BRequest memory) {
return
ISynapseImpl.T2BRequest(
amount,
receiverAddress,
toChainId,
NATIVE_TOKEN_ADDRESS
);
}
}
文件 10 的 11:T2BApproval.sol
pragma solidity ^0.8.13;
import "./interfaces/IT2BRouter.sol";
import {SafeTransferLib} from "lib/solmate/src/utils/SafeTransferLib.sol";
import {ERC20} from "lib/solmate/src/tokens/ERC20.sol";
contract T2BApproval {
using SafeTransferLib for ERC20;
error ZeroAddress();
error InvalidTokenAddress();
constructor(address _t2bRouter) {
IT2BRouter t2bRouter = IT2BRouter(_t2bRouter);
uint256 tokenIndex = 0;
while (t2bRouter.supportedTokens(tokenIndex) != address(0)) {
ERC20(t2bRouter.supportedTokens(tokenIndex)).safeApprove(
address(t2bRouter),
type(uint256).max
);
unchecked {
++tokenIndex;
}
}
selfdestruct(payable(msg.sender));
}
}
文件 11 的 11:T2BRouter.sol
pragma solidity ^0.8.13;
import "./utils/Ownable.sol";
import "./T2BApproval.sol";
import "./interfaces/IT2BRequest.sol";
import {SafeTransferLib} from "lib/solmate/src/utils/SafeTransferLib.sol";
import {ERC20} from "lib/solmate/src/tokens/ERC20.sol";
import "lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol";
contract T2BRouter is Ownable {
using SafeTransferLib for ERC20;
error VerificationCallFailed();
error InvalidTokenAddress();
error BalanceMismatch();
error BridgingFailed();
error UnsupportedBridge();
error ZeroAddress();
error SignerMismatch();
error InvalidNonce();
address public constant ETH_ADDRESS =
address(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);
address public immutable socketGateway;
address public feeTakerAddress;
address[] public supportedTokens;
address public signerAddress;
mapping(uint32 => address) public bridgeVerifiers;
mapping(address => uint256) public nextNonce;
constructor(
address _owner,
address _socketGateway,
address _feeTakerAddress
) Ownable(_owner) {
socketGateway = _socketGateway;
feeTakerAddress = _feeTakerAddress;
}
function setFeeTakerAddress(address _feeTakerAddress) external onlyOwner {
feeTakerAddress = _feeTakerAddress;
}
function setSignerAddress(address _signerAddress) external onlyOwner {
signerAddress = _signerAddress;
}
function setBridgeVerifier(
uint32 routeId,
address bridgeVerifier
) external onlyOwner {
bridgeVerifiers[routeId] = bridgeVerifier;
}
function setSupportedTokens(address[] memory _tokens) external onlyOwner {
for (uint256 i = 0; i < _tokens.length; i++) {
supportedTokens.push(_tokens[i]);
}
supportedTokens.push(address(0));
}
function emptyTokenList() external onlyOwner {
address[] memory emptyList;
supportedTokens = emptyList;
}
function bridgeERC20(
uint256 fees,
uint256 nonce,
bytes calldata bridgeData,
bytes calldata signature
) external {
address recoveredSigner = ECDSA.recover(
keccak256(
abi.encodePacked(
"\x19Ethereum Signed Message:\n32",
keccak256(
abi.encode(
address(this),
nonce,
block.chainid,
fees,
bridgeData
)
)
)
),
signature
);
if (signerAddress != recoveredSigner) revert SignerMismatch();
unchecked {
if (nonce != nextNonce[signerAddress]++) revert InvalidNonce();
}
if (bridgeVerifiers[uint32(bytes4(bridgeData[0:4]))] == address(0))
revert UnsupportedBridge();
(bool parseSuccess, bytes memory parsedData) = bridgeVerifiers[
uint32(bytes4(bridgeData[0:4]))
].call(bridgeData[4:bridgeData.length - 1]);
if (!parseSuccess) revert VerificationCallFailed();
IT2BRequest.T2BRequest memory t2bRequest = abi.decode(
parsedData,
(IT2BRequest.T2BRequest)
);
address t2bAddress = getAddressFor(
t2bRequest.recipient,
t2bRequest.toChainId
);
if (
ERC20(t2bRequest.token).allowance(t2bAddress, address(this)) <
t2bRequest.amount
) {
bytes32 uniqueSalt = keccak256(
abi.encode(t2bRequest.recipient, t2bRequest.toChainId)
);
new T2BApproval{salt: uniqueSalt}(address(this));
}
ERC20(t2bRequest.token).safeTransferFrom(
t2bAddress,
address(this),
t2bRequest.amount + fees
);
if (fees > 0)
ERC20(t2bRequest.token).safeTransfer(feeTakerAddress, fees);
if (
t2bRequest.amount >
ERC20(t2bRequest.token).allowance(address(this), socketGateway)
) {
ERC20(t2bRequest.token).safeApprove(
address(socketGateway),
type(uint256).max
);
}
(bool bridgeSuccess, ) = socketGateway.call(bridgeData);
if (!bridgeSuccess) revert BridgingFailed();
}
function deployApprovalContract(
address receiver,
uint256 toChainId
) public returns (address approvalAddress) {
bytes32 uniqueSalt = keccak256(abi.encode(receiver, toChainId));
approvalAddress = address(new T2BApproval{salt: uniqueSalt}(address(this)));
}
function getAddressFor(
address receiver,
uint256 toChainId
) public view returns (address) {
bytes32 salt = keccak256(abi.encode(receiver, toChainId));
return
address(
uint160(
uint256(
keccak256(
abi.encodePacked(
bytes1(0xff),
address(this),
salt,
keccak256(
abi.encodePacked(
type(T2BApproval).creationCode,
abi.encode(address(this))
)
)
)
)
)
)
);
}
function rescueFunds(
address token_,
address userAddress_,
uint256 amount_
) external onlyOwner {
if (userAddress_ == address(0)) revert ZeroAddress();
if (token_ == ETH_ADDRESS) {
SafeTransferLib.safeTransferETH(userAddress_, amount_);
} else {
if (token_.code.length == 0) revert InvalidTokenAddress();
SafeTransferLib.safeTransfer(ERC20(token_), userAddress_, amount_);
}
}
function rescueFromT2BReceiver(
address t2bReceiver_,
address token_,
address userAddress_,
uint256 amount_
) external onlyOwner {
if (userAddress_ == address(0)) revert ZeroAddress();
if (token_.code.length == 0) revert InvalidTokenAddress();
SafeTransferLib.safeTransferFrom(
ERC20(token_),
t2bReceiver_,
userAddress_,
amount_
);
}
}
{
"compilationTarget": {
"src/T2BRouter.sol": "T2BRouter"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 1000000
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_socketGateway","type":"address"},{"internalType":"address","name":"_feeTakerAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BalanceMismatch","type":"error"},{"inputs":[],"name":"BridgingFailed","type":"error"},{"inputs":[],"name":"InvalidNonce","type":"error"},{"inputs":[],"name":"InvalidTokenAddress","type":"error"},{"inputs":[],"name":"OnlyNominee","type":"error"},{"inputs":[],"name":"OnlyOwner","type":"error"},{"inputs":[],"name":"SignerMismatch","type":"error"},{"inputs":[],"name":"UnsupportedBridge","type":"error"},{"inputs":[],"name":"VerificationCallFailed","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"claimer","type":"address"}],"name":"OwnerClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"nominee","type":"address"}],"name":"OwnerNominated","type":"event"},{"inputs":[],"name":"ETH_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"fees","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"bridgeData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"bridgeERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"}],"name":"bridgeVerifiers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"toChainId","type":"uint256"}],"name":"deployApprovalContract","outputs":[{"internalType":"address","name":"approvalAddress","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emptyTokenList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeTakerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"toChainId","type":"uint256"}],"name":"getAddressFor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nextNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"nominee_","type":"address"}],"name":"nominateOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nominee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"t2bReceiver_","type":"address"},{"internalType":"address","name":"token_","type":"address"},{"internalType":"address","name":"userAddress_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"rescueFromT2BReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token_","type":"address"},{"internalType":"address","name":"userAddress_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"rescueFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"routeId","type":"uint32"},{"internalType":"address","name":"bridgeVerifier","type":"address"}],"name":"setBridgeVerifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeTakerAddress","type":"address"}],"name":"setFeeTakerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signerAddress","type":"address"}],"name":"setSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"setSupportedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"socketGateway","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"supportedTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]