编译器
0.8.20+commit.a1b79de6
文件 1 的 24:Actions.sol
pragma solidity ^0.8.17;
uint64 constant DAILY_EPOCH_DURATION = 1 days;
uint64 constant DAILY_EPOCH_OFFSET = 0 hours;
uint64 constant HOURLY_EPOCH_DURATION = 1 hours;
uint64 constant NO_OFFSET = 0 hours;
uint256 constant ACTION_LOCK = 101;
uint256 constant ACTION_ADVENTURER_HOMAGE = 1001;
uint256 constant ACTION_ADVENTURER_BATTLE_V3 = 1002;
uint256 constant ACTION_ADVENTURER_COLLECT_EPOCH_REWARDS = 1003;
uint256 constant ACTION_ADVENTURER_VOID_CRAFTING = 1004;
uint256 constant ACTION_ADVENTURER_REALM_CRAFTING = 1005;
uint256 constant ACTION_ADVENTURER_ANIMA_REGENERATION = 1006;
uint256 constant ACTION_ADVENTURER_BATTLE_V3_OPPONENT = 1007;
uint256 constant ACTION_ADVENTURER_TRAINING = 1008;
uint256 constant ACTION_ADVENTURER_TRANSCENDENCE = 1009;
uint256 constant ACTION_ADVENTURER_MINT_MULTIPASS = 1010;
uint256 constant ACTION_ARMORY_STAKE_RARITY_ITEM = 2001;
uint256 constant ACTION_ARMORY_UNSTAKE_RARITY_ITEM = 2002;
uint256 constant ACTION_ARMORY_STAKE_RARITY_ITEM_SHARD = 2011;
uint256 constant ACTION_ARMORY_UNSTAKE_RARITY_ITEM_SHARD = 2012;
uint256 constant ACTION_ARMORY_STAKE_MATERIAL_SHARD = 2021;
uint256 constant ACTION_ARMORY_UNSTAKE_MATERIAL_SHARD = 2022;
uint256 constant ACTION_ARMORY_STAKE_LAB = 2031;
uint256 constant ACTION_ARMORY_UNSTAKE_LAB = 2032;
uint256 constant ACTION_ARMORY_STAKE_COLLECTIBLE = 2041;
uint256 constant ACTION_ARMORY_UNSTAKE_COLLECTIBLE = 2042;
uint256 constant ACTION_ARMORY_STAKE_MATERIAL = 2051;
uint256 constant ACTION_ARMORY_UNSTAKE_MATERIAL = 2052;
uint256 constant ACTION_ARMORY_STAKE_CITY = 2061;
uint256 constant ACTION_ARMORY_UNSTAKE_CITY = 2062;
uint256 constant ACTION_ARMORY_STAKE_MONUMENT = 2071;
uint256 constant ACTION_ARMORY_UNSTAKE_MONUMENT = 2072;
uint256 constant ACTION_ARMORY_STAKE_ANIMA_CHAMBER = 2081;
uint256 constant ACTION_ARMORY_UNSTAKE_ANIMA_CHAMBER = 2082;
uint256 constant ACTION_ANIMA_STAKING_COLLECT_STAKER_REWARDS = 2083;
uint256 constant ACTION_ANIMA_STAKING_COLLECT_REALMER_REWARDS = 2084;
uint256 constant ACTION_REALM_COLLECT_COLLECTIBLES = 4001;
uint256 constant ACTION_REALM_BUILD_LAB = 4011;
uint256 constant ACTION_REALM_BUILD_MONUMENT = 4012;
uint256 constant ACTION_REALM_BUILD_CITY = 4013;
文件 2 的 24:Context.sol
pragma solidity ^0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
文件 3 的 24:Epoch.sol
pragma solidity ^0.8.17;
import "../lib/FloatingPointConstants.sol";
uint256 constant MASK_128 = ((1 << 128) - 1);
uint128 constant MASK_64 = ((1 << 64) - 1);
library Epoch {
function toEpochNumber(
uint256 _timestamp,
uint256 _duration,
uint256 _offset
) internal pure returns (uint256) {
return (_timestamp + _offset) / _duration;
}
function toEpochNumber(uint256 _timestamp, uint128 _config) internal pure returns (uint256) {
return (_timestamp + (_config & MASK_64)) / ((_config >> 64) & MASK_64);
}
function toEpochCompleteness(
uint256 _timestamp,
uint128 _config
) internal pure returns (uint256 result) {
result = (_config >> 64) & MASK_64;
result = (ONE_HUNDRED * ((_timestamp + (_config & MASK_64)) % result)) / result;
}
function epochToTimestamp(
uint256 _epoch,
uint128 _config
) internal pure returns (uint256 result) {
result = _epoch * ((_config >> 64) & MASK_64);
if (result > 0) {
result -= (_config & MASK_64);
}
}
function toConfig(uint64 _duration, uint64 _offset) internal pure returns (uint128) {
return (uint128(_duration) << 64) | uint128(_offset);
}
function packEpoch(uint256 _epochNumber, uint128 _config) internal pure returns (uint256) {
return (uint256(_config) << 128) | uint128(_epochNumber);
}
function packTimestampToEpoch(
uint256 _timestamp,
uint128 _config
) internal pure returns (uint256) {
return packEpoch(toEpochNumber(_timestamp, _config), _config);
}
function unpack(
uint256 _packedEpoch
) internal pure returns (uint256 epochNumber, uint128 config) {
config = uint128(_packedEpoch >> 128);
epochNumber = _packedEpoch & MASK_128;
}
}
文件 4 的 24:EpochConfigurable.sol
pragma solidity ^0.8.17;
import "./Epoch.sol";
import "../Manager/ManagerModifier.sol";
import "./IEpochConfigurable.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
contract EpochConfigurable is Pausable, ManagerModifier, IEpochConfigurable {
uint128 public EPOCH_CONFIG;
constructor(
address _manager,
uint64 _epochDuration,
uint64 _epochOffset
) ManagerModifier(_manager) {
EPOCH_CONFIG = Epoch.toConfig(_epochDuration, _epochOffset);
}
function currentEpoch() public view returns (uint) {
return epochAtTimestamp(block.timestamp);
}
function epochAtTimestamp(uint _timestamp) public view returns (uint) {
return Epoch.toEpochNumber(_timestamp, EPOCH_CONFIG);
}
function pause() external onlyAdmin {
_pause();
}
function unpause() external onlyAdmin {
_unpause();
}
function updateEpochConfig(uint64 duration, uint64 offset) external onlyAdmin {
EPOCH_CONFIG = Epoch.toConfig(duration, offset);
}
}
文件 5 的 24:FloatingPointConstants.sol
pragma solidity ^0.8.17;
uint256 constant DECIMAL_POINT = 10 ** 3;
uint256 constant ROUNDING_ADJUSTER = DECIMAL_POINT - 1;
int256 constant SIGNED_DECIMAL_POINT = int256(DECIMAL_POINT);
uint256 constant ONE_HUNDRED = 100 * DECIMAL_POINT;
uint256 constant ONE_HUNDRED_SQUARE = ONE_HUNDRED * ONE_HUNDRED;
int256 constant SIGNED_ONE_HUNDRED = 100 * SIGNED_DECIMAL_POINT;
int256 constant SIGNED_ONE_HUNDRED_SQUARE = SIGNED_ONE_HUNDRED * SIGNED_ONE_HUNDRED;
int256 constant SIGNED_ZERO = 0;
文件 6 的 24:IAnima.sol
pragma solidity ^0.8.4;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
interface IAnima is IERC20, IERC20Metadata {
function CAP() external view returns (uint256);
function mintFor(address _for, uint256 _amount) external;
function burnFrom(address account, uint256 amount) external;
}
文件 7 的 24:IArbSys.sol
pragma solidity >=0.4.21 <0.9.0;
interface ArbSys {
function arbBlockNumber() external view returns (uint256);
function arbBlockHash(uint256 arbBlockNum) external view returns (bytes32);
function arbChainID() external view returns (uint256);
function arbOSVersion() external view returns (uint256);
function getStorageGasAvailable() external view returns (uint256);
function isTopLevelCall() external view returns (bool);
function mapL1SenderContractAddressToL2Alias(
address sender,
address unused
) external pure returns (address);
function wasMyCallersAddressAliased() external view returns (bool);
function myCallersAddressWithoutAliasing() external view returns (address);
function withdrawEth(address destination) external payable returns (uint256);
function sendTxToL1(address destination, bytes calldata data) external payable returns (uint256);
function sendMerkleTreeState()
external
view
returns (uint256 size, bytes32 root, bytes32[] memory partials);
event L2ToL1Tx(
address caller,
address indexed destination,
uint256 indexed hash,
uint256 indexed position,
uint256 arbBlockNum,
uint256 ethBlockNum,
uint256 timestamp,
uint256 callvalue,
bytes data
);
event L2ToL1Transaction(
address caller,
address indexed destination,
uint256 indexed uniqueId,
uint256 indexed batchNumber,
uint256 indexInBatch,
uint256 arbBlockNum,
uint256 ethBlockNum,
uint256 timestamp,
uint256 callvalue,
bytes data
);
event SendMerkleUpdate(uint256 indexed reserved, bytes32 indexed hash, uint256 indexed position);
error InvalidBlockNumber(uint256 requested, uint256 current);
}
文件 8 的 24:IArmory.sol
pragma solidity ^0.8.17;
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "../Manager/ManagerModifier.sol";
import "./IArmoryEntityStorageAdapter.sol";
struct MultiStakeRequest {
address _staker;
address[] _ownerAddresses;
uint256[] _ownerTokenIds;
bytes32[][] _proofs;
address[] _entityAddresses;
uint256[][][] _entityIds;
uint256[][][] _entityAmounts;
}
interface IArmory {
function adapters(
address _entityAddress
) external view returns (IArmoryEntityStorageAdapter);
function stake(
address _staker,
address _ownerAddress,
uint256 _ownerTokenId,
address _entityAddress,
bytes32[] calldata _proof,
uint256 _entityId,
uint256 _entityAmount
) external;
function stakeBatch(
address _staker,
address _ownerAddress,
uint256 _ownerTokenId,
bytes32[] calldata _proof,
address _entityAddress,
uint256[] calldata _entityIds,
uint256[] calldata _entityAmounts
) external;
function stakeBatch(
address _staker,
address[] calldata _ownerAddresses,
uint256[] calldata _ownerTokenIds,
bytes32[][] calldata _proofs,
address _entityAddress,
uint256[][] calldata _entityIds,
uint256[][] calldata _entityAmounts
) external;
function stakeBatchMulti(MultiStakeRequest calldata _request) external;
function unstake(
address _staker,
address _ownerAddress,
uint256 _ownerTokenId,
bytes32[] calldata _proof,
address _entityAddress,
uint256 _entityId,
uint256 _entityAmount
) external;
function unstakeBatch(
address _staker,
address _ownerAddress,
uint256 _ownerTokenId,
bytes32[] calldata _proof,
address _entityAddress,
uint256[] calldata _entityIds,
uint256[] calldata _entityAmounts
) external;
function unstakeBatch(
address _staker,
address[] calldata _ownerAddresses,
uint256[] calldata _ownerTokenIds,
bytes32[][] calldata _proofs,
address _entityAddress,
uint256[][] calldata _entityIds,
uint256[][] calldata _entityAmounts
) external;
function unstakeBatchMulti(MultiStakeRequest calldata _request) external;
function burn(
address _ownerAddress,
uint256 _ownerTokenId,
address _entityAddress,
uint256 _entityId,
uint256 _entityAmount
) external;
function burnBatch(
address _ownerAddress,
uint256 _ownerTokenId,
address _entityAddress,
uint256[] calldata _entityIds,
uint256[] calldata _entityAmounts
) external;
function burnBatch(
address[] calldata _ownerAddresses,
uint256[] calldata _ownerTokenIds,
address _entityAddress,
uint256[][] calldata _entityIds,
uint256[][] calldata _entityAmounts
) external;
function burnBatchMulti(
address[] calldata _ownerAddresses,
uint256[] calldata _ownerTokenIds,
address[] calldata _entityAddresses,
uint256[][][] calldata _entityIds,
uint256[][][] calldata _entityAmounts
) external;
function mint(
address _ownerAddress,
uint256 _ownerTokenId,
address _entityAddress,
uint256 _entityId,
uint256 _entityAmount
) external;
function mintBatch(
address _ownerAddresses,
uint256 _ownerTokenIds,
address _entityAddress,
uint256[] calldata _entityIds,
uint256[] calldata _entityAmounts
) external;
function mintBatch(
address[] calldata _ownerAddresses,
uint256[] calldata _ownerTokenIds,
address _entityAddress,
uint256[][] calldata _entityIds,
uint256[][] calldata _entityAmounts
) external;
function checkMinimumAmounts(
address _ownerAddresses,
uint256 _ownerTokenIds,
address _entityAddress,
uint256[] calldata _entityIds,
uint256[] calldata _entityAmounts
) external view;
function checkMinimumAmounts(
address _ownerAddresses,
uint256 _ownerTokenIds,
address _entityAddress,
uint256[] calldata _entityIds,
uint256 _entityAmounts
) external view;
function checkMinimumAmountsBatch(
address[] calldata _ownerAddresses,
uint256[] calldata _ownerTokenIds,
address _entityAddress,
uint256[][] calldata _entityIds,
uint256[][] calldata _entityAmounts
) external view;
function checkMinimumAmountsBatch(
address[] calldata _ownerAddresses,
uint256[] calldata _ownerTokenIds,
address _entityAddress,
uint256[][] calldata _entityIds,
uint256 _entityAmount
) external view;
function balanceOf(
address _ownerAddress,
uint _ownerId,
address _entityAddress,
uint _entityTokenId
) external view returns (uint);
function balanceOfBatch(
address _ownerAddress,
uint _ownerId,
address _entityAddress,
uint[] memory _entityTokenIds
) external view returns (uint[] memory);
}
文件 9 的 24:IArmoryEntityStorageAdapter.sol
pragma solidity ^0.8.17;
interface IArmoryEntityStorageAdapter {
error Unauthorized(address _staker, address _ownerAddress, uint _ownerId);
error UnsupportedOperation(address _entityAddress, string operation);
error UnsupportedEntity(address _entityAddress);
error AlreadyStaked(
address _ownerAddress,
uint _ownerId,
address _entityAddress,
uint _entityId,
uint _tokenAmounts
);
error InsufficientAmountStaked(
address _ownerAddress,
uint _ownerId,
address _entityAddress,
uint _tokenIds,
uint _tokenAmounts
);
function entityType() external pure returns (uint);
function stake(
address _staker,
address _ownerAddress,
uint256 _ownerId,
bytes32[] calldata _proof,
address _entityAddress,
uint256 _entityTokenId,
uint256 _entityAmount
) external;
function stakeBatch(
address _staker,
address _ownerAddresses,
uint256 _ownerIds,
bytes32[] calldata _proof,
address _entityAddress,
uint256[] calldata _entityTokenIds,
uint256[] calldata _entityAmounts
) external;
function stakeBatch(
address _staker,
address[] calldata _ownerAddresses,
uint256[] calldata _ownerIds,
bytes32[][] calldata _proofs,
address _entityAddress,
uint256[][] calldata _entityTokenIds,
uint256[][] calldata _entityAmounts
) external;
function unstake(
address _staker,
address _ownerAddress,
uint256 _ownerId,
bytes32[] calldata _proof,
address _entityAddress,
uint256 _entityTokenId,
uint256 _entityAmount
) external;
function unstakeBatch(
address _staker,
address _ownerAddresses,
uint256 _ownerIds,
bytes32[] calldata _proof,
address _entityAddress,
uint256[] calldata _entityTokenIds,
uint256[] calldata _entityAmounts
) external;
function unstakeBatch(
address _staker,
address[] calldata _ownerAddresses,
uint256[] calldata _ownerIds,
bytes32[][] calldata _proofs,
address _entityAddress,
uint256[][] calldata _entityTokenIds,
uint256[][] calldata _entityAmounts
) external;
function burn(
address _ownerAddress,
uint256 _ownerId,
address _entityAddress,
uint256 _entityTokenId,
uint256 _entityAmount
) external;
function burnBatch(
address _ownerAddress,
uint256 _ownerId,
address _entityAddress,
uint256[] calldata _entityTokenIds,
uint256[] calldata _entityAmounts
) external;
function burnBatch(
address[] calldata _ownerAddress,
uint256[] calldata _ownerId,
address _entityAddress,
uint256[][] calldata _entityTokenIds,
uint256[][] calldata _entityAmounts
) external;
function mint(
address _ownerAddresses,
uint256 _ownerIds,
address _entityAddress,
uint256 _entityTokenId,
uint256 _entityAmount
) external;
function mintBatch(
address _ownerAddresses,
uint256 _ownerIds,
address _entityAddress,
uint256[] calldata _entityTokenIds,
uint256[] calldata _entityAmounts
) external;
function mintBatch(
address[] calldata _ownerAddresses,
uint256[] calldata _ownerIds,
address _entityAddress,
uint256[][] calldata _entityTokenIds,
uint256[][] calldata _entityAmounts
) external;
function batchCheckAmounts(
address[] calldata _ownerAddresses,
uint256[] calldata _ownerIds,
address _entityAddress,
uint256[][] calldata _entityTokenIds,
uint256[][] calldata _entityAmounts
) external view;
function batchCheckAmounts(
address _ownerAddresses,
uint256 _ownerIds,
address _entityAddress,
uint256[] calldata _entityTokenIds,
uint256[] calldata _entityAmounts
) external view;
function batchCheckAmounts(
address _ownerAddresses,
uint256 _ownerIds,
address _entityAddress,
uint256[] calldata _entityTokenIds,
uint256 _entityAmounts
) external view;
function balanceOf(
address _ownerAddress,
uint _ownerIds,
address _entityAddress,
uint _entityTokenId
) external view returns (uint);
function balanceOfBatch(
address _ownerAddress,
uint _ownerIds,
address _entityAddress,
uint[] calldata _entityTokenIds
) external view returns (uint[] memory);
}
文件 10 的 24:IDurabilityEnabledArmory.sol
pragma solidity ^0.8.17;
import { IArmory } from "./IArmory.sol";
interface IDurabilityEnabledArmory is IArmory {
function durabilitySupport(
address _entityAddress
) external view returns (bool);
function currentDurability(
address _ownerAddress,
uint256 _ownerId,
address _entityAddress,
uint256 _entityId
) external view returns (uint);
function currentDurabilityBatch(
address _ownerAddress,
uint256 _ownerId,
address _entityAddress,
uint256[] calldata _entityId
) external view returns (uint[] memory);
function currentDurabilityBatch(
address[] calldata _ownerAddresses,
uint256[] calldata _ownerIds,
address _entityAddress,
uint256[][] calldata _entityIds
) external view returns (uint[][] memory);
function currentDurabilityBatchMulti(
address[] calldata _ownerAddresses,
uint256[] calldata _ownerIds,
address[] calldata _entityAddress,
uint256[][][] calldata _entityIds
) external view returns (uint[][][] memory);
function currentDurabilityPercentage(
address _ownerAddress,
uint256 _ownerId,
address _entityAddress,
uint256 _entityId
) external view returns (uint);
function currentDurabilityPercentageBatch(
address _ownerAddress,
uint256 _ownerId,
address _entityAddress,
uint256[] calldata _entityId
) external view returns (uint[] memory);
function currentDurabilityPercentageBatch(
address[] calldata _ownerAddresses,
uint256[] calldata _ownerIds,
address _entityAddress,
uint256[][] calldata _entityIds
) external view returns (uint[][] memory);
function currentDurabilityPercentageBatchMulti(
address[] calldata _ownerAddresses,
uint256[] calldata _ownerIds,
address[] calldata _entityAddress,
uint256[][][] calldata _entityIds
) external view returns (uint[][][] memory);
function reduceDurability(
address _ownerAddress,
uint _ownerTokenId,
address _ownedTokenAddress,
uint _ownedTokenId,
uint _durabilityLoss,
bool _startNewTokenIfNeeded,
bool _ignoreAvailability
) external;
function reduceDurabilityBatch(
address[] calldata _ownerAddresses,
uint[] calldata _ownerTokenIds,
address _ownedTokenAddress,
uint[][] calldata _ownedTokenIds,
uint durabilityLoss,
bool _startNewTokenIfNeeded,
bool _ignoreAvailability
) external;
function reduceDurabilityBatch(
address[] calldata _ownerAddresses,
uint[] calldata _ownerTokenIds,
address _entityAddress,
uint[][] calldata _entityTokenIds,
uint[][] calldata _durabilityLosses,
bool _startNewTokenIfNeeded,
bool _ignoreAvailability
) external;
function reduceDurabilityMultiBatch(
address[] calldata _ownerAddresses,
uint[] calldata _ownerTokenIds,
address[] calldata _ownedTokenAddresses,
uint[][][] calldata _ownedTokenIds,
uint _durabilityLoss,
bool _startNewTokenIfNeeded,
bool _ignoreAvailability
) external;
function reduceDurabilityMultiBatch(
address[] calldata _ownerAddresses,
uint[] calldata _ownerTokenIds,
address[] calldata _entityAddresses,
uint[][][] calldata _entityTokenIds,
uint[][][] calldata _durabilityLosses,
bool _startNewTokenIfNeeded,
bool _ignoreAvailability
) external;
}
文件 11 的 24:IERC20.sol
pragma solidity ^0.8.0;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, 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 from,
address to,
uint256 amount
) external returns (bool);
}
文件 12 的 24:IERC20Metadata.sol
pragma solidity ^0.8.0;
import "../IERC20.sol";
interface IERC20Metadata is IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
文件 13 的 24:IEpochConfigurable.sol
pragma solidity ^0.8.17;
interface IEpochConfigurable {
function currentEpoch() external view returns (uint);
function epochAtTimestamp(uint _timestamp) external view returns (uint);
}
文件 14 的 24:IManager.sol
pragma solidity ^0.8.4;
interface IManager {
function isAdmin(address _addr) external view returns (bool);
function isManager(address _addr, uint256 _type) external view returns (bool);
function addManager(address _addr, uint256 _type) external;
function removeManager(address _addr, uint256 _type) external;
function addAdmin(address _addr) external;
function removeAdmin(address _addr) external;
}
文件 15 的 24:IMaterial.sol
pragma solidity ^0.8.17;
interface IMaterial {
function mintFor(address _for, uint256 _id, uint256 _amount) external;
function mintBatchFor(address _for, uint256[] memory _ids, uint256[] memory _amounts) external;
function burn(uint256 _id, uint256 _amount) external;
function burnBatch(uint256[] memory ids, uint256[] memory amounts) external;
}
文件 16 的 24:IMonumentHomage.sol
pragma solidity ^0.8.17;
interface IMonumentHomage {
struct StakedMonument {
uint256 tokenId;
uint256 amount;
}
struct HomageDestination {
uint256 realmId;
uint256 structureId;
uint256 structureAmount;
}
struct HomageRequest {
address adventurerAddress;
uint256 adventurerId;
bytes32[] proofs;
HomageDestination[] destinations;
}
function payHomage(HomageRequest[] calldata _requests) external;
function getEligibleStructureAmounts(
uint256[] calldata _realmIds,
uint256[] calldata _tokenIds
) external view returns (uint256[] calldata);
function getAdventurerHomagePoints(
address[] calldata _addresses,
uint256[] calldata _adventurerIds
) external view returns (uint256[] calldata);
}
文件 17 的 24:IRandomStructureBurner.sol
pragma solidity ^0.8.17;
interface IRandomStructureBurner {
function availableUsageCounts(
address _structureAddress,
uint[] calldata _structureIds,
uint[] calldata _lossPerUsage
) external view returns (uint[] memory);
function randomReduceDurability(
uint _randomBase,
address _structureAddress,
uint[] calldata _structureIds,
uint[] calldata _durabilityLoss,
uint[] calldata _amounts,
address _durabilityLossHandler
) external returns (uint nextRandomBase);
}
文件 18 的 24:IRiftHomageConfigProvider.sol
pragma solidity ^0.8.17;
struct RiftHomageConfigStruct {
uint[4] structureId;
uint[4] realmTokenCost;
uint[4] voidTokenCost;
uint[4] durabilityLossPercentage;
uint[4] structureAnimaCapacity;
}
interface IRiftHomageConfigProvider {
function config() external view returns (RiftHomageConfigStruct memory);
function animaCapacityPerStructure() external view returns (uint[7] memory);
}
文件 19 的 24:ITokenSpender.sol
pragma solidity ^0.8.17;
import "../Utils/IEpochConfigurable.sol";
uint constant SPENDER_ADVENTURER_BUCKET = 1;
uint constant SPENDER_REALM_BUCKET = 2;
interface ITokenSpender is IEpochConfigurable {
function getEpochValue(uint _epoch) external view returns (uint);
function getEpochValueBatch(
uint startEpoch,
uint endEpoch
) external view returns (uint[] memory result);
function getBucketEpochValueBatch(
uint _startEpoch,
uint _endEpoch,
uint _bucket
) external view returns (uint[] memory result);
function getEpochValueBatchTotal(
uint startEpoch,
uint endEpoch
) external view returns (uint result);
function getBucketEpochValueBatchTotal(
uint _startEpoch,
uint _endEpoch,
uint _bucket
) external view returns (uint result);
function spend(address _owner, uint _amount, uint _bucket) external;
}
文件 20 的 24:ManagerModifier.sol
pragma solidity ^0.8.4;
import "../Manager/IManager.sol";
abstract contract ManagerModifier {
IManager public immutable MANAGER;
constructor(address _manager) {
MANAGER = IManager(_manager);
}
modifier onlyAdmin() {
require(MANAGER.isAdmin(msg.sender), "Manager: Not an Admin");
_;
}
modifier onlyManager() {
require(MANAGER.isManager(msg.sender, 0), "Manager: Not manager");
_;
}
modifier onlyMinter() {
require(MANAGER.isManager(msg.sender, 1), "Manager: Not minter");
_;
}
modifier onlyTokenMinter() {
require(MANAGER.isManager(msg.sender, 2), "Manager: Not token minter");
_;
}
modifier onlyBinder() {
require(MANAGER.isManager(msg.sender, 3), "Manager: Not binder");
_;
}
modifier onlyConfigManager() {
require(MANAGER.isManager(msg.sender, 4), "Manager: Not config manager");
_;
}
modifier onlyTokenSpender() {
require(MANAGER.isManager(msg.sender, 5), "Manager: Not token spender");
_;
}
modifier onlyTokenEmitter() {
require(MANAGER.isManager(msg.sender, 6), "Manager: Not token emitter");
_;
}
modifier onlyPauser() {
require(
MANAGER.isAdmin(msg.sender) || MANAGER.isManager(msg.sender, 6),
"Manager: Not pauser"
);
_;
}
}
文件 21 的 24:Pausable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Pausable is Context {
event Paused(address account);
event Unpaused(address account);
bool private _paused;
constructor() {
_paused = false;
}
modifier whenNotPaused() {
_requireNotPaused();
_;
}
modifier whenPaused() {
_requirePaused();
_;
}
function paused() public view virtual returns (bool) {
return _paused;
}
function _requireNotPaused() internal view virtual {
require(!paused(), "Pausable: paused");
}
function _requirePaused() internal view virtual {
require(paused(), "Pausable: not paused");
}
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
文件 22 的 24:Random.sol
pragma solidity ^0.8.17;
import "./IArbSys.sol";
uint256 constant MIN_SAFE_NEXT_NUMBER_PRIME = 200033;
uint256 constant HIGH_RANGE_PRIME_OFFSET = 13;
library Random {
function startRandomBase(uint256 _highSalt, uint256 _lowSalt) internal view returns (uint256) {
return
uint256(
keccak256(
abi.encodePacked(
_getPreviousBlockhash(),
block.timestamp,
msg.sender,
_lowSalt,
_highSalt
)
)
);
}
function getNextRandom(
uint256 _randomBase,
uint256 _range
) internal view returns (uint256, uint256) {
uint256 nextNumberSeparator = MIN_SAFE_NEXT_NUMBER_PRIME > _range
? MIN_SAFE_NEXT_NUMBER_PRIME
: (_range + HIGH_RANGE_PRIME_OFFSET);
uint256 nextBaseNumber = _randomBase / nextNumberSeparator;
if (nextBaseNumber > nextNumberSeparator) {
return (_randomBase % _range, nextBaseNumber);
}
nextBaseNumber = uint256(
keccak256(abi.encodePacked(_getPreviousBlockhash(), msg.sender, _randomBase, _range))
);
return (nextBaseNumber % _range, nextBaseNumber / nextNumberSeparator);
}
function _getPreviousBlockhash() internal view returns (bytes32) {
if (
block.chainid == 42161 ||
block.chainid == 42170 ||
block.chainid == 421613 ||
block.chainid == 421614 ||
block.chainid == 23011913 ||
block.chainid == 421611
) {
return ArbSys(address(0x64)).arbBlockHash(ArbSys(address(0x64)).arbBlockNumber() - 1);
} else {
return blockhash(block.number - 1);
}
}
}
文件 23 的 24:ReentrancyGuard.sol
pragma solidity ^0.8.0;
abstract contract ReentrancyGuard {
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
_status = _ENTERED;
}
function _nonReentrantAfter() private {
_status = _NOT_ENTERED;
}
}
文件 24 的 24:RiftHomage.sol
pragma solidity ^0.8.17;
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "./IMonumentHomage.sol";
import "./IRiftHomageConfigProvider.sol";
import "../Manager/ManagerModifier.sol";
import "../Action/Actions.sol";
import "../Utils/Epoch.sol";
import "../Utils/Random.sol";
import "../Anima/IAnima.sol";
import "../Armory/IDurabilityEnabledArmory.sol";
import "../Structure/IRandomStructureBurner.sol";
import "../ERC20/ITokenSpender.sol";
import "../Item/IMaterial.sol";
import { EpochConfigurable } from "../Utils/EpochConfigurable.sol";
struct ConfigCache {
uint epoch;
RiftHomageConfigStruct config;
}
struct RiftHomageRequest {
uint[] realmRequests;
uint[] voidRequests;
}
contract RiftHomage is EpochConfigurable, ReentrancyGuard {
ConfigCache private CONFIG_CACHE;
IRiftHomageConfigProvider public CONFIG_PROVIDER;
IRandomStructureBurner public RANDOM_STRUCTURE_BURNER;
IDurabilityEnabledArmory public REALM_ARMORY;
IMaterial public MATERIAL;
address public immutable DURABILITY_LOSS_HANDLER;
ITokenSpender public TOKEN_SPENDER;
address public STRUCTURE;
address public REALM;
constructor(
address _manager,
address _realmArmory,
address _realm,
address _structure,
address _configProvider,
address _tokenSpender,
address _durabilityLossHandler,
address _material,
address _structureBurner
) EpochConfigurable(_manager, 1 days, 0 hours) {
CONFIG_PROVIDER = IRiftHomageConfigProvider(_configProvider);
STRUCTURE = _structure;
TOKEN_SPENDER = ITokenSpender(_tokenSpender);
REALM_ARMORY = IDurabilityEnabledArmory(_realmArmory);
REALM = _realm;
DURABILITY_LOSS_HANDLER = _durabilityLossHandler;
MATERIAL = IMaterial(_material);
RANDOM_STRUCTURE_BURNER = IRandomStructureBurner(_structureBurner);
}
function availableRealmHomageCounts() external view returns (uint[] memory) {
RiftHomageConfigStruct memory cfg = config();
uint[] memory structureIds = new uint[](4);
uint[] memory durabilityLosses = new uint[](4);
for (uint i = 0; i < 4; i++) {
structureIds[i] = cfg.structureId[i];
durabilityLosses[i] = cfg.durabilityLossPercentage[i];
}
return
RANDOM_STRUCTURE_BURNER.availableUsageCounts(
STRUCTURE,
structureIds,
durabilityLosses
);
}
function homage(
RiftHomageRequest calldata _request
) external whenNotPaused nonReentrant {
require(
msg.sender == tx.origin,
"Homage is not allowed through another contract"
);
uint randomBase = Random.startRandomBase(
ACTION_ADVENTURER_HOMAGE,
uint(uint160(msg.sender))
);
uint[] memory materialIds = new uint[](4);
for (uint i = 0; i < 4; i++) {
materialIds[i] = i + 1;
}
RiftHomageConfigStruct memory cfg = _config();
uint[] memory structureIds = new uint[](4);
uint[] memory durabilityLosses = new uint[](4);
uint totalAnimaSpent;
bool areMonumentsAffected = false;
for (uint i = 0; i < 4; i++) {
structureIds[i] = cfg.structureId[i];
durabilityLosses[i] = cfg.durabilityLossPercentage[i];
if (_request.realmRequests[i] + _request.voidRequests[i] <= 0) {
continue;
}
if (_request.realmRequests[i] > 0) {
areMonumentsAffected = true;
}
totalAnimaSpent += _request.realmRequests[i] * cfg.realmTokenCost[i];
totalAnimaSpent += _request.voidRequests[i] * cfg.voidTokenCost[i];
MATERIAL.mintFor(
msg.sender,
i + 1,
_request.realmRequests[i] + _request.voidRequests[i]
);
}
TOKEN_SPENDER.spend(msg.sender, totalAnimaSpent, SPENDER_ADVENTURER_BUCKET);
if (areMonumentsAffected) {
RANDOM_STRUCTURE_BURNER.randomReduceDurability(
randomBase,
STRUCTURE,
structureIds,
durabilityLosses,
_request.realmRequests,
DURABILITY_LOSS_HANDLER
);
}
}
function _config() internal returns (RiftHomageConfigStruct memory) {
uint epochNow = currentEpoch();
if (CONFIG_CACHE.epoch != epochNow) {
CONFIG_CACHE.config = CONFIG_PROVIDER.config();
CONFIG_CACHE.epoch = epochNow;
}
return CONFIG_CACHE.config;
}
function config() public view returns (RiftHomageConfigStruct memory) {
uint epochNow = currentEpoch();
if (CONFIG_CACHE.epoch != epochNow) {
return CONFIG_PROVIDER.config();
}
return CONFIG_CACHE.config;
}
function clearCache() external onlyAdmin {
CONFIG_CACHE.epoch = 0;
}
}
{
"compilationTarget": {
"contracts/Monument/RiftHomage.sol": "RiftHomage"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_manager","type":"address"},{"internalType":"address","name":"_realmArmory","type":"address"},{"internalType":"address","name":"_realm","type":"address"},{"internalType":"address","name":"_structure","type":"address"},{"internalType":"address","name":"_configProvider","type":"address"},{"internalType":"address","name":"_tokenSpender","type":"address"},{"internalType":"address","name":"_durabilityLossHandler","type":"address"},{"internalType":"address","name":"_material","type":"address"},{"internalType":"address","name":"_structureBurner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"CONFIG_PROVIDER","outputs":[{"internalType":"contract IRiftHomageConfigProvider","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DURABILITY_LOSS_HANDLER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EPOCH_CONFIG","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGER","outputs":[{"internalType":"contract IManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MATERIAL","outputs":[{"internalType":"contract IMaterial","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RANDOM_STRUCTURE_BURNER","outputs":[{"internalType":"contract IRandomStructureBurner","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REALM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REALM_ARMORY","outputs":[{"internalType":"contract IDurabilityEnabledArmory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STRUCTURE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_SPENDER","outputs":[{"internalType":"contract ITokenSpender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"availableRealmHomageCounts","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clearCache","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"config","outputs":[{"components":[{"internalType":"uint256[4]","name":"structureId","type":"uint256[4]"},{"internalType":"uint256[4]","name":"realmTokenCost","type":"uint256[4]"},{"internalType":"uint256[4]","name":"voidTokenCost","type":"uint256[4]"},{"internalType":"uint256[4]","name":"durabilityLossPercentage","type":"uint256[4]"},{"internalType":"uint256[4]","name":"structureAnimaCapacity","type":"uint256[4]"}],"internalType":"struct RiftHomageConfigStruct","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"epochAtTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256[]","name":"realmRequests","type":"uint256[]"},{"internalType":"uint256[]","name":"voidRequests","type":"uint256[]"}],"internalType":"struct RiftHomageRequest","name":"_request","type":"tuple"}],"name":"homage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"duration","type":"uint64"},{"internalType":"uint64","name":"offset","type":"uint64"}],"name":"updateEpochConfig","outputs":[],"stateMutability":"nonpayable","type":"function"}]