@coti-io/coti-contracts 1.3.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/contracts/access/DataPrivacyFramework/DataPrivacyFramework.sol +1 -1
- package/contracts/access/DataPrivacyFramework/extensions/DataPrivacyFrameworkMpc.sol +1 -1
- package/contracts/disperse/coinByRatio/FixedRatioCoinDisperserUnlimitedWindow.sol +2 -4
- package/contracts/disperse/disperseToken/MintDisperser.sol +1 -3
- package/contracts/disperse/disperseToken/TokenDisperser.sol +1 -1
- package/contracts/messaging/PrivateMessaging.sol +1 -1
- package/contracts/mocks/access/DataPrivacyFramework/DataPrivacyFrameworkMock.sol +1 -1
- package/contracts/mocks/messaging/PrivateMessagingHarness.sol +1 -1
- package/contracts/mocks/oracle/CotiPriceConsumerMock.sol +1 -1
- package/contracts/mocks/token/ERC20DecimalsMock.sol +1 -1
- package/contracts/mocks/token/ERC20Mock.sol +1 -1
- package/contracts/mocks/token/PrivateERC20/EncryptedTokenReceiverMock.sol +1 -1
- package/contracts/mocks/token/PrivateERC20/PrivacyBridgeERC20Mock.sol +1 -1
- package/contracts/mocks/token/PrivateERC20/PrivateERC20AuditorSupplyMock.sol +1 -1
- package/contracts/mocks/token/PrivateERC20/PrivateERC20CappedMock.sol +1 -1
- package/contracts/mocks/token/PrivateERC20/PrivateERC20GtCallerMock.sol +1 -1
- package/contracts/mocks/token/PrivateERC20/PrivateERC20Mock.sol +1 -1
- package/contracts/mocks/token/PrivateERC20/PrivateERC20ReentrantReceiverMock.sol +1 -1
- package/contracts/mocks/token/PrivateERC20/PublicReentrantTokenReceiverMock.sol +1 -1
- package/contracts/mocks/token/PrivateERC20/PublicTokenReceiverBoolMock.sol +1 -1
- package/contracts/mocks/token/PrivateERC20/PublicTokenReceiverMock.sol +1 -1
- package/contracts/mocks/token/PrivateERC721/PrivateERC721URIStorageMock.sol +1 -1
- package/contracts/mocks/utils/mpc/Arithmetic128TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/Arithmetic256TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/ArithmeticAddTestsContract.sol +196 -0
- package/contracts/mocks/utils/mpc/ArithmeticMulTestsContract.sol +194 -0
- package/contracts/mocks/utils/mpc/ArithmeticSigned128TestsContract.sol +63 -0
- package/contracts/mocks/utils/mpc/ArithmeticSigned256TestsContract.sol +107 -0
- package/contracts/mocks/utils/mpc/ArithmeticSignedNarrowTestsContract.sol +123 -0
- package/contracts/mocks/utils/mpc/ArithmeticSubTestsContract.sol +196 -0
- package/contracts/mocks/utils/mpc/Bitwise128TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/Bitwise256TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/BitwiseTestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/CheckedArithmetic128WithOverflowBitTestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/CheckedArithmetic256WithOverflowBitTestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/CheckedArithmeticWIthOverflowBitTestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/Comparison128TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/Comparison1TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/Comparison256TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/Comparison2TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/MinMax128TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/MinMax256TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/MinMaxTestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/MinimalImplementation.sol +1 -1
- package/contracts/mocks/utils/mpc/MinimalProxy.sol +1 -1
- package/contracts/mocks/utils/mpc/Miscellaneous1TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/MiscellaneousTestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/MpcOperations128TestContract.sol +1 -1
- package/contracts/mocks/utils/mpc/MpcOperationsTestContract.sol +4 -4
- package/contracts/mocks/utils/mpc/Mux128TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/Mux256TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/OffboardToUserKeyTestContract.sol +1 -1
- package/contracts/mocks/utils/mpc/OnBoard128TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/OnBoard256TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/PrivacyImplementationV1.sol +1 -1
- package/contracts/mocks/utils/mpc/PrivacyImplementationV2.sol +1 -1
- package/contracts/mocks/utils/mpc/PrivacyProxy.sol +1 -1
- package/contracts/mocks/utils/mpc/Random128TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/Random256TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/Shift128TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/Shift256TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/ShiftTestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/StringTestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/Transfer128TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/Transfer256TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/TransferScalarTestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/TransferTestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/TransferWithAllowance128TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/TransferWithAllowance256TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/TransferWithAllowance64_16TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/TransferWithAllowance64_32TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/TransferWithAllowance64_64TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/TransferWithAllowance64_8TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/TransferWithAllowanceScalarTestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/TransferWithAllowanceTestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/ValidateCiphertext128TestsContract.sol +1 -1
- package/contracts/mocks/utils/mpc/ValidateCiphertext256TestsContract.sol +2 -2
- package/contracts/mocks/utils/mpc/ValidateCiphertextTestsContract.sol +1 -1
- package/contracts/mocks/wallet/PrivateERC20Wallet/PrivateERC20WalletMock.sol +1 -1
- package/contracts/node/CotiNodeRewards.sol +3 -3
- package/contracts/node/SoulboundNodeNFT.sol +1 -2
- package/contracts/onboard/AccountOnboard.sol +1 -1
- package/contracts/oracle/ICotiPriceConsumer.sol +1 -1
- package/contracts/pod/IInbox.sol +231 -0
- package/contracts/pod/IInboxMiner.sol +53 -0
- package/contracts/pod/InboxUser.sol +29 -0
- package/contracts/pod/InboxUserCotiTestnet.sol +13 -0
- package/contracts/pod/PodNetworkConstants.sol +30 -0
- package/contracts/pod/examples/MpcAdder.sol +57 -0
- package/contracts/pod/examples/MpcAdderPausable.sol +25 -0
- package/contracts/pod/examples/MpcAdderPausable.sol.bak +25 -0
- package/contracts/pod/examples/it128/PodAdder128.sol +48 -0
- package/contracts/pod/examples/it256/PodAdder256.sol +48 -0
- package/contracts/pod/fee/IInboxFeeManager.sol +40 -0
- package/contracts/pod/manifest.json +52 -0
- package/contracts/pod/mpc/PodLib.sol +10 -0
- package/contracts/pod/mpc/PodLib128.sol +361 -0
- package/contracts/pod/mpc/PodLib256.sol +361 -0
- package/contracts/pod/mpc/PodLib64.sol +385 -0
- package/contracts/pod/mpc/PodLibBase.sol +72 -0
- package/contracts/pod/mpc/PodUser.sol +58 -0
- package/contracts/pod/mpc/PodUserFuji.sol +14 -0
- package/contracts/pod/mpc/PodUserSepolia.sol +13 -0
- package/contracts/pod/mpc/coti-side/IPodExecutorOps.sol +99 -0
- package/contracts/pod/mpccodec/MpcAbiCodec.sol +482 -0
- package/contracts/pod/privacy/IPodPriceOracle.sol +20 -0
- package/contracts/pod/privacy/IPrivacyPortal.sol +248 -0
- package/contracts/pod/privacy/IPrivacyPortalFactory.sol +88 -0
- package/contracts/pod/privacy/PortalFeeOracle.sol +51 -0
- package/contracts/pod/privacy/PrivacyPortal.sol +871 -0
- package/contracts/pod/privacy/PrivacyPortalFactory.sol +492 -0
- package/contracts/pod/privacy/PrivacyPortalFeeLib.sol +98 -0
- package/contracts/pod/privacy/mocks/CloneHelper.sol +14 -0
- package/contracts/pod/privacy/mocks/MockERC20.sol +26 -0
- package/contracts/pod/privacy/mocks/MockPodERC20ForPortal.sol +160 -0
- package/contracts/pod/privacy/mocks/MockPrivacyPortalFactory.sol +125 -0
- package/contracts/pod/privacy/mocks/MockWrappedNative.sol +24 -0
- package/contracts/pod/token/erc7984/Erc7984Constants.sol +9 -0
- package/contracts/pod/token/erc7984/Erc7984Pointers.sol +29 -0
- package/contracts/pod/token/erc7984/IERC7984.sol +69 -0
- package/contracts/pod/token/erc7984/IERC7984PortalWrapper.sol +31 -0
- package/contracts/pod/token/erc7984/PodErc7984Mixin.sol +125 -0
- package/contracts/pod/token/erc7984/README.md +60 -0
- package/contracts/pod/token/perc20/IPodERC20.sol +298 -0
- package/contracts/pod/token/perc20/PodERC20.sol +1021 -0
- package/contracts/pod/token/perc20/PodErc20Mintable.sol +88 -0
- package/contracts/pod/token/perc20/PodErc20MintableInitializable.sol +42 -0
- package/contracts/pod/token/perc20/cotiside/IPodErc20CotiSide.sol +88 -0
- package/contracts/pod/token/perc20/cotiside/PodErc20CotiMother.sol +529 -0
- package/contracts/pod/utils/IWrappedNative.sol +11 -0
- package/contracts/privacyBridge/PrivacyBridge.sol +5 -5
- package/contracts/privacyBridge/PrivacyBridgeCotiNative.sol +1 -1
- package/contracts/privacyBridge/PrivacyBridgeERC20.sol +1 -1
- package/contracts/privacyBridge/PrivacyBridgeUSDCe.sol +1 -1
- package/contracts/privacyBridge/PrivacyBridgeUSDT.sol +1 -1
- package/contracts/privacyBridge/PrivacyBridgeWADA.sol +1 -1
- package/contracts/privacyBridge/PrivacyBridgeWBTC.sol +1 -1
- package/contracts/privacyBridge/PrivacyBridgeWETH.sol +1 -1
- package/contracts/privacyBridge/PrivacyBridgegCoti.sol +1 -1
- package/contracts/token/PrivateERC20/IPrivateERC20.sol +1 -1
- package/contracts/token/PrivateERC20/ITokenReceiver.sol +1 -1
- package/contracts/token/PrivateERC20/ITokenReceiverEncrypted.sol +1 -1
- package/contracts/token/PrivateERC20/PrivateERC20.sol +5 -5
- package/contracts/token/PrivateERC20/tokens/PrivateBridgedUSDC.sol +1 -1
- package/contracts/token/PrivateERC20/tokens/PrivateCOTI.sol +1 -1
- package/contracts/token/PrivateERC20/tokens/PrivateCOTITreasuryGovernanceToken.sol +1 -1
- package/contracts/token/PrivateERC20/tokens/PrivateTetherUSD.sol +1 -1
- package/contracts/token/PrivateERC20/tokens/PrivateWrappedADA.sol +1 -1
- package/contracts/token/PrivateERC20/tokens/PrivateWrappedBTC.sol +1 -1
- package/contracts/token/PrivateERC20/tokens/PrivateWrappedEther.sol +1 -1
- package/contracts/token/PrivateERC721/IERC721Errors.sol +1 -1
- package/contracts/token/PrivateERC721/PrivateERC721.sol +1 -1
- package/contracts/token/PrivateERC721/extensions/IPrivateERC721URIStorage.sol +1 -1
- package/contracts/token/PrivateERC721/extensions/PrivateERC721URIStorage.sol +1 -1
- package/contracts/token/points/CotiTokenPoints004.sol +43 -0
- package/contracts/utils/mpc/MpcCore.sol +610 -1
- package/contracts/utils/mpc/MpcInterface.sol +1 -1
- package/hardhat.config.ts +5 -14
- package/package.json +4 -4
- package/scripts/deployCotiTokenPoints004.ts +61 -0
- package/scripts/deployFixedRatioCoinDisperserUnlimitedWindow.ts +68 -0
- package/scripts/verifyCotiTokenPoints004.ts +123 -0
- package/scripts/verifyFixedRatioCoinDisperserUnlimitedWindow.ts +112 -0
- package/test/messaging/PrivateMessaging.test.ts +5 -5
- package/test/pod/privacy/PrivacyPortal.access.test.ts +756 -0
- package/test/pod/privacy/PrivacyPortal.recovery.test.ts +263 -0
- package/test/privacyBridge/UnifiedPrivacyBridges.test.cjs +5 -3
- package/test/utils/mpc/CheckedSignedArithmetic256.test.ts +163 -0
- package/test/utils/mpc/NegativeCases.test.ts +3 -3
- package/test/utils/mpc/Precompile.test.ts +6 -6
- package/typechain-types/@openzeppelin/contracts/access/AccessControl.ts +2 -2
- package/typechain-types/@openzeppelin/contracts/access/IAccessControl.ts +2 -2
- package/typechain-types/@openzeppelin/contracts/access/extensions/AccessControlEnumerable.ts +375 -0
- package/typechain-types/@openzeppelin/contracts/access/extensions/IAccessControlEnumerable.ts +329 -0
- package/typechain-types/@openzeppelin/contracts/access/extensions/index.ts +5 -0
- package/typechain-types/@openzeppelin/contracts/access/index.ts +2 -0
- package/typechain-types/@openzeppelin/contracts/interfaces/IERC1363.ts +412 -0
- package/typechain-types/@openzeppelin/contracts/interfaces/IERC5267.ts +151 -0
- package/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors.ts +69 -0
- package/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors.ts +69 -0
- package/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors.ts +69 -0
- package/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/index.ts +6 -0
- package/typechain-types/@openzeppelin/contracts/interfaces/index.ts +4 -0
- package/typechain-types/@openzeppelin/contracts/token/ERC20/ERC20.ts +6 -50
- package/typechain-types/@openzeppelin/contracts/token/ERC20/IERC20.ts +6 -6
- package/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.ts +313 -0
- package/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable.ts +356 -0
- package/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.ts +423 -0
- package/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.ts +6 -6
- package/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/index.ts +3 -0
- package/typechain-types/@openzeppelin/contracts/token/ERC20/index.ts +2 -0
- package/typechain-types/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.ts +69 -0
- package/typechain-types/@openzeppelin/contracts/token/ERC20/utils/index.ts +4 -0
- package/typechain-types/@openzeppelin/contracts/utils/Nonces.ts +85 -0
- package/typechain-types/@openzeppelin/contracts/utils/Pausable.ts +150 -0
- package/typechain-types/@openzeppelin/contracts/utils/ReentrancyGuard.ts +69 -0
- package/typechain-types/@openzeppelin/contracts/utils/ShortStrings.ts +69 -0
- package/typechain-types/@openzeppelin/contracts/utils/Strings.ts +69 -0
- package/typechain-types/@openzeppelin/contracts/utils/cryptography/ECDSA.ts +69 -0
- package/typechain-types/@openzeppelin/contracts/utils/cryptography/EIP712.ts +151 -0
- package/typechain-types/@openzeppelin/contracts/utils/cryptography/index.ts +5 -0
- package/typechain-types/@openzeppelin/contracts/utils/index.ts +9 -0
- package/typechain-types/@openzeppelin/contracts/utils/math/SafeCast.ts +69 -0
- package/typechain-types/@openzeppelin/contracts/utils/math/index.ts +4 -0
- package/typechain-types/contracts/mocks/token/ERC20DecimalsMock.ts +6 -50
- package/typechain-types/contracts/mocks/token/ERC20Mock.ts +6 -50
- package/typechain-types/contracts/mocks/token/PrivateERC20/PrivacyBridgeERC20Mock.ts +16 -2
- package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20AuditorSupplyMock.ts +2 -2
- package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20CappedMock.ts +2 -2
- package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20Mock.ts +2 -2
- package/typechain-types/contracts/privacyBridge/PrivacyBridge.ts +16 -2
- package/typechain-types/contracts/privacyBridge/PrivacyBridgeCotiNative.ts +16 -2
- package/typechain-types/contracts/privacyBridge/PrivacyBridgeERC20.sol/PrivacyBridgeERC20.ts +16 -2
- package/typechain-types/contracts/privacyBridge/PrivacyBridgeUSDCe.ts +16 -2
- package/typechain-types/contracts/privacyBridge/PrivacyBridgeUSDT.ts +16 -2
- package/typechain-types/contracts/privacyBridge/PrivacyBridgeWADA.ts +16 -2
- package/typechain-types/contracts/privacyBridge/PrivacyBridgeWBTC.ts +16 -2
- package/typechain-types/contracts/privacyBridge/PrivacyBridgeWETH.ts +16 -2
- package/typechain-types/contracts/privacyBridge/PrivacyBridgegCoti.ts +16 -2
- package/typechain-types/contracts/token/PrivateERC20/PrivateERC20.ts +2 -2
- package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateBridgedUSDC.ts +2 -2
- package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateCOTI.ts +2 -2
- package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateCOTITreasuryGovernanceToken.ts +2 -2
- package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateTetherUSD.ts +2 -2
- package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateWrappedADA.ts +2 -2
- package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateWrappedBTC.ts +2 -2
- package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateWrappedEther.ts +2 -2
- package/typechain-types/contracts/token/index.ts +2 -0
- package/typechain-types/contracts/token/points/CotiTokenPoints004.sol/COTITokenPoints004.ts +826 -0
- package/typechain-types/contracts/token/points/CotiTokenPoints004.ts +826 -0
- package/typechain-types/contracts/token/points/index.ts +4 -0
- package/typechain-types/factories/@openzeppelin/contracts/access/AccessControl__factory.ts +22 -1
- package/typechain-types/factories/@openzeppelin/contracts/access/IAccessControl__factory.ts +22 -1
- package/typechain-types/factories/@openzeppelin/contracts/access/Ownable__factory.ts +22 -0
- package/typechain-types/factories/@openzeppelin/contracts/access/extensions/AccessControlEnumerable__factory.ts +316 -0
- package/typechain-types/factories/@openzeppelin/contracts/access/extensions/IAccessControlEnumerable__factory.ts +265 -0
- package/typechain-types/factories/@openzeppelin/contracts/access/extensions/index.ts +5 -0
- package/typechain-types/factories/@openzeppelin/contracts/access/index.ts +1 -0
- package/typechain-types/factories/@openzeppelin/contracts/interfaces/IERC1363__factory.ts +393 -0
- package/typechain-types/factories/@openzeppelin/contracts/interfaces/IERC5267__factory.ts +71 -0
- package/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors__factory.ts +127 -0
- package/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors__factory.ts +111 -0
- package/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors__factory.ts +128 -0
- package/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/index.ts +6 -0
- package/typechain-types/factories/@openzeppelin/contracts/interfaces/index.ts +3 -0
- package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/ERC20__factory.ts +84 -110
- package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/IERC20__factory.ts +3 -3
- package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable__factory.ts +364 -0
- package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable__factory.ts +382 -0
- package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit__factory.ts +540 -0
- package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata__factory.ts +3 -3
- package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/index.ts +3 -0
- package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/index.ts +1 -0
- package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/utils/SafeERC20__factory.ts +96 -0
- package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/utils/index.ts +4 -0
- package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/ERC721__factory.ts +98 -59
- package/typechain-types/factories/@openzeppelin/contracts/utils/Nonces__factory.ts +57 -0
- package/typechain-types/factories/@openzeppelin/contracts/utils/Pausable__factory.ts +71 -0
- package/typechain-types/factories/@openzeppelin/contracts/utils/ReentrancyGuard__factory.ts +30 -0
- package/typechain-types/factories/@openzeppelin/contracts/utils/ShortStrings__factory.ts +83 -0
- package/typechain-types/factories/@openzeppelin/contracts/utils/Strings__factory.ts +90 -0
- package/typechain-types/factories/@openzeppelin/contracts/utils/cryptography/ECDSA__factory.ts +91 -0
- package/typechain-types/factories/@openzeppelin/contracts/utils/cryptography/EIP712__factory.ts +87 -0
- package/typechain-types/factories/@openzeppelin/contracts/utils/cryptography/index.ts +5 -0
- package/typechain-types/factories/@openzeppelin/contracts/utils/index.ts +7 -0
- package/typechain-types/factories/@openzeppelin/contracts/utils/math/SafeCast__factory.ts +118 -0
- package/typechain-types/factories/@openzeppelin/contracts/utils/math/index.ts +4 -0
- package/typechain-types/factories/contracts/disperse/coinByRatio/FixedRatioCoinDisperserLeftoverS1__factory.ts +12 -1
- package/typechain-types/factories/contracts/disperse/coinByRatio/FixedRatioCoinDisperserUnlimitedWindow__factory.ts +39 -1
- package/typechain-types/factories/contracts/disperse/coinByRatio/FixedRatioCoinDisperser__factory.ts +12 -1
- package/typechain-types/factories/contracts/disperse/disperseToken/MintDisperser.sol/MintDisperser__factory.ts +23 -1
- package/typechain-types/factories/contracts/disperse/disperseToken/TokenDisperser__factory.ts +12 -1
- package/typechain-types/factories/contracts/messaging/PrivateMessaging__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/messaging/PrivateMessagingHarness__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/token/ERC20DecimalsMock__factory.ts +90 -52
- package/typechain-types/factories/contracts/mocks/token/ERC20Mock__factory.ts +90 -52
- package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivacyBridgeERC20Mock__factory.ts +90 -2
- package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20AuditorSupplyMock__factory.ts +28 -2
- package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20CappedMock__factory.ts +28 -2
- package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20GtCallerMock__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20Mock__factory.ts +28 -2
- package/typechain-types/factories/contracts/mocks/token/PrivateERC721/PrivateERC721URIStorageMock__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/Arithmetic128TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/Arithmetic256TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/ArithmeticTestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/Bitwise128TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/Bitwise256TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/BitwiseTestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/CheckedArithmetic128WithOverflowBitTestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/CheckedArithmetic256WithOverflowBitTestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/CheckedArithmeticWIthOverflowBitTestsContract.sol/CheckedArithmeticWithOverflowBitTestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison128TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison1TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison256TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison2TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/MinMax128TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/MinMax256TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/MinMaxTestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/MinimalImplementation__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/Miscellaneous1TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/MiscellaneousTestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/MpcOperations128TestContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/MpcOperationsTestContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/Mux128TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/Mux256TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/OffboardToUserKeyTestContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/OnBoard128TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/OnBoard256TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/PrivacyImplementationV1__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/PrivacyImplementationV2__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/Random128TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/Random256TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/Shift128TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/Shift256TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/ShiftTestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/StringTestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/Transfer128TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/Transfer256TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/TransferScalarTestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/TransferTestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance128TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance256TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance64_16TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance64_32TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance64_64TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance64_8TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowanceScalarTestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowanceTestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/ValidateCiphertext128TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/ValidateCiphertext256TestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/utils/mpc/ValidateCiphertextTestsContract__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/wallet/PrivateERC20Wallet/PrivateERC20WalletMock__factory.ts +1 -1
- package/typechain-types/factories/contracts/node/CotiNodeRewards__factory.ts +28 -1
- package/typechain-types/factories/contracts/node/SoulboundNodeNFT.sol/SoulboundNodeNFT__factory.ts +126 -1
- package/typechain-types/factories/contracts/onboard/AccountOnboard__factory.ts +1 -1
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeCotiNative__factory.ts +79 -2
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeERC20.sol/PrivacyBridgeERC20__factory.ts +89 -1
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeUSDCe__factory.ts +90 -2
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeUSDT__factory.ts +90 -2
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeWADA__factory.ts +90 -2
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeWBTC__factory.ts +90 -2
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeWETH__factory.ts +90 -2
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridge__factory.ts +78 -1
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgegCoti__factory.ts +90 -2
- package/typechain-types/factories/contracts/token/PrivateERC20/PrivateERC20__factory.ts +27 -1
- package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateBridgedUSDC__factory.ts +28 -2
- package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateCOTITreasuryGovernanceToken__factory.ts +28 -2
- package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateCOTI__factory.ts +28 -2
- package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateTetherUSD__factory.ts +28 -2
- package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateWrappedADA__factory.ts +28 -2
- package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateWrappedBTC__factory.ts +28 -2
- package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateWrappedEther__factory.ts +28 -2
- package/typechain-types/factories/contracts/token/index.ts +1 -0
- package/typechain-types/factories/contracts/token/points/CotiTokenPoints004.sol/COTITokenPoints004__factory.ts +992 -0
- package/typechain-types/factories/contracts/token/points/CotiTokenPoints004__factory.ts +992 -0
- package/typechain-types/factories/contracts/token/points/index.ts +4 -0
- package/typechain-types/factories/contracts/utils/mpc/MpcCore__factory.ts +1 -1
- package/typechain-types/hardhat.d.ts +360 -0
- package/typechain-types/index.ts +36 -4
- package/contracts/mocks/utils/mpc/ArithmeticTestsContract.sol +0 -408
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import hre from "hardhat"
|
|
2
|
+
import { expect } from "chai"
|
|
3
|
+
import { parseUnits } from "ethers"
|
|
4
|
+
|
|
5
|
+
describe("PrivacyPortal failed-request recovery", function () {
|
|
6
|
+
async function deployPortalFixture() {
|
|
7
|
+
const [owner, user, other] = await hre.ethers.getSigners()
|
|
8
|
+
|
|
9
|
+
const MockFactory = await hre.ethers.getContractFactory("MockPrivacyPortalFactory")
|
|
10
|
+
const factory = await MockFactory.deploy(owner.address, owner.address)
|
|
11
|
+
await factory.waitForDeployment()
|
|
12
|
+
|
|
13
|
+
const MockERC20 = await hre.ethers.getContractFactory("MockERC20")
|
|
14
|
+
const underlying = await MockERC20.deploy("Mock USD", "mUSD", 6)
|
|
15
|
+
await underlying.waitForDeployment()
|
|
16
|
+
|
|
17
|
+
const MockPToken = await hre.ethers.getContractFactory("MockPodERC20ForPortal")
|
|
18
|
+
const pToken = await MockPToken.deploy()
|
|
19
|
+
await pToken.waitForDeployment()
|
|
20
|
+
|
|
21
|
+
const PortalImpl = await hre.ethers.getContractFactory("PrivacyPortal")
|
|
22
|
+
const portalImpl = await PortalImpl.deploy()
|
|
23
|
+
await portalImpl.waitForDeployment()
|
|
24
|
+
|
|
25
|
+
const CloneHelper = await hre.ethers.getContractFactory("CloneHelper")
|
|
26
|
+
const cloneHelper = await CloneHelper.deploy()
|
|
27
|
+
await cloneHelper.waitForDeployment()
|
|
28
|
+
|
|
29
|
+
await cloneHelper.clone(await portalImpl.getAddress())
|
|
30
|
+
const portalAddress = await cloneHelper.lastClone()
|
|
31
|
+
const portal = PortalImpl.attach(portalAddress) as Awaited<ReturnType<typeof PortalImpl.deploy>>
|
|
32
|
+
|
|
33
|
+
await portal.initialize(
|
|
34
|
+
await underlying.getAddress(),
|
|
35
|
+
await pToken.getAddress(),
|
|
36
|
+
6,
|
|
37
|
+
false,
|
|
38
|
+
await factory.getAddress()
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
const amount = parseUnits("100", 6)
|
|
42
|
+
await underlying.mint(user.address, amount * 2n)
|
|
43
|
+
await underlying.connect(user).approve(await portal.getAddress(), amount * 2n)
|
|
44
|
+
|
|
45
|
+
return { owner, user, other, factory, underlying, pToken, portal, amount }
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
it("refunds locked underlying after a system-failed mint", async function () {
|
|
49
|
+
const { user, other, underlying, pToken, portal, amount } = await deployPortalFixture()
|
|
50
|
+
|
|
51
|
+
const tx = await portal.connect(user).deposit(user.address, amount, 0, 100, {
|
|
52
|
+
value: 1000,
|
|
53
|
+
})
|
|
54
|
+
const receipt = await tx.wait()
|
|
55
|
+
const depositLog = receipt!.logs
|
|
56
|
+
.map((log) => {
|
|
57
|
+
try {
|
|
58
|
+
return portal.interface.parseLog(log)
|
|
59
|
+
} catch {
|
|
60
|
+
return null
|
|
61
|
+
}
|
|
62
|
+
})
|
|
63
|
+
.find((parsed) => parsed?.name === "DepositRequested")
|
|
64
|
+
const requestId = depositLog!.args.mintRequestId as string
|
|
65
|
+
|
|
66
|
+
const feesLog = receipt!.logs
|
|
67
|
+
.map((log) => {
|
|
68
|
+
try {
|
|
69
|
+
return portal.interface.parseLog(log)
|
|
70
|
+
} catch {
|
|
71
|
+
return null
|
|
72
|
+
}
|
|
73
|
+
})
|
|
74
|
+
.find((parsed) => parsed?.name === "OperationFeesPaid")
|
|
75
|
+
expect(feesLog).to.not.equal(undefined)
|
|
76
|
+
expect(feesLog!.args.payer).to.equal(user.address)
|
|
77
|
+
expect(feesLog!.args.correlationId).to.equal(requestId)
|
|
78
|
+
expect(feesLog!.args.isDeposit).to.equal(true)
|
|
79
|
+
expect(feesLog!.args.isNativeWrap).to.equal(false)
|
|
80
|
+
expect(feesLog!.args.portalFee).to.equal(0n)
|
|
81
|
+
expect(feesLog!.args.podFee).to.equal(1000n)
|
|
82
|
+
expect(feesLog!.args.podCallbackFee).to.equal(100n)
|
|
83
|
+
expect(feesLog!.args.amount).to.equal(amount)
|
|
84
|
+
|
|
85
|
+
expect(await underlying.balanceOf(await portal.getAddress())).to.equal(amount)
|
|
86
|
+
await expect(portal.connect(user).refundFailedDeposit(requestId)).to.be.revertedWithCustomError(
|
|
87
|
+
portal,
|
|
88
|
+
"DepositMintNotFailed"
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
await pToken.markLastMintRaised()
|
|
92
|
+
await expect(portal.connect(user).refundFailedDeposit(requestId)).to.be.revertedWithCustomError(
|
|
93
|
+
portal,
|
|
94
|
+
"DepositMintNotFailed"
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
await pToken.markLastMintFailed()
|
|
98
|
+
const before = await underlying.balanceOf(user.address)
|
|
99
|
+
// Permissionless: a third party may trigger; funds still return to the depositor.
|
|
100
|
+
await expect(portal.connect(other).refundFailedDeposit(requestId))
|
|
101
|
+
.to.emit(portal, "DepositRefunded")
|
|
102
|
+
.withArgs(user.address, requestId, amount)
|
|
103
|
+
|
|
104
|
+
expect(await underlying.balanceOf(user.address)).to.equal(before + amount)
|
|
105
|
+
expect(await underlying.balanceOf(await portal.getAddress())).to.equal(0n)
|
|
106
|
+
await expect(portal.connect(user).refundFailedDeposit(requestId)).to.be.revertedWithCustomError(
|
|
107
|
+
portal,
|
|
108
|
+
"DepositEscrowInvalid"
|
|
109
|
+
)
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
it("marks withdrawal Failed when the pToken transfer request fails", async function () {
|
|
113
|
+
const { user, portal, pToken, amount } = await deployPortalFixture()
|
|
114
|
+
|
|
115
|
+
const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600)
|
|
116
|
+
const tx = await portal.connect(user).requestWithdrawWithPermit(
|
|
117
|
+
user.address,
|
|
118
|
+
amount,
|
|
119
|
+
0,
|
|
120
|
+
1000,
|
|
121
|
+
100,
|
|
122
|
+
deadline,
|
|
123
|
+
27,
|
|
124
|
+
hre.ethers.ZeroHash,
|
|
125
|
+
hre.ethers.ZeroHash,
|
|
126
|
+
{ value: 1000 }
|
|
127
|
+
)
|
|
128
|
+
const receipt = await tx.wait()
|
|
129
|
+
const withdrawLog = receipt!.logs
|
|
130
|
+
.map((log) => {
|
|
131
|
+
try {
|
|
132
|
+
return portal.interface.parseLog(log)
|
|
133
|
+
} catch {
|
|
134
|
+
return null
|
|
135
|
+
}
|
|
136
|
+
})
|
|
137
|
+
.find((parsed) => parsed?.name === "WithdrawalRequested")
|
|
138
|
+
const withdrawalId = withdrawLog!.args.withdrawalId as string
|
|
139
|
+
const transferRequestId = withdrawLog!.args.transferRequestId as string
|
|
140
|
+
|
|
141
|
+
await expect(portal.cancelFailedWithdrawal(withdrawalId)).to.be.revertedWithCustomError(
|
|
142
|
+
portal,
|
|
143
|
+
"WithdrawTransferNotFailed"
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
await pToken.markLastTransferFailed()
|
|
147
|
+
await expect(portal.cancelFailedWithdrawal(withdrawalId))
|
|
148
|
+
.to.emit(portal, "WithdrawalFailed")
|
|
149
|
+
.withArgs(withdrawalId, transferRequestId)
|
|
150
|
+
|
|
151
|
+
const feesLog = receipt!.logs
|
|
152
|
+
.map((log) => {
|
|
153
|
+
try {
|
|
154
|
+
return portal.interface.parseLog(log)
|
|
155
|
+
} catch {
|
|
156
|
+
return null
|
|
157
|
+
}
|
|
158
|
+
})
|
|
159
|
+
.find((parsed) => parsed?.name === "OperationFeesPaid")
|
|
160
|
+
expect(feesLog).to.not.equal(undefined)
|
|
161
|
+
expect(feesLog!.args.correlationId).to.equal(withdrawalId)
|
|
162
|
+
expect(feesLog!.args.isDeposit).to.equal(false)
|
|
163
|
+
expect(feesLog!.args.portalFee).to.equal(0n)
|
|
164
|
+
expect(feesLog!.args.podFee).to.equal(1000n)
|
|
165
|
+
expect(feesLog!.args.podCallbackFee).to.equal(100n)
|
|
166
|
+
|
|
167
|
+
const withdrawal = await portal.withdrawals(withdrawalId)
|
|
168
|
+
expect(withdrawal.status).to.equal(3n) // WithdrawalStatus.Failed
|
|
169
|
+
await expect(portal.cancelFailedWithdrawal(withdrawalId)).to.be.revertedWithCustomError(
|
|
170
|
+
portal,
|
|
171
|
+
"WithdrawalNotPending"
|
|
172
|
+
)
|
|
173
|
+
await expect(portal.triggerWithdrawalRelease(withdrawalId)).to.be.revertedWithCustomError(
|
|
174
|
+
portal,
|
|
175
|
+
"WithdrawalNotPending"
|
|
176
|
+
)
|
|
177
|
+
})
|
|
178
|
+
|
|
179
|
+
it("cancels withdrawal after a system-failed pToken transfer", async function () {
|
|
180
|
+
const { user, portal, pToken, amount } = await deployPortalFixture()
|
|
181
|
+
|
|
182
|
+
const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600)
|
|
183
|
+
const tx = await portal.connect(user).requestWithdrawWithPermit(
|
|
184
|
+
user.address,
|
|
185
|
+
amount,
|
|
186
|
+
0,
|
|
187
|
+
1000,
|
|
188
|
+
100,
|
|
189
|
+
deadline,
|
|
190
|
+
27,
|
|
191
|
+
hre.ethers.ZeroHash,
|
|
192
|
+
hre.ethers.ZeroHash,
|
|
193
|
+
{ value: 1000 }
|
|
194
|
+
)
|
|
195
|
+
const receipt = await tx.wait()
|
|
196
|
+
const withdrawLog = receipt!.logs
|
|
197
|
+
.map((log) => {
|
|
198
|
+
try {
|
|
199
|
+
return portal.interface.parseLog(log)
|
|
200
|
+
} catch {
|
|
201
|
+
return null
|
|
202
|
+
}
|
|
203
|
+
})
|
|
204
|
+
.find((parsed) => parsed?.name === "WithdrawalRequested")
|
|
205
|
+
const withdrawalId = withdrawLog!.args.withdrawalId as string
|
|
206
|
+
const transferRequestId = withdrawLog!.args.transferRequestId as string
|
|
207
|
+
|
|
208
|
+
await pToken.markLastTransferSystemFailed()
|
|
209
|
+
await expect(portal.cancelFailedWithdrawal(withdrawalId))
|
|
210
|
+
.to.emit(portal, "WithdrawalFailed")
|
|
211
|
+
.withArgs(withdrawalId, transferRequestId)
|
|
212
|
+
|
|
213
|
+
const withdrawal = await portal.withdrawals(withdrawalId)
|
|
214
|
+
expect(withdrawal.status).to.equal(3n) // WithdrawalStatus.Failed
|
|
215
|
+
})
|
|
216
|
+
|
|
217
|
+
it("rescues native and ERC20 to the factory rescue recipient while paused", async function () {
|
|
218
|
+
const { owner, other, factory, underlying, portal, pToken } = await deployPortalFixture()
|
|
219
|
+
const rescueTo = other.address
|
|
220
|
+
await factory.setRescueRecipient(rescueTo)
|
|
221
|
+
|
|
222
|
+
await owner.sendTransaction({ to: await portal.getAddress(), value: parseUnits("1", 18) })
|
|
223
|
+
await underlying.mint(await portal.getAddress(), parseUnits("50", 6))
|
|
224
|
+
|
|
225
|
+
await expect(portal.connect(owner).rescueNative(parseUnits("1", 18))).to.be.revertedWithCustomError(
|
|
226
|
+
portal,
|
|
227
|
+
"ExpectedPause"
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
await portal.connect(owner).pause()
|
|
231
|
+
const rescueNativeAmount = parseUnits("0.4", 18)
|
|
232
|
+
await expect(portal.connect(owner).rescueNative(rescueNativeAmount))
|
|
233
|
+
.to.emit(portal, "NativeRescued")
|
|
234
|
+
.withArgs(rescueTo, rescueNativeAmount)
|
|
235
|
+
|
|
236
|
+
const rescueErc20Amount = parseUnits("25", 6)
|
|
237
|
+
await expect(portal.connect(owner).rescueERC20(await underlying.getAddress(), rescueErc20Amount))
|
|
238
|
+
.to.emit(portal, "ERC20Rescued")
|
|
239
|
+
.withArgs(await underlying.getAddress(), rescueTo, rescueErc20Amount)
|
|
240
|
+
|
|
241
|
+
await expect(
|
|
242
|
+
portal.connect(owner).rescueERC20(await pToken.getAddress(), 1)
|
|
243
|
+
).to.be.revertedWithCustomError(portal, "CannotRescuePToken")
|
|
244
|
+
})
|
|
245
|
+
|
|
246
|
+
it("sweeps portal fees to the factory fee recipient", async function () {
|
|
247
|
+
const { owner, user, factory, portal, underlying, amount } = await deployPortalFixture()
|
|
248
|
+
expect(await factory.feeRecipient()).to.equal(owner.address)
|
|
249
|
+
|
|
250
|
+
await portal.connect(owner).setDepositFee(100, 0, parseUnits("1", 18))
|
|
251
|
+
await underlying.connect(user).approve(await portal.getAddress(), amount)
|
|
252
|
+
await portal.connect(user).deposit(user.address, amount, 100, 100, { value: 1100 })
|
|
253
|
+
|
|
254
|
+
expect(await portal.accumulatedPortalFees()).to.equal(100n)
|
|
255
|
+
const before = await hre.ethers.provider.getBalance(owner.address)
|
|
256
|
+
const tx = await portal.connect(owner).withdrawPortalFees(100)
|
|
257
|
+
const receipt = await tx.wait()
|
|
258
|
+
const gas = receipt!.gasUsed * receipt!.gasPrice
|
|
259
|
+
const after = await hre.ethers.provider.getBalance(owner.address)
|
|
260
|
+
expect(after + gas - before).to.equal(100n)
|
|
261
|
+
expect(await portal.accumulatedPortalFees()).to.equal(0n)
|
|
262
|
+
})
|
|
263
|
+
})
|
|
@@ -37,9 +37,11 @@ function validateEnvironment() {
|
|
|
37
37
|
* @returns {ethers.Wallet}
|
|
38
38
|
*/
|
|
39
39
|
function makeSdkWallet() {
|
|
40
|
-
const raw =
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
const raw =
|
|
41
|
+
process.env.PRIVATE_KEY ||
|
|
42
|
+
(process.env.SIGNING_KEYS ? process.env.SIGNING_KEYS.split(",")[0]?.trim() : null);
|
|
43
|
+
if (!raw) throw new Error("PRIVATE_KEY (or SIGNING_KEYS) not set in .env");
|
|
44
|
+
const pk = raw.startsWith("0x") ? raw : "0x" + raw;
|
|
43
45
|
return new ethers.Wallet(pk, ethers.provider);
|
|
44
46
|
}
|
|
45
47
|
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import hre from "hardhat"
|
|
2
|
+
import { expect } from "chai"
|
|
3
|
+
import { setupAccounts } from "../accounts"
|
|
4
|
+
|
|
5
|
+
const gasLimit = 12000000
|
|
6
|
+
const MAX_INT256 = (1n << 255n) - 1n
|
|
7
|
+
const MIN_INT256 = -(1n << 255n)
|
|
8
|
+
|
|
9
|
+
type Deployed = {
|
|
10
|
+
contract: any
|
|
11
|
+
owner: any
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
async function deployNamed(name: string): Promise<Deployed> {
|
|
15
|
+
const [owner] = await setupAccounts()
|
|
16
|
+
const factory = await hre.ethers.getContractFactory(name, owner as any)
|
|
17
|
+
const contract = await factory.deploy({ gasLimit })
|
|
18
|
+
await contract.waitForDeployment()
|
|
19
|
+
return { contract, owner }
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
async function expectRevert(txPromise: Promise<any>, owner: any) {
|
|
23
|
+
const tx = await txPromise
|
|
24
|
+
try {
|
|
25
|
+
await tx.wait()
|
|
26
|
+
expect.fail("expected transaction to revert")
|
|
27
|
+
} catch (e) {
|
|
28
|
+
const receipt = await owner.provider?.getTransactionReceipt(tx.hash)
|
|
29
|
+
expect(receipt?.status).to.equal(0)
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
describe("Checked Signed Arithmetic", function () {
|
|
34
|
+
describe("narrow (8/16/32/64)", function () {
|
|
35
|
+
let deployment: Deployed
|
|
36
|
+
|
|
37
|
+
before(async function () {
|
|
38
|
+
deployment = await deployNamed("ArithmeticSignedNarrowTestsContract")
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
for (const func of [
|
|
42
|
+
"basicSigned8Test",
|
|
43
|
+
"basicSigned16Test",
|
|
44
|
+
"basicSigned32Test",
|
|
45
|
+
"basicSigned64Test",
|
|
46
|
+
"minDivMinusOne8Test",
|
|
47
|
+
]) {
|
|
48
|
+
it(`${func} should preserve signed integer semantics`, async function () {
|
|
49
|
+
const { contract } = deployment
|
|
50
|
+
const tx = await contract.getFunction(func)({ gasLimit })
|
|
51
|
+
const receipt = await tx.wait()
|
|
52
|
+
expect(receipt?.status).to.equal(1)
|
|
53
|
+
})
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
for (const func of [
|
|
57
|
+
"checkedAdd8OverflowTest",
|
|
58
|
+
"checkedSub8UnderflowTest",
|
|
59
|
+
"checkedMul8OverflowTest",
|
|
60
|
+
]) {
|
|
61
|
+
it(`${func} should revert`, async function () {
|
|
62
|
+
const { contract, owner } = deployment
|
|
63
|
+
await expectRevert(contract.getFunction(func)({ gasLimit }), owner)
|
|
64
|
+
})
|
|
65
|
+
}
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
describe("int128", function () {
|
|
69
|
+
let deployment: Deployed
|
|
70
|
+
|
|
71
|
+
before(async function () {
|
|
72
|
+
deployment = await deployNamed("ArithmeticSigned128TestsContract")
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
for (const func of [
|
|
76
|
+
"basicSigned128Test",
|
|
77
|
+
"minDivMinusOne128Test",
|
|
78
|
+
"plainMul128WrapTest",
|
|
79
|
+
]) {
|
|
80
|
+
it(`${func} should preserve signed integer semantics`, async function () {
|
|
81
|
+
const { contract } = deployment
|
|
82
|
+
const tx = await contract.getFunction(func)({ gasLimit })
|
|
83
|
+
const receipt = await tx.wait()
|
|
84
|
+
expect(receipt?.status).to.equal(1)
|
|
85
|
+
})
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
for (const func of [
|
|
89
|
+
"checkedAdd128OverflowTest",
|
|
90
|
+
"checkedSub128UnderflowTest",
|
|
91
|
+
"checkedMul128OverflowTest",
|
|
92
|
+
]) {
|
|
93
|
+
it(`${func} should revert`, async function () {
|
|
94
|
+
const { contract, owner } = deployment
|
|
95
|
+
await expectRevert(contract.getFunction(func)({ gasLimit }), owner)
|
|
96
|
+
})
|
|
97
|
+
}
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
describe("int256", function () {
|
|
101
|
+
let deployment: Deployed
|
|
102
|
+
|
|
103
|
+
before(async function () {
|
|
104
|
+
deployment = await deployNamed("ArithmeticSigned256TestsContract")
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
for (const func of [
|
|
108
|
+
"basicSigned256ArithmeticTest",
|
|
109
|
+
"basicSigned256ComparisonTest",
|
|
110
|
+
"basicSigned256MuxAndHelpersTest",
|
|
111
|
+
"minDivMinusOne256Test",
|
|
112
|
+
"plainMul256WrapTest",
|
|
113
|
+
]) {
|
|
114
|
+
it(`${func} should preserve signed integer semantics`, async function () {
|
|
115
|
+
const { contract } = deployment
|
|
116
|
+
const tx = await contract.getFunction(func)({ gasLimit })
|
|
117
|
+
const receipt = await tx.wait()
|
|
118
|
+
expect(receipt?.status).to.equal(1)
|
|
119
|
+
})
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
it("checkedAdd should return an in-range signed result", async function () {
|
|
123
|
+
const { contract } = deployment
|
|
124
|
+
const tx = await contract.getFunction("checkedAddTest")(100n, -40n, { gasLimit })
|
|
125
|
+
await tx.wait()
|
|
126
|
+
expect(await contract.getFunction("getAddResult")()).to.equal(60n)
|
|
127
|
+
})
|
|
128
|
+
|
|
129
|
+
it("checkedAdd should revert on signed overflow", async function () {
|
|
130
|
+
const { contract, owner } = deployment
|
|
131
|
+
await expectRevert(contract.getFunction("checkedAddTest")(MAX_INT256, 1n, { gasLimit }), owner)
|
|
132
|
+
})
|
|
133
|
+
|
|
134
|
+
it("checkedSub should return an in-range signed result", async function () {
|
|
135
|
+
const { contract } = deployment
|
|
136
|
+
const tx = await contract.getFunction("checkedSubTest")(-100n, -40n, { gasLimit })
|
|
137
|
+
await tx.wait()
|
|
138
|
+
expect(await contract.getFunction("getSubResult")()).to.equal(-60n)
|
|
139
|
+
})
|
|
140
|
+
|
|
141
|
+
it("checkedSub should revert on signed underflow", async function () {
|
|
142
|
+
const { contract, owner } = deployment
|
|
143
|
+
await expectRevert(contract.getFunction("checkedSubTest")(MIN_INT256, 1n, { gasLimit }), owner)
|
|
144
|
+
})
|
|
145
|
+
|
|
146
|
+
it("checkedMul should return an in-range signed result", async function () {
|
|
147
|
+
const { contract } = deployment
|
|
148
|
+
const tx = await contract.getFunction("checkedMulTest")(-12n, 9n, { gasLimit })
|
|
149
|
+
await tx.wait()
|
|
150
|
+
expect(await contract.getFunction("getMulResult")()).to.equal(-108n)
|
|
151
|
+
})
|
|
152
|
+
|
|
153
|
+
it("checkedMul should revert on positive signed overflow", async function () {
|
|
154
|
+
const { contract, owner } = deployment
|
|
155
|
+
await expectRevert(contract.getFunction("checkedMulTest")(1n << 128n, 1n << 128n, { gasLimit }), owner)
|
|
156
|
+
})
|
|
157
|
+
|
|
158
|
+
it("checkedMul should revert on min-int negation overflow", async function () {
|
|
159
|
+
const { contract, owner } = deployment
|
|
160
|
+
await expectRevert(contract.getFunction("checkedMulTest")(MIN_INT256, -1n, { gasLimit }), owner)
|
|
161
|
+
})
|
|
162
|
+
})
|
|
163
|
+
})
|
|
@@ -420,7 +420,7 @@ describe("Negative Test Cases - 8/16/32/64-bit", function () {
|
|
|
420
420
|
it("Should handle subtraction resulting in zero", async function () {
|
|
421
421
|
const [owner] = await setupAccounts()
|
|
422
422
|
|
|
423
|
-
const factory = await hre.ethers.getContractFactory("
|
|
423
|
+
const factory = await hre.ethers.getContractFactory("ArithmeticSubTestsContract", owner as any)
|
|
424
424
|
const contract = await factory.deploy({ gasLimit })
|
|
425
425
|
await contract.waitForDeployment()
|
|
426
426
|
|
|
@@ -438,7 +438,7 @@ describe("Negative Test Cases - 8/16/32/64-bit", function () {
|
|
|
438
438
|
it("Should handle max value operations for 8-bit", async function () {
|
|
439
439
|
const [owner] = await setupAccounts()
|
|
440
440
|
|
|
441
|
-
const factory = await hre.ethers.getContractFactory("
|
|
441
|
+
const factory = await hre.ethers.getContractFactory("ArithmeticAddTestsContract", owner as any)
|
|
442
442
|
const contract = await factory.deploy({ gasLimit })
|
|
443
443
|
await contract.waitForDeployment()
|
|
444
444
|
|
|
@@ -457,7 +457,7 @@ describe("Negative Test Cases - 8/16/32/64-bit", function () {
|
|
|
457
457
|
it("Should handle max value operations for 16-bit", async function () {
|
|
458
458
|
const [owner] = await setupAccounts()
|
|
459
459
|
|
|
460
|
-
const factory = await hre.ethers.getContractFactory("
|
|
460
|
+
const factory = await hre.ethers.getContractFactory("ArithmeticAddTestsContract", owner as any)
|
|
461
461
|
const contract = await factory.deploy({ gasLimit })
|
|
462
462
|
await contract.waitForDeployment()
|
|
463
463
|
|
|
@@ -60,12 +60,12 @@ const bool_a = true
|
|
|
60
60
|
const bool_b = false
|
|
61
61
|
const [a, b] = params
|
|
62
62
|
describe("Precompile", function () {
|
|
63
|
-
buildTest("
|
|
64
|
-
buildTest("
|
|
65
|
-
buildTest("
|
|
66
|
-
buildTest("
|
|
67
|
-
buildTest("
|
|
68
|
-
buildTest("
|
|
63
|
+
buildTest("ArithmeticAddTestsContract", "addTest", "getAddResult", params, a + b)
|
|
64
|
+
buildTest("ArithmeticAddTestsContract", "checkedAddTest", "getAddResult", params, a + b)
|
|
65
|
+
buildTest("ArithmeticSubTestsContract", "subTest", "getSubResult", params, a - b)
|
|
66
|
+
buildTest("ArithmeticSubTestsContract", "checkedSubTest", "getSubResult", params, a - b)
|
|
67
|
+
buildTest("ArithmeticMulTestsContract", "mulTest", "getMulResult", params, a * b)
|
|
68
|
+
buildTest("ArithmeticMulTestsContract", "checkedMulTest", "getMulResult", params, a * b)
|
|
69
69
|
|
|
70
70
|
buildTest("MiscellaneousTestsContract", "divTest", "getDivResult", params, a / b)
|
|
71
71
|
buildTest("MiscellaneousTestsContract", "remTest", "getRemResult", params, a % b)
|
|
@@ -206,7 +206,7 @@ export interface AccessControl extends BaseContract {
|
|
|
206
206
|
>;
|
|
207
207
|
|
|
208
208
|
renounceRole: TypedContractMethod<
|
|
209
|
-
[role: BytesLike,
|
|
209
|
+
[role: BytesLike, callerConfirmation: AddressLike],
|
|
210
210
|
[void],
|
|
211
211
|
"nonpayable"
|
|
212
212
|
>;
|
|
@@ -250,7 +250,7 @@ export interface AccessControl extends BaseContract {
|
|
|
250
250
|
getFunction(
|
|
251
251
|
nameOrSignature: "renounceRole"
|
|
252
252
|
): TypedContractMethod<
|
|
253
|
-
[role: BytesLike,
|
|
253
|
+
[role: BytesLike, callerConfirmation: AddressLike],
|
|
254
254
|
[void],
|
|
255
255
|
"nonpayable"
|
|
256
256
|
>;
|
|
@@ -186,7 +186,7 @@ export interface IAccessControl extends BaseContract {
|
|
|
186
186
|
>;
|
|
187
187
|
|
|
188
188
|
renounceRole: TypedContractMethod<
|
|
189
|
-
[role: BytesLike,
|
|
189
|
+
[role: BytesLike, callerConfirmation: AddressLike],
|
|
190
190
|
[void],
|
|
191
191
|
"nonpayable"
|
|
192
192
|
>;
|
|
@@ -221,7 +221,7 @@ export interface IAccessControl extends BaseContract {
|
|
|
221
221
|
getFunction(
|
|
222
222
|
nameOrSignature: "renounceRole"
|
|
223
223
|
): TypedContractMethod<
|
|
224
|
-
[role: BytesLike,
|
|
224
|
+
[role: BytesLike, callerConfirmation: AddressLike],
|
|
225
225
|
[void],
|
|
226
226
|
"nonpayable"
|
|
227
227
|
>;
|