文件 1 的 6:DIAOracleV2.sol
pragma solidity ^0.8.0;
contract DIAOracleV2 {
mapping (string => uint256) public values;
address public oracleUpdater;
event OracleUpdate(string key, uint128 value, uint128 timestamp);
event UpdaterAddressChange(address newUpdater);
constructor() {
oracleUpdater = msg.sender;
}
function setValue(string memory key, uint128 value, uint128 timestamp) public {
require(msg.sender == oracleUpdater,"not a updater");
uint256 cValue = (((uint256)(value)) << 128) + timestamp;
values[key] = cValue;
emit OracleUpdate(key, value, timestamp);
}
function getValue(string memory key) external view returns (uint128, uint128) {
uint256 cValue = values[key];
uint128 timestamp = (uint128)(cValue % 2**128);
uint128 value = (uint128)(cValue >> 128);
return (value, timestamp);
}
function updateOracleUpdaterAddress(address newOracleUpdaterAddress) public {
require(msg.sender == oracleUpdater,"not a updater");
oracleUpdater = newOracleUpdaterAddress;
emit UpdaterAddressChange(newOracleUpdaterAddress);
}
}
文件 2 的 6:IERC1155.sol
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
interface IERC1155 is IERC165 {
event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
event TransferBatch(
address indexed operator,
address indexed from,
address indexed to,
uint256[] ids,
uint256[] values
);
event ApprovalForAll(address indexed account, address indexed operator, bool approved);
event URI(string value, uint256 indexed id);
function balanceOf(address account, uint256 id) external view returns (uint256);
function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
external
view
returns (uint256[] memory);
function setApprovalForAll(address operator, bool approved) external;
function isApprovedForAll(address account, address operator) external view returns (bool);
function safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes calldata data
) external;
function safeBatchTransferFrom(
address from,
address to,
uint256[] calldata ids,
uint256[] calldata amounts,
bytes calldata data
) external;
}
文件 3 的 6:IERC1155Receiver.sol
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
interface IERC1155Receiver is IERC165 {
function onERC1155Received(
address operator,
address from,
uint256 id,
uint256 value,
bytes calldata data
) external returns (bytes4);
function onERC1155BatchReceived(
address operator,
address from,
uint256[] calldata ids,
uint256[] calldata values,
bytes calldata data
) external returns (bytes4);
}
文件 4 的 6:IERC165.sol
pragma solidity ^0.8.0;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 5 的 6:IERC20.sol
pragma solidity ^0.8.0;
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
文件 6 的 6:MoveAsset.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
import "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "../DIAOracleV2.sol";
contract MoveAsset is IERC1155Receiver {
event Deposit(
address indexed _nftAddress,
address indexed _from,
uint256 indexed _nftID,
bool _ethdropped,
uint256 fee
);
event Withdraw(
address indexed _nftAddress,
address indexed _from,
uint256 indexed _nftID
);
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
address public owner;
uint256 public l2GasFee;
address public gasOracle;
uint256 public withdrawGasLimit ;
mapping(address => mapping(uint256 => bool)) public ethdropped;
constructor(address oracle) {
owner = msg.sender;
gasOracle = oracle;
}
function _calculateFee() public view returns (uint256) {
(uint128 value, ) = DIAOracleV2(gasOracle).getValue(
"GAS_ARB"
);
return value * withdrawGasLimit;
}
function _updateGasOracle(address _newOracle) external onlyOwner {
gasOracle = _newOracle;
}
function _updateWithdrwaGasLimit(uint256 _newGasLimit) external onlyOwner {
withdrawGasLimit = _newGasLimit;
}
function getFee() public view returns (uint256) {
return _calculateFee();
}
function isFeeRequired(address _nftAddress, uint256 _nftID)
public
view
returns (bool)
{
return ethdropped[_nftAddress][_nftID];
}
function deposit(uint256 _nftID, address _nftAddress) external payable {
require(
IERC1155(_nftAddress).isApprovedForAll(msg.sender, address(this)),
"approve missing"
);
if (isFeeRequired(_nftAddress, _nftID)) {
require(msg.value >= _calculateFee(), "missing fee");
}
IERC1155(_nftAddress).safeTransferFrom(
msg.sender,
address(this),
_nftID,
1,
"0x0"
);
emit Deposit(
_nftAddress,
msg.sender,
_nftID,
ethdropped[_nftAddress][_nftID],
msg.value
);
ethdropped[_nftAddress][_nftID] = true;
}
function _withdraw(
address _to,
uint256 _tokenID,
address _nftAddress
) external onlyOwner {
IERC1155(_nftAddress).safeTransferFrom(
address(this),
_to,
_tokenID,
1,
"0x0"
);
emit Withdraw(_nftAddress, msg.sender, _tokenID);
}
function onERC1155Received(
address,
address,
uint256,
uint256,
bytes memory
) public pure override returns (bytes4) {
return
bytes4(
keccak256("onERC1155Received(address,address,uint256,uint256,bytes)")
);
}
function supportsInterface(bytes4 interfaceId)
public
pure
override
returns (bool)
{
return interfaceId == type(IERC1155Receiver).interfaceId;
}
function onERC1155BatchReceived(
address,
address,
uint256[] memory,
uint256[] memory,
bytes memory
) public pure override returns (bytes4) {
return
bytes4(
keccak256(
"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"
)
);
}
function _withdrawETH() external onlyOwner {
payable(msg.sender).transfer(address(this).balance);
}
function withdrawToken(address _tokenContract, uint8 _amount)
external
onlyOwner
{
IERC20 tokenContract = IERC20(_tokenContract);
tokenContract.transfer(msg.sender, _amount);
}
}
{
"compilationTarget": {
"contracts/bridge/MoveAsset.sol": "MoveAsset"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"oracle","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_nftAddress","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"uint256","name":"_nftID","type":"uint256"},{"indexed":false,"internalType":"bool","name":"_ethdropped","type":"bool"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_nftAddress","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"uint256","name":"_nftID","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"_calculateFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOracle","type":"address"}],"name":"_updateGasOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newGasLimit","type":"uint256"}],"name":"_updateWithdrwaGasLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenID","type":"uint256"},{"internalType":"address","name":"_nftAddress","type":"address"}],"name":"_withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftID","type":"uint256"},{"internalType":"address","name":"_nftAddress","type":"address"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"ethdropped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gasOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_nftAddress","type":"address"},{"internalType":"uint256","name":"_nftID","type":"uint256"}],"name":"isFeeRequired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"l2GasFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"withdrawGasLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint8","name":"_amount","type":"uint8"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]