Skip to content

Commit f5f22c0

Browse files
arr000xalexbeljames-toussaint
committed
Upgrade to use fhevm contracts v0.9.0 (#248)
* chore: fhevm-v9 * chore: port all tests for fhevm v9 * Merge pull request #1 from OpenZeppelin/chore/update-disclose-flow update disclose flow * Update wrapper contract (#2) * Update wrapper contract * fix tests * fix mock * update docs * add changeset * request id unnecessary * Update contracts/token/ERC7984/extensions/ERC7984ERC20Wrapper.sol Co-authored-by: James Toussaint <33313130+james-toussaint@users.noreply.github.com> * remove unused params * Update test/token/ERC7984/ERC7984.test.ts Co-authored-by: James Toussaint <33313130+james-toussaint@users.noreply.github.com> * `cts` -> `handles` * `cleartext` -> `cleartextAmount` * Update test/token/ERC7984/extensions/ERC7984Wrapper.test.ts Co-authored-by: James Toussaint <33313130+james-toussaint@users.noreply.github.com> * nit --------- Co-authored-by: 0xalexbel <alexandre.belhoste@zama.ai> Co-authored-by: James Toussaint <33313130+james-toussaint@users.noreply.github.com>
1 parent cda1ca7 commit f5f22c0

21 files changed

+258
-192
lines changed

.changeset/puny-nails-bathe.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'openzeppelin-confidential-contracts': minor
3+
---
4+
5+
Migrate FHEVM contracts from v0.8 to v0.9
Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
// SPDX-License-Identifier: MIT
2-
pragma solidity ^0.8.24;
2+
pragma solidity ^0.8.27;
33

44
import {FHE, externalEuint64, euint64} from "@fhevm/solidity/lib/FHE.sol";
55
import {IERC20} from "@openzeppelin/contracts/interfaces/IERC20.sol";
66
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
77
import {IERC7984} from "../../interfaces/IERC7984.sol";
88

9-
contract SwapConfidentialToERC20 {
10-
error SwapConfidentialToERC20InvalidGatewayRequest(uint256 requestId);
9+
contract SwapERC7984ToERC20 {
10+
error SwapERC7984ToERC20InvalidFinalization(euint64 amount);
1111

12-
mapping(uint256 requestId => address) private _receivers;
12+
mapping(euint64 amount => address) private _receivers;
1313
IERC7984 private _fromToken;
1414
IERC20 private _toToken;
1515

@@ -23,23 +23,21 @@ contract SwapConfidentialToERC20 {
2323
FHE.allowTransient(amount, address(_fromToken));
2424
euint64 amountTransferred = _fromToken.confidentialTransferFrom(msg.sender, address(this), amount);
2525

26-
bytes32[] memory cts = new bytes32[](1);
27-
cts[0] = euint64.unwrap(amountTransferred);
28-
uint256 requestID = FHE.requestDecryption(cts, this.finalizeSwap.selector);
29-
30-
// register who is getting the tokens
31-
_receivers[requestID] = msg.sender;
26+
FHE.makePubliclyDecryptable(amountTransferred);
27+
_receivers[amountTransferred] = msg.sender;
3228
}
3329

34-
function finalizeSwap(uint256 requestID, bytes calldata cleartexts, bytes calldata decryptionProof) public virtual {
35-
FHE.checkSignatures(requestID, cleartexts, decryptionProof);
36-
uint64 amount = abi.decode(cleartexts, (uint64));
37-
address to = _receivers[requestID];
38-
require(to != address(0), SwapConfidentialToERC20InvalidGatewayRequest(requestID));
39-
delete _receivers[requestID];
30+
function finalizeSwap(euint64 amount, uint64 cleartextAmount, bytes calldata decryptionProof) public virtual {
31+
bytes32[] memory handles = new bytes32[](1);
32+
handles[0] = euint64.unwrap(amount);
33+
34+
FHE.verifySignatures(handles, abi.encode(cleartextAmount), decryptionProof);
35+
address to = _receivers[amount];
36+
require(to != address(0), SwapERC7984ToERC20InvalidFinalization(amount));
37+
delete _receivers[amount];
4038

41-
if (amount != 0) {
42-
SafeERC20.safeTransfer(_toToken, to, amount);
39+
if (cleartextAmount != 0) {
40+
SafeERC20.safeTransfer(_toToken, to, cleartextAmount);
4341
}
4442
}
4543
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// SPDX-License-Identifier: MIT
22
pragma solidity ^0.8.24;
33

4-
import {SepoliaConfig} from "@fhevm/solidity/config/ZamaConfig.sol";
4+
import {EthereumConfig} from "@fhevm/solidity/config/ZamaConfig.sol";
55
import {VestingWalletCliffConfidential} from "../../finance/VestingWalletCliffConfidential.sol";
66

7-
abstract contract VestingWalletCliffConfidentialMock is VestingWalletCliffConfidential, SepoliaConfig {}
7+
abstract contract VestingWalletCliffConfidentialMock is VestingWalletCliffConfidential, EthereumConfig {}

contracts/mocks/finance/VestingWalletConfidentialFactoryMock.sol

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
// SPDX-License-Identifier: MIT
22
pragma solidity ^0.8.24;
33

4-
import {SepoliaConfig, ZamaConfig} from "@fhevm/solidity/config/ZamaConfig.sol";
4+
import {EthereumConfig, ZamaConfig} from "@fhevm/solidity/config/ZamaConfig.sol";
55
import {FHE} from "@fhevm/solidity/lib/FHE.sol";
66
import {ERC7821WithExecutor} from "./../../finance/ERC7821WithExecutor.sol";
77
import {VestingWalletCliffConfidential} from "./../../finance/VestingWalletCliffConfidential.sol";
88
import {VestingWalletConfidentialFactory} from "./../../finance/VestingWalletConfidentialFactory.sol";
99

10-
abstract contract VestingWalletConfidentialFactoryMock is VestingWalletConfidentialFactory, SepoliaConfig {
10+
abstract contract VestingWalletConfidentialFactoryMock is VestingWalletConfidentialFactory, EthereumConfig {
1111
function _deployVestingWalletImplementation() internal virtual override returns (address) {
1212
return address(new VestingWalletCliffExecutorConfidential());
1313
}
@@ -46,7 +46,7 @@ abstract contract VestingWalletConfidentialFactoryMock is VestingWalletConfident
4646
}
4747

4848
// slither-disable-next-line locked-ether
49-
contract VestingWalletCliffExecutorConfidential is VestingWalletCliffConfidential, ERC7821WithExecutor, SepoliaConfig {
49+
contract VestingWalletCliffExecutorConfidential is VestingWalletCliffConfidential, ERC7821WithExecutor, EthereumConfig {
5050
constructor() {
5151
_disableInitializers();
5252
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// SPDX-License-Identifier: MIT
22
pragma solidity ^0.8.24;
33

4-
import {SepoliaConfig} from "@fhevm/solidity/config/ZamaConfig.sol";
4+
import {EthereumConfig} from "@fhevm/solidity/config/ZamaConfig.sol";
55
import {VestingWalletConfidential} from "../../finance/VestingWalletConfidential.sol";
66

7-
abstract contract VestingWalletConfidentialMock is VestingWalletConfidential, SepoliaConfig {}
7+
abstract contract VestingWalletConfidentialMock is VestingWalletConfidential, EthereumConfig {}

contracts/mocks/token/ERC7984ERC20WrapperMock.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
// SPDX-License-Identifier: MIT
22
pragma solidity ^0.8.27;
33

4-
import {SepoliaConfig} from "@fhevm/solidity/config/ZamaConfig.sol";
4+
import {EthereumConfig} from "@fhevm/solidity/config/ZamaConfig.sol";
55
import {IERC20} from "@openzeppelin/contracts/interfaces/IERC20.sol";
66
import {ERC7984ERC20Wrapper, ERC7984} from "../../token/ERC7984/extensions/ERC7984ERC20Wrapper.sol";
77

8-
contract ERC7984ERC20WrapperMock is ERC7984ERC20Wrapper, SepoliaConfig {
8+
contract ERC7984ERC20WrapperMock is ERC7984ERC20Wrapper, EthereumConfig {
99
constructor(
1010
IERC20 token,
1111
string memory name,

contracts/mocks/token/ERC7984FreezableMock.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
pragma solidity ^0.8.27;
44

5-
import {SepoliaConfig} from "@fhevm/solidity/config/ZamaConfig.sol";
5+
import {EthereumConfig} from "@fhevm/solidity/config/ZamaConfig.sol";
66
import {FHE, euint64, externalEuint64} from "@fhevm/solidity/lib/FHE.sol";
77
import {ERC7984} from "../../token/ERC7984/ERC7984.sol";
88
import {ERC7984Freezable} from "../../token/ERC7984/extensions/ERC7984Freezable.sol";

contracts/mocks/token/ERC7984Mock.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22

33
pragma solidity ^0.8.27;
44

5-
import {SepoliaConfig} from "@fhevm/solidity/config/ZamaConfig.sol";
5+
import {EthereumConfig} from "@fhevm/solidity/config/ZamaConfig.sol";
66
import {FHE, eaddress, euint64, externalEuint64} from "@fhevm/solidity/lib/FHE.sol";
77
import {ERC7984} from "../../token/ERC7984/ERC7984.sol";
88

99
// solhint-disable func-name-mixedcase
10-
contract ERC7984Mock is ERC7984, SepoliaConfig {
10+
contract ERC7984Mock is ERC7984, EthereumConfig {
1111
address private immutable _OWNER;
1212

1313
event EncryptedAmountCreated(euint64 amount);

contracts/mocks/token/ERC7984ObserverAccessMock.sol

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
pragma solidity ^0.8.27;
44

5-
import {SepoliaConfig} from "@fhevm/solidity/config/ZamaConfig.sol";
65
import {FHE, euint64, externalEuint64} from "@fhevm/solidity/lib/FHE.sol";
76
import {ERC7984ObserverAccess} from "../../token/ERC7984/extensions/ERC7984ObserverAccess.sol";
87
import {ERC7984Mock} from "./ERC7984Mock.sol";

contracts/mocks/token/ERC7984ReceiverMock.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
// SPDX-License-Identifier: MIT
22
pragma solidity ^0.8.27;
33

4-
import {SepoliaConfig} from "@fhevm/solidity/config/ZamaConfig.sol";
4+
import {EthereumConfig} from "@fhevm/solidity/config/ZamaConfig.sol";
55
import {FHE, ebool, euint64} from "@fhevm/solidity/lib/FHE.sol";
66
import {IERC7984Receiver} from "../../interfaces/IERC7984Receiver.sol";
77

8-
contract ERC7984ReceiverMock is IERC7984Receiver, SepoliaConfig {
8+
contract ERC7984ReceiverMock is IERC7984Receiver, EthereumConfig {
99
event ConfidentialTransferCallback(bool success);
1010

1111
error InvalidInput(uint8 input);

0 commit comments

Comments
 (0)