diff --git a/contracts/interfaces/modules/dispute/policies/IArbitrationPolicy.sol b/contracts/interfaces/modules/dispute/policies/IArbitrationPolicy.sol index f8b38dcfc..896270d6e 100644 --- a/contracts/interfaces/modules/dispute/policies/IArbitrationPolicy.sol +++ b/contracts/interfaces/modules/dispute/policies/IArbitrationPolicy.sol @@ -6,8 +6,9 @@ interface IArbitrationPolicy { /// @notice Executes custom logic on raising dispute /// @dev Enforced to be only callable by the DisputeModule /// @param caller Address of the caller + /// @param disputeId The dispute id /// @param data The arbitrary data used to raise the dispute - function onRaiseDispute(address caller, bytes calldata data) external; + function onRaiseDispute(address caller, uint256 disputeId, bytes calldata data) external; /// @notice Executes custom logic on disputing judgement /// @dev Enforced to be only callable by the DisputeModule diff --git a/contracts/interfaces/modules/dispute/policies/UMA/IArbitrationPolicyUMA.sol b/contracts/interfaces/modules/dispute/policies/UMA/IArbitrationPolicyUMA.sol index 04f8f8353..3b9311dcf 100644 --- a/contracts/interfaces/modules/dispute/policies/UMA/IArbitrationPolicyUMA.sol +++ b/contracts/interfaces/modules/dispute/policies/UMA/IArbitrationPolicyUMA.sol @@ -24,20 +24,10 @@ interface IArbitrationPolicyUMA is IArbitrationPolicy, IOOV3Callbacks { /// @notice Emitted when a dispute is raised /// @param disputeId The dispute id /// @param caller The caller address that raised the dispute - /// @param claim The asserted claim /// @param liveness The liveness time /// @param currency The bond currency /// @param bond The bond size - /// @param identifier The UMA specific identifier - event DisputeRaisedUMA( - uint256 disputeId, - address caller, - bytes claim, - uint64 liveness, - address currency, - uint256 bond, - bytes32 identifier - ); + event DisputeRaisedUMA(uint256 disputeId, address caller, uint64 liveness, address currency, uint256 bond); /// @notice Emitted when an assertion is disputed /// @param assertionId The assertion id diff --git a/contracts/lib/BytesConversion.sol b/contracts/lib/BytesConversion.sol new file mode 100644 index 000000000..758dc79a9 --- /dev/null +++ b/contracts/lib/BytesConversion.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.26; + +/// @title Bytes Conversion +/// @notice Library for bytes conversion operations +library BytesConversion { + /// @notice Converts a uint into a base-10, UTF-8 representation stored in a `string` type + function toUtf8BytesUint(uint256 x) internal pure returns (bytes memory) { + if (x == 0) { + return "0"; + } + uint256 j = x; + uint256 len; + while (j != 0) { + len++; + j /= 10; + } + bytes memory bstr = new bytes(len); + uint256 k = len; + while (x != 0) { + k = k - 1; + uint8 temp = (48 + uint8(x - (x / 10) * 10)); + bytes1 b1 = bytes1(temp); + bstr[k] = b1; + x /= 10; + } + return bstr; + } +} diff --git a/contracts/modules/dispute/DisputeModule.sol b/contracts/modules/dispute/DisputeModule.sol index 59e764ca3..18bcd6115 100644 --- a/contracts/modules/dispute/DisputeModule.sol +++ b/contracts/modules/dispute/DisputeModule.sol @@ -213,7 +213,7 @@ contract DisputeModule is parentDisputeId: 0 }); - IArbitrationPolicy(arbitrationPolicy).onRaiseDispute(msg.sender, data); + IArbitrationPolicy(arbitrationPolicy).onRaiseDispute(msg.sender, disputeId, data); emit DisputeRaised( disputeId, diff --git a/contracts/modules/dispute/policies/UMA/ArbitrationPolicyUMA.sol b/contracts/modules/dispute/policies/UMA/ArbitrationPolicyUMA.sol index b892701d8..e0eafe2a1 100644 --- a/contracts/modules/dispute/policies/UMA/ArbitrationPolicyUMA.sol +++ b/contracts/modules/dispute/policies/UMA/ArbitrationPolicyUMA.sol @@ -7,7 +7,6 @@ import { UUPSUpgradeable } from "@openzeppelin/contracts-upgradeable/proxy/utils import { ReentrancyGuardUpgradeable } from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; import { IDisputeModule } from "../../../../interfaces/modules/dispute/IDisputeModule.sol"; -import { IRoyaltyModule } from "../../../../interfaces/modules/royalty/IRoyaltyModule.sol"; import { IArbitrationPolicyUMA } from "../../../../interfaces/modules/dispute/policies/UMA/IArbitrationPolicyUMA.sol"; import { IOOV3 } from "../../../../interfaces/modules/dispute/policies/UMA/IOOV3.sol"; import { ProtocolPausableUpgradeable } from "../../../../pause/ProtocolPausableUpgradeable.sol"; @@ -25,13 +24,12 @@ contract ArbitrationPolicyUMA is { using SafeERC20 for IERC20; - /// @notice Dispute module address - /// @custom:oz-upgrades-unsafe-allow state-variable-immutable - IDisputeModule public immutable DISPUTE_MODULE; + /// @notice Returns the percentage scale - represents 100% + uint32 public constant MAX_PERCENT = 100_000_000; - /// @notice Royalty module address + /// @notice Dispute module address /// @custom:oz-upgrades-unsafe-allow state-variable-immutable - IRoyaltyModule public immutable ROYALTY_MODULE; + address public immutable DISPUTE_MODULE; /// @dev Storage structure for the ArbitrationPolicyUMA /// @param minLiveness The minimum liveness value @@ -42,7 +40,6 @@ contract ArbitrationPolicyUMA is /// @param disputeIdToAssertionId The mapping of dispute id to assertion id /// @param assertionIdToDisputeId The mapping of assertion id to dispute id /// @param counterEvidenceHashes The mapping of assertion id to counter evidence hash - /// @param ipOwnerTimePercents The mapping of dispute id to ip owner time percent of the dispute /// @custom:storage-location erc7201:story-protocol.ArbitrationPolicyUMA struct ArbitrationPolicyUMAStorage { uint64 minLiveness; @@ -53,7 +50,6 @@ contract ArbitrationPolicyUMA is mapping(uint256 disputeId => bytes32 assertionId) disputeIdToAssertionId; mapping(bytes32 assertionId => uint256 disputeId) assertionIdToDisputeId; mapping(bytes32 assertionId => bytes32 counterEvidenceHash) counterEvidenceHashes; - mapping(uint256 disputeId => uint32 ipOwnerTimePercent) ipOwnerTimePercents; } // keccak256(abi.encode(uint256(keccak256("story-protocol.ArbitrationPolicyUMA")) - 1)) & ~bytes32(uint256(0xff)); @@ -62,21 +58,17 @@ contract ArbitrationPolicyUMA is /// @dev Restricts the calls to the dispute module modifier onlyDisputeModule() { - if (msg.sender != address(DISPUTE_MODULE)) revert Errors.ArbitrationPolicyUMA__NotDisputeModule(); + if (msg.sender != DISPUTE_MODULE) revert Errors.ArbitrationPolicyUMA__NotDisputeModule(); _; } /// Constructor /// @param disputeModule The address of the dispute module - /// @param royaltyModule The address of the royalty module /// @custom:oz-upgrades-unsafe-allow constructor - constructor(address disputeModule, address royaltyModule) { + constructor(address disputeModule) { if (disputeModule == address(0)) revert Errors.ArbitrationPolicyUMA__ZeroDisputeModule(); - if (royaltyModule == address(0)) revert Errors.ArbitrationPolicyUMA__ZeroRoyaltyModule(); - - DISPUTE_MODULE = IDisputeModule(disputeModule); - ROYALTY_MODULE = IRoyaltyModule(royaltyModule); + DISPUTE_MODULE = disputeModule; _disableInitializers(); } @@ -109,8 +101,7 @@ contract ArbitrationPolicyUMA is if (minLiveness == 0) revert Errors.ArbitrationPolicyUMA__ZeroMinLiveness(); if (maxLiveness == 0) revert Errors.ArbitrationPolicyUMA__ZeroMaxLiveness(); if (minLiveness > maxLiveness) revert Errors.ArbitrationPolicyUMA__MinLivenessAboveMax(); - if (ipOwnerTimePercent > ROYALTY_MODULE.maxPercent()) - revert Errors.ArbitrationPolicyUMA__IpOwnerTimePercentAboveMax(); + if (ipOwnerTimePercent > MAX_PERCENT) revert Errors.ArbitrationPolicyUMA__IpOwnerTimePercentAboveMax(); ArbitrationPolicyUMAStorage storage $ = _getArbitrationPolicyUMAStorage(); $.minLiveness = minLiveness; @@ -125,8 +116,6 @@ contract ArbitrationPolicyUMA is /// @param maxBond The maximum bond value function setMaxBond(address token, uint256 maxBond) external restricted { ArbitrationPolicyUMAStorage storage $ = _getArbitrationPolicyUMAStorage(); - if (maxBond < $.oov3.getMinimumBond(token)) revert Errors.ArbitrationPolicyUMA__MaxBondBelowMinimumBond(); - $.maxBonds[token] = maxBond; emit MaxBondSet(token, maxBond); @@ -148,8 +137,6 @@ contract ArbitrationPolicyUMA is if (liveness < $.minLiveness) revert Errors.ArbitrationPolicyUMA__LivenessBelowMin(); if (liveness > $.maxLiveness) revert Errors.ArbitrationPolicyUMA__LivenessAboveMax(); if (bond > $.maxBonds[currency]) revert Errors.ArbitrationPolicyUMA__BondAboveMax(); - if (!ROYALTY_MODULE.isWhitelistedRoyaltyToken(currency)) - revert Errors.ArbitrationPolicyUMA__CurrencyNotWhitelisted(); bytes memory claim = abi.encodePacked( bytes("This IP is infringing according to the information from the dispute Id "), @@ -172,7 +159,6 @@ contract ArbitrationPolicyUMA is bytes32(0) // domainId ); - $.ipOwnerTimePercents[disputeId] = $.ipOwnerTimePercent; $.assertionIdToDisputeId[assertionId] = disputeId; $.disputeIdToAssertionId[disputeId] = assertionId; @@ -212,9 +198,9 @@ contract ArbitrationPolicyUMA is uint256 disputeId = $.assertionIdToDisputeId[assertionId]; if (disputeId == 0) revert Errors.ArbitrationPolicyUMA__DisputeNotFound(); - (address targetIpId, , , address arbitrationPolicy, , , , uint256 parentDisputeId) = DISPUTE_MODULE.disputes( - disputeId - ); + (address targetIpId, , , address arbitrationPolicy, , , , uint256 parentDisputeId) = IDisputeModule( + DISPUTE_MODULE + ).disputes(disputeId); if (arbitrationPolicy != address(this)) revert Errors.ArbitrationPolicyUMA__OnlyDisputePolicyUMA(); if (parentDisputeId > 0) revert Errors.ArbitrationPolicyUMA__CannotDisputeAssertionIfTagIsInherited(); @@ -223,8 +209,7 @@ contract ArbitrationPolicyUMA is IOOV3.Assertion memory assertion = $.oov3.getAssertion(assertionId); uint64 liveness = assertion.expirationTime - assertion.assertionTime; uint64 elapsedTime = uint64(block.timestamp) - assertion.assertionTime; - uint32 maxPercent = ROYALTY_MODULE.maxPercent(); - bool inIpOwnerTimeWindow = elapsedTime <= (liveness * $.ipOwnerTimePercents[disputeId]) / maxPercent; + bool inIpOwnerTimeWindow = elapsedTime <= (liveness * $.ipOwnerTimePercent) / MAX_PERCENT; if (inIpOwnerTimeWindow && msg.sender != targetIpId) revert Errors.ArbitrationPolicyUMA__OnlyTargetIpIdCanDisputeWithinTimeWindow( elapsedTime, @@ -256,7 +241,7 @@ contract ArbitrationPolicyUMA is uint256 disputeId = $.assertionIdToDisputeId[assertionId]; - DISPUTE_MODULE.setDisputeJudgement(disputeId, assertedTruthfully, ""); + IDisputeModule(DISPUTE_MODULE).setDisputeJudgement(disputeId, assertedTruthfully, ""); } /// @notice OOV3 callback function for when an assertion is disputed @@ -267,6 +252,11 @@ contract ArbitrationPolicyUMA is if ($.counterEvidenceHashes[assertionId] == bytes32(0)) revert Errors.ArbitrationPolicyUMA__NoCounterEvidence(); } + /// @notice Returns the maximum percentage - represents 100% + function maxPercent() external view returns (uint32) { + return MAX_PERCENT; + } + /// @notice Returns the minimum liveness for UMA disputes function minLiveness() external view returns (uint64) { return _getArbitrationPolicyUMAStorage().minLiveness; @@ -282,12 +272,6 @@ contract ArbitrationPolicyUMA is return _getArbitrationPolicyUMAStorage().ipOwnerTimePercent; } - /// @notice Returns the percentage of liveness time the IP owner has priority to respond to a dispute - /// for a given dispute id - function ipOwnerTimePercents(uint256 disputeId) external view returns (uint32) { - return _getArbitrationPolicyUMAStorage().ipOwnerTimePercents[disputeId]; - } - /// @notice Returns the OOV3 address function oov3() external view returns (address) { return address(_getArbitrationPolicyUMAStorage().oov3); diff --git a/test/foundry/mocks/dispute/MockArbitrationPolicy.sol b/test/foundry/mocks/dispute/MockArbitrationPolicy.sol index eda52cfae..adc1d2957 100644 --- a/test/foundry/mocks/dispute/MockArbitrationPolicy.sol +++ b/test/foundry/mocks/dispute/MockArbitrationPolicy.sol @@ -34,7 +34,7 @@ contract MockArbitrationPolicy is IArbitrationPolicy { treasury = newTreasury; } - function onRaiseDispute(address caller, bytes calldata data) external onlyDisputeModule { + function onRaiseDispute(address caller, uint256 disputeId, bytes calldata data) external onlyDisputeModule { IERC20(PAYMENT_TOKEN).safeTransferFrom(caller, address(this), ARBITRATION_PRICE); } diff --git a/test/foundry/modules/dispute/policies/UMA/ArbitrationPolicyUMA.t.sol b/test/foundry/modules/dispute/policies/UMA/ArbitrationPolicyUMA.t.sol index fe637c1ce..e9767a8b9 100644 --- a/test/foundry/modules/dispute/policies/UMA/ArbitrationPolicyUMA.t.sol +++ b/test/foundry/modules/dispute/policies/UMA/ArbitrationPolicyUMA.t.sol @@ -6,6 +6,7 @@ import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { PausableUpgradeable } from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; import { DisputeModule } from "contracts/modules/dispute/DisputeModule.sol"; +import { RoyaltyModule } from "contracts/modules/royalty/RoyaltyModule.sol"; import { ArbitrationPolicyUMA } from "contracts/modules/dispute/policies/UMA/ArbitrationPolicyUMA.sol"; import { IOOV3 } from "contracts/interfaces/modules/dispute/policies/UMA/IOOV3.sol"; import { Errors } from "contracts/lib/Errors.sol"; @@ -20,20 +21,13 @@ contract ArbitrationPolicyUMATest is BaseTest { event OOV3Set(address oov3); event LivenessSet(uint64 minLiveness, uint64 maxLiveness, uint32 ipOwnerTimePercent); event MaxBondSet(address token, uint256 maxBond); - event DisputeRaisedUMA( - uint256 disputeId, - address caller, - bytes claim, - uint64 liveness, - address currency, - uint256 bond, - bytes32 identifier - ); + event DisputeRaisedUMA(uint256 disputeId, address caller, uint64 liveness, address currency, uint256 bond); event AssertionDisputed(bytes32 assertionId, bytes32 counterEvidenceHash); MockIpAssetRegistry mockIpAssetRegistry; ArbitrationPolicyUMA newArbitrationPolicyUMA; DisputeModule newDisputeModule; + RoyaltyModule newRoyaltyModule; address internal newOOV3; AccessManager newAccessManager; address internal newAdmin; @@ -71,8 +65,23 @@ contract ArbitrationPolicyUMATest is BaseTest { ) ); + // deploy royalty module + address newRoyaltyModuleImpl = address(new RoyaltyModule(address(1), address(1), address(1), address(1))); + newRoyaltyModule = RoyaltyModule( + TestProxyHelper.deployUUPSProxy( + newRoyaltyModuleImpl, + abi.encodeCall( + RoyaltyModule.initialize, + (address(newAccessManager), uint256(8), uint256(1024), uint256(15)) + ) + ) + ); + newRoyaltyModule.whitelistRoyaltyToken(susd, true); + // deploy arbitration policy UMA - address newArbitrationPolicyUMAImpl = address(new ArbitrationPolicyUMA(address(newDisputeModule))); + address newArbitrationPolicyUMAImpl = address( + new ArbitrationPolicyUMA(address(newDisputeModule), address(newRoyaltyModule)) + ); newArbitrationPolicyUMA = ArbitrationPolicyUMA( TestProxyHelper.deployUUPSProxy( newArbitrationPolicyUMAImpl, @@ -100,7 +109,12 @@ contract ArbitrationPolicyUMATest is BaseTest { function test_ArbitrationPolicyUMA_constructor_revert_ZeroDisputeModule() public { vm.expectRevert(Errors.ArbitrationPolicyUMA__ZeroDisputeModule.selector); - new ArbitrationPolicyUMA(address(0)); + new ArbitrationPolicyUMA(address(0), address(1)); + } + + function test_ArbitrationPolicyUMA_constructor_revert_ZeroRoyaltyModule() public { + vm.expectRevert(Errors.ArbitrationPolicyUMA__ZeroRoyaltyModule.selector); + new ArbitrationPolicyUMA(address(1), address(0)); } function test_ArbitrationPolicyUMA_setOOV3_revert_ZeroOOV3() public { @@ -152,39 +166,33 @@ contract ArbitrationPolicyUMATest is BaseTest { function test_ArbitrationPolicyUMA_onRaiseDispute_revert_paused() public { newArbitrationPolicyUMA.pause(); - bytes memory claim = "test claim"; uint64 liveness = 1; IERC20 currency = IERC20(susd); uint256 bond = 0; - bytes32 identifier = bytes32("ASSERT_TRUTH"); - bytes memory data = abi.encode(claim, liveness, currency, bond, identifier); + bytes memory data = abi.encode(liveness, currency, bond); vm.expectRevert(abi.encodeWithSelector(PausableUpgradeable.EnforcedPause.selector)); newDisputeModule.raiseDispute(address(1), disputeEvidenceHashExample, "IMPROPER_REGISTRATION", data); } function test_ArbitrationPolicyUMA_onRaiseDispute_revert_LivenessBelowMin() public { - bytes memory claim = "test claim"; uint64 liveness = 1; IERC20 currency = IERC20(susd); uint256 bond = 0; - bytes32 identifier = bytes32("ASSERT_TRUTH"); - bytes memory data = abi.encode(claim, liveness, currency, bond, identifier); + bytes memory data = abi.encode(liveness, currency, bond); vm.expectRevert(Errors.ArbitrationPolicyUMA__LivenessBelowMin.selector); newDisputeModule.raiseDispute(address(1), disputeEvidenceHashExample, "IMPROPER_REGISTRATION", data); } function test_ArbitrationPolicyUMA_onRaiseDispute_revert_LivenessAboveMax() public { - bytes memory claim = "test claim"; uint64 liveness = 365 days + 1; IERC20 currency = IERC20(susd); uint256 bond = 0; - bytes32 identifier = bytes32("ASSERT_TRUTH"); - bytes memory data = abi.encode(claim, liveness, currency, bond, identifier); + bytes memory data = abi.encode(liveness, currency, bond); vm.expectRevert(Errors.ArbitrationPolicyUMA__LivenessAboveMax.selector); newDisputeModule.raiseDispute(address(1), disputeEvidenceHashExample, "IMPROPER_REGISTRATION", data); @@ -201,59 +209,54 @@ contract ArbitrationPolicyUMATest is BaseTest { function test_ArbitrationPolicyUMA_onRaiseDispute_revert_NotDisputeModule() public { vm.expectRevert(Errors.ArbitrationPolicyUMA__NotDisputeModule.selector); - newArbitrationPolicyUMA.onRaiseDispute(address(1), bytes("")); + newArbitrationPolicyUMA.onRaiseDispute(address(1), 1, bytes("")); } function test_ArbitrationPolicyUMA_onRaiseDispute_revert_BondAboveMax() public { - bytes memory claim = "test claim"; uint64 liveness = 3600 * 24 * 30; IERC20 currency = IERC20(susd); uint256 bond = 25000e18 + 1; - bytes32 identifier = bytes32("ASSERT_TRUTH"); - bytes memory data = abi.encode(claim, liveness, currency, bond, identifier); + bytes memory data = abi.encode(liveness, currency, bond); vm.expectRevert(Errors.ArbitrationPolicyUMA__BondAboveMax.selector); newDisputeModule.raiseDispute(address(1), disputeEvidenceHashExample, "IMPROPER_REGISTRATION", data); } - function test_ArbitrationPolicyUMA_onRaiseDispute_revert_UnsupportedCurrency() public { - bytes memory claim = "test claim"; + function test_ArbitrationPolicyUMA_onRaiseDispute_revert_CurrencyNotWhitelisted() public { uint64 liveness = 3600 * 24 * 30; IERC20 currency = IERC20(address(new MockERC20())); uint256 bond = 0; - bytes32 identifier = bytes32("ASSERT_TRUTH"); - bytes memory data = abi.encode(claim, liveness, currency, bond, identifier); + bytes memory data = abi.encode(liveness, currency, bond); + + newRoyaltyModule.whitelistRoyaltyToken(address(currency), false); - vm.expectRevert("Unsupported currency"); + vm.expectRevert(Errors.ArbitrationPolicyUMA__CurrencyNotWhitelisted.selector); newDisputeModule.raiseDispute(address(1), disputeEvidenceHashExample, "IMPROPER_REGISTRATION", data); } - function test_ArbitrationPolicyUMA_onRaiseDispute_revert_UnsupportedIdentifier() public { - bytes memory claim = "test claim"; + function test_ArbitrationPolicyUMA_onRaiseDispute_revert_UnsupportedCurrency() public { uint64 liveness = 3600 * 24 * 30; - IERC20 currency = IERC20(susd); + IERC20 currency = IERC20(address(new MockERC20())); uint256 bond = 0; - bytes32 identifier = bytes32("RANDOM_IDENTIFIER"); - bytes memory data = abi.encode(claim, liveness, currency, bond, identifier); + bytes memory data = abi.encode(liveness, currency, bond); + + newRoyaltyModule.whitelistRoyaltyToken(address(currency), true); - vm.expectRevert("Unsupported identifier"); + vm.expectRevert("Unsupported currency"); newDisputeModule.raiseDispute(address(1), disputeEvidenceHashExample, "IMPROPER_REGISTRATION", data); } function test_ArbitrationPolicyUMA_onRaiseDispute() public { - bytes memory claim = "test claim"; uint64 liveness = 3600 * 24 * 30; IERC20 currency = IERC20(susd); uint256 bond = 0; - bytes32 identifier = bytes32("ASSERT_TRUTH"); - - bytes memory data = abi.encode(claim, liveness, currency, bond, identifier); + bytes memory data = abi.encode(liveness, currency, bond); vm.expectEmit(true, true, true, true); - emit DisputeRaisedUMA(1, address(2), claim, liveness, address(currency), bond, identifier); + emit DisputeRaisedUMA(1, address(2), liveness, address(currency), bond); vm.startPrank(address(2)); newDisputeModule.raiseDispute(address(1), disputeEvidenceHashExample, "IMPROPER_REGISTRATION", data); @@ -266,13 +269,11 @@ contract ArbitrationPolicyUMATest is BaseTest { } function test_ArbitrationPolicyUMA_onRaiseDispute_WithBond() public { - bytes memory claim = "test claim"; uint64 liveness = 3600 * 24 * 30; IERC20 currency = IERC20(susd); uint256 bond = 1000; - bytes32 identifier = bytes32("ASSERT_TRUTH"); - bytes memory data = abi.encode(claim, liveness, currency, bond, identifier); + bytes memory data = abi.encode(liveness, currency, bond); /* vm.expectEmit(true, true, true, true); emit DisputeRaisedUMA(1, address(2), claim, liveness, address(currency), bond, identifier); */ @@ -300,13 +301,11 @@ contract ArbitrationPolicyUMATest is BaseTest { } function test_ArbitrationPolicyUMA_onDisputeCancel_revert_CannotCancel() public { - bytes memory claim = "test claim"; uint64 liveness = 3600 * 24 * 30; IERC20 currency = IERC20(susd); uint256 bond = 0; - bytes32 identifier = bytes32("ASSERT_TRUTH"); - bytes memory data = abi.encode(claim, liveness, currency, bond, identifier); + bytes memory data = abi.encode(liveness, currency, bond); newDisputeModule.raiseDispute(address(1), disputeEvidenceHashExample, "IMPROPER_REGISTRATION", data); @@ -315,13 +314,11 @@ contract ArbitrationPolicyUMATest is BaseTest { } function test_ArbitrationPolicyUMA_onDisputeJudgement_revert_AssertionNotExpired() public { - bytes memory claim = "test claim"; uint64 liveness = 3600 * 24 * 30; IERC20 currency = IERC20(susd); uint256 bond = 0; - bytes32 identifier = bytes32("ASSERT_TRUTH"); - bytes memory data = abi.encode(claim, liveness, currency, bond, identifier); + bytes memory data = abi.encode(liveness, currency, bond); uint256 disputeId = newDisputeModule.raiseDispute( address(1), @@ -338,13 +335,11 @@ contract ArbitrationPolicyUMATest is BaseTest { } function test_ArbitrationPolicyUMA_onDisputeJudgement_AssertionWithoutDispute() public { - bytes memory claim = "test claim"; uint64 liveness = 3600 * 24 * 30; IERC20 currency = IERC20(susd); uint256 bond = 0; - bytes32 identifier = bytes32("ASSERT_TRUTH"); - bytes memory data = abi.encode(claim, liveness, currency, bond, identifier); + bytes memory data = abi.encode(liveness, currency, bond); uint256 disputeId = newDisputeModule.raiseDispute( address(1), @@ -369,13 +364,11 @@ contract ArbitrationPolicyUMATest is BaseTest { } function test_ArbitrationPolicyUMA_onDisputeJudgement_AssertionWithoutDisputeWithBond() public { - bytes memory claim = "test claim"; uint64 liveness = 3600 * 24 * 30; IERC20 currency = IERC20(susd); uint256 bond = 1000; - bytes32 identifier = bytes32("ASSERT_TRUTH"); - bytes memory data = abi.encode(claim, liveness, currency, bond, identifier); + bytes memory data = abi.encode(liveness, currency, bond); address disputer = address(2); @@ -410,13 +403,11 @@ contract ArbitrationPolicyUMATest is BaseTest { } function test_ArbitrationPolicyUMA_onDisputeJudgement_AssertionWithDispute() public { - bytes memory claim = "test claim"; uint64 liveness = 3600 * 24 * 30; IERC20 currency = IERC20(susd); uint256 bond = 0; - bytes32 identifier = bytes32("ASSERT_TRUTH"); - bytes memory data = abi.encode(claim, liveness, currency, bond, identifier); + bytes memory data = abi.encode(liveness, currency, bond); address targetIpId = address(1); @@ -440,8 +431,8 @@ contract ArbitrationPolicyUMATest is BaseTest { IOOV3.Assertion memory assertion = oov3.getAssertion(assertionId); uint64 assertionTimestamp = assertion.assertionTime; bytes memory ancillaryData = AuxiliaryOOV3Interface(newOOV3).stampAssertion(assertionId); - IMockAncillary(mockAncillary).requestPrice(identifier, assertionTimestamp, ancillaryData); - IMockAncillary(mockAncillary).pushPrice(identifier, assertionTimestamp, ancillaryData, 1e18); + IMockAncillary(mockAncillary).requestPrice(bytes32("ASSERT_TRUTH"), assertionTimestamp, ancillaryData); + IMockAncillary(mockAncillary).pushPrice(bytes32("ASSERT_TRUTH"), assertionTimestamp, ancillaryData, 1e18); oov3.settleAssertion(assertionId); (, , , , , , bytes32 currentTagAfter, ) = newDisputeModule.disputes(disputeId); @@ -451,12 +442,10 @@ contract ArbitrationPolicyUMATest is BaseTest { } function test_ArbitrationPolicyUMA_disputeAssertion_revert_paused() public { - bytes memory claim = "test claim"; uint64 liveness = 3600 * 24 * 30; IERC20 currency = IERC20(susd); uint256 bond = 0; - bytes32 identifier = bytes32("ASSERT_TRUTH"); - bytes memory data = abi.encode(claim, liveness, currency, bond, identifier); + bytes memory data = abi.encode(liveness, currency, bond); address targetIpId = address(1); uint256 disputeId = newDisputeModule.raiseDispute( @@ -478,12 +467,10 @@ contract ArbitrationPolicyUMATest is BaseTest { } function test_ArbitrationPolicyUMA_disputeAssertion_revert_CannotDisputeAssertionTwice() public { - bytes memory claim = "test claim"; uint64 liveness = 3600 * 24 * 30; IERC20 currency = IERC20(susd); uint256 bond = 0; - bytes32 identifier = bytes32("ASSERT_TRUTH"); - bytes memory data = abi.encode(claim, liveness, currency, bond, identifier); + bytes memory data = abi.encode(liveness, currency, bond); address targetIpId = address(1); uint256 disputeId = newDisputeModule.raiseDispute( @@ -504,12 +491,10 @@ contract ArbitrationPolicyUMATest is BaseTest { } function test_ArbitrationPolicyUMA_disputeAssertion_revert_NoCounterEvidence() public { - bytes memory claim = "test claim"; uint64 liveness = 3600 * 24 * 30; IERC20 currency = IERC20(susd); uint256 bond = 0; - bytes32 identifier = bytes32("ASSERT_TRUTH"); - bytes memory data = abi.encode(claim, liveness, currency, bond, identifier); + bytes memory data = abi.encode(liveness, currency, bond); address targetIpId = address(1); uint256 disputeId = newDisputeModule.raiseDispute( @@ -528,12 +513,10 @@ contract ArbitrationPolicyUMATest is BaseTest { } function test_ArbitrationPolicyUMA_disputeAssertion_revert_DisputeNotFound() public { - bytes memory claim = "test claim"; uint64 liveness = 3600 * 24 * 30; IERC20 currency = IERC20(susd); uint256 bond = 0; - bytes32 identifier = bytes32("ASSERT_TRUTH"); - bytes memory data = abi.encode(claim, liveness, currency, bond, identifier); + bytes memory data = abi.encode(liveness, currency, bond); address targetIpId = address(1); uint256 disputeId = newDisputeModule.raiseDispute( @@ -548,12 +531,10 @@ contract ArbitrationPolicyUMATest is BaseTest { } function test_ArbitrationPolicyUMA_disputeAssertion_revert_OnlyTargetIpIdCanDispute() public { - bytes memory claim = "test claim"; uint64 liveness = 3600 * 24 * 30; IERC20 currency = IERC20(susd); uint256 bond = 0; - bytes32 identifier = bytes32("ASSERT_TRUTH"); - bytes memory data = abi.encode(claim, liveness, currency, bond, identifier); + bytes memory data = abi.encode(liveness, currency, bond); address targetIpId = address(1); uint256 disputeId = newDisputeModule.raiseDispute( @@ -578,12 +559,10 @@ contract ArbitrationPolicyUMATest is BaseTest { } function test_ArbitrationPolicyUMA_disputeAssertion_IPA() public { - bytes memory claim = "test claim"; uint64 liveness = 3600 * 24 * 30; IERC20 currency = IERC20(susd); uint256 bond = 0; - bytes32 identifier = bytes32("ASSERT_TRUTH"); - bytes memory data = abi.encode(claim, liveness, currency, bond, identifier); + bytes memory data = abi.encode(liveness, currency, bond); address targetIpId = address(1); uint256 disputeId = newDisputeModule.raiseDispute( @@ -610,8 +589,8 @@ contract ArbitrationPolicyUMATest is BaseTest { IOOV3.Assertion memory assertion = oov3.getAssertion(assertionId); uint64 assertionTimestamp = assertion.assertionTime; bytes memory ancillaryData = AuxiliaryOOV3Interface(newOOV3).stampAssertion(assertionId); - IMockAncillary(mockAncillary).requestPrice(identifier, assertionTimestamp, ancillaryData); - IMockAncillary(mockAncillary).pushPrice(identifier, assertionTimestamp, ancillaryData, 0); + IMockAncillary(mockAncillary).requestPrice(bytes32("ASSERT_TRUTH"), assertionTimestamp, ancillaryData); + IMockAncillary(mockAncillary).pushPrice(bytes32("ASSERT_TRUTH"), assertionTimestamp, ancillaryData, 0); oov3.settleAssertion(assertionId); (, , , , , , bytes32 currentTagAfter, ) = newDisputeModule.disputes(disputeId); @@ -621,12 +600,10 @@ contract ArbitrationPolicyUMATest is BaseTest { } function test_ArbitrationPolicyUMA_disputeAssertion_NotIPA() public { - bytes memory claim = "test claim"; uint64 liveness = 3600 * 24 * 30; IERC20 currency = IERC20(susd); uint256 bond = 0; - bytes32 identifier = bytes32("ASSERT_TRUTH"); - bytes memory data = abi.encode(claim, liveness, currency, bond, identifier); + bytes memory data = abi.encode(liveness, currency, bond); address targetIpId = address(1); uint256 disputeId = newDisputeModule.raiseDispute( @@ -655,8 +632,8 @@ contract ArbitrationPolicyUMATest is BaseTest { IOOV3.Assertion memory assertion = oov3.getAssertion(assertionId); uint64 assertionTimestamp = assertion.assertionTime; bytes memory ancillaryData = AuxiliaryOOV3Interface(newOOV3).stampAssertion(assertionId); - IMockAncillary(mockAncillary).requestPrice(identifier, assertionTimestamp, ancillaryData); - IMockAncillary(mockAncillary).pushPrice(identifier, assertionTimestamp, ancillaryData, 0); + IMockAncillary(mockAncillary).requestPrice(bytes32("ASSERT_TRUTH"), assertionTimestamp, ancillaryData); + IMockAncillary(mockAncillary).pushPrice(bytes32("ASSERT_TRUTH"), assertionTimestamp, ancillaryData, 0); oov3.settleAssertion(assertionId); (, , , , , , bytes32 currentTagAfter, ) = newDisputeModule.disputes(disputeId); @@ -666,12 +643,10 @@ contract ArbitrationPolicyUMATest is BaseTest { } function test_ArbitrationPolicyUMA_disputeAssertion_WithBondAndIpTagged() public { - bytes memory claim = "test claim"; uint64 liveness = 3600 * 24 * 30; IERC20 currency = IERC20(susd); uint256 bond = 1000; - bytes32 identifier = bytes32("ASSERT_TRUTH"); - bytes memory data = abi.encode(claim, liveness, currency, bond, identifier); + bytes memory data = abi.encode(liveness, currency, bond); //address defenderIpIdOwner = address(1); //address disputeInitiator = address(2); @@ -705,8 +680,8 @@ contract ArbitrationPolicyUMATest is BaseTest { IOOV3.Assertion memory assertion = oov3.getAssertion(assertionId); uint64 assertionTimestamp = assertion.assertionTime; bytes memory ancillaryData = AuxiliaryOOV3Interface(newOOV3).stampAssertion(assertionId); - IMockAncillary(mockAncillary).requestPrice(identifier, assertionTimestamp, ancillaryData); - IMockAncillary(mockAncillary).pushPrice(identifier, assertionTimestamp, ancillaryData, 1e18); + IMockAncillary(mockAncillary).requestPrice(bytes32("ASSERT_TRUTH"), assertionTimestamp, ancillaryData); + IMockAncillary(mockAncillary).pushPrice(bytes32("ASSERT_TRUTH"), assertionTimestamp, ancillaryData, 1e18); (, , , , , , bytes32 currentTagBefore, ) = newDisputeModule.disputes(disputeId); @@ -730,12 +705,10 @@ contract ArbitrationPolicyUMATest is BaseTest { } function test_ArbitrationPolicyUMA_disputeAssertion_WithBondAndIpNotTagged() public { - bytes memory claim = "test claim"; uint64 liveness = 3600 * 24 * 30; IERC20 currency = IERC20(susd); uint256 bond = 1000; - bytes32 identifier = bytes32("ASSERT_TRUTH"); - bytes memory data = abi.encode(claim, liveness, currency, bond, identifier); + bytes memory data = abi.encode(liveness, currency, bond); //address defenderIpIdOwner = address(1); //address disputeInitiator = address(2); @@ -769,8 +742,8 @@ contract ArbitrationPolicyUMATest is BaseTest { IOOV3.Assertion memory assertion = oov3.getAssertion(assertionId); uint64 assertionTimestamp = assertion.assertionTime; bytes memory ancillaryData = AuxiliaryOOV3Interface(newOOV3).stampAssertion(assertionId); - IMockAncillary(mockAncillary).requestPrice(identifier, assertionTimestamp, ancillaryData); - IMockAncillary(mockAncillary).pushPrice(identifier, assertionTimestamp, ancillaryData, 0); + IMockAncillary(mockAncillary).requestPrice(bytes32("ASSERT_TRUTH"), assertionTimestamp, ancillaryData); + IMockAncillary(mockAncillary).pushPrice(bytes32("ASSERT_TRUTH"), assertionTimestamp, ancillaryData, 0); (, , , , , , bytes32 currentTagBefore, ) = newDisputeModule.disputes(disputeId); @@ -793,41 +766,6 @@ contract ArbitrationPolicyUMATest is BaseTest { assertEq(defenderIpIdOwnerBalAfter - defenderIpIdOwnerBalBefore, bondRecipientAmount); } - function test_ArbitrationPolicyUMA_disputeAssertion_WithIpOwnerTimePercentChange() public { - // liveness set to 30 days - uint64 liveness = 3600 * 24 * 30; - IERC20 currency = IERC20(susd); - uint256 bond = 0; - - bytes memory data = abi.encode(liveness, currency, bond); - - address targetIpId = address(1); - - uint256 disputeId = newDisputeModule.raiseDispute( - targetIpId, - disputeEvidenceHashExample, - "IMPROPER_REGISTRATION", - data - ); - // warp - vm.warp(block.timestamp + 4 days); - // set the IpOwnerTimePercent to 0% - newArbitrationPolicyUMA.setLiveness(10, 100, 0); - - bytes32 assertionId = newArbitrationPolicyUMA.disputeIdToAssertionId(disputeId); - bytes32 counterEvidenceHash = bytes32("COUNTER_EVIDENCE_HASH"); - vm.startPrank(address(2)); - vm.expectRevert( - abi.encodeWithSelector( - Errors.ArbitrationPolicyUMA__OnlyTargetIpIdCanDisputeWithinTimeWindow.selector, - 4 days, - liveness, - address(2) - ) - ); - newArbitrationPolicyUMA.disputeAssertion(assertionId, counterEvidenceHash); - } - function test_ArbitrationPolicyUMA_assertionResolvedCallback_revert_paused() public { newArbitrationPolicyUMA.pause();