diff --git a/src/main/java/com/iexec/commons/poco/chain/IexecHubAbstractService.java b/src/main/java/com/iexec/commons/poco/chain/IexecHubAbstractService.java index 36180f9..3d8f731 100644 --- a/src/main/java/com/iexec/commons/poco/chain/IexecHubAbstractService.java +++ b/src/main/java/com/iexec/commons/poco/chain/IexecHubAbstractService.java @@ -577,6 +577,19 @@ public String getOwner(final String address) { return ""; } + /** + * Read on-chain the consumption level of an order from its EIP-712 hash + * + * @param typedHash The order EIP-712 hash whose consumption level is queried + * @return The consumed value which is less or equal to the order volume. It will be {@literal BigInteger.ZERO} if the + * hash is not present on-chain and has never been matched in a deal. + * @throws IOException on communication error with the blockchain network + */ + public BigInteger viewConsumed(final String typedHash) throws IOException { + return Numeric.toBigInt( + txManager.sendCall(iexecHubAddress, VIEW_CONSUMED_SELECTOR + Numeric.cleanHexPrefix(typedHash), DefaultBlockParameterName.LATEST)); + } + // endregion // region Purge diff --git a/src/main/java/com/iexec/commons/poco/encoding/AccessorsEncoder.java b/src/main/java/com/iexec/commons/poco/encoding/AccessorsEncoder.java index 381b5b3..9b688f5 100644 --- a/src/main/java/com/iexec/commons/poco/encoding/AccessorsEncoder.java +++ b/src/main/java/com/iexec/commons/poco/encoding/AccessorsEncoder.java @@ -50,6 +50,8 @@ public class AccessorsEncoder { */ public static final String OWNER_SELECTOR = "0x8da5cb5b"; + public static final String VIEW_CONSUMED_SELECTOR = "0x4b2bec8c"; + // app public static final String M_APPCHECKSUM_SELECTOR = "0x84aaf12e"; public static final String M_APPMRENCLAVE_SELECTOR = "0xe30d26a8"; diff --git a/src/test/java/com/iexec/commons/poco/itest/IexecHubTestService.java b/src/test/java/com/iexec/commons/poco/itest/IexecHubTestService.java index 98b739c..99889a4 100644 --- a/src/test/java/com/iexec/commons/poco/itest/IexecHubTestService.java +++ b/src/test/java/com/iexec/commons/poco/itest/IexecHubTestService.java @@ -40,6 +40,7 @@ public class IexecHubTestService extends IexecHubAbstractService { static final BigInteger GAS_PRICE = BigInteger.valueOf(22_000_000_000L); static final BigInteger GAS_LIMIT = BigInteger.valueOf(1_000_000L); + static final long CHAIN_ID = 65535L; static final String IEXEC_HUB_ADDRESS = "0xc4b11f41746D3Ad8504da5B383E1aB9aa969AbC7"; static final String ASSET_MULTI_ADDRESS = "multiAddress"; diff --git a/src/test/java/com/iexec/commons/poco/itest/MatchOrdersTests.java b/src/test/java/com/iexec/commons/poco/itest/MatchOrdersTests.java index 7eaa4be..7d5ba94 100644 --- a/src/test/java/com/iexec/commons/poco/itest/MatchOrdersTests.java +++ b/src/test/java/com/iexec/commons/poco/itest/MatchOrdersTests.java @@ -150,7 +150,16 @@ void shouldMatchOrdersWithSignerService() throws IOException { assertThat(iexecHubService.fetchLogTopics(matchOrdersTxHash)) .isEqualTo(List.of("Transfer", "Lock", "Transfer", "Lock", "SchedulerNotice", "OrdersMatched")); + // orders consumption + assertThat(iexecHubService.viewConsumed(signedAppOrder.computeHash(ordersService.getDomain()))).isEqualTo(BigInteger.ONE); + assertThat(iexecHubService.viewConsumed(signedDatasetOrder.computeHash(ordersService.getDomain()))).isEqualTo(BigInteger.ONE); + assertThat(iexecHubService.viewConsumed(signedWorkerpoolOrder.computeHash(ordersService.getDomain()))).isEqualTo(BigInteger.ONE); + assertThat(iexecHubService.viewConsumed(signedRequestOrder.computeHash(ordersService.getDomain()))).isEqualTo(BigInteger.ONE); + // estimate gas revert + // 0x694578656356352d6d617463684f72646572732d30783630 is hex string corresponding to the 'iExecV5-matchOrders-0x60' string + // The estimateGas calls tells us that not enough volumes are available across the 4 orders + // https://github.com/iExecBlockchainComputing/PoCo/blob/v6.0.0/contracts/facets/IexecPoco1Facet.sol#L311 assertThatThrownBy(() -> signerService.estimateGas(IEXEC_HUB_ADDRESS, matchOrdersTxData)) .isInstanceOf(JsonRpcError.class) .hasMessage("Reverted 0x694578656356352d6d617463684f72646572732d30783630"); diff --git a/src/test/java/com/iexec/commons/poco/itest/OrdersService.java b/src/test/java/com/iexec/commons/poco/itest/OrdersService.java index bdeeffa..753aa8f 100644 --- a/src/test/java/com/iexec/commons/poco/itest/OrdersService.java +++ b/src/test/java/com/iexec/commons/poco/itest/OrdersService.java @@ -22,6 +22,7 @@ import com.iexec.commons.poco.encoding.MatchOrdersDataEncoder; import com.iexec.commons.poco.order.*; import com.iexec.commons.poco.utils.BytesUtils; +import lombok.Getter; import org.apache.commons.lang3.RandomStringUtils; import org.web3j.crypto.Hash; @@ -30,8 +31,7 @@ import java.util.Map; import java.util.TreeMap; -import static com.iexec.commons.poco.itest.IexecHubTestService.GAS_PRICE; -import static com.iexec.commons.poco.itest.IexecHubTestService.IEXEC_HUB_ADDRESS; +import static com.iexec.commons.poco.itest.IexecHubTestService.*; public class OrdersService { @@ -39,8 +39,8 @@ public class OrdersService { static final String DATASET_NAME = "my-dataset"; static final String WORKERPOOL_NAME = "my-workerpool"; - private static final long CHAIN_ID = 65535L; + @Getter private final EIP712Domain domain; private final SignerService signerService;