编译器
0.8.20+commit.a1b79de6
文件 1 的 15:Armory.sol
pragma solidity ^0.8.17;
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "../Manager/ManagerModifier.sol";
import "../Utils/ArrayUtils.sol";
import "./IArmoryEntityStorageAdapter.sol";
import "./ArmoryConstants.sol";
import "./IArmory.sol";
contract Armory is IArmory, ReentrancyGuard, Pausable, ManagerModifier {
mapping(address => IArmoryEntityStorageAdapter) public adapters;
mapping(address => uint) public entityTypes;
mapping(address => uint) public adapterListIndex;
address[] public entityList;
uint public enabledEntitiesCount;
event Staked(
address staker,
uint tokenType,
address ownerAddress,
uint256 ownerId,
address entityAddress,
uint256[] entityIds,
uint256[] entityAmounts
);
event Unstaked(
address staker,
uint tokenType,
address ownerAddress,
uint256 ownerId,
address entityAddress,
uint256[] entityIds,
uint256[] entityAmounts
);
event Burned(
uint tokenType,
address ownerAddress,
uint256 ownerId,
address entityAddress,
uint256[] entityIds,
uint256[] entityAmounts
);
event Minted(
uint tokenType,
address ownerAddress,
uint256 ownerId,
address entityAddress,
uint256[] entityIds,
uint256[] entityAmounts
);
constructor(address _manager) ManagerModifier(_manager) {}
function stake(
address _staker,
address _ownerAddress,
uint256 _ownerTokenId,
address _entityAddress,
bytes32[] calldata _proof,
uint256 _entityId,
uint256 _entityAmount
) external onlyManager nonReentrant whenNotPaused {
adapters[_entityAddress].stake(
_staker,
_ownerAddress,
_ownerTokenId,
_proof,
_entityAddress,
_entityId,
_entityAmount
);
emit Staked(
_staker,
entityTypes[_entityAddress],
_ownerAddress,
_ownerTokenId,
_entityAddress,
ArrayUtils.toMemoryArray(_entityId, 1),
ArrayUtils.toMemoryArray(_entityAmount, 1)
);
}
function stakeBatch(
address _staker,
address _ownerAddress,
uint256 _ownerTokenId,
bytes32[] calldata _proof,
address _entityAddress,
uint256[] calldata _entityIds,
uint256[] calldata _entityAmounts
) external onlyManager nonReentrant whenNotPaused {
_stakeBatchInternal(
_staker,
_ownerAddress,
_ownerTokenId,
_proof,
_entityAddress,
_entityIds,
_entityAmounts
);
}
function stakeBatch(
address _staker,
address[] calldata _ownerAddresses,
uint256[] calldata _ownerTokenIds,
bytes32[][] calldata _proofs,
address _entityAddress,
uint256[][] calldata _entityIds,
uint256[][] calldata _entityAmounts
) external onlyManager nonReentrant whenNotPaused {
_stakeBatchInternal(
_staker,
_ownerAddresses,
_ownerTokenIds,
_proofs,
_entityAddress,
_entityIds,
_entityAmounts
);
}
function stakeBatchMulti(
MultiStakeRequest calldata _request
) external onlyManager nonReentrant whenNotPaused {
for (uint i = 0; i < _request._entityAddresses.length; i++) {
_stakeBatchInternal(
_request._staker,
_request._ownerAddresses,
_request._ownerTokenIds,
_request._proofs,
_request._entityAddresses[i],
_request._entityIds[i],
_request._entityAmounts[i]
);
}
}
function unstake(
address _staker,
address _ownerAddress,
uint256 _ownerTokenId,
bytes32[] calldata _proof,
address _entityAddress,
uint256 _entityId,
uint256 _entityAmount
) external onlyManager nonReentrant whenNotPaused {
adapters[_entityAddress].unstake(
_staker,
_ownerAddress,
_ownerTokenId,
_proof,
_entityAddress,
_entityId,
_entityAmount
);
emit Unstaked(
_staker,
entityTypes[_entityAddress],
_ownerAddress,
_ownerTokenId,
_entityAddress,
ArrayUtils.toMemoryArray(_entityId, 1),
ArrayUtils.toMemoryArray(_entityAmount, 1)
);
}
function unstakeBatch(
address _staker,
address _ownerAddress,
uint256 _ownerTokenId,
bytes32[] calldata _proof,
address _entityAddress,
uint256[] calldata _entityIds,
uint256[] calldata _entityAmounts
) external onlyManager nonReentrant whenNotPaused {
_unstakeBatchInternal(
_staker,
_ownerAddress,
_ownerTokenId,
_proof,
_entityAddress,
_entityIds,
_entityAmounts
);
}
function unstakeBatch(
address _staker,
address[] calldata _ownerAddresses,
uint256[] calldata _ownerTokenIds,
bytes32[][] calldata _proofs,
address _entityAddress,
uint256[][] calldata _entityIds,
uint256[][] calldata _entityAmounts
) external onlyManager nonReentrant whenNotPaused {
_unstakeBatchInternal(
_staker,
_ownerAddresses,
_ownerTokenIds,
_proofs,
_entityAddress,
_entityIds,
_entityAmounts
);
}
function unstakeBatchMulti(
MultiStakeRequest calldata _request
) external onlyManager nonReentrant whenNotPaused {
for (uint i = 0; i < _request._entityAddresses.length; i++) {
_unstakeBatchInternal(
_request._staker,
_request._ownerAddresses,
_request._ownerTokenIds,
_request._proofs,
_request._entityAddresses[i],
_request._entityIds[i],
_request._entityAmounts[i]
);
}
}
function burn(
address _ownerAddress,
uint256 _ownerTokenId,
address _entityAddress,
uint256 _entityId,
uint256 _entityAmount
) external onlyManager nonReentrant whenNotPaused {
adapters[_entityAddress].burn(
_ownerAddress,
_ownerTokenId,
_entityAddress,
_entityId,
_entityAmount
);
emit Burned(
adapters[_entityAddress].entityType(),
_ownerAddress,
_ownerTokenId,
_entityAddress,
ArrayUtils.toMemoryArray(_entityId, 1),
ArrayUtils.toMemoryArray(_entityAmount, 1)
);
}
function burnBatch(
address _ownerAddress,
uint256 _ownerTokenId,
address _entityAddress,
uint256[] calldata _entityIds,
uint256[] calldata _entityAmounts
) external onlyManager nonReentrant whenNotPaused {
_burnBatchInternal(
_ownerAddress,
_ownerTokenId,
_entityAddress,
_entityIds,
_entityAmounts
);
}
function burnBatch(
address[] calldata _ownerAddresses,
uint256[] calldata _ownerTokenIds,
address _entityAddress,
uint256[][] calldata _entityIds,
uint256[][] calldata _entityAmounts
) external onlyManager nonReentrant whenNotPaused {
_burnBatchInternal(
_ownerAddresses,
_ownerTokenIds,
_entityAddress,
_entityIds,
_entityAmounts
);
}
function burnBatchMulti(
address[] calldata _ownerAddresses,
uint256[] calldata _ownerTokenIds,
address[] calldata _entityAddresses,
uint256[][][] calldata _entityIds,
uint256[][][] calldata _entityAmounts
) external onlyManager nonReentrant whenNotPaused {
require(
_entityAddresses.length == _entityIds.length &&
_entityAddresses.length == _entityAmounts.length
);
for (uint256 i = 0; i < _entityAddresses.length; i++) {
_burnBatchInternal(
_ownerAddresses,
_ownerTokenIds,
_entityAddresses[i],
_entityIds[i],
_entityAmounts[i]
);
}
}
function mint(
address _ownerAddress,
uint256 _ownerTokenId,
address _entityAddress,
uint256 _entityId,
uint256 _entityAmount
) external onlyMinter nonReentrant whenNotPaused {
adapters[_entityAddress].mint(
_ownerAddress,
_ownerTokenId,
_entityAddress,
_entityId,
_entityAmount
);
emit Minted(
entityTypes[_entityAddress],
_ownerAddress,
_ownerTokenId,
_entityAddress,
ArrayUtils.toMemoryArray(_entityId, 1),
ArrayUtils.toMemoryArray(_entityAmount, 1)
);
}
function mintBatch(
address _ownerAddress,
uint256 _ownerTokenId,
address _entityAddress,
uint256[] calldata _entityIds,
uint256[] calldata _entityAmounts
) external onlyMinter nonReentrant whenNotPaused {
_mintBatchInternal(
_ownerAddress,
_ownerTokenId,
_entityAddress,
_entityIds,
_entityAmounts
);
}
function mintBatch(
address[] calldata _ownerAddresses,
uint256[] calldata _ownerTokenIds,
address _entityAddress,
uint256[][] calldata _entityIds,
uint256[][] calldata _entityAmounts
) external onlyMinter nonReentrant whenNotPaused {
_mintBatchInternal(
_ownerAddresses,
_ownerTokenIds,
_entityAddress,
_entityIds,
_entityAmounts
);
}
function checkMinimumAmounts(
address _ownerAddress,
uint256 _ownerTokenId,
address _entityAddress,
uint256[] calldata _entityIds,
uint256[] calldata _entityAmounts
) external view whenNotPaused {
adapters[_entityAddress].batchCheckAmounts(
_ownerAddress,
_ownerTokenId,
_entityAddress,
_entityIds,
_entityAmounts
);
}
function checkMinimumAmounts(
address _ownerAddress,
uint256 _ownerTokenId,
address _entityAddress,
uint256[] calldata _entityIds,
uint256 _entityAmount
) external view whenNotPaused {
adapters[_entityAddress].batchCheckAmounts(
_ownerAddress,
_ownerTokenId,
_entityAddress,
_entityIds,
_entityAmount
);
}
function checkMinimumAmountsBatch(
address[] calldata _ownerAddresses,
uint256[] calldata _ownerTokenIds,
address _entityAddress,
uint256[][] calldata _entityIds,
uint256[][] calldata _entityAmounts
) external view whenNotPaused {
for (uint256 j = 0; j < _ownerTokenIds.length; j++) {
adapters[_entityAddress].batchCheckAmounts(
_ownerAddresses[j],
_ownerTokenIds[j],
_entityAddress,
_entityIds[j],
_entityAmounts[j]
);
}
}
function checkMinimumAmountsBatch(
address[] calldata _ownerAddresses,
uint256[] calldata _ownerTokenIds,
address _entityAddress,
uint256[][] calldata _entityIds,
uint256 _entityAmounts
) external view whenNotPaused {
for (uint256 j = 0; j < _ownerTokenIds.length; j++) {
adapters[_entityAddress].batchCheckAmounts(
_ownerAddresses[j],
_ownerTokenIds[j],
_entityAddress,
_entityIds[j],
_entityAmounts
);
}
}
function balanceOf(
address _ownerAddress,
uint _ownerId,
address _entityAddress,
uint _entityTokenId
) external view returns (uint) {
return
adapters[_entityAddress].balanceOf(
_ownerAddress,
_ownerId,
_entityAddress,
_entityTokenId
);
}
function balanceOfBatch(
address _ownerAddress,
uint _ownerId,
address _entityAddress,
uint[] memory _entityTokenIds
) external view returns (uint[] memory) {
return
adapters[_entityAddress].balanceOfBatch(
_ownerAddress,
_ownerId,
_entityAddress,
_entityTokenIds
);
}
function totalEntityCount() external view returns (uint) {
return entityList.length;
}
function enabledEntities() external view returns (address[] memory) {
address[] memory result = new address[](enabledEntitiesCount);
uint enabledEntityIndex = 0;
for (uint i = 0; i < entityList.length; i++) {
address entity = entityList[i];
if (entityTypes[entity] != ARMORY_ENTITY_DISABLED) {
result[enabledEntityIndex++] = address(adapters[entity]);
}
}
return result;
}
function _stakeBatchInternal(
address _staker,
address _ownerAddress,
uint256 _ownerId,
bytes32[] calldata _proof,
address _entityAddress,
uint256[] calldata _entityIds,
uint256[] calldata _entityAmounts
) internal {
if (_entityIds.length == 0) {
return;
}
adapters[_entityAddress].stakeBatch(
_staker,
_ownerAddress,
_ownerId,
_proof,
_entityAddress,
_entityIds,
_entityAmounts
);
emit Staked(
_staker,
entityTypes[_entityAddress],
_ownerAddress,
_ownerId,
_entityAddress,
_entityIds,
_entityAmounts
);
}
function _stakeBatchInternal(
address _staker,
address[] calldata _ownerAddress,
uint256[] calldata _ownerId,
bytes32[][] calldata _proofs,
address _entityAddress,
uint256[][] calldata _entityIds,
uint256[][] calldata _entityAmounts
) internal {
require(
_ownerAddress.length == _ownerId.length &&
_ownerAddress.length == _entityIds.length &&
_ownerAddress.length == _entityAmounts.length
);
adapters[_entityAddress].stakeBatch(
_staker,
_ownerAddress,
_ownerId,
_proofs,
_entityAddress,
_entityIds,
_entityAmounts
);
uint entityType = entityTypes[_entityAddress];
for (uint i = 0; i < _ownerAddress.length; i++) {
emit Staked(
_staker,
entityType,
_ownerAddress[i],
_ownerId[i],
_entityAddress,
_entityIds[i],
_entityAmounts[i]
);
}
}
function _unstakeBatchInternal(
address _staker,
address _ownerAddress,
uint256 _ownerId,
bytes32[] calldata _proof,
address _entityAddress,
uint256[] calldata _entityIds,
uint256[] calldata _entityAmounts
) internal {
if (_entityIds.length == 0) {
return;
}
adapters[_entityAddress].unstakeBatch(
_staker,
_ownerAddress,
_ownerId,
_proof,
_entityAddress,
_entityIds,
_entityAmounts
);
emit Unstaked(
_staker,
entityTypes[_entityAddress],
_ownerAddress,
_ownerId,
_entityAddress,
_entityIds,
_entityAmounts
);
}
function _unstakeBatchInternal(
address _staker,
address[] calldata _ownerAddress,
uint256[] calldata _ownerId,
bytes32[][] calldata _proofs,
address _entityAddress,
uint256[][] calldata _entityIds,
uint256[][] calldata _entityAmounts
) internal {
require(
_ownerAddress.length == _ownerId.length &&
_ownerAddress.length == _entityIds.length &&
_ownerAddress.length == _entityAmounts.length
);
adapters[_entityAddress].unstakeBatch(
_staker,
_ownerAddress,
_ownerId,
_proofs,
_entityAddress,
_entityIds,
_entityAmounts
);
uint entityType = entityTypes[_entityAddress];
for (uint i = 0; i < _ownerAddress.length; i++) {
emit Unstaked(
_staker,
entityType,
_ownerAddress[i],
_ownerId[i],
_entityAddress,
_entityIds[i],
_entityAmounts[i]
);
}
}
function _mintBatchInternal(
address _ownerAddress,
uint256 _ownerId,
address _entityAddress,
uint256[] calldata _entityIds,
uint256[] calldata _entityAmounts
) internal {
if (_entityIds.length == 0) {
return;
}
adapters[_entityAddress].mintBatch(
_ownerAddress,
_ownerId,
_entityAddress,
_entityIds,
_entityAmounts
);
emit Minted(
entityTypes[_entityAddress],
_ownerAddress,
_ownerId,
_entityAddress,
_entityIds,
_entityAmounts
);
}
function _mintBatchInternal(
address[] calldata _ownerAddress,
uint256[] calldata _ownerId,
address _entityAddress,
uint256[][] calldata _entityIds,
uint256[][] calldata _entityAmounts
) internal {
require(
_ownerAddress.length == _ownerId.length &&
_ownerAddress.length == _entityIds.length &&
_ownerAddress.length == _entityAmounts.length
);
adapters[_entityAddress].mintBatch(
_ownerAddress,
_ownerId,
_entityAddress,
_entityIds,
_entityAmounts
);
uint entityType = entityTypes[_entityAddress];
for (uint i = 0; i < _ownerAddress.length; i++) {
emit Minted(
entityType,
_ownerAddress[i],
_ownerId[i],
_entityAddress,
_entityIds[i],
_entityAmounts[i]
);
}
}
function _burnBatchInternal(
address _ownerAddress,
uint256 _ownerId,
address _entityAddress,
uint256[] calldata _entityIds,
uint256[] calldata _entityAmounts
) internal {
if (_entityIds.length == 0) {
return;
}
adapters[_entityAddress].burnBatch(
_ownerAddress,
_ownerId,
_entityAddress,
_entityIds,
_entityAmounts
);
emit Burned(
entityTypes[_entityAddress],
_ownerAddress,
_ownerId,
_entityAddress,
_entityIds,
_entityAmounts
);
}
function _burnBatchInternal(
address[] calldata _ownerAddress,
uint256[] calldata _ownerId,
address _entityAddress,
uint256[][] calldata _entityIds,
uint256[][] calldata _entityAmounts
) internal {
require(
_ownerAddress.length == _ownerId.length &&
_ownerAddress.length == _entityIds.length &&
_ownerAddress.length == _entityAmounts.length
);
adapters[_entityAddress].burnBatch(
_ownerAddress,
_ownerId,
_entityAddress,
_entityIds,
_entityAmounts
);
uint entityType = entityTypes[_entityAddress];
for (uint i = 0; i < _ownerAddress.length; i++) {
emit Burned(
entityType,
_ownerAddress[i],
_ownerId[i],
_entityAddress,
_entityIds[i],
_entityAmounts[i]
);
}
}
function enableEntity(
address _entity,
address _adapter
) public virtual onlyAdmin {
require(
address(adapters[_entity]) == address(0),
"Collection already enabled"
);
adapters[_entity] = IArmoryEntityStorageAdapter(_adapter);
if (adapterListIndex[_entity] == 0) {
adapterListIndex[_entity] = entityList.length;
entityList.push(_entity);
}
entityTypes[_entity] = adapters[_entity].entityType();
enabledEntitiesCount++;
}
function disableEntity(address _entity) public virtual onlyAdmin {
require(
address(adapters[_entity]) != address(0),
"Collection already disabled"
);
adapters[_entity] = IArmoryEntityStorageAdapter(address(0));
entityTypes[_entity] = ARMORY_ENTITY_DISABLED;
enabledEntitiesCount--;
}
function pause() external onlyAdmin {
_pause();
}
function unpause() external onlyAdmin {
_unpause();
}
}
文件 2 的 15:ArmoryConstants.sol
pragma solidity ^0.8.17;
uint constant ARMORY_ENTITY_DISABLED = 0;
uint constant ARMORY_ENTITY_ERC20 = 1;
uint constant ARMORY_ENTITY_ERC721 = 2;
uint constant ARMORY_ENTITY_ERC1155 = 3;
uint constant ARMORY_ENTITY_DATA = 4;
文件 3 的 15:ArrayUtils.sol
pragma solidity ^0.8.17;
library ArrayUtils {
error ArrayLengthMismatch(uint _length1, uint _length2);
error InvalidArrayOrder(uint index);
function ensureSameLength(uint _l1, uint _l2) internal pure {
if (_l1 != _l2) {
revert ArrayLengthMismatch(_l1, _l2);
}
}
function ensureSameLength(uint _l1, uint _l2, uint _l3) internal pure {
ensureSameLength(_l1, _l2);
ensureSameLength(_l1, _l3);
}
function ensureSameLength(uint _l1, uint _l2, uint _l3, uint _l4) internal pure {
ensureSameLength(_l1, _l2);
ensureSameLength(_l1, _l3);
ensureSameLength(_l1, _l4);
}
function ensureSameLength(uint _l1, uint _l2, uint _l3, uint _l4, uint _l5) internal pure {
ensureSameLength(_l1, _l2);
ensureSameLength(_l1, _l3);
ensureSameLength(_l1, _l4);
ensureSameLength(_l1, _l5);
}
function checkAddressesForDuplicates(address[] memory _tokenAddrs) internal pure {
address lastAddress;
for (uint i = 0; i < _tokenAddrs.length; i++) {
if (lastAddress > _tokenAddrs[i]) {
revert InvalidArrayOrder(i);
}
lastAddress = _tokenAddrs[i];
}
}
function checkForDuplicates(uint[] memory _ids) internal pure {
uint lastId;
for (uint i = 0; i < _ids.length; i++) {
if (lastId > _ids[i]) {
revert InvalidArrayOrder(i);
}
lastId = _ids[i];
}
}
function checkForDuplicates(address[] memory _tokenAddrs, uint[] memory _tokenIds) internal pure {
address lastAddress;
int256 lastTokenId = -1;
for (uint i = 0; i < _tokenAddrs.length; i++) {
if (_tokenAddrs[i] > lastAddress) {
lastTokenId = -1;
}
if (_tokenAddrs[i] < lastAddress || int(_tokenIds[i]) <= lastTokenId) {
revert InvalidArrayOrder(i);
}
lastAddress = _tokenAddrs[i];
lastTokenId = int(_tokenIds[i]);
}
}
function toMemoryArray(uint _value, uint _length) internal pure returns (uint[] memory result) {
result = new uint[](_length);
for (uint i = 0; i < _length; i++) {
result[i] = _value;
}
}
function toMemoryArray(uint[] calldata _value) internal pure returns (uint[] memory result) {
result = new uint[](_value.length);
for (uint i = 0; i < _value.length; i++) {
result[i] = _value[i];
}
}
function toMemoryArray(
address _address,
uint _length
) internal pure returns (address[] memory result) {
result = new address[](_length);
for (uint i = 0; i < _length; i++) {
result[i] = _address;
}
}
function toMemoryArray(
address[] calldata _addresses
) internal pure returns (address[] memory result) {
result = new address[](_addresses.length);
for (uint i = 0; i < _addresses.length; i++) {
result[i] = _addresses[i];
}
}
}
文件 4 的 15: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;
}
}
文件 5 的 15:DurabilityEnabledArmory.sol
pragma solidity ^0.8.17;
import "./Armory.sol";
import "./IDurabilityEnabledArmory.sol";
import "./IDurabilityEnabledAdapter.sol";
contract DurabilityEnabledArmory is Armory, IDurabilityEnabledArmory {
error DurabilityNotSupported(address _address);
constructor(address _manager) Armory(_manager) {}
mapping(address => bool) public durabilitySupport;
struct ProcessingMemory {
address _ownerAddress;
uint _ownerTokenId;
address _entityAddress;
uint _entityTokenId;
uint durabilityLoss;
}
function currentDurability(
address _ownerAddress,
uint256 _ownerId,
address _entityAddress,
uint256 _entityId
) public view returns (uint) {
IDurabilityEnabledAdapter adapter = _getDurabilityAdapter(_entityAddress);
return
adapter.currentDurability(
_ownerAddress,
_ownerId,
_entityAddress,
_entityId
);
}
function currentDurabilityBatch(
address _ownerAddress,
uint256 _ownerId,
address _entityAddress,
uint256[] calldata _entityIds
) public view returns (uint[] memory) {
IDurabilityEnabledAdapter adapter = _getDurabilityAdapter(_entityAddress);
return
adapter.currentDurabilityBatch(
_ownerAddress,
_ownerId,
_entityAddress,
_entityIds
);
}
function currentDurabilityBatch(
address[] calldata _ownerAddresses,
uint256[] calldata _ownerIds,
address _entityAddress,
uint256[][] calldata _entityIds
) external view returns (uint[][] memory) {
IDurabilityEnabledAdapter adapter = _getDurabilityAdapter(_entityAddress);
return
adapter.currentDurabilityBatch(
_ownerAddresses,
_ownerIds,
_entityAddress,
_entityIds
);
}
function currentDurabilityBatchMulti(
address[] calldata _ownerAddresses,
uint256[] calldata _ownerIds,
address[] calldata _entityAddresses,
uint256[][][] calldata _entityIds
) external view returns (uint[][][] memory result) {
result = new uint[][][](_entityAddresses.length);
for (uint i = 0; i < _entityAddresses.length; i++) {
result[i] = _getDurabilityAdapter(_entityAddresses[i])
.currentDurabilityBatch(
_ownerAddresses,
_ownerIds,
_entityAddresses[i],
_entityIds[i]
);
}
}
function currentDurabilityPercentage(
address _ownerAddress,
uint256 _ownerId,
address _entityAddress,
uint256 _entityId
) external view returns (uint) {
IDurabilityEnabledAdapter adapter = _getDurabilityAdapter(_entityAddress);
return
adapter.currentDurabilityPercentage(
_ownerAddress,
_ownerId,
_entityAddress,
_entityId
);
}
function currentDurabilityPercentageBatch(
address _ownerAddress,
uint256 _ownerId,
address _entityAddress,
uint256[] calldata _entityIds
) public view returns (uint[] memory) {
IDurabilityEnabledAdapter adapter = _getDurabilityAdapter(_entityAddress);
return
adapter.currentDurabilityBatchPercentage(
_ownerAddress,
_ownerId,
_entityAddress,
_entityIds
);
}
function currentDurabilityPercentageBatch(
address[] calldata _ownerAddresses,
uint256[] calldata _ownerIds,
address _entityAddress,
uint256[][] calldata _entityIds
) external view returns (uint[][] memory) {
IDurabilityEnabledAdapter adapter = _getDurabilityAdapter(_entityAddress);
return
adapter.currentDurabilityBatchPercentage(
_ownerAddresses,
_ownerIds,
_entityAddress,
_entityIds
);
}
function currentDurabilityPercentageBatchMulti(
address[] calldata _ownerAddresses,
uint256[] calldata _ownerIds,
address[] calldata _entityAddresses,
uint256[][][] calldata _entityIds
) external view returns (uint[][][] memory result) {
result = new uint[][][](_entityAddresses.length);
for (uint i = 0; i < _entityAddresses.length; i++) {
result[i] = _getDurabilityAdapter(_entityAddresses[i])
.currentDurabilityBatchPercentage(
_ownerAddresses,
_ownerIds,
_entityAddresses[i],
_entityIds[i]
);
}
}
function reduceDurability(
address _ownerAddress,
uint _ownerTokenId,
address _entityAddress,
uint _entityTokenId,
uint durabilityLoss,
bool _startNewTokenIfNeeded,
bool _ignoreAvailability
) public whenNotPaused onlyManager {
IDurabilityEnabledAdapter adapter = _getDurabilityAdapter(_entityAddress);
uint brokenAmount = adapter.reduceDurability(
msg.sender,
_ownerAddress,
_ownerTokenId,
_entityAddress,
_entityTokenId,
durabilityLoss,
_startNewTokenIfNeeded,
_ignoreAvailability
);
if (brokenAmount > 0) {
emit Burned(
IArmoryEntityStorageAdapter(address(adapter)).entityType(),
_ownerAddress,
_ownerTokenId,
_entityAddress,
ArrayUtils.toMemoryArray(_entityTokenId, 1),
ArrayUtils.toMemoryArray(brokenAmount, 1)
);
}
}
function reduceDurabilityBatch(
address[] calldata _ownerAddresses,
uint[] calldata _ownerTokenIds,
address _entityAddress,
uint[][] calldata _entityTokenIds,
uint _durabilityLoss,
bool _startNewTokenIfNeeded,
bool _ignoreAvailability
) external whenNotPaused onlyManager {
_reduceDurabilityBatchInternal(
_ownerAddresses,
_ownerTokenIds,
_entityAddress,
_entityTokenIds,
_durabilityLoss,
_startNewTokenIfNeeded,
_ignoreAvailability
);
}
function reduceDurabilityBatch(
address[] calldata _ownerAddresses,
uint[] calldata _ownerTokenIds,
address _entityAddress,
uint[][] calldata _entityTokenIds,
uint[][] calldata _durabilityLosses,
bool _startNewTokenIfNeeded,
bool _ignoreAvailability
) external whenNotPaused onlyManager {
_reduceDurabilityBatchInternal(
_ownerAddresses,
_ownerTokenIds,
_entityAddress,
_entityTokenIds,
_durabilityLosses,
_startNewTokenIfNeeded,
_ignoreAvailability
);
}
function reduceDurabilityMultiBatch(
address[] calldata _ownerAddresses,
uint[] calldata _ownerTokenIds,
address[] calldata _entityAddresses,
uint[][][] calldata _entityTokenIds,
uint _durabilityLoss,
bool _startNewTokenIfNeeded,
bool _ignoreAvailability
) external whenNotPaused onlyManager {
for (uint i = 0; i < _entityAddresses.length; i++) {
_reduceDurabilityBatchInternal(
_ownerAddresses,
_ownerTokenIds,
_entityAddresses[i],
_entityTokenIds[i],
_durabilityLoss,
_startNewTokenIfNeeded,
_ignoreAvailability
);
}
}
function reduceDurabilityMultiBatch(
address[] calldata _ownerAddresses,
uint[] calldata _ownerTokenIds,
address[] calldata _entityAddresses,
uint[][][] calldata _entityTokenIds,
uint[][][] calldata _durabilityLosses,
bool _startNewTokenIfNeeded,
bool _ignoreAvailability
) external whenNotPaused onlyManager {
for (uint i = 0; i < _entityAddresses.length; i++) {
_reduceDurabilityBatchInternal(
_ownerAddresses,
_ownerTokenIds,
_entityAddresses[i],
_entityTokenIds[i],
_durabilityLosses[i],
_startNewTokenIfNeeded,
_ignoreAvailability
);
}
}
function _reduceDurabilityBatchInternal(
address[] calldata _ownerAddresses,
uint[] calldata _ownerTokenIds,
address _entityAddress,
uint[][] calldata _entityTokenIds,
uint _durabilityLoss,
bool _startNewTokenIfNeeded,
bool _ignoreAvailability
) internal returns (bool anyBroken, uint[][] memory brokenAmounts) {
IDurabilityEnabledAdapter adapter = _getDurabilityAdapter(_entityAddress);
(anyBroken, brokenAmounts) = adapter.reduceDurabilityBatch(
msg.sender,
_ownerAddresses,
_ownerTokenIds,
_entityAddress,
_entityTokenIds,
_durabilityLoss,
_startNewTokenIfNeeded,
_ignoreAvailability
);
_emitBurnEvents(
_ownerAddresses,
_ownerTokenIds,
_entityAddress,
_entityTokenIds,
brokenAmounts,
anyBroken
);
}
function _reduceDurabilityBatchInternal(
address[] calldata _ownerAddresses,
uint[] calldata _ownerTokenIds,
address _entityAddress,
uint[][] calldata _entityTokenIds,
uint[][] calldata _durabilityLosses,
bool _startNewTokenIfNeeded,
bool _ignoreAvailability
) internal returns (bool anyBroken, uint[][] memory brokenAmounts) {
(anyBroken, brokenAmounts) = _getDurabilityAdapter(_entityAddress)
.reduceDurabilityBatch(
msg.sender,
_ownerAddresses,
_ownerTokenIds,
_entityAddress,
_entityTokenIds,
_durabilityLosses,
_startNewTokenIfNeeded,
_ignoreAvailability
);
_emitBurnEvents(
_ownerAddresses,
_ownerTokenIds,
_entityAddress,
_entityTokenIds,
brokenAmounts,
anyBroken
);
}
function _emitBurnEvents(
address[] calldata _ownerAddresses,
uint[] calldata _ownerTokenIds,
address _entityAddress,
uint[][] calldata _entityTokenIds,
uint[][] memory _brokenAmounts,
bool anyBroken
) internal {
if (!anyBroken) {
return;
}
for (uint i = 0; i < _ownerAddresses.length; i++) {
emit Burned(
adapters[_entityAddress].entityType(),
_ownerAddresses[i],
_ownerTokenIds[i],
_entityAddress,
_entityTokenIds[i],
_brokenAmounts[i]
);
}
}
function enableEntity(
address _entity,
address _adapter
) public override onlyAdmin {
super.enableEntity(_entity, _adapter);
durabilitySupport[_entity] = true;
}
function disableEntity(address _entity) public override onlyAdmin {
super.disableEntity(_entity);
durabilitySupport[_entity] = false;
}
function forceChangeDurabilitySupport(
address _entity,
bool _durabilitySupport
) external onlyAdmin {
durabilitySupport[_entity] = _durabilitySupport;
}
function _getDurabilityAdapter(
address _entityAddress
) internal view returns (IDurabilityEnabledAdapter) {
if (!durabilitySupport[_entityAddress]) {
revert DurabilityNotSupported(_entityAddress);
}
return IDurabilityEnabledAdapter(address(adapters[_entityAddress]));
}
}
文件 6 的 15: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 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 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);
}
文件 7 的 15: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 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);
}
文件 8 的 15:IBrokenEquipmentHandler.sol
pragma solidity ^0.8.17;
interface IBrokenTokenHandler {
function handleBrokenToken(
address _breakerContract,
address _ownerAddress,
uint _ownerTokenId,
address _brokenEntityAddress,
uint _brokenEntityTokenId,
uint _brokenAmount
) external;
function handleBrokenTokenBatch(
address _breakerContract,
address _ownerAddress,
uint _ownerTokenId,
address _brokenEntityAddress,
uint[] calldata _brokenEntityTokenIds,
uint[] calldata _brokenAmounts
) external;
function handleBrokenTokenBatch(
address _breakerContract,
address[] calldata _ownerAddresses,
uint[] calldata _ownerTokenIds,
address _brokenEntityAddress,
uint[][] calldata _brokenEntityTokenIds,
uint[][] calldata _brokenAmounts
) external;
}
文件 9 的 15:IDurabilityEnabledAdapter.sol
pragma solidity ^0.8.17;
import "../Manager/ManagerModifier.sol";
import "../AdventurerEquipment/IBrokenEquipmentHandler.sol";
import "./IArmoryEntityStorageAdapter.sol";
interface IDurabilityEnabledAdapter {
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 _ownerAddress,
uint256[] calldata _ownerId,
address _entityAddress,
uint256[][] calldata _entityId
) external view returns (uint[][] memory);
function currentDurabilityPercentage(
address _ownerAddress,
uint256 _ownerId,
address _entityAddress,
uint256 _entityId
) external view returns (uint);
function currentDurabilityBatchPercentage(
address _ownerAddress,
uint256 _ownerId,
address _entityAddress,
uint256[] calldata _entityId
) external view returns (uint[] memory);
function currentDurabilityBatchPercentage(
address[] calldata _ownerAddress,
uint256[] calldata _ownerId,
address _entityAddress,
uint256[][] calldata _entityId
) external view returns (uint[][] memory);
function reduceDurability(
address _reducer,
address _ownerAddress,
uint _ownerTokenId,
address _entityAddress,
uint _entityTokenId,
uint _durabilityLoss,
bool _startNewTokenIfNeeded,
bool _ignoreAvailability
) external returns (uint);
function reduceDurabilityBatch(
address _reducer,
address _ownerAddress,
uint _ownerTokenIds,
address _entityAddress,
uint[] calldata _entityTokenIds,
uint _durabilityLoss,
bool _startNewTokenIfNeeded,
bool _ignoreAvailability
) external returns (bool, uint[] memory);
function reduceDurabilityBatch(
address _reducer,
address _ownerAddress,
uint _ownerTokenIds,
address _entityAddress,
uint[] calldata _entityTokenIds,
uint[] calldata _durabilityLosses,
bool _startNewTokenIfNeeded,
bool _ignoreAvailability
) external returns (bool, uint[] memory);
function reduceDurabilityBatch(
address _reducer,
address[] calldata _ownerAddress,
uint[] calldata _ownerTokenIds,
address _entityAddress,
uint[][] calldata _entityTokenIds,
uint _durabilityLoss,
bool _startNewTokenIfNeeded,
bool _ignoreAvailability
) external returns (bool, uint[][] memory);
function reduceDurabilityBatch(
address _reducer,
address[] calldata _ownerAddress,
uint[] calldata _ownerTokenIds,
address _entityAddress,
uint[][] calldata _entityTokenIds,
uint[][] calldata _durabilityLoss,
bool _startNewTokenIfNeeded,
bool _ignoreAvailability
) external returns (bool, uint[][] memory);
}
文件 10 的 15:IDurabilityEnabledArmory.sol
pragma solidity ^0.8.17;
import { IArmory } from "./IArmory.sol";
interface IDurabilityEnabledArmory is IArmory {
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 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 的 15: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;
}
文件 12 的 15: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");
_;
}
}
文件 13 的 15: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());
}
}
文件 14 的 15:RealmArmory.sol
pragma solidity ^0.8.17;
import "../Armory/DurabilityEnabledArmory.sol";
contract RealmArmory is DurabilityEnabledArmory {
constructor(address _manager) DurabilityEnabledArmory(_manager) {}
}
文件 15 的 15: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;
}
}
{
"compilationTarget": {
"contracts/RealmArmory/RealmArmory.sol": "RealmArmory"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"DurabilityNotSupported","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenType","type":"uint256"},{"indexed":false,"internalType":"address","name":"ownerAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"ownerId","type":"uint256"},{"indexed":false,"internalType":"address","name":"entityAddress","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"entityIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"entityAmounts","type":"uint256[]"}],"name":"Burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenType","type":"uint256"},{"indexed":false,"internalType":"address","name":"ownerAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"ownerId","type":"uint256"},{"indexed":false,"internalType":"address","name":"entityAddress","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"entityIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"entityAmounts","type":"uint256[]"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenType","type":"uint256"},{"indexed":false,"internalType":"address","name":"ownerAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"ownerId","type":"uint256"},{"indexed":false,"internalType":"address","name":"entityAddress","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"entityIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"entityAmounts","type":"uint256[]"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenType","type":"uint256"},{"indexed":false,"internalType":"address","name":"ownerAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"ownerId","type":"uint256"},{"indexed":false,"internalType":"address","name":"entityAddress","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"entityIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"entityAmounts","type":"uint256[]"}],"name":"Unstaked","type":"event"},{"inputs":[],"name":"MANAGER","outputs":[{"internalType":"contract IManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"adapterListIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"adapters","outputs":[{"internalType":"contract IArmoryEntityStorageAdapter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_ownerAddress","type":"address"},{"internalType":"uint256","name":"_ownerId","type":"uint256"},{"internalType":"address","name":"_entityAddress","type":"address"},{"internalType":"uint256","name":"_entityTokenId","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_ownerAddress","type":"address"},{"internalType":"uint256","name":"_ownerId","type":"uint256"},{"internalType":"address","name":"_entityAddress","type":"address"},{"internalType":"uint256[]","name":"_entityTokenIds","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_ownerAddress","type":"address"},{"internalType":"uint256","name":"_ownerTokenId","type":"uint256"},{"internalType":"address","name":"_entityAddress","type":"address"},{"internalType":"uint256","name":"_entityId","type":"uint256"},{"internalType":"uint256","name":"_entityAmount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ownerAddress","type":"address"},{"internalType":"uint256","name":"_ownerTokenId","type":"uint256"},{"internalType":"address","name":"_entityAddress","type":"address"},{"internalType":"uint256[]","name":"_entityIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_entityAmounts","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_ownerAddresses","type":"address[]"},{"internalType":"uint256[]","name":"_ownerTokenIds","type":"uint256[]"},{"internalType":"address","name":"_entityAddress","type":"address"},{"internalType":"uint256[][]","name":"_entityIds","type":"uint256[][]"},{"internalType":"uint256[][]","name":"_entityAmounts","type":"uint256[][]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_ownerAddresses","type":"address[]"},{"internalType":"uint256[]","name":"_ownerTokenIds","type":"uint256[]"},{"internalType":"address[]","name":"_entityAddresses","type":"address[]"},{"internalType":"uint256[][][]","name":"_entityIds","type":"uint256[][][]"},{"internalType":"uint256[][][]","name":"_entityAmounts","type":"uint256[][][]"}],"name":"burnBatchMulti","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ownerAddress","type":"address"},{"internalType":"uint256","name":"_ownerTokenId","type":"uint256"},{"internalType":"address","name":"_entityAddress","type":"address"},{"internalType":"uint256[]","name":"_entityIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_entityAmounts","type":"uint256[]"}],"name":"checkMinimumAmounts","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_ownerAddress","type":"address"},{"internalType":"uint256","name":"_ownerTokenId","type":"uint256"},{"internalType":"address","name":"_entityAddress","type":"address"},{"internalType":"uint256[]","name":"_entityIds","type":"uint256[]"},{"internalType":"uint256","name":"_entityAmount","type":"uint256"}],"name":"checkMinimumAmounts","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_ownerAddresses","type":"address[]"},{"internalType":"uint256[]","name":"_ownerTokenIds","type":"uint256[]"},{"internalType":"address","name":"_entityAddress","type":"address"},{"internalType":"uint256[][]","name":"_entityIds","type":"uint256[][]"},{"internalType":"uint256","name":"_entityAmounts","type":"uint256"}],"name":"checkMinimumAmountsBatch","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_ownerAddresses","type":"address[]"},{"internalType":"uint256[]","name":"_ownerTokenIds","type":"uint256[]"},{"internalType":"address","name":"_entityAddress","type":"address"},{"internalType":"uint256[][]","name":"_entityIds","type":"uint256[][]"},{"internalType":"uint256[][]","name":"_entityAmounts","type":"uint256[][]"}],"name":"checkMinimumAmountsBatch","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_ownerAddress","type":"address"},{"internalType":"uint256","name":"_ownerId","type":"uint256"},{"internalType":"address","name":"_entityAddress","type":"address"},{"internalType":"uint256","name":"_entityId","type":"uint256"}],"name":"currentDurability","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_ownerAddress","type":"address"},{"internalType":"uint256","name":"_ownerId","type":"uint256"},{"internalType":"address","name":"_entityAddress","type":"address"},{"internalType":"uint256[]","name":"_entityIds","type":"uint256[]"}],"name":"currentDurabilityBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_ownerAddresses","type":"address[]"},{"internalType":"uint256[]","name":"_ownerIds","type":"uint256[]"},{"internalType":"address","name":"_entityAddress","type":"address"},{"internalType":"uint256[][]","name":"_entityIds","type":"uint256[][]"}],"name":"currentDurabilityBatch","outputs":[{"internalType":"uint256[][]","name":"","type":"uint256[][]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_ownerAddresses","type":"address[]"},{"internalType":"uint256[]","name":"_ownerIds","type":"uint256[]"},{"internalType":"address[]","name":"_entityAddresses","type":"address[]"},{"internalType":"uint256[][][]","name":"_entityIds","type":"uint256[][][]"}],"name":"currentDurabilityBatchMulti","outputs":[{"internalType":"uint256[][][]","name":"result","type":"uint256[][][]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_ownerAddress","type":"address"},{"internalType":"uint256","name":"_ownerId","type":"uint256"},{"internalType":"address","name":"_entityAddress","type":"address"},{"internalType":"uint256","name":"_entityId","type":"uint256"}],"name":"currentDurabilityPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_ownerAddresses","type":"address[]"},{"internalType":"uint256[]","name":"_ownerIds","type":"uint256[]"},{"internalType":"address","name":"_entityAddress","type":"address"},{"internalType":"uint256[][]","name":"_entityIds","type":"uint256[][]"}],"name":"currentDurabilityPercentageBatch","outputs":[{"internalType":"uint256[][]","name":"","type":"uint256[][]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_ownerAddress","type":"address"},{"internalType":"uint256","name":"_ownerId","type":"uint256"},{"internalType":"address","name":"_entityAddress","type":"address"},{"internalType":"uint256[]","name":"_entityIds","type":"uint256[]"}],"name":"currentDurabilityPercentageBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_ownerAddresses","type":"address[]"},{"internalType":"uint256[]","name":"_ownerIds","type":"uint256[]"},{"internalType":"address[]","name":"_entityAddresses","type":"address[]"},{"internalType":"uint256[][][]","name":"_entityIds","type":"uint256[][][]"}],"name":"currentDurabilityPercentageBatchMulti","outputs":[{"internalType":"uint256[][][]","name":"result","type":"uint256[][][]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"}],"name":"disableEntity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"durabilitySupport","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"address","name":"_adapter","type":"address"}],"name":"enableEntity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enabledEntities","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enabledEntitiesCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"entityList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"entityTypes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"bool","name":"_durabilitySupport","type":"bool"}],"name":"forceChangeDurabilitySupport","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ownerAddress","type":"address"},{"internalType":"uint256","name":"_ownerTokenId","type":"uint256"},{"internalType":"address","name":"_entityAddress","type":"address"},{"internalType":"uint256","name":"_entityId","type":"uint256"},{"internalType":"uint256","name":"_entityAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ownerAddress","type":"address"},{"internalType":"uint256","name":"_ownerTokenId","type":"uint256"},{"internalType":"address","name":"_entityAddress","type":"address"},{"internalType":"uint256[]","name":"_entityIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_entityAmounts","type":"uint256[]"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_ownerAddresses","type":"address[]"},{"internalType":"uint256[]","name":"_ownerTokenIds","type":"uint256[]"},{"internalType":"address","name":"_entityAddress","type":"address"},{"internalType":"uint256[][]","name":"_entityIds","type":"uint256[][]"},{"internalType":"uint256[][]","name":"_entityAmounts","type":"uint256[][]"}],"name":"mintBatch","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":[{"internalType":"address","name":"_ownerAddress","type":"address"},{"internalType":"uint256","name":"_ownerTokenId","type":"uint256"},{"internalType":"address","name":"_entityAddress","type":"address"},{"internalType":"uint256","name":"_entityTokenId","type":"uint256"},{"internalType":"uint256","name":"durabilityLoss","type":"uint256"},{"internalType":"bool","name":"_startNewTokenIfNeeded","type":"bool"},{"internalType":"bool","name":"_ignoreAvailability","type":"bool"}],"name":"reduceDurability","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_ownerAddresses","type":"address[]"},{"internalType":"uint256[]","name":"_ownerTokenIds","type":"uint256[]"},{"internalType":"address","name":"_entityAddress","type":"address"},{"internalType":"uint256[][]","name":"_entityTokenIds","type":"uint256[][]"},{"internalType":"uint256[][]","name":"_durabilityLosses","type":"uint256[][]"},{"internalType":"bool","name":"_startNewTokenIfNeeded","type":"bool"},{"internalType":"bool","name":"_ignoreAvailability","type":"bool"}],"name":"reduceDurabilityBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_ownerAddresses","type":"address[]"},{"internalType":"uint256[]","name":"_ownerTokenIds","type":"uint256[]"},{"internalType":"address","name":"_entityAddress","type":"address"},{"internalType":"uint256[][]","name":"_entityTokenIds","type":"uint256[][]"},{"internalType":"uint256","name":"_durabilityLoss","type":"uint256"},{"internalType":"bool","name":"_startNewTokenIfNeeded","type":"bool"},{"internalType":"bool","name":"_ignoreAvailability","type":"bool"}],"name":"reduceDurabilityBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_ownerAddresses","type":"address[]"},{"internalType":"uint256[]","name":"_ownerTokenIds","type":"uint256[]"},{"internalType":"address[]","name":"_entityAddresses","type":"address[]"},{"internalType":"uint256[][][]","name":"_entityTokenIds","type":"uint256[][][]"},{"internalType":"uint256","name":"_durabilityLoss","type":"uint256"},{"internalType":"bool","name":"_startNewTokenIfNeeded","type":"bool"},{"internalType":"bool","name":"_ignoreAvailability","type":"bool"}],"name":"reduceDurabilityMultiBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_ownerAddresses","type":"address[]"},{"internalType":"uint256[]","name":"_ownerTokenIds","type":"uint256[]"},{"internalType":"address[]","name":"_entityAddresses","type":"address[]"},{"internalType":"uint256[][][]","name":"_entityTokenIds","type":"uint256[][][]"},{"internalType":"uint256[][][]","name":"_durabilityLosses","type":"uint256[][][]"},{"internalType":"bool","name":"_startNewTokenIfNeeded","type":"bool"},{"internalType":"bool","name":"_ignoreAvailability","type":"bool"}],"name":"reduceDurabilityMultiBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"address","name":"_ownerAddress","type":"address"},{"internalType":"uint256","name":"_ownerTokenId","type":"uint256"},{"internalType":"address","name":"_entityAddress","type":"address"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"uint256","name":"_entityId","type":"uint256"},{"internalType":"uint256","name":"_entityAmount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"address[]","name":"_ownerAddresses","type":"address[]"},{"internalType":"uint256[]","name":"_ownerTokenIds","type":"uint256[]"},{"internalType":"bytes32[][]","name":"_proofs","type":"bytes32[][]"},{"internalType":"address","name":"_entityAddress","type":"address"},{"internalType":"uint256[][]","name":"_entityIds","type":"uint256[][]"},{"internalType":"uint256[][]","name":"_entityAmounts","type":"uint256[][]"}],"name":"stakeBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"address","name":"_ownerAddress","type":"address"},{"internalType":"uint256","name":"_ownerTokenId","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"address","name":"_entityAddress","type":"address"},{"internalType":"uint256[]","name":"_entityIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_entityAmounts","type":"uint256[]"}],"name":"stakeBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"address[]","name":"_ownerAddresses","type":"address[]"},{"internalType":"uint256[]","name":"_ownerTokenIds","type":"uint256[]"},{"internalType":"bytes32[][]","name":"_proofs","type":"bytes32[][]"},{"internalType":"address[]","name":"_entityAddresses","type":"address[]"},{"internalType":"uint256[][][]","name":"_entityIds","type":"uint256[][][]"},{"internalType":"uint256[][][]","name":"_entityAmounts","type":"uint256[][][]"}],"internalType":"struct MultiStakeRequest","name":"_request","type":"tuple"}],"name":"stakeBatchMulti","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalEntityCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"address","name":"_ownerAddress","type":"address"},{"internalType":"uint256","name":"_ownerTokenId","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"address","name":"_entityAddress","type":"address"},{"internalType":"uint256","name":"_entityId","type":"uint256"},{"internalType":"uint256","name":"_entityAmount","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"address[]","name":"_ownerAddresses","type":"address[]"},{"internalType":"uint256[]","name":"_ownerTokenIds","type":"uint256[]"},{"internalType":"bytes32[][]","name":"_proofs","type":"bytes32[][]"},{"internalType":"address","name":"_entityAddress","type":"address"},{"internalType":"uint256[][]","name":"_entityIds","type":"uint256[][]"},{"internalType":"uint256[][]","name":"_entityAmounts","type":"uint256[][]"}],"name":"unstakeBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"address","name":"_ownerAddress","type":"address"},{"internalType":"uint256","name":"_ownerTokenId","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"address","name":"_entityAddress","type":"address"},{"internalType":"uint256[]","name":"_entityIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_entityAmounts","type":"uint256[]"}],"name":"unstakeBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"address[]","name":"_ownerAddresses","type":"address[]"},{"internalType":"uint256[]","name":"_ownerTokenIds","type":"uint256[]"},{"internalType":"bytes32[][]","name":"_proofs","type":"bytes32[][]"},{"internalType":"address[]","name":"_entityAddresses","type":"address[]"},{"internalType":"uint256[][][]","name":"_entityIds","type":"uint256[][][]"},{"internalType":"uint256[][][]","name":"_entityAmounts","type":"uint256[][][]"}],"internalType":"struct MultiStakeRequest","name":"_request","type":"tuple"}],"name":"unstakeBatchMulti","outputs":[],"stateMutability":"nonpayable","type":"function"}]