¡El código fuente de este contrato está verificado!
Metadatos del Contrato
Compilador
0.8.14+commit.80d49f37
Idioma
Solidity
Código Fuente del Contrato
Archivo 1 de 5: Context.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)pragmasolidity ^0.8.0;/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/abstractcontractContext{
function_msgSender() internalviewvirtualreturns (address) {
returnmsg.sender;
}
function_msgData() internalviewvirtualreturns (bytescalldata) {
returnmsg.data;
}
}
Código Fuente del Contrato
Archivo 2 de 5: IZKBridgeEntrypoint.sol
// SPDX-License-Identifier: MITpragmasolidity ^0.8.0;interfaceIZKBridgeEntrypoint{
// @notice send a ZKBridge message to the specified address at a ZKBridge endpoint.// @param dstChainId - the destination chain identifier// @param dstAddress - the address on destination chain// @param payload - a custom bytes payload to send to the destination contractfunctionsend(uint16 dstChainId, address dstAddress, bytesmemory payload) externalpayablereturns (uint64 sequence);
}
Código Fuente del Contrato
Archivo 3 de 5: IZKBridgeReceiver.sol
// SPDX-License-Identifier: MITpragmasolidity ^0.8.0;interfaceIZKBridgeReceiver{
// @notice ZKBridge endpoint will invoke this function to deliver the message on the destination// @param srcChainId - the source endpoint identifier// @param srcAddress - the source sending contract address from the source chain// @param sequence - the ordered message nonce// @param payload - the signed payload is the UA bytes has encoded to be sentfunctionzkReceive(uint16 srcChainId, address srcAddress, uint64 sequence, bytescalldata payload) external;
}
Código Fuente del Contrato
Archivo 4 de 5: Mailer.sol
// SPDX-License-Identifier: MITpragmasolidity ^0.8.0;import"./interfaces/IZKBridgeEntrypoint.sol";
import"./interfaces/IZKBridgeReceiver.sol";
import"@openzeppelin/contracts/access/Ownable.sol";
/// @title Mailer/// @notice An example contract for sending messages to other chains, using the ZKBridgeEntrypoint.contractMailerisOwnable{
/// @notice The ZKBridgeEntrypoint contract, which sends messages to other chains.
IZKBridgeEntrypoint public zkBridgeEntrypoint;
uint256public fee;
uint256public maxLength =66;
eventMessageSend(uint64indexed sequence, uint32indexed dstChainId, addressindexed dstAddress, address sender, address recipient, string message);
constructor(address _zkBridgeEntrypoint) {
zkBridgeEntrypoint = IZKBridgeEntrypoint(_zkBridgeEntrypoint);
}
/// @notice Sends a message to a destination MessageBridge./// @param dstChainId The chain ID where the destination MessageBridge./// @param dstAddress The address of the destination MessageBridge./// @param message The message to send.functionsendMessage(uint16 dstChainId, address dstAddress, address recipient, stringmemory message) externalpayable{
require(msg.value>= fee, "Insufficient Fee");
require(bytes(message).length<= maxLength, "Maximum message length exceeded.");
bytesmemory payload =abi.encode(msg.sender, recipient, message);
uint64 sequence = zkBridgeEntrypoint.send(dstChainId, dstAddress, payload);
emit MessageSend(sequence, dstChainId, dstAddress, msg.sender, recipient, message);
}
// @notice Allows owner to set a new fee.// @param fee The new fee to use.functionsetFee(uint256 _fee) externalonlyOwner{
fee = _fee;
}
// @notice Allows owner to set a new msg length.// @param new msg length.functionsetMsgLength(uint256 _maxLength) externalonlyOwner{
maxLength = _maxLength;
}
// @notice Allows owner to claim all fees sent to this contract.functionclaimFees() externalonlyOwner{
payable(owner()).transfer(address(this).balance);
}
}
Código Fuente del Contrato
Archivo 5 de 5: Ownable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)pragmasolidity ^0.8.0;import"../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/abstractcontractOwnableisContext{
addressprivate _owner;
eventOwnershipTransferred(addressindexed previousOwner, addressindexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/modifieronlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/functionowner() publicviewvirtualreturns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/function_checkOwner() internalviewvirtual{
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/functionrenounceOwnership() publicvirtualonlyOwner{
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/functiontransferOwnership(address newOwner) publicvirtualonlyOwner{
require(newOwner !=address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/function_transferOwnership(address newOwner) internalvirtual{
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}