编译器
0.6.11+commit.5ef660b1
文件 1 的 8:IBridge.sol
pragma solidity ^0.6.11;
interface IBridge {
event MessageDelivered(
uint256 indexed messageIndex,
bytes32 indexed beforeInboxAcc,
address inbox,
uint8 kind,
address sender,
bytes32 messageDataHash
);
event BridgeCallTriggered(
address indexed outbox,
address indexed destAddr,
uint256 amount,
bytes data
);
event InboxToggle(address indexed inbox, bool enabled);
event OutboxToggle(address indexed outbox, bool enabled);
function deliverMessageToInbox(
uint8 kind,
address sender,
bytes32 messageDataHash
) external payable returns (uint256);
function executeCall(
address destAddr,
uint256 amount,
bytes calldata data
) external returns (bool success, bytes memory returnData);
function setInbox(address inbox, bool enabled) external;
function setOutbox(address inbox, bool enabled) external;
function activeOutbox() external view returns (address);
function allowedInboxes(address inbox) external view returns (bool);
function allowedOutboxes(address outbox) external view returns (bool);
function inboxAccs(uint256 index) external view returns (bytes32);
function messageCount() external view returns (uint256);
}
文件 2 的 8:IInbox.sol
pragma solidity ^0.6.11;
import "./IMessageProvider.sol";
interface IInbox is IMessageProvider {
function sendL2Message(bytes calldata messageData) external returns (uint256);
function sendUnsignedTransaction(
uint256 maxGas,
uint256 gasPriceBid,
uint256 nonce,
address destAddr,
uint256 amount,
bytes calldata data
) external returns (uint256);
function sendContractTransaction(
uint256 maxGas,
uint256 gasPriceBid,
address destAddr,
uint256 amount,
bytes calldata data
) external returns (uint256);
function sendL1FundedUnsignedTransaction(
uint256 maxGas,
uint256 gasPriceBid,
uint256 nonce,
address destAddr,
bytes calldata data
) external payable returns (uint256);
function sendL1FundedContractTransaction(
uint256 maxGas,
uint256 gasPriceBid,
address destAddr,
bytes calldata data
) external payable returns (uint256);
function createRetryableTicket(
address destAddr,
uint256 arbTxCallValue,
uint256 maxSubmissionCost,
address submissionRefundAddress,
address valueRefundAddress,
uint256 maxGas,
uint256 gasPriceBid,
bytes calldata data
) external payable returns (uint256);
function createRetryableTicketNoRefundAliasRewrite(
address destAddr,
uint256 arbTxCallValue,
uint256 maxSubmissionCost,
address submissionRefundAddress,
address valueRefundAddress,
uint256 maxGas,
uint256 gasPriceBid,
bytes calldata data
) external payable returns (uint256);
function depositEth(uint256 maxSubmissionCost) external payable returns (uint256);
function bridge() external view returns (address);
function pauseCreateRetryables() external;
function unpauseCreateRetryables() external;
function startRewriteAddress() external;
function stopRewriteAddress() external;
}
文件 3 的 8:IMessageProvider.sol
pragma solidity ^0.6.11;
interface IMessageProvider {
event InboxMessageDelivered(uint256 indexed messageNum, bytes data);
event InboxMessageDeliveredFromOrigin(uint256 indexed messageNum);
}
文件 4 的 8:IOutbox.sol
pragma solidity ^0.6.11;
interface IOutbox {
event OutboxEntryCreated(
uint256 indexed batchNum,
uint256 outboxEntryIndex,
bytes32 outputRoot,
uint256 numInBatch
);
event OutBoxTransactionExecuted(
address indexed destAddr,
address indexed l2Sender,
uint256 indexed outboxEntryIndex,
uint256 transactionIndex
);
function l2ToL1Sender() external view returns (address);
function l2ToL1Block() external view returns (uint256);
function l2ToL1EthBlock() external view returns (uint256);
function l2ToL1Timestamp() external view returns (uint256);
function l2ToL1BatchNum() external view returns (uint256);
function l2ToL1OutputId() external view returns (bytes32);
function processOutgoingMessages(bytes calldata sendsData, uint256[] calldata sendLengths)
external;
function outboxEntryExists(uint256 batchNum) external view returns (bool);
}
文件 5 的 8:L1CrossDomainEnabled.sol
pragma solidity ^0.6.11;
import "../arbitrum/IBridge.sol";
import "../arbitrum/IInbox.sol";
import "../arbitrum/IOutbox.sol";
abstract contract L1CrossDomainEnabled {
IInbox public immutable inbox;
event TxToL2(address indexed from, address indexed to, uint256 indexed seqNum, bytes data);
constructor(address _inbox) public {
inbox = IInbox(_inbox);
}
modifier onlyL2Counterpart(address l2Counterpart) {
address bridge = inbox.bridge();
require(msg.sender == bridge, "NOT_FROM_BRIDGE");
address l2ToL1Sender = IOutbox(IBridge(bridge).activeOutbox()).l2ToL1Sender();
require(l2ToL1Sender == l2Counterpart, "ONLY_COUNTERPART_GATEWAY");
_;
}
function sendTxToL2(
address target,
address user,
uint256 maxSubmissionCost,
uint256 maxGas,
uint256 gasPriceBid,
bytes memory data
) internal returns (uint256) {
uint256 seqNum = inbox.createRetryableTicket{value: msg.value}(
target,
0,
maxSubmissionCost,
user,
user,
maxGas,
gasPriceBid,
data
);
emit TxToL2(user, target, seqNum, data);
return seqNum;
}
function sendTxToL2NoAliasing(
address target,
address user,
uint256 l1CallValue,
uint256 maxSubmissionCost,
uint256 maxGas,
uint256 gasPriceBid,
bytes memory data
) internal returns (uint256) {
uint256 seqNum = inbox.createRetryableTicketNoRefundAliasRewrite{value: l1CallValue}(
target,
0,
maxSubmissionCost,
user,
user,
maxGas,
gasPriceBid,
data
);
emit TxToL2(user, target, seqNum, data);
return seqNum;
}
}
文件 6 的 8:L1DaiGateway.sol
pragma solidity ^0.6.11;
import "./L1ITokenGateway.sol";
import "../l2/L2ITokenGateway.sol";
import "./L1CrossDomainEnabled.sol";
interface TokenLike {
function transferFrom(
address _from,
address _to,
uint256 _value
) external returns (bool success);
}
contract L1DaiGateway is L1CrossDomainEnabled, L1ITokenGateway {
mapping(address => uint256) public wards;
function rely(address usr) external auth {
wards[usr] = 1;
emit Rely(usr);
}
function deny(address usr) external auth {
wards[usr] = 0;
emit Deny(usr);
}
modifier auth() {
require(wards[msg.sender] == 1, "L1DaiGateway/not-authorized");
_;
}
event Rely(address indexed usr);
event Deny(address indexed usr);
address public immutable l1Dai;
address public immutable l2Dai;
address public immutable l1Escrow;
address public immutable l1Router;
address public immutable l2Counterpart;
uint256 public isOpen = 1;
event Closed();
constructor(
address _l2Counterpart,
address _l1Router,
address _inbox,
address _l1Dai,
address _l2Dai,
address _l1Escrow
) public L1CrossDomainEnabled(_inbox) {
wards[msg.sender] = 1;
emit Rely(msg.sender);
l1Dai = _l1Dai;
l2Dai = _l2Dai;
l1Escrow = _l1Escrow;
l1Router = _l1Router;
l2Counterpart = _l2Counterpart;
}
function close() external auth {
isOpen = 0;
emit Closed();
}
function outboundTransfer(
address l1Token,
address to,
uint256 amount,
uint256 maxGas,
uint256 gasPriceBid,
bytes calldata data
) external payable override returns (bytes memory) {
require(isOpen == 1, "L1DaiGateway/closed");
require(l1Token == l1Dai, "L1DaiGateway/token-not-dai");
address from;
uint256 seqNum;
bytes memory extraData;
{
uint256 maxSubmissionCost;
(from, maxSubmissionCost, extraData) = parseOutboundData(data);
require(extraData.length == 0, "L1DaiGateway/call-hook-data-not-allowed");
TokenLike(l1Token).transferFrom(from, l1Escrow, amount);
bytes memory outboundCalldata = getOutboundCalldata(l1Token, from, to, amount, extraData);
seqNum = sendTxToL2(
l2Counterpart,
from,
maxSubmissionCost,
maxGas,
gasPriceBid,
outboundCalldata
);
}
emit DepositInitiated(l1Token, from, to, seqNum, amount);
return abi.encode(seqNum);
}
function getOutboundCalldata(
address l1Token,
address from,
address to,
uint256 amount,
bytes memory data
) public pure returns (bytes memory outboundCalldata) {
bytes memory emptyBytes = "";
outboundCalldata = abi.encodeWithSelector(
L2ITokenGateway.finalizeInboundTransfer.selector,
l1Token,
from,
to,
amount,
abi.encode(emptyBytes, data)
);
return outboundCalldata;
}
function finalizeInboundTransfer(
address l1Token,
address from,
address to,
uint256 amount,
bytes calldata data
) external override onlyL2Counterpart(l2Counterpart) {
require(l1Token == l1Dai, "L1DaiGateway/token-not-dai");
(uint256 exitNum, ) = abi.decode(data, (uint256, bytes));
TokenLike(l1Token).transferFrom(l1Escrow, to, amount);
emit WithdrawalFinalized(l1Token, from, to, exitNum, amount);
}
function parseOutboundData(bytes memory data)
internal
view
returns (
address from,
uint256 maxSubmissionCost,
bytes memory extraData
)
{
if (msg.sender == l1Router) {
(from, extraData) = abi.decode(data, (address, bytes));
} else {
from = msg.sender;
extraData = data;
}
(maxSubmissionCost, extraData) = abi.decode(extraData, (uint256, bytes));
}
function calculateL2TokenAddress(address l1Token) external view override returns (address) {
if (l1Token != l1Dai) {
return address(0);
}
return l2Dai;
}
function counterpartGateway() external view override returns (address) {
return l2Counterpart;
}
}
文件 7 的 8:L1ITokenGateway.sol
pragma solidity ^0.6.11;
interface L1ITokenGateway {
event DepositInitiated(
address l1Token,
address indexed from,
address indexed to,
uint256 indexed sequenceNumber,
uint256 amount
);
event WithdrawalFinalized(
address l1Token,
address indexed from,
address indexed to,
uint256 indexed exitNum,
uint256 amount
);
function outboundTransfer(
address token,
address to,
uint256 amount,
uint256 maxGas,
uint256 gasPriceBid,
bytes calldata data
) external payable returns (bytes memory);
function finalizeInboundTransfer(
address token,
address from,
address to,
uint256 amount,
bytes calldata data
) external;
function calculateL2TokenAddress(address l1Token) external view returns (address);
function counterpartGateway() external view returns (address);
}
文件 8 的 8:L2ITokenGateway.sol
pragma solidity ^0.6.11;
interface L2ITokenGateway {
event DepositFinalized(
address indexed l1Token,
address indexed from,
address indexed to,
uint256 amount
);
event WithdrawalInitiated(
address l1Token,
address indexed from,
address indexed to,
uint256 indexed l2ToL1Id,
uint256 exitNum,
uint256 amount
);
function outboundTransfer(
address token,
address to,
uint256 amount,
uint256 maxGas,
uint256 gasPriceBid,
bytes calldata data
) external returns (bytes memory);
function finalizeInboundTransfer(
address token,
address from,
address to,
uint256 amount,
bytes calldata data
) external;
function calculateL2TokenAddress(address l1Token) external view returns (address);
function counterpartGateway() external view returns (address);
}
{
"compilationTarget": {
"contracts/l1/L1DaiGateway.sol": "L1DaiGateway"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_l2Counterpart","type":"address"},{"internalType":"address","name":"_l1Router","type":"address"},{"internalType":"address","name":"_inbox","type":"address"},{"internalType":"address","name":"_l1Dai","type":"address"},{"internalType":"address","name":"_l2Dai","type":"address"},{"internalType":"address","name":"_l1Escrow","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"Closed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"usr","type":"address"}],"name":"Deny","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"l1Token","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"sequenceNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DepositInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"usr","type":"address"}],"name":"Rely","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"seqNum","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"TxToL2","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"l1Token","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"exitNum","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawalFinalized","type":"event"},{"inputs":[{"internalType":"address","name":"l1Token","type":"address"}],"name":"calculateL2TokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"close","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"counterpartGateway","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"usr","type":"address"}],"name":"deny","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"l1Token","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"finalizeInboundTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"l1Token","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"getOutboundCalldata","outputs":[{"internalType":"bytes","name":"outboundCalldata","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"inbox","outputs":[{"internalType":"contract IInbox","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOpen","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"l1Dai","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"l1Escrow","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"l1Router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"l2Counterpart","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"l2Dai","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"l1Token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"maxGas","type":"uint256"},{"internalType":"uint256","name":"gasPriceBid","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"outboundTransfer","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"usr","type":"address"}],"name":"rely","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"wards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]