@coti-io/coti-contracts 1.2.0 → 1.3.0
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/messaging/PrivateMessaging.sol +456 -0
- 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/PrivateERC20/PrivacyBridgeERC20Mock.sol +8 -3
- package/contracts/node/SoulboundNodeNFT.sol +22 -22
- package/contracts/oracle/CotiPriceConsumer.sol +103 -0
- package/contracts/oracle/ICotiPriceConsumer.sol +15 -0
- package/contracts/oracle/IStdReference.sol +26 -0
- package/contracts/privacyBridge/PrivacyBridge.sol +373 -91
- package/contracts/privacyBridge/PrivacyBridgeCotiNative.sol +209 -161
- package/contracts/privacyBridge/PrivacyBridgeERC20.sol +241 -159
- package/contracts/privacyBridge/PrivacyBridgeUSDCe.sol +7 -1
- package/contracts/privacyBridge/PrivacyBridgeUSDT.sol +7 -1
- package/contracts/privacyBridge/PrivacyBridgeWADA.sol +7 -1
- package/contracts/privacyBridge/PrivacyBridgeWBTC.sol +7 -1
- package/contracts/privacyBridge/PrivacyBridgeWETH.sol +7 -1
- package/contracts/privacyBridge/PrivacyBridgegCoti.sol +7 -1
- package/hardhat.config.ts +5 -2
- package/package.json +2 -2
- 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/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/sonar-project.properties +11 -0
- package/test/messaging/PrivateMessaging.test.ts +158 -0
- package/test/privacyBridge/UnifiedPrivacyBridges.test.cjs +1663 -0
- package/test/token/PrivateERC20/PrivacyBridge.fees.test.ts +162 -239
- 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/index.ts +4 -0
- package/typechain-types/@openzeppelin/contracts/index.ts +2 -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 +330 -0
- package/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.ts +286 -0
- package/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/index.ts +1 -0
- package/typechain-types/@openzeppelin/contracts/token/ERC20/index.ts +1 -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/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 +349 -0
- package/typechain-types/contracts/mocks/token/ERC20Mock.ts +368 -0
- package/typechain-types/contracts/mocks/token/PrivateERC20/EncryptedTokenReceiverMock.ts +108 -0
- package/typechain-types/contracts/mocks/token/PrivateERC20/PrivacyBridgeERC20Mock.ts +1892 -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 +1628 -0
- package/typechain-types/contracts/privacyBridge/PrivacyBridgeCotiNative.ts +1870 -0
- package/typechain-types/contracts/privacyBridge/PrivacyBridgeERC20.sol/IHasDecimals.ts +84 -0
- package/typechain-types/contracts/privacyBridge/PrivacyBridgeERC20.sol/PrivacyBridgeERC20.ts +1892 -0
- package/typechain-types/contracts/privacyBridge/PrivacyBridgeERC20.sol/index.ts +5 -0
- package/typechain-types/contracts/privacyBridge/PrivacyBridgeUSDCe.ts +1892 -0
- package/typechain-types/contracts/privacyBridge/PrivacyBridgeUSDT.ts +1892 -0
- package/typechain-types/contracts/privacyBridge/PrivacyBridgeWADA.ts +1892 -0
- package/typechain-types/contracts/privacyBridge/PrivacyBridgeWBTC.ts +1892 -0
- package/typechain-types/contracts/privacyBridge/PrivacyBridgeWETH.ts +1892 -0
- package/typechain-types/contracts/privacyBridge/PrivacyBridgegCoti.ts +1892 -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/factories/@openzeppelin/contracts/access/AccessControlEnumerable__factory.ts +276 -0
- package/typechain-types/factories/@openzeppelin/contracts/access/AccessControl__factory.ts +229 -0
- package/typechain-types/factories/@openzeppelin/contracts/access/IAccessControlEnumerable__factory.ts +244 -0
- package/typechain-types/factories/@openzeppelin/contracts/access/IAccessControl__factory.ts +197 -0
- package/typechain-types/factories/@openzeppelin/contracts/access/index.ts +4 -0
- package/typechain-types/factories/@openzeppelin/contracts/index.ts +1 -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 +356 -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 +1 -0
- package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/index.ts +1 -0
- package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/ERC721__factory.ts +416 -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/contracts/disperse/coinByRatio/FixedRatioCoinDisperserLeftoverS1__factory.ts +791 -0
- package/typechain-types/factories/contracts/disperse/coinByRatio/FixedRatioCoinDisperserUnlimitedWindow__factory.ts +711 -0
- package/typechain-types/factories/contracts/disperse/coinByRatio/FixedRatioCoinDisperser__factory.ts +1 -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 +19 -1
- package/typechain-types/factories/contracts/disperse/disperseToken/MintDisperser.sol/index.ts +1 -0
- package/typechain-types/factories/contracts/disperse/disperseToken/TokenDisperser__factory.ts +1 -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 +394 -0
- package/typechain-types/factories/contracts/mocks/token/ERC20Mock__factory.ts +392 -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 +1797 -0
- package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20AuditorSupplyMock__factory.ts +1514 -0
- package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20CappedMock__factory.ts +1466 -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 +771 -55
- 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 +549 -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 +947 -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 +1676 -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 +1678 -0
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeERC20.sol/index.ts +5 -0
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeUSDCe__factory.ts +1782 -0
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeUSDT__factory.ts +1782 -0
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeWADA__factory.ts +1782 -0
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeWBTC__factory.ts +1782 -0
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeWETH__factory.ts +1782 -0
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridge__factory.ts +1367 -0
- package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgegCoti__factory.ts +1782 -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 +793 -59
- package/typechain-types/factories/contracts/token/PrivateERC20/index.ts +3 -0
- package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateBridgedUSDC__factory.ts +1445 -0
- package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateCOTITreasuryGovernanceToken__factory.ts +1451 -0
- package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateCOTI__factory.ts +1442 -0
- package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateTetherUSD__factory.ts +1445 -0
- package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateWrappedADA__factory.ts +1445 -0
- package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateWrappedBTC__factory.ts +1445 -0
- package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateWrappedEther__factory.ts +1451 -0
- package/typechain-types/factories/contracts/token/PrivateERC20/tokens/index.ts +10 -0
- package/typechain-types/factories/contracts/utils/mpc/MpcCore__factory.ts +1 -1
- package/typechain-types/hardhat.d.ts +953 -17
- package/typechain-types/index.ts +104 -0
- 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
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.19;
|
|
3
|
+
|
|
4
|
+
import "../utils/mpc/MpcCore.sol";
|
|
5
|
+
|
|
6
|
+
contract PrivateMessaging {
|
|
7
|
+
error InvalidEpochDuration();
|
|
8
|
+
error InvalidRecipient();
|
|
9
|
+
error MessageNotFound();
|
|
10
|
+
error UnauthorizedViewer();
|
|
11
|
+
error ZeroValue();
|
|
12
|
+
error InvalidChunkCount();
|
|
13
|
+
error ChunkTooLarge();
|
|
14
|
+
error ChunkOutOfBounds();
|
|
15
|
+
error EpochStillActive();
|
|
16
|
+
error NothingToClaim();
|
|
17
|
+
error AlreadyClaimed();
|
|
18
|
+
error NativeTransferFailed();
|
|
19
|
+
error PastEpochFundingNotAllowed();
|
|
20
|
+
|
|
21
|
+
event MessageSent(
|
|
22
|
+
uint256 indexed messageId,
|
|
23
|
+
address indexed from,
|
|
24
|
+
address indexed to,
|
|
25
|
+
uint256 epoch
|
|
26
|
+
);
|
|
27
|
+
event RewardFunded(uint256 indexed epoch, address indexed funder, uint256 amount);
|
|
28
|
+
event RewardClaimed(uint256 indexed epoch, address indexed agent, uint256 amount);
|
|
29
|
+
|
|
30
|
+
struct MessageRecord {
|
|
31
|
+
bool exists;
|
|
32
|
+
address from;
|
|
33
|
+
address to;
|
|
34
|
+
uint64 timestamp;
|
|
35
|
+
uint64 epoch;
|
|
36
|
+
uint32 chunkCount;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
struct MessageView {
|
|
40
|
+
uint256 id;
|
|
41
|
+
address from;
|
|
42
|
+
address to;
|
|
43
|
+
uint64 timestamp;
|
|
44
|
+
uint64 epoch;
|
|
45
|
+
uint32 chunkCount;
|
|
46
|
+
ctString ciphertext;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
uint8 public constant MAX_CHUNK_CELLS = 3;
|
|
50
|
+
uint32 public constant MAX_CHUNKS_PER_MESSAGE = 64;
|
|
51
|
+
|
|
52
|
+
uint64 public immutable epochDuration;
|
|
53
|
+
uint64 public immutable genesisTimestamp;
|
|
54
|
+
|
|
55
|
+
uint256 private _nextMessageId;
|
|
56
|
+
|
|
57
|
+
mapping(uint256 => MessageRecord) private _messages;
|
|
58
|
+
mapping(uint256 => mapping(uint256 => ctString)) private _networkCiphertexts;
|
|
59
|
+
mapping(uint256 => mapping(uint256 => ctString)) private _senderCiphertexts;
|
|
60
|
+
mapping(uint256 => mapping(uint256 => ctString)) private _recipientCiphertexts;
|
|
61
|
+
mapping(address => uint256[]) private _inboxMessageIds;
|
|
62
|
+
mapping(address => uint256[]) private _sentMessageIds;
|
|
63
|
+
|
|
64
|
+
mapping(uint256 => mapping(address => uint256)) public epochUsageUnits;
|
|
65
|
+
mapping(uint256 => uint256) public epochTotalUsageUnits;
|
|
66
|
+
mapping(uint256 => uint256) public epochRewardPool;
|
|
67
|
+
mapping(uint256 => uint256) public epochClaimedAmount;
|
|
68
|
+
mapping(uint256 => uint256) public epochClaimedUsageUnits;
|
|
69
|
+
mapping(uint256 => mapping(address => bool)) public epochHasClaimed;
|
|
70
|
+
|
|
71
|
+
constructor(uint64 epochDurationSeconds) payable {
|
|
72
|
+
if (epochDurationSeconds == 0) {
|
|
73
|
+
revert InvalidEpochDuration();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
epochDuration = epochDurationSeconds;
|
|
77
|
+
genesisTimestamp = uint64(block.timestamp);
|
|
78
|
+
|
|
79
|
+
if (msg.value > 0) {
|
|
80
|
+
_fundEpoch(currentEpoch(), msg.sender, msg.value);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
receive() external payable {
|
|
85
|
+
_fundEpoch(currentEpoch(), msg.sender, msg.value);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function currentEpoch() public view returns (uint256) {
|
|
89
|
+
return (block.timestamp - genesisTimestamp) / epochDuration;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function epochForTimestamp(uint256 timestamp) public view returns (uint256) {
|
|
93
|
+
if (timestamp < genesisTimestamp) {
|
|
94
|
+
return 0;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return (timestamp - genesisTimestamp) / epochDuration;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function fundEpoch(uint256 epoch) external payable {
|
|
101
|
+
if (msg.value == 0) {
|
|
102
|
+
revert ZeroValue();
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (epoch < currentEpoch()) {
|
|
106
|
+
revert PastEpochFundingNotAllowed();
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
_fundEpoch(epoch, msg.sender, msg.value);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function sendMessage(address to, itString calldata encryptedMessage) external returns (uint256 messageId) {
|
|
113
|
+
if (to == address(0) || to == msg.sender) {
|
|
114
|
+
revert InvalidRecipient();
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
uint256 usageUnits = _validateEncryptedChunk(encryptedMessage);
|
|
118
|
+
|
|
119
|
+
messageId = _createMessageRecord(msg.sender, to, 1);
|
|
120
|
+
|
|
121
|
+
gtString memory validatedMessage = MpcCore.validateCiphertext(encryptedMessage);
|
|
122
|
+
_storeChunkCiphertexts(
|
|
123
|
+
messageId,
|
|
124
|
+
0,
|
|
125
|
+
MpcCore.offBoard(validatedMessage),
|
|
126
|
+
MpcCore.offBoardToUser(validatedMessage, msg.sender),
|
|
127
|
+
MpcCore.offBoardToUser(validatedMessage, to)
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
_addEpochUsage(_messages[messageId].epoch, msg.sender, usageUnits);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function sendMultipartMessage(address to, itString[] calldata encryptedChunks)
|
|
134
|
+
external
|
|
135
|
+
returns (uint256 messageId)
|
|
136
|
+
{
|
|
137
|
+
if (to == address(0) || to == msg.sender) {
|
|
138
|
+
revert InvalidRecipient();
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
uint256 chunkCount = encryptedChunks.length;
|
|
142
|
+
if (chunkCount == 0 || chunkCount > MAX_CHUNKS_PER_MESSAGE) {
|
|
143
|
+
revert InvalidChunkCount();
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
uint256 usageUnits;
|
|
147
|
+
for (uint256 i = 0; i < chunkCount; i++) {
|
|
148
|
+
usageUnits += _validateEncryptedChunk(encryptedChunks[i]);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
messageId = _createMessageRecord(msg.sender, to, chunkCount);
|
|
152
|
+
|
|
153
|
+
for (uint256 i = 0; i < chunkCount; i++) {
|
|
154
|
+
gtString memory validatedMessage = MpcCore.validateCiphertext(encryptedChunks[i]);
|
|
155
|
+
_storeChunkCiphertexts(
|
|
156
|
+
messageId,
|
|
157
|
+
i,
|
|
158
|
+
MpcCore.offBoard(validatedMessage),
|
|
159
|
+
MpcCore.offBoardToUser(validatedMessage, msg.sender),
|
|
160
|
+
MpcCore.offBoardToUser(validatedMessage, to)
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
_addEpochUsage(_messages[messageId].epoch, msg.sender, usageUnits);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function getMessageMetadata(uint256 messageId)
|
|
168
|
+
external
|
|
169
|
+
view
|
|
170
|
+
returns (address from, address to, uint64 timestamp, uint64 epoch)
|
|
171
|
+
{
|
|
172
|
+
MessageRecord storage record = _requireMessage(messageId);
|
|
173
|
+
return (record.from, record.to, record.timestamp, record.epoch);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function getMessage(uint256 messageId) external view returns (MessageView memory messageView) {
|
|
177
|
+
MessageRecord storage record = _requireMessage(messageId);
|
|
178
|
+
ctString memory ciphertext = _messageCiphertextForViewer(messageId, record, msg.sender, 0);
|
|
179
|
+
|
|
180
|
+
return MessageView({
|
|
181
|
+
id: messageId,
|
|
182
|
+
from: record.from,
|
|
183
|
+
to: record.to,
|
|
184
|
+
timestamp: record.timestamp,
|
|
185
|
+
epoch: record.epoch,
|
|
186
|
+
chunkCount: record.chunkCount,
|
|
187
|
+
ciphertext: ciphertext
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
function getMessageChunkCount(uint256 messageId) external view returns (uint256 chunkCount) {
|
|
192
|
+
MessageRecord storage record = _requireMessage(messageId);
|
|
193
|
+
return record.chunkCount;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function getMessageChunk(uint256 messageId, uint256 chunkIndex)
|
|
197
|
+
external
|
|
198
|
+
view
|
|
199
|
+
returns (ctString memory ciphertext)
|
|
200
|
+
{
|
|
201
|
+
MessageRecord storage record = _requireMessage(messageId);
|
|
202
|
+
return _messageCiphertextForViewer(messageId, record, msg.sender, chunkIndex);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
function getSenderCiphertext(uint256 messageId) external view returns (ctString memory ciphertext) {
|
|
206
|
+
_requireMessage(messageId);
|
|
207
|
+
return _senderCiphertexts[messageId][0];
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function getSenderChunkCiphertext(uint256 messageId, uint256 chunkIndex)
|
|
211
|
+
external
|
|
212
|
+
view
|
|
213
|
+
returns (ctString memory ciphertext)
|
|
214
|
+
{
|
|
215
|
+
MessageRecord storage record = _requireMessage(messageId);
|
|
216
|
+
_requireChunkIndex(record, chunkIndex);
|
|
217
|
+
return _senderCiphertexts[messageId][chunkIndex];
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
function getRecipientCiphertext(uint256 messageId) external view returns (ctString memory ciphertext) {
|
|
221
|
+
_requireMessage(messageId);
|
|
222
|
+
return _recipientCiphertexts[messageId][0];
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
function getRecipientChunkCiphertext(uint256 messageId, uint256 chunkIndex)
|
|
226
|
+
external
|
|
227
|
+
view
|
|
228
|
+
returns (ctString memory ciphertext)
|
|
229
|
+
{
|
|
230
|
+
MessageRecord storage record = _requireMessage(messageId);
|
|
231
|
+
_requireChunkIndex(record, chunkIndex);
|
|
232
|
+
return _recipientCiphertexts[messageId][chunkIndex];
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
function getNetworkCiphertext(uint256 messageId) external view returns (ctString memory ciphertext) {
|
|
236
|
+
_requireMessage(messageId);
|
|
237
|
+
return _networkCiphertexts[messageId][0];
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
function getNetworkChunkCiphertext(uint256 messageId, uint256 chunkIndex)
|
|
241
|
+
external
|
|
242
|
+
view
|
|
243
|
+
returns (ctString memory ciphertext)
|
|
244
|
+
{
|
|
245
|
+
MessageRecord storage record = _requireMessage(messageId);
|
|
246
|
+
_requireChunkIndex(record, chunkIndex);
|
|
247
|
+
return _networkCiphertexts[messageId][chunkIndex];
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
function inboxCount(address account) external view returns (uint256) {
|
|
251
|
+
return _inboxMessageIds[account].length;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
function sentCount(address account) external view returns (uint256) {
|
|
255
|
+
return _sentMessageIds[account].length;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
function getInboxPage(
|
|
259
|
+
address account,
|
|
260
|
+
uint256 offset,
|
|
261
|
+
uint256 limit
|
|
262
|
+
) external view returns (uint256[] memory messageIds) {
|
|
263
|
+
return _slice(_inboxMessageIds[account], offset, limit);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
function getSentPage(
|
|
267
|
+
address account,
|
|
268
|
+
uint256 offset,
|
|
269
|
+
uint256 limit
|
|
270
|
+
) external view returns (uint256[] memory messageIds) {
|
|
271
|
+
return _slice(_sentMessageIds[account], offset, limit);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
function pendingRewards(uint256 epoch, address agent) public view returns (uint256) {
|
|
275
|
+
if (epoch >= currentEpoch() || epochHasClaimed[epoch][agent]) {
|
|
276
|
+
return 0;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
uint256 usage = epochUsageUnits[epoch][agent];
|
|
280
|
+
uint256 totalUsage = epochTotalUsageUnits[epoch];
|
|
281
|
+
uint256 rewardPool = epochRewardPool[epoch];
|
|
282
|
+
|
|
283
|
+
if (usage == 0 || totalUsage == 0 || rewardPool == 0) {
|
|
284
|
+
return 0;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
uint256 claimedUsage = epochClaimedUsageUnits[epoch];
|
|
288
|
+
uint256 claimedAmount = epochClaimedAmount[epoch];
|
|
289
|
+
|
|
290
|
+
uint256 remainingUsage = totalUsage - claimedUsage;
|
|
291
|
+
uint256 remainingPool = rewardPool - claimedAmount;
|
|
292
|
+
|
|
293
|
+
if (usage == remainingUsage) {
|
|
294
|
+
return remainingPool;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
return (remainingPool * usage) / remainingUsage;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
function claimRewards(uint256 epoch) external returns (uint256 amount) {
|
|
301
|
+
if (epoch >= currentEpoch()) {
|
|
302
|
+
revert EpochStillActive();
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
if (epochHasClaimed[epoch][msg.sender]) {
|
|
306
|
+
revert AlreadyClaimed();
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
amount = pendingRewards(epoch, msg.sender);
|
|
310
|
+
if (amount == 0) {
|
|
311
|
+
revert NothingToClaim();
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
uint256 usage = epochUsageUnits[epoch][msg.sender];
|
|
315
|
+
|
|
316
|
+
epochHasClaimed[epoch][msg.sender] = true;
|
|
317
|
+
epochClaimedUsageUnits[epoch] += usage;
|
|
318
|
+
epochClaimedAmount[epoch] += amount;
|
|
319
|
+
|
|
320
|
+
(bool success, ) = payable(msg.sender).call{value: amount}("");
|
|
321
|
+
if (!success) {
|
|
322
|
+
revert NativeTransferFailed();
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
emit RewardClaimed(epoch, msg.sender, amount);
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
function getEpochSummary(uint256 epoch)
|
|
329
|
+
external
|
|
330
|
+
view
|
|
331
|
+
returns (
|
|
332
|
+
uint256 totalUsageUnits,
|
|
333
|
+
uint256 rewardPool,
|
|
334
|
+
uint256 claimedAmount,
|
|
335
|
+
uint256 claimedUsageUnits
|
|
336
|
+
)
|
|
337
|
+
{
|
|
338
|
+
return (
|
|
339
|
+
epochTotalUsageUnits[epoch],
|
|
340
|
+
epochRewardPool[epoch],
|
|
341
|
+
epochClaimedAmount[epoch],
|
|
342
|
+
epochClaimedUsageUnits[epoch]
|
|
343
|
+
);
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
function _fundEpoch(uint256 epoch, address funder, uint256 amount) internal {
|
|
347
|
+
if (amount == 0) {
|
|
348
|
+
revert ZeroValue();
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
epochRewardPool[epoch] += amount;
|
|
352
|
+
emit RewardFunded(epoch, funder, amount);
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
function _createMessageRecord(
|
|
356
|
+
address from,
|
|
357
|
+
address to,
|
|
358
|
+
uint256 chunkCount
|
|
359
|
+
) internal returns (uint256 messageId) {
|
|
360
|
+
uint256 epoch = currentEpoch();
|
|
361
|
+
messageId = _nextMessageId++;
|
|
362
|
+
|
|
363
|
+
MessageRecord storage record = _messages[messageId];
|
|
364
|
+
record.exists = true;
|
|
365
|
+
record.from = from;
|
|
366
|
+
record.to = to;
|
|
367
|
+
record.timestamp = uint64(block.timestamp);
|
|
368
|
+
record.epoch = uint64(epoch);
|
|
369
|
+
record.chunkCount = uint32(chunkCount);
|
|
370
|
+
|
|
371
|
+
_sentMessageIds[from].push(messageId);
|
|
372
|
+
_inboxMessageIds[to].push(messageId);
|
|
373
|
+
|
|
374
|
+
emit MessageSent(messageId, from, to, epoch);
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
function _addEpochUsage(uint256 epoch, address from, uint256 usageUnits) internal {
|
|
378
|
+
epochUsageUnits[epoch][from] += usageUnits;
|
|
379
|
+
epochTotalUsageUnits[epoch] += usageUnits;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
function _storeChunkCiphertexts(
|
|
383
|
+
uint256 messageId,
|
|
384
|
+
uint256 chunkIndex,
|
|
385
|
+
ctString memory networkCiphertext,
|
|
386
|
+
ctString memory senderCiphertext,
|
|
387
|
+
ctString memory recipientCiphertext
|
|
388
|
+
) internal {
|
|
389
|
+
_networkCiphertexts[messageId][chunkIndex] = networkCiphertext;
|
|
390
|
+
_senderCiphertexts[messageId][chunkIndex] = senderCiphertext;
|
|
391
|
+
_recipientCiphertexts[messageId][chunkIndex] = recipientCiphertext;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
function _messageCiphertextForViewer(
|
|
395
|
+
uint256 messageId,
|
|
396
|
+
MessageRecord storage record,
|
|
397
|
+
address viewer,
|
|
398
|
+
uint256 chunkIndex
|
|
399
|
+
) internal view returns (ctString memory ciphertext) {
|
|
400
|
+
_requireChunkIndex(record, chunkIndex);
|
|
401
|
+
|
|
402
|
+
if (viewer == record.from) {
|
|
403
|
+
return _senderCiphertexts[messageId][chunkIndex];
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
if (viewer == record.to) {
|
|
407
|
+
return _recipientCiphertexts[messageId][chunkIndex];
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
revert UnauthorizedViewer();
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
function _validateEncryptedChunk(itString calldata encryptedChunk) internal pure returns (uint256 cells) {
|
|
414
|
+
cells = encryptedChunk.ciphertext.value.length;
|
|
415
|
+
if (
|
|
416
|
+
cells == 0 ||
|
|
417
|
+
cells != encryptedChunk.signature.length ||
|
|
418
|
+
cells > MAX_CHUNK_CELLS
|
|
419
|
+
) {
|
|
420
|
+
revert ChunkTooLarge();
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
function _slice(
|
|
425
|
+
uint256[] storage source,
|
|
426
|
+
uint256 offset,
|
|
427
|
+
uint256 limit
|
|
428
|
+
) internal view returns (uint256[] memory page) {
|
|
429
|
+
if (offset >= source.length || limit == 0) {
|
|
430
|
+
return new uint256[](0);
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
uint256 end = offset + limit;
|
|
434
|
+
if (end > source.length) {
|
|
435
|
+
end = source.length;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
page = new uint256[](end - offset);
|
|
439
|
+
for (uint256 i = offset; i < end; i++) {
|
|
440
|
+
page[i - offset] = source[i];
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
function _requireMessage(uint256 messageId) internal view returns (MessageRecord storage record) {
|
|
445
|
+
record = _messages[messageId];
|
|
446
|
+
if (!record.exists) {
|
|
447
|
+
revert MessageNotFound();
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
function _requireChunkIndex(MessageRecord storage record, uint256 chunkIndex) internal view {
|
|
452
|
+
if (chunkIndex >= record.chunkCount) {
|
|
453
|
+
revert ChunkOutOfBounds();
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.19;
|
|
3
|
+
|
|
4
|
+
import "../../messaging/PrivateMessaging.sol";
|
|
5
|
+
|
|
6
|
+
contract PrivateMessagingHarness is PrivateMessaging {
|
|
7
|
+
constructor(uint64 epochDurationSeconds) PrivateMessaging(epochDurationSeconds) {}
|
|
8
|
+
|
|
9
|
+
function recordSyntheticMessage(
|
|
10
|
+
address from,
|
|
11
|
+
address to,
|
|
12
|
+
ctString calldata networkCiphertext,
|
|
13
|
+
ctString calldata senderCiphertext,
|
|
14
|
+
ctString calldata recipientCiphertext
|
|
15
|
+
) external returns (uint256 messageId) {
|
|
16
|
+
messageId = _createMessageRecord(from, to, 1);
|
|
17
|
+
_addEpochUsage(currentEpoch(), from, networkCiphertext.value.length);
|
|
18
|
+
_storeChunkCiphertexts(
|
|
19
|
+
messageId,
|
|
20
|
+
0,
|
|
21
|
+
networkCiphertext,
|
|
22
|
+
senderCiphertext,
|
|
23
|
+
recipientCiphertext
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function recordSyntheticMultipartMessage(
|
|
28
|
+
address from,
|
|
29
|
+
address to,
|
|
30
|
+
ctString[] calldata networkCiphertexts,
|
|
31
|
+
ctString[] calldata senderCiphertexts,
|
|
32
|
+
ctString[] calldata recipientCiphertexts
|
|
33
|
+
) external returns (uint256 messageId) {
|
|
34
|
+
require(networkCiphertexts.length > 0, "chunk count");
|
|
35
|
+
require(networkCiphertexts.length == senderCiphertexts.length, "sender length");
|
|
36
|
+
require(networkCiphertexts.length == recipientCiphertexts.length, "recipient length");
|
|
37
|
+
|
|
38
|
+
messageId = _createMessageRecord(from, to, networkCiphertexts.length);
|
|
39
|
+
uint256 usageUnits;
|
|
40
|
+
|
|
41
|
+
for (uint256 i = 0; i < networkCiphertexts.length; i++) {
|
|
42
|
+
usageUnits += networkCiphertexts[i].value.length;
|
|
43
|
+
_storeChunkCiphertexts(
|
|
44
|
+
messageId,
|
|
45
|
+
i,
|
|
46
|
+
networkCiphertexts[i],
|
|
47
|
+
senderCiphertexts[i],
|
|
48
|
+
recipientCiphertexts[i]
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
_addEpochUsage(currentEpoch(), from, usageUnits);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.19;
|
|
3
|
+
|
|
4
|
+
import "../../oracle/ICotiPriceConsumer.sol";
|
|
5
|
+
|
|
6
|
+
/// @dev Test double for {ICotiPriceConsumer}: fixed rates and a shared `lastUpdated` for all symbols.
|
|
7
|
+
contract CotiPriceConsumerMock is ICotiPriceConsumer {
|
|
8
|
+
mapping(string => uint256) internal rates;
|
|
9
|
+
uint256 public metaLastUpdated;
|
|
10
|
+
|
|
11
|
+
function setRate(string calldata base, uint256 rate_) external {
|
|
12
|
+
rates[base] = rate_;
|
|
13
|
+
metaLastUpdated = block.timestamp;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function sync() external {
|
|
17
|
+
metaLastUpdated = block.timestamp;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function getPrice(string calldata base) external view returns (uint256) {
|
|
21
|
+
return rates[base];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function getPriceWithMeta(string calldata base)
|
|
25
|
+
external
|
|
26
|
+
view
|
|
27
|
+
returns (uint256 rate, uint256 lastUpdated, uint256 blockTimestamp)
|
|
28
|
+
{
|
|
29
|
+
return (rates[base], metaLastUpdated, block.timestamp);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.19;
|
|
3
|
+
|
|
4
|
+
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
|
|
5
|
+
|
|
6
|
+
/// @dev ERC20 mock with configurable decimals (for matching private token decimals in bridge tests).
|
|
7
|
+
contract ERC20DecimalsMock is ERC20 {
|
|
8
|
+
uint8 private immutable _decimals;
|
|
9
|
+
|
|
10
|
+
constructor(string memory name_, string memory symbol_, uint8 decimals_) ERC20(name_, symbol_) {
|
|
11
|
+
_decimals = decimals_;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function decimals() public view override returns (uint8) {
|
|
15
|
+
return _decimals;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function mint(address to, uint256 amount) external {
|
|
19
|
+
_mint(to, amount);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -7,7 +7,12 @@ import "../../../privacyBridge/PrivacyBridgeERC20.sol";
|
|
|
7
7
|
* @dev Mock contract for testing PrivacyBridgeERC20
|
|
8
8
|
*/
|
|
9
9
|
contract PrivacyBridgeERC20Mock is PrivacyBridgeERC20 {
|
|
10
|
-
constructor(
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
constructor(
|
|
11
|
+
address _token,
|
|
12
|
+
address _privateToken,
|
|
13
|
+
string memory _tokenSymbol,
|
|
14
|
+
address _feeRecipient,
|
|
15
|
+
address _rescueRecipient,
|
|
16
|
+
address _priceOracle
|
|
17
|
+
) PrivacyBridgeERC20(_token, _privateToken, _tokenSymbol, _feeRecipient, _rescueRecipient, _priceOracle) {}
|
|
13
18
|
}
|