文件 1 的 3:IOffchainZombie.sol
pragma solidity ^0.8.0;
interface IOffchainZombie {
function ownerOf(uint256 tokenId) external view returns (address owner);
function transferFrom(address from, address to, uint256 tokenId) external;
}
文件 2 的 3:IOnchainZombie.sol
pragma solidity ^0.8.0;
interface IOnchainZombie {
function claimMouse(address _claimer) external;
function claimMice(address _claimer, uint _num) external;
}
文件 3 的 3:OnchainGate.sol
pragma solidity ^0.8.0;
import "./IOffchainZombie.sol";
import "./IOnchainZombie.sol";
contract OnchainGate {
bool public _gateOpened;
mapping(uint => address) offchainIdToOwner;
address public offChainAddress;
address public onChainAddress;
address _owner;
constructor() {
_owner = msg.sender;
}
function claimOnchainMouse(
uint _offchain_uid
)
external
gateOpened
{
require(IOffchainZombie(offChainAddress).ownerOf(_offchain_uid)==msg.sender, "You are not the mice owner");
offchainIdToOwner[_offchain_uid]=msg.sender;
IOffchainZombie(offChainAddress).transferFrom(msg.sender, address(this), _offchain_uid);
IOnchainZombie(onChainAddress).claimMouse(msg.sender);
}
function claimOnchainMice(
uint[] memory _offchain_uids_
)
external
gateOpened
{
for (uint8 i =0;i<_offchain_uids_.length;i++)
{
require(IOffchainZombie(offChainAddress).ownerOf(_offchain_uids_[i])==msg.sender, "You are not the offchain mice owner");
offchainIdToOwner[_offchain_uids_[i]]=msg.sender;
IOffchainZombie(offChainAddress).transferFrom(msg.sender, address(this), _offchain_uids_[i]);
}
IOnchainZombie(onChainAddress).claimMice(msg.sender, _offchain_uids_.length);
}
function getClaimedOwner(
uint _offchain_uid_
)
external
view
returns(address)
{
return offchainIdToOwner[_offchain_uid_];
}
function setOffchainAddress(
address _offChainAddress
)
external
onlyOwner
{
offChainAddress = _offChainAddress;
}
function setOnchainAddress(
address _onChainAddress
)
external
onlyOwner
{
onChainAddress = _onChainAddress;
}
function setGateState(
bool state
)
public
onlyOwner
{
_gateOpened=state;
}
modifier gateOpened() {
require(_gateOpened);
_;
}
modifier onlyOwner() {
require(_owner == msg.sender);
_;
}
}
{
"compilationTarget": {
"contracts/OnchainGate.sol": "OnchainGate"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"_gateOpened","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_offchain_uids_","type":"uint256[]"}],"name":"claimOnchainMice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_offchain_uid","type":"uint256"}],"name":"claimOnchainMouse","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_offchain_uid_","type":"uint256"}],"name":"getClaimedOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"offChainAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onChainAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"setGateState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_offChainAddress","type":"address"}],"name":"setOffchainAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_onChainAddress","type":"address"}],"name":"setOnchainAddress","outputs":[],"stateMutability":"nonpayable","type":"function"}]