@coti-io/coti-contracts 1.2.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/.github/workflows/npm-publish.yml +1 -1
- 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 +456 -0
- package/contracts/mocks/access/DataPrivacyFramework/DataPrivacyFrameworkMock.sol +1 -1
- package/contracts/mocks/messaging/PrivateMessagingHarness.sol +54 -0
- package/contracts/mocks/oracle/CotiPriceConsumerMock.sol +31 -0
- package/contracts/mocks/token/ERC20DecimalsMock.sol +21 -0
- package/contracts/mocks/token/ERC20Mock.sol +1 -1
- package/contracts/mocks/token/PrivateERC20/EncryptedTokenReceiverMock.sol +1 -1
- package/contracts/mocks/token/PrivateERC20/PrivacyBridgeERC20Mock.sol +9 -4
- 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 +23 -24
- package/contracts/onboard/AccountOnboard.sol +1 -1
- package/contracts/oracle/CotiPriceConsumer.sol +103 -0
- package/contracts/oracle/ICotiPriceConsumer.sol +15 -0
- package/contracts/oracle/IStdReference.sol +26 -0
- 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 +376 -94
- package/contracts/privacyBridge/PrivacyBridgeCotiNative.sol +210 -162
- package/contracts/privacyBridge/PrivacyBridgeERC20.sol +242 -160
- package/contracts/privacyBridge/PrivacyBridgeUSDCe.sol +8 -2
- package/contracts/privacyBridge/PrivacyBridgeUSDT.sol +8 -2
- package/contracts/privacyBridge/PrivacyBridgeWADA.sol +8 -2
- package/contracts/privacyBridge/PrivacyBridgeWBTC.sol +8 -2
- package/contracts/privacyBridge/PrivacyBridgeWETH.sol +8 -2
- package/contracts/privacyBridge/PrivacyBridgegCoti.sol +8 -2
- 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 +9 -15
- package/package.json +4 -4
- package/scripts/add-bridge-operators.cjs +87 -0
- package/scripts/deploy-coti-price-consumer-mainnet.cjs +49 -0
- package/scripts/deployCotiNodeRewards.ts +51 -0
- package/scripts/deployCotiTokenPoints004.ts +61 -0
- package/scripts/deployFixedRatioCoinDisperserUnlimitedWindow.ts +68 -0
- package/scripts/redeploy-private-and-bridges.cjs +201 -0
- package/scripts/set-bridge-limits-mainnet.cjs +177 -0
- package/scripts/verify-mainnet-private-bridges.cjs +289 -0
- package/scripts/verifyCotiTokenPoints004.ts +123 -0
- package/scripts/verifyFixedRatioCoinDisperserUnlimitedWindow.ts +112 -0
- package/sonar-project.properties +11 -0
- package/test/messaging/PrivateMessaging.test.ts +158 -0
- 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 +1665 -0
- package/test/token/PrivateERC20/PrivacyBridge.fees.test.ts +162 -239
- 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 +324 -0
- package/typechain-types/@openzeppelin/contracts/access/AccessControlEnumerable.ts +361 -0
- package/typechain-types/@openzeppelin/contracts/access/IAccessControl.ts +292 -0
- package/typechain-types/@openzeppelin/contracts/access/IAccessControlEnumerable.ts +329 -0
- 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 +6 -0
- package/typechain-types/@openzeppelin/contracts/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/security/Pausable.ts +150 -0
- package/typechain-types/@openzeppelin/contracts/security/index.ts +4 -0
- package/typechain-types/@openzeppelin/contracts/token/ERC20/ERC20.ts +286 -0
- 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 +286 -0
- package/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/index.ts +4 -0
- package/typechain-types/@openzeppelin/contracts/token/ERC20/index.ts +3 -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/token/ERC721/ERC721.ts +420 -0
- package/typechain-types/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.ts +420 -0
- package/typechain-types/@openzeppelin/contracts/token/ERC721/extensions/index.ts +4 -0
- package/typechain-types/@openzeppelin/contracts/token/ERC721/index.ts +3 -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/disperse/coinByRatio/FixedRatioCoinDisperserLeftoverS1.ts +735 -0
- package/typechain-types/contracts/disperse/coinByRatio/FixedRatioCoinDisperserUnlimitedWindow.ts +734 -0
- package/typechain-types/contracts/disperse/coinByRatio/index.ts +2 -0
- package/typechain-types/contracts/disperse/disperseToken/MintDisperser.sol/IOwnable.ts +95 -0
- package/typechain-types/contracts/disperse/disperseToken/MintDisperser.sol/MintDisperser.ts +22 -0
- package/typechain-types/contracts/disperse/disperseToken/MintDisperser.sol/index.ts +1 -0
- package/typechain-types/contracts/index.ts +8 -0
- package/typechain-types/contracts/messaging/PrivateMessaging.ts +871 -0
- package/typechain-types/contracts/messaging/index.ts +4 -0
- package/typechain-types/contracts/mocks/index.ts +4 -0
- package/typechain-types/contracts/mocks/messaging/PrivateMessagingHarness.ts +951 -0
- package/typechain-types/contracts/mocks/messaging/index.ts +4 -0
- package/typechain-types/contracts/mocks/oracle/CotiPriceConsumerMock.ts +163 -0
- package/typechain-types/contracts/mocks/oracle/index.ts +4 -0
- package/typechain-types/contracts/mocks/token/ERC20DecimalsMock.ts +305 -0
- package/typechain-types/contracts/mocks/token/ERC20Mock.ts +324 -0
- package/typechain-types/contracts/mocks/token/PrivateERC20/EncryptedTokenReceiverMock.ts +108 -0
- package/typechain-types/contracts/mocks/token/PrivateERC20/PrivacyBridgeERC20Mock.ts +1906 -0
- package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20AuditorSupplyMock.ts +1296 -0
- package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20CappedMock.ts +1270 -0
- package/typechain-types/contracts/mocks/{utils/mpc/Bitwise128BitTestsContract.ts → token/PrivateERC20/PrivateERC20GtCallerMock.ts} +47 -67
- package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20Mock.ts +757 -25
- package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20ReentrantReceiverMock.sol/IPrivateERC20TransferAndCallEncrypted.ts +102 -0
- package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20ReentrantReceiverMock.sol/PrivateERC20ReentrantReceiverMock.ts +154 -0
- package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20ReentrantReceiverMock.sol/index.ts +5 -0
- package/typechain-types/contracts/mocks/token/PrivateERC20/PublicReentrantTokenReceiverMock.ts +155 -0
- package/typechain-types/contracts/mocks/token/PrivateERC20/PublicTokenReceiverBoolMock.ts +107 -0
- package/typechain-types/contracts/mocks/token/PrivateERC20/PublicTokenReceiverMock.ts +100 -0
- package/typechain-types/contracts/mocks/token/PrivateERC20/index.ts +10 -0
- package/typechain-types/contracts/mocks/token/index.ts +2 -0
- package/typechain-types/contracts/mocks/wallet/PrivateERC20Wallet/PrivateERC20WalletMock.ts +6 -6
- package/typechain-types/contracts/node/CotiNodeRewards.ts +566 -0
- package/typechain-types/contracts/node/SoulboundNodeNFT.sol/IERC5192.ts +123 -0
- package/typechain-types/contracts/node/SoulboundNodeNFT.sol/SoulboundNodeNFT.ts +975 -0
- package/typechain-types/contracts/node/SoulboundNodeNFT.sol/index.ts +5 -0
- package/typechain-types/contracts/node/index.ts +6 -0
- package/typechain-types/contracts/oracle/CotiPriceConsumer.ts +256 -0
- package/typechain-types/contracts/oracle/ICotiPriceConsumer.ts +119 -0
- package/typechain-types/contracts/oracle/IStdReference.ts +136 -0
- package/typechain-types/contracts/oracle/index.ts +6 -0
- package/typechain-types/contracts/privacyBridge/PrivacyBridge.ts +1642 -0
- package/typechain-types/contracts/privacyBridge/PrivacyBridgeCotiNative.ts +1884 -0
- package/typechain-types/contracts/privacyBridge/PrivacyBridgeERC20.sol/IHasDecimals.ts +84 -0
- package/typechain-types/contracts/privacyBridge/PrivacyBridgeERC20.sol/PrivacyBridgeERC20.ts +1906 -0
- package/typechain-types/contracts/privacyBridge/PrivacyBridgeERC20.sol/index.ts +5 -0
- package/typechain-types/contracts/privacyBridge/PrivacyBridgeUSDCe.ts +1906 -0
- package/typechain-types/contracts/privacyBridge/PrivacyBridgeUSDT.ts +1906 -0
- package/typechain-types/contracts/privacyBridge/PrivacyBridgeWADA.ts +1906 -0
- package/typechain-types/contracts/privacyBridge/PrivacyBridgeWBTC.ts +1906 -0
- package/typechain-types/contracts/privacyBridge/PrivacyBridgeWETH.ts +1906 -0
- package/typechain-types/contracts/privacyBridge/PrivacyBridgegCoti.ts +1906 -0
- package/typechain-types/contracts/privacyBridge/index.ts +13 -0
- package/typechain-types/contracts/token/PrivateERC20/IPrivateERC20.ts +439 -19
- package/typechain-types/contracts/token/PrivateERC20/ITokenReceiver.ts +100 -0
- package/typechain-types/contracts/token/PrivateERC20/ITokenReceiverEncrypted.ts +99 -0
- package/typechain-types/contracts/token/PrivateERC20/PrivateERC20.ts +763 -15
- package/typechain-types/contracts/token/PrivateERC20/index.ts +4 -0
- package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateBridgedUSDC.ts +1270 -0
- package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateCOTI.ts +1270 -0
- package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateCOTITreasuryGovernanceToken.ts +1270 -0
- package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateTetherUSD.ts +1270 -0
- package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateWrappedADA.ts +1270 -0
- package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateWrappedBTC.ts +1270 -0
- package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateWrappedEther.ts +1270 -0
- package/typechain-types/contracts/token/PrivateERC20/tokens/index.ts +10 -0
- 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/AccessControlEnumerable__factory.ts +276 -0
- package/typechain-types/factories/@openzeppelin/contracts/access/AccessControl__factory.ts +250 -0
- package/typechain-types/factories/@openzeppelin/contracts/access/IAccessControlEnumerable__factory.ts +244 -0
- package/typechain-types/factories/@openzeppelin/contracts/access/IAccessControl__factory.ts +218 -0
- 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 +5 -0
- package/typechain-types/factories/@openzeppelin/contracts/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/security/Pausable__factory.ts +61 -0
- package/typechain-types/factories/@openzeppelin/contracts/security/index.ts +4 -0
- package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/ERC20__factory.ts +330 -0
- 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 +247 -0
- package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/index.ts +4 -0
- package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/index.ts +2 -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 +455 -0
- package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata__factory.ts +355 -0
- package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/extensions/index.ts +4 -0
- package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/index.ts +2 -0
- 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 +802 -0
- package/typechain-types/factories/contracts/disperse/coinByRatio/FixedRatioCoinDisperserUnlimitedWindow__factory.ts +749 -0
- package/typechain-types/factories/contracts/disperse/coinByRatio/FixedRatioCoinDisperser__factory.ts +12 -1
- package/typechain-types/factories/contracts/disperse/coinByRatio/index.ts +2 -0
- package/typechain-types/factories/contracts/disperse/disperseToken/MintDisperser.sol/IOwnable__factory.ts +35 -0
- package/typechain-types/factories/contracts/disperse/disperseToken/MintDisperser.sol/MintDisperser__factory.ts +41 -1
- package/typechain-types/factories/contracts/disperse/disperseToken/MintDisperser.sol/index.ts +1 -0
- package/typechain-types/factories/contracts/disperse/disperseToken/TokenDisperser__factory.ts +12 -1
- package/typechain-types/factories/contracts/index.ts +4 -0
- package/typechain-types/factories/contracts/messaging/PrivateMessaging__factory.ts +1035 -0
- package/typechain-types/factories/contracts/messaging/index.ts +4 -0
- package/typechain-types/factories/contracts/mocks/access/DataPrivacyFramework/DataPrivacyFrameworkMock__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/index.ts +2 -0
- package/typechain-types/factories/contracts/mocks/messaging/PrivateMessagingHarness__factory.ts +1161 -0
- package/typechain-types/factories/contracts/mocks/messaging/index.ts +4 -0
- package/typechain-types/factories/contracts/mocks/oracle/CotiPriceConsumerMock__factory.ts +159 -0
- package/typechain-types/factories/contracts/mocks/oracle/index.ts +4 -0
- package/typechain-types/factories/contracts/mocks/token/ERC20DecimalsMock__factory.ts +432 -0
- package/typechain-types/factories/contracts/mocks/token/ERC20Mock__factory.ts +430 -0
- package/typechain-types/factories/contracts/mocks/token/PrivateERC20/EncryptedTokenReceiverMock__factory.ts +125 -0
- package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivacyBridgeERC20Mock__factory.ts +1885 -0
- package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20AuditorSupplyMock__factory.ts +1540 -0
- package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20CappedMock__factory.ts +1492 -0
- package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20GtCallerMock__factory.ts +165 -0
- package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20Mock__factory.ts +794 -52
- package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20ReentrantReceiverMock.sol/IPrivateERC20TransferAndCallEncrypted__factory.ts +54 -0
- package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20ReentrantReceiverMock.sol/PrivateERC20ReentrantReceiverMock__factory.ts +159 -0
- package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20ReentrantReceiverMock.sol/index.ts +5 -0
- package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PublicReentrantTokenReceiverMock__factory.ts +164 -0
- package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PublicTokenReceiverBoolMock__factory.ts +130 -0
- package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PublicTokenReceiverMock__factory.ts +102 -0
- package/typechain-types/factories/contracts/mocks/token/PrivateERC20/index.ts +9 -0
- package/typechain-types/factories/contracts/mocks/token/PrivateERC721/PrivateERC721URIStorageMock__factory.ts +1 -1
- package/typechain-types/factories/contracts/mocks/token/index.ts +2 -0
- 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/MinimalProxy__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/PrivacyProxy__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 +4 -22
- package/typechain-types/factories/contracts/node/CotiNodeRewards__factory.ts +576 -0
- package/typechain-types/factories/contracts/node/SoulboundNodeNFT.sol/IERC5192__factory.ts +54 -0
- package/typechain-types/factories/contracts/node/SoulboundNodeNFT.sol/SoulboundNodeNFT__factory.ts +1072 -0
- package/typechain-types/factories/contracts/node/SoulboundNodeNFT.sol/index.ts +5 -0
- package/typechain-types/factories/contracts/node/index.ts +5 -0
- package/typechain-types/factories/contracts/onboard/AccountOnboard__factory.ts +1 -1
- package/typechain-types/factories/contracts/oracle/CotiPriceConsumer__factory.ts +295 -0
- package/typechain-types/factories/contracts/oracle/ICotiPriceConsumer__factory.ts +73 -0
- package/typechain-types/factories/contracts/oracle/IStdReference__factory.ts +107 -0
- package/typechain-types/factories/contracts/oracle/index.ts +6 -0
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeCotiNative__factory.ts +1753 -0
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeERC20.sol/IHasDecimals__factory.ts +38 -0
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeERC20.sol/PrivacyBridgeERC20__factory.ts +1766 -0
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeERC20.sol/index.ts +5 -0
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeUSDCe__factory.ts +1870 -0
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeUSDT__factory.ts +1870 -0
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeWADA__factory.ts +1870 -0
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeWBTC__factory.ts +1870 -0
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeWETH__factory.ts +1870 -0
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridge__factory.ts +1444 -0
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgegCoti__factory.ts +1870 -0
- package/typechain-types/factories/contracts/privacyBridge/index.ts +12 -0
- package/typechain-types/factories/contracts/token/PrivateERC20/IPrivateERC20__factory.ts +481 -35
- package/typechain-types/factories/contracts/token/PrivateERC20/ITokenReceiverEncrypted__factory.ts +53 -0
- package/typechain-types/factories/contracts/token/PrivateERC20/ITokenReceiver__factory.ts +54 -0
- package/typechain-types/factories/contracts/token/PrivateERC20/PrivateERC20__factory.ts +812 -52
- package/typechain-types/factories/contracts/token/PrivateERC20/index.ts +3 -0
- package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateBridgedUSDC__factory.ts +1471 -0
- package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateCOTITreasuryGovernanceToken__factory.ts +1477 -0
- package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateCOTI__factory.ts +1468 -0
- package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateTetherUSD__factory.ts +1471 -0
- package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateWrappedADA__factory.ts +1471 -0
- package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateWrappedBTC__factory.ts +1471 -0
- package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateWrappedEther__factory.ts +1477 -0
- package/typechain-types/factories/contracts/token/PrivateERC20/tokens/index.ts +10 -0
- 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 +1414 -118
- package/typechain-types/index.ts +138 -2
- package/contracts/mocks/utils/mpc/ArithmeticTestsContract.sol +0 -408
- package/typechain-types/contracts/mocks/utils/mpc/Arithmetic128BitTestsContract.ts +0 -341
- package/typechain-types/contracts/mocks/utils/mpc/Arithmetic256BitTestsContract.ts +0 -347
- package/typechain-types/contracts/mocks/utils/mpc/Bitwise256BitTestsContract.ts +0 -186
- package/typechain-types/contracts/mocks/utils/mpc/Comparison128BitTestsContract.ts +0 -260
- package/typechain-types/contracts/mocks/utils/mpc/Comparison256BitTestsContract.ts +0 -260
- package/typechain-types/contracts/mocks/utils/mpc/Miscellaneous128BitTestsContract.ts +0 -302
- package/typechain-types/contracts/mocks/utils/mpc/Miscellaneous256BitTestsContract.ts +0 -322
- package/typechain-types/factories/contracts/mocks/utils/mpc/Arithmetic128BitTestsContract__factory.ts +0 -349
- package/typechain-types/factories/contracts/mocks/utils/mpc/Arithmetic256BitTestsContract__factory.ts +0 -364
- package/typechain-types/factories/contracts/mocks/utils/mpc/Bitwise128BitTestsContract__factory.ts +0 -182
- package/typechain-types/factories/contracts/mocks/utils/mpc/Bitwise256BitTestsContract__factory.ts +0 -182
- package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison128BitTestsContract__factory.ts +0 -255
- package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison256BitTestsContract__factory.ts +0 -255
- package/typechain-types/factories/contracts/mocks/utils/mpc/Miscellaneous128BitTestsContract__factory.ts +0 -332
- package/typechain-types/factories/contracts/mocks/utils/mpc/Miscellaneous256BitTestsContract__factory.ts +0 -380
|
@@ -1,327 +1,250 @@
|
|
|
1
1
|
import hre from "hardhat"
|
|
2
2
|
import { expect } from "chai"
|
|
3
3
|
import { setupAccounts } from "../../utils/accounts"
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
CotiPriceConsumerMock,
|
|
6
|
+
ERC20DecimalsMock,
|
|
7
|
+
PrivacyBridgeERC20Mock,
|
|
8
|
+
PrivateERC20Mock,
|
|
9
|
+
} from "../../../typechain-types"
|
|
5
10
|
import { Wallet } from "@coti-io/coti-ethers"
|
|
6
|
-
import {
|
|
11
|
+
import { parseEther, parseUnits, ZeroAddress } from "ethers"
|
|
7
12
|
import { txOpts } from "../../utils/privateErc20Helpers"
|
|
8
13
|
|
|
9
14
|
const GAS_LIMIT = 12000000
|
|
10
15
|
|
|
11
|
-
describe("PrivacyBridge Fees", function () {
|
|
16
|
+
describe("PrivacyBridge Fees (dynamic native COTI)", function () {
|
|
12
17
|
let bridge: PrivacyBridgeERC20Mock
|
|
13
18
|
let bridgeAddress: string
|
|
14
19
|
let privateToken: PrivateERC20Mock
|
|
15
20
|
let privateTokenAddress: string
|
|
16
|
-
let publicToken:
|
|
21
|
+
let publicToken: ERC20DecimalsMock
|
|
17
22
|
let publicTokenAddress: string
|
|
23
|
+
let oracle: CotiPriceConsumerMock
|
|
18
24
|
let owner: Wallet
|
|
19
25
|
let user: Wallet
|
|
20
|
-
/** Fee recipient when only two funded accounts exist in `.env` (same as `owner`). */
|
|
21
26
|
let feeRecipient: Wallet
|
|
22
27
|
|
|
23
|
-
const INITIAL_SUPPLY =
|
|
24
|
-
const DEPOSIT_AMOUNT =
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
+
const INITIAL_SUPPLY = parseUnits("1000000", 6)
|
|
29
|
+
const DEPOSIT_AMOUNT = parseUnits("10000", 6)
|
|
30
|
+
|
|
31
|
+
async function syncOracleAndEstimateDepositFee(amount: bigint) {
|
|
32
|
+
await (await oracle.sync()).wait()
|
|
33
|
+
return bridge.estimateDepositFee(amount)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async function syncOracleAndEstimateWithdrawFee(amount: bigint) {
|
|
37
|
+
await (await oracle.sync()).wait()
|
|
38
|
+
return bridge.estimateWithdrawFee(amount)
|
|
39
|
+
}
|
|
28
40
|
|
|
29
41
|
before(async function () {
|
|
30
42
|
;[owner, user] = await setupAccounts()
|
|
31
43
|
feeRecipient = owner
|
|
32
44
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
publicToken = await ERC20Factory.connect(owner).deploy("Public Token", "PUB", txOpts)
|
|
45
|
+
const PublicFactory = await hre.ethers.getContractFactory("ERC20DecimalsMock")
|
|
46
|
+
publicToken = await PublicFactory.connect(owner).deploy("Public Token", "PUB", 6, txOpts)
|
|
36
47
|
await publicToken.waitForDeployment()
|
|
37
48
|
publicTokenAddress = await publicToken.getAddress()
|
|
38
49
|
|
|
39
|
-
// Mint tokens to owner and user
|
|
40
50
|
await publicToken.mint(owner.address, INITIAL_SUPPLY, { gasLimit: GAS_LIMIT })
|
|
41
51
|
await publicToken.mint(user.address, INITIAL_SUPPLY, { gasLimit: GAS_LIMIT })
|
|
42
52
|
|
|
43
|
-
// Deploy private ERC20 token
|
|
44
53
|
const PrivateERC20Factory = await hre.ethers.getContractFactory("PrivateERC20Mock")
|
|
45
54
|
privateToken = await PrivateERC20Factory.connect(owner).deploy(txOpts)
|
|
46
55
|
await privateToken.waitForDeployment()
|
|
47
56
|
privateTokenAddress = await privateToken.getAddress()
|
|
48
57
|
|
|
49
|
-
|
|
58
|
+
const OracleFactory = await hre.ethers.getContractFactory("CotiPriceConsumerMock")
|
|
59
|
+
oracle = await OracleFactory.connect(owner).deploy(txOpts)
|
|
60
|
+
await oracle.waitForDeployment()
|
|
61
|
+
await (await oracle.setRate("COTI", parseEther("1"))).wait()
|
|
62
|
+
await (await oracle.setRate("USDC", parseEther("1"))).wait()
|
|
63
|
+
const oracleAddress = await oracle.getAddress()
|
|
64
|
+
|
|
50
65
|
const BridgeFactory = await hre.ethers.getContractFactory("PrivacyBridgeERC20Mock")
|
|
51
|
-
bridge = await BridgeFactory.connect(owner).deploy(
|
|
66
|
+
bridge = await BridgeFactory.connect(owner).deploy(
|
|
67
|
+
publicTokenAddress,
|
|
68
|
+
privateTokenAddress,
|
|
69
|
+
"USDC",
|
|
70
|
+
feeRecipient.address,
|
|
71
|
+
feeRecipient.address,
|
|
72
|
+
oracleAddress,
|
|
73
|
+
txOpts
|
|
74
|
+
)
|
|
52
75
|
await bridge.waitForDeployment()
|
|
53
76
|
bridgeAddress = await bridge.getAddress()
|
|
54
77
|
|
|
55
|
-
// Fund bridge with public tokens for withdrawals
|
|
56
78
|
await publicToken.connect(owner).transfer(bridgeAddress, INITIAL_SUPPLY / 2n, { gasLimit: GAS_LIMIT })
|
|
79
|
+
|
|
80
|
+
await owner.sendTransaction({ to: user.address, value: parseEther("50") })
|
|
57
81
|
})
|
|
58
82
|
|
|
59
|
-
describe("
|
|
60
|
-
it("
|
|
61
|
-
expect(await bridge.
|
|
62
|
-
expect(await bridge.
|
|
83
|
+
describe("Default dynamic fee parameters", function () {
|
|
84
|
+
it("exposes deposit/withdraw floor, percentage divisor scale, and caps", async function () {
|
|
85
|
+
expect(await bridge.depositFixedFee()).to.equal(parseEther("10"))
|
|
86
|
+
expect(await bridge.depositPercentageBps()).to.equal(500n)
|
|
87
|
+
expect(await bridge.depositMaxFee()).to.equal(parseEther("3000"))
|
|
88
|
+
expect(await bridge.withdrawFixedFee()).to.equal(parseEther("3"))
|
|
89
|
+
expect(await bridge.withdrawPercentageBps()).to.equal(250n)
|
|
90
|
+
expect(await bridge.FEE_DIVISOR()).to.equal(1_000_000n)
|
|
63
91
|
})
|
|
92
|
+
})
|
|
64
93
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
await
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
94
|
+
describe("Oracle and estimates", function () {
|
|
95
|
+
it("reverts deploy when price oracle is zero", async function () {
|
|
96
|
+
const freshFactory = await hre.ethers.getContractFactory("PrivacyBridgeERC20Mock")
|
|
97
|
+
await expect(
|
|
98
|
+
freshFactory
|
|
99
|
+
.connect(owner)
|
|
100
|
+
.deploy(
|
|
101
|
+
publicTokenAddress,
|
|
102
|
+
privateTokenAddress,
|
|
103
|
+
"USDC",
|
|
104
|
+
feeRecipient.address,
|
|
105
|
+
feeRecipient.address,
|
|
106
|
+
ZeroAddress,
|
|
107
|
+
txOpts
|
|
108
|
+
)
|
|
109
|
+
).to.be.revertedWithCustomError(bridge, "InvalidAddress")
|
|
71
110
|
})
|
|
72
111
|
|
|
73
|
-
it("
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
await expect(tx).to.emit(bridge, "FeeUpdated").withArgs("withdraw", ONE_PERCENT_FEE)
|
|
112
|
+
it("reverts setMaxOracleAge(0)", async function () {
|
|
113
|
+
await expect(bridge.connect(owner).setMaxOracleAge(0n, { gasLimit: GAS_LIMIT })).to.be.revertedWithCustomError(
|
|
114
|
+
bridge,
|
|
115
|
+
"OracleMaxAgeZeroDisallowed"
|
|
116
|
+
)
|
|
79
117
|
})
|
|
80
118
|
|
|
81
|
-
it("
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
expect(await bridge.depositFeeBasisPoints()).to.equal(0n)
|
|
119
|
+
it("estimateDepositFee returns fee and timestamps", async function () {
|
|
120
|
+
const [fee, cotiLu, tokenLu] = await syncOracleAndEstimateDepositFee(DEPOSIT_AMOUNT)
|
|
121
|
+
expect(fee).to.be.gt(0n)
|
|
122
|
+
expect(cotiLu).to.equal(tokenLu)
|
|
86
123
|
})
|
|
124
|
+
})
|
|
87
125
|
|
|
88
|
-
|
|
89
|
-
|
|
126
|
+
describe("Operator fee configuration", function () {
|
|
127
|
+
it("allows operator to set deposit dynamic fee and emits DynamicFeeUpdated", async function () {
|
|
128
|
+
const fixedFee = parseEther("2")
|
|
129
|
+
const pct = 1000n
|
|
130
|
+
const maxFee = parseEther("500")
|
|
131
|
+
const tx = await bridge.connect(owner).setDepositDynamicFee(fixedFee, pct, maxFee, { gasLimit: GAS_LIMIT })
|
|
90
132
|
await tx.wait()
|
|
91
|
-
|
|
92
|
-
expect(await bridge.
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
bridge.connect(owner).setDepositFee(MAX_FEE + 1n, { gasLimit: GAS_LIMIT })
|
|
98
|
-
).to.be.revertedWithCustomError(bridge, "InvalidFee")
|
|
133
|
+
expect(await bridge.depositFixedFee()).to.equal(fixedFee)
|
|
134
|
+
expect(await bridge.depositPercentageBps()).to.equal(pct)
|
|
135
|
+
expect(await bridge.depositMaxFee()).to.equal(maxFee)
|
|
136
|
+
await expect(tx)
|
|
137
|
+
.to.emit(bridge, "DynamicFeeUpdated")
|
|
138
|
+
.withArgs("deposit", fixedFee, pct, maxFee)
|
|
99
139
|
})
|
|
100
140
|
|
|
101
|
-
it("
|
|
141
|
+
it("reverts when non-operator sets deposit dynamic fee", async function () {
|
|
142
|
+
const opRole = await bridge.OPERATOR_ROLE()
|
|
102
143
|
await expect(
|
|
103
|
-
bridge.connect(user).
|
|
104
|
-
|
|
144
|
+
bridge.connect(user).setDepositDynamicFee(parseEther("1"), 100n, parseEther("100"), {
|
|
145
|
+
gasLimit: GAS_LIMIT,
|
|
146
|
+
})
|
|
147
|
+
)
|
|
148
|
+
.to.be.revertedWithCustomError(bridge, "AccessControlUnauthorizedAccount")
|
|
149
|
+
.withArgs(user.address, opRole)
|
|
105
150
|
})
|
|
106
151
|
|
|
107
|
-
it("
|
|
152
|
+
it("reverts InvalidFee when percentage exceeds MAX_FEE_UNITS", async function () {
|
|
153
|
+
const maxUnits = await bridge.MAX_FEE_UNITS()
|
|
108
154
|
await expect(
|
|
109
|
-
bridge.connect(
|
|
110
|
-
|
|
155
|
+
bridge.connect(owner).setDepositDynamicFee(parseEther("1"), maxUnits + 1n, parseEther("1000"), {
|
|
156
|
+
gasLimit: GAS_LIMIT,
|
|
157
|
+
})
|
|
158
|
+
).to.be.revertedWithCustomError(bridge, "InvalidFee")
|
|
111
159
|
})
|
|
112
160
|
|
|
113
|
-
// Reset fees to zero for next tests
|
|
114
161
|
after(async function () {
|
|
115
|
-
await bridge
|
|
116
|
-
|
|
162
|
+
await bridge
|
|
163
|
+
.connect(owner)
|
|
164
|
+
.setDepositDynamicFee(parseEther("10"), 500n, parseEther("3000"), { gasLimit: GAS_LIMIT })
|
|
117
165
|
})
|
|
118
166
|
})
|
|
119
167
|
|
|
120
|
-
describe("Deposit with
|
|
121
|
-
it("
|
|
122
|
-
const
|
|
168
|
+
describe("Deposit with native COTI fee", function () {
|
|
169
|
+
it("collects dynamic native fee into accumulatedCotiFees and credits liability", async function () {
|
|
170
|
+
const feesBefore = await bridge.accumulatedCotiFees()
|
|
171
|
+
const liabilityBefore = await bridge.totalUserLiability()
|
|
123
172
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
await tx.wait()
|
|
127
|
-
|
|
128
|
-
const balanceAfter = await publicToken.balanceOf(user.address)
|
|
129
|
-
expect(balanceBefore - balanceAfter).to.equal(DEPOSIT_AMOUNT)
|
|
130
|
-
|
|
131
|
-
// User should receive full amount in private tokens
|
|
132
|
-
const ctBalance = await privateToken["balanceOf(address)"](user.address)
|
|
133
|
-
const privateBalance = await user.decryptValue256(ctBalance)
|
|
134
|
-
expect(privateBalance).to.equal(DEPOSIT_AMOUNT)
|
|
135
|
-
|
|
136
|
-
expect(await bridge.accumulatedFees()).to.equal(0n)
|
|
137
|
-
})
|
|
138
|
-
|
|
139
|
-
it("should deduct 1% fee on deposit", async function () {
|
|
140
|
-
// Set 1% fee
|
|
141
|
-
await bridge.connect(owner).setDepositFee(ONE_PERCENT_FEE, { gasLimit: GAS_LIMIT })
|
|
142
|
-
|
|
143
|
-
const expectedFee = (DEPOSIT_AMOUNT * ONE_PERCENT_FEE) / 10000n
|
|
144
|
-
const expectedAmount = DEPOSIT_AMOUNT - expectedFee
|
|
173
|
+
const [fee, cotiTs, tokenTs] = await syncOracleAndEstimateDepositFee(DEPOSIT_AMOUNT)
|
|
174
|
+
expect(fee).to.be.gt(0n)
|
|
145
175
|
|
|
146
176
|
await publicToken.connect(user).approve(bridgeAddress, DEPOSIT_AMOUNT, { gasLimit: GAS_LIMIT })
|
|
147
|
-
const tx = await bridge
|
|
177
|
+
const tx = await bridge
|
|
178
|
+
.connect(user)
|
|
179
|
+
.deposit(DEPOSIT_AMOUNT, cotiTs, tokenTs, { gasLimit: GAS_LIMIT, value: fee })
|
|
148
180
|
await tx.wait()
|
|
149
181
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
expect(privateBalance).to.equal(DEPOSIT_AMOUNT + expectedAmount) // Previous deposit + this one
|
|
154
|
-
|
|
155
|
-
expect(await bridge.accumulatedFees()).to.equal(expectedFee)
|
|
182
|
+
expect(await bridge.accumulatedCotiFees()).to.equal(feesBefore + fee)
|
|
183
|
+
expect(await bridge.totalUserLiability()).to.equal(liabilityBefore + DEPOSIT_AMOUNT)
|
|
184
|
+
await expect(tx).to.emit(bridge, "Deposit")
|
|
156
185
|
})
|
|
157
186
|
|
|
158
|
-
it("
|
|
159
|
-
|
|
160
|
-
await bridge.connect(owner).setDepositFee(TEN_PERCENT_FEE, { gasLimit: GAS_LIMIT })
|
|
161
|
-
|
|
162
|
-
const previousFees = await bridge.accumulatedFees()
|
|
163
|
-
const expectedFee = (DEPOSIT_AMOUNT * TEN_PERCENT_FEE) / 10000n
|
|
164
|
-
const expectedAmount = DEPOSIT_AMOUNT - expectedFee
|
|
165
|
-
|
|
187
|
+
it("reverts deposit when msg.value is below computed fee", async function () {
|
|
188
|
+
const [, cotiTs, tokenTs] = await syncOracleAndEstimateDepositFee(DEPOSIT_AMOUNT)
|
|
166
189
|
await publicToken.connect(user).approve(bridgeAddress, DEPOSIT_AMOUNT, { gasLimit: GAS_LIMIT })
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
// Reset fee to zero
|
|
174
|
-
after(async function () {
|
|
175
|
-
await bridge.connect(owner).setDepositFee(0n, { gasLimit: GAS_LIMIT })
|
|
190
|
+
await expect(
|
|
191
|
+
bridge.connect(user).deposit(DEPOSIT_AMOUNT, cotiTs, tokenTs, {
|
|
192
|
+
gasLimit: GAS_LIMIT,
|
|
193
|
+
value: 1n,
|
|
194
|
+
})
|
|
195
|
+
).to.be.revertedWithCustomError(bridge, "InsufficientCotiFee")
|
|
176
196
|
})
|
|
177
197
|
})
|
|
178
198
|
|
|
179
|
-
describe("
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
const
|
|
185
|
-
const balance = await user.decryptValue256(ctBalance)
|
|
186
|
-
if (balance < WITHDRAW_AMOUNT) {
|
|
187
|
-
await publicToken.connect(user).approve(bridgeAddress, DEPOSIT_AMOUNT, { gasLimit: GAS_LIMIT })
|
|
188
|
-
await bridge.connect(user).deposit(DEPOSIT_AMOUNT, { gasLimit: GAS_LIMIT })
|
|
189
|
-
}
|
|
190
|
-
})
|
|
191
|
-
|
|
192
|
-
it("should withdraw without fee when fee is zero", async function () {
|
|
193
|
-
const publicBalanceBefore = await publicToken.balanceOf(user.address)
|
|
194
|
-
|
|
195
|
-
const tx = await privateToken.connect(user).transferAndCall(
|
|
196
|
-
bridgeAddress,
|
|
197
|
-
WITHDRAW_AMOUNT,
|
|
198
|
-
"0x",
|
|
199
|
-
{ gasLimit: GAS_LIMIT }
|
|
200
|
-
)
|
|
199
|
+
describe("withdrawCotiFees", function () {
|
|
200
|
+
it("allows owner to sweep accumulated native fees to feeRecipient", async function () {
|
|
201
|
+
const accumulated = await bridge.accumulatedCotiFees()
|
|
202
|
+
expect(accumulated).to.be.gt(0n)
|
|
203
|
+
const recipientBalBefore = await hre.ethers.provider.getBalance(feeRecipient.address)
|
|
204
|
+
const tx = await bridge.connect(owner).withdrawCotiFees(accumulated, { gasLimit: GAS_LIMIT })
|
|
201
205
|
await tx.wait()
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
expect(
|
|
205
|
-
|
|
206
|
-
// No fees accumulated
|
|
207
|
-
expect(await bridge.accumulatedFees()).to.be.greaterThan(0n) // From previous deposit tests
|
|
208
|
-
})
|
|
209
|
-
|
|
210
|
-
it("should deduct 1% fee on withdrawal", async function () {
|
|
211
|
-
// Set 1% fee
|
|
212
|
-
await bridge.connect(owner).setWithdrawFee(ONE_PERCENT_FEE, { gasLimit: GAS_LIMIT })
|
|
213
|
-
|
|
214
|
-
const previousFees = await bridge.accumulatedFees()
|
|
215
|
-
const expectedFee = (WITHDRAW_AMOUNT * ONE_PERCENT_FEE) / 10000n
|
|
216
|
-
const expectedAmount = WITHDRAW_AMOUNT - expectedFee
|
|
217
|
-
|
|
218
|
-
const publicBalanceBefore = await publicToken.balanceOf(user.address)
|
|
219
|
-
|
|
220
|
-
const tx = await privateToken.connect(user).transferAndCall(
|
|
221
|
-
bridgeAddress,
|
|
222
|
-
WITHDRAW_AMOUNT,
|
|
223
|
-
"0x",
|
|
224
|
-
{ gasLimit: GAS_LIMIT }
|
|
225
|
-
)
|
|
226
|
-
await tx.wait()
|
|
227
|
-
|
|
228
|
-
const publicBalanceAfter = await publicToken.balanceOf(user.address)
|
|
229
|
-
expect(publicBalanceAfter - publicBalanceBefore).to.equal(expectedAmount)
|
|
230
|
-
|
|
231
|
-
expect(await bridge.accumulatedFees()).to.equal(previousFees + expectedFee)
|
|
206
|
+
const recipientBalAfter = await hre.ethers.provider.getBalance(feeRecipient.address)
|
|
207
|
+
expect(recipientBalAfter - recipientBalBefore).to.equal(accumulated)
|
|
208
|
+
expect(await bridge.accumulatedCotiFees()).to.equal(0n)
|
|
232
209
|
})
|
|
233
210
|
|
|
234
|
-
it("
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
const previousFees = await bridge.accumulatedFees()
|
|
239
|
-
const expectedFee = (WITHDRAW_AMOUNT * TEN_PERCENT_FEE) / 10000n
|
|
240
|
-
const expectedAmount = WITHDRAW_AMOUNT - expectedFee
|
|
241
|
-
|
|
242
|
-
const publicBalanceBefore = await publicToken.balanceOf(user.address)
|
|
243
|
-
|
|
244
|
-
const tx = await privateToken.connect(user).transferAndCall(
|
|
245
|
-
bridgeAddress,
|
|
246
|
-
WITHDRAW_AMOUNT,
|
|
247
|
-
"0x",
|
|
248
|
-
{ gasLimit: GAS_LIMIT }
|
|
249
|
-
)
|
|
250
|
-
await tx.wait()
|
|
251
|
-
|
|
252
|
-
const publicBalanceAfter = await publicToken.balanceOf(user.address)
|
|
253
|
-
expect(publicBalanceAfter - publicBalanceBefore).to.equal(expectedAmount)
|
|
254
|
-
|
|
255
|
-
expect(await bridge.accumulatedFees()).to.equal(previousFees + expectedFee)
|
|
211
|
+
it("reverts withdrawCotiFees for non-owner", async function () {
|
|
212
|
+
await expect(
|
|
213
|
+
bridge.connect(user).withdrawCotiFees(1n, { gasLimit: GAS_LIMIT })
|
|
214
|
+
).to.be.revertedWithCustomError(bridge, "OwnableUnauthorizedAccount")
|
|
256
215
|
})
|
|
257
216
|
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
217
|
+
it("reverts withdrawCotiFees with zero amount", async function () {
|
|
218
|
+
await expect(
|
|
219
|
+
bridge.connect(owner).withdrawCotiFees(0n, { gasLimit: GAS_LIMIT })
|
|
220
|
+
).to.be.revertedWithCustomError(bridge, "AmountZero")
|
|
261
221
|
})
|
|
262
222
|
})
|
|
263
223
|
|
|
264
|
-
describe("
|
|
265
|
-
|
|
266
|
-
const
|
|
267
|
-
expect(accumulatedFees).to.be.greaterThan(0n)
|
|
268
|
-
|
|
269
|
-
const recipientBalanceBefore = await publicToken.balanceOf(feeRecipient.address)
|
|
270
|
-
|
|
271
|
-
const tx = await bridge.connect(owner).withdrawFees(
|
|
272
|
-
feeRecipient.address,
|
|
273
|
-
accumulatedFees,
|
|
274
|
-
{ gasLimit: GAS_LIMIT }
|
|
275
|
-
)
|
|
276
|
-
await tx.wait()
|
|
277
|
-
|
|
278
|
-
const recipientBalanceAfter = await publicToken.balanceOf(feeRecipient.address)
|
|
279
|
-
expect(recipientBalanceAfter - recipientBalanceBefore).to.equal(accumulatedFees)
|
|
280
|
-
|
|
281
|
-
expect(await bridge.accumulatedFees()).to.equal(0n)
|
|
282
|
-
await expect(tx).to.emit(bridge, "FeesWithdrawn").withArgs(feeRecipient.address, accumulatedFees)
|
|
283
|
-
})
|
|
284
|
-
|
|
285
|
-
it("should allow partial withdrawal of fees", async function () {
|
|
286
|
-
// Accumulate some fees first
|
|
287
|
-
await bridge.connect(owner).setDepositFee(ONE_PERCENT_FEE, { gasLimit: GAS_LIMIT })
|
|
224
|
+
describe("Withdraw path (native fee + public token)", function () {
|
|
225
|
+
before(async function () {
|
|
226
|
+
const [fee, cotiTs, tokenTs] = await syncOracleAndEstimateDepositFee(DEPOSIT_AMOUNT)
|
|
288
227
|
await publicToken.connect(user).approve(bridgeAddress, DEPOSIT_AMOUNT, { gasLimit: GAS_LIMIT })
|
|
289
|
-
await bridge.connect(user).deposit(DEPOSIT_AMOUNT,
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
await bridge.connect(owner).withdrawFees(feeRecipient.address, withdrawAmount, { gasLimit: GAS_LIMIT })
|
|
295
|
-
|
|
296
|
-
expect(await bridge.accumulatedFees()).to.equal(accumulatedFees - withdrawAmount)
|
|
297
|
-
|
|
298
|
-
// Reset
|
|
299
|
-
await bridge.connect(owner).setDepositFee(0n, { gasLimit: GAS_LIMIT })
|
|
228
|
+
await bridge.connect(user).deposit(DEPOSIT_AMOUNT, cotiTs, tokenTs, {
|
|
229
|
+
gasLimit: GAS_LIMIT,
|
|
230
|
+
value: fee,
|
|
231
|
+
})
|
|
300
232
|
})
|
|
301
233
|
|
|
302
|
-
it("
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
).to.be.revertedWithCustomError(bridge, "OwnableUnauthorizedAccount")
|
|
306
|
-
})
|
|
234
|
+
it("withdraw burns private and releases public after paying native fee", async function () {
|
|
235
|
+
const withdrawAmount = parseUnits("1000", 6)
|
|
236
|
+
const [wFee, cotiTs2, tokenTs2] = await syncOracleAndEstimateWithdrawFee(withdrawAmount)
|
|
307
237
|
|
|
308
|
-
|
|
309
|
-
await expect(
|
|
310
|
-
bridge.connect(owner).withdrawFees(hre.ethers.ZeroAddress, 100n, { gasLimit: GAS_LIMIT })
|
|
311
|
-
).to.be.revertedWithCustomError(bridge, "InvalidAddress")
|
|
312
|
-
})
|
|
238
|
+
await privateToken.connect(user).approve(bridgeAddress, withdrawAmount, { gasLimit: GAS_LIMIT })
|
|
313
239
|
|
|
314
|
-
|
|
315
|
-
await
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
await expect(
|
|
323
|
-
bridge.connect(owner).withdrawFees(feeRecipient.address, accumulatedFees + 1n, { gasLimit: GAS_LIMIT })
|
|
324
|
-
).to.be.revertedWithCustomError(bridge, "InsufficientAccumulatedFees")
|
|
240
|
+
const publicBefore = await publicToken.balanceOf(user.address)
|
|
241
|
+
const tx = await bridge.connect(user).withdraw(withdrawAmount, cotiTs2, tokenTs2, {
|
|
242
|
+
gasLimit: GAS_LIMIT,
|
|
243
|
+
value: wFee,
|
|
244
|
+
})
|
|
245
|
+
await tx.wait()
|
|
246
|
+
const publicAfter = await publicToken.balanceOf(user.address)
|
|
247
|
+
expect(publicAfter - publicBefore).to.equal(withdrawAmount)
|
|
325
248
|
})
|
|
326
249
|
})
|
|
327
250
|
})
|
|
@@ -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
|
+
})
|