文件 1 的 6:Breeder.sol
pragma solidity ^0.7.0;
interface Breeder {
function corgisMinted() external returns (uint256);
function priceForCorgi(uint256 _corgiNumber) external pure returns (uint256);
function mint(
uint256 _blockNumber,
address _toAddress,
uint256 _amount,
address payable _refundAddress,
bytes calldata _data
) external payable;
}
文件 2 的 6:Context.sol
pragma solidity >=0.6.0 <0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this;
return msg.data;
}
}
文件 3 的 6:CryptoCorgisRescuer.sol
pragma solidity ^0.7.0;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/math/SafeMath.sol";
import "@openzeppelin/contracts/math/Math.sol";
import "./interfaces/Breeder.sol";
contract CryptoCorgisRescuer is Ownable {
using SafeMath for uint256;
address payable public treasuryAddress;
address public breederAddress;
uint256 public discountPerBlockEth;
uint256 public floorPriceEth;
constructor(
address payable _treasuryAddress,
address _breederAddress,
uint256 _discountPerBlockEth,
uint256 _floorPriceEth
) {
treasuryAddress = _treasuryAddress;
breederAddress = _breederAddress;
discountPerBlockEth = _discountPerBlockEth;
floorPriceEth = _floorPriceEth;
}
receive() external payable {}
function setDiscountPerBlock(uint256 _discountPerBlockEth) public onlyOwner {
discountPerBlockEth = _discountPerBlockEth;
}
function setFloorPrice(uint256 _floorPriceEth) public onlyOwner {
floorPriceEth = _floorPriceEth;
}
function returnFunds() public onlyOwner {
treasuryAddress.transfer(address(this).balance);
}
function rescueCorgi(uint256 _blockNumber, bytes calldata _data) public payable {
uint256 fullPrice = Breeder(breederAddress).priceForCorgi(Breeder(breederAddress).corgisMinted() + 1);
uint256 discountEth = block.number.sub(_blockNumber).mul(discountPerBlockEth);
(bool _, uint256 discountedPriceEth) = fullPrice.trySub(discountEth);
uint finalPrice = Math.max(discountedPriceEth, floorPriceEth);
require(msg.value >= finalPrice, "CryptoCorgisRescuer: Insufficient funds to rescue a Crypto Corgi.");
msg.sender.transfer(msg.value.sub(finalPrice));
Breeder(breederAddress).mint{value: fullPrice}(_blockNumber, msg.sender, 1, msg.sender, _data);
}
}
文件 4 的 6:Math.sol
pragma solidity >=0.6.0 <0.8.0;
library Math {
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a >= b ? a : b;
}
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
function average(uint256 a, uint256 b) internal pure returns (uint256) {
return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
}
}
文件 5 的 6:Ownable.sol
pragma solidity >=0.6.0 <0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor () internal {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
function owner() public view virtual returns (address) {
return _owner;
}
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
文件 6 的 6:SafeMath.sol
pragma solidity >=0.6.0 <0.8.0;
library SafeMath {
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b > a) return (false, 0);
return (true, a - b);
}
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a / b);
}
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a % b);
}
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a, "SafeMath: subtraction overflow");
return a - b;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) return 0;
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: division by zero");
return a / b;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: modulo by zero");
return a % b;
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
return a - b;
}
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a / b;
}
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a % b;
}
}
{
"compilationTarget": {
"contracts/CryptoCorgisRescuer.sol": "CryptoCorgisRescuer"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address payable","name":"_treasuryAddress","type":"address"},{"internalType":"address","name":"_breederAddress","type":"address"},{"internalType":"uint256","name":"_discountPerBlockEth","type":"uint256"},{"internalType":"uint256","name":"_floorPriceEth","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"breederAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"discountPerBlockEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"floorPriceEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_blockNumber","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"rescueCorgi","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"returnFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_discountPerBlockEth","type":"uint256"}],"name":"setDiscountPerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_floorPriceEth","type":"uint256"}],"name":"setFloorPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]