@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.
Files changed (481) hide show
  1. package/.github/workflows/npm-publish.yml +1 -1
  2. package/contracts/access/DataPrivacyFramework/DataPrivacyFramework.sol +1 -1
  3. package/contracts/access/DataPrivacyFramework/extensions/DataPrivacyFrameworkMpc.sol +1 -1
  4. package/contracts/disperse/coinByRatio/FixedRatioCoinDisperserUnlimitedWindow.sol +2 -4
  5. package/contracts/disperse/disperseToken/MintDisperser.sol +1 -3
  6. package/contracts/disperse/disperseToken/TokenDisperser.sol +1 -1
  7. package/contracts/messaging/PrivateMessaging.sol +456 -0
  8. package/contracts/mocks/access/DataPrivacyFramework/DataPrivacyFrameworkMock.sol +1 -1
  9. package/contracts/mocks/messaging/PrivateMessagingHarness.sol +54 -0
  10. package/contracts/mocks/oracle/CotiPriceConsumerMock.sol +31 -0
  11. package/contracts/mocks/token/ERC20DecimalsMock.sol +21 -0
  12. package/contracts/mocks/token/ERC20Mock.sol +1 -1
  13. package/contracts/mocks/token/PrivateERC20/EncryptedTokenReceiverMock.sol +1 -1
  14. package/contracts/mocks/token/PrivateERC20/PrivacyBridgeERC20Mock.sol +9 -4
  15. package/contracts/mocks/token/PrivateERC20/PrivateERC20AuditorSupplyMock.sol +1 -1
  16. package/contracts/mocks/token/PrivateERC20/PrivateERC20CappedMock.sol +1 -1
  17. package/contracts/mocks/token/PrivateERC20/PrivateERC20GtCallerMock.sol +1 -1
  18. package/contracts/mocks/token/PrivateERC20/PrivateERC20Mock.sol +1 -1
  19. package/contracts/mocks/token/PrivateERC20/PrivateERC20ReentrantReceiverMock.sol +1 -1
  20. package/contracts/mocks/token/PrivateERC20/PublicReentrantTokenReceiverMock.sol +1 -1
  21. package/contracts/mocks/token/PrivateERC20/PublicTokenReceiverBoolMock.sol +1 -1
  22. package/contracts/mocks/token/PrivateERC20/PublicTokenReceiverMock.sol +1 -1
  23. package/contracts/mocks/token/PrivateERC721/PrivateERC721URIStorageMock.sol +1 -1
  24. package/contracts/mocks/utils/mpc/Arithmetic128TestsContract.sol +1 -1
  25. package/contracts/mocks/utils/mpc/Arithmetic256TestsContract.sol +1 -1
  26. package/contracts/mocks/utils/mpc/ArithmeticAddTestsContract.sol +196 -0
  27. package/contracts/mocks/utils/mpc/ArithmeticMulTestsContract.sol +194 -0
  28. package/contracts/mocks/utils/mpc/ArithmeticSigned128TestsContract.sol +63 -0
  29. package/contracts/mocks/utils/mpc/ArithmeticSigned256TestsContract.sol +107 -0
  30. package/contracts/mocks/utils/mpc/ArithmeticSignedNarrowTestsContract.sol +123 -0
  31. package/contracts/mocks/utils/mpc/ArithmeticSubTestsContract.sol +196 -0
  32. package/contracts/mocks/utils/mpc/Bitwise128TestsContract.sol +1 -1
  33. package/contracts/mocks/utils/mpc/Bitwise256TestsContract.sol +1 -1
  34. package/contracts/mocks/utils/mpc/BitwiseTestsContract.sol +1 -1
  35. package/contracts/mocks/utils/mpc/CheckedArithmetic128WithOverflowBitTestsContract.sol +1 -1
  36. package/contracts/mocks/utils/mpc/CheckedArithmetic256WithOverflowBitTestsContract.sol +1 -1
  37. package/contracts/mocks/utils/mpc/CheckedArithmeticWIthOverflowBitTestsContract.sol +1 -1
  38. package/contracts/mocks/utils/mpc/Comparison128TestsContract.sol +1 -1
  39. package/contracts/mocks/utils/mpc/Comparison1TestsContract.sol +1 -1
  40. package/contracts/mocks/utils/mpc/Comparison256TestsContract.sol +1 -1
  41. package/contracts/mocks/utils/mpc/Comparison2TestsContract.sol +1 -1
  42. package/contracts/mocks/utils/mpc/MinMax128TestsContract.sol +1 -1
  43. package/contracts/mocks/utils/mpc/MinMax256TestsContract.sol +1 -1
  44. package/contracts/mocks/utils/mpc/MinMaxTestsContract.sol +1 -1
  45. package/contracts/mocks/utils/mpc/MinimalImplementation.sol +1 -1
  46. package/contracts/mocks/utils/mpc/MinimalProxy.sol +1 -1
  47. package/contracts/mocks/utils/mpc/Miscellaneous1TestsContract.sol +1 -1
  48. package/contracts/mocks/utils/mpc/MiscellaneousTestsContract.sol +1 -1
  49. package/contracts/mocks/utils/mpc/MpcOperations128TestContract.sol +1 -1
  50. package/contracts/mocks/utils/mpc/MpcOperationsTestContract.sol +4 -4
  51. package/contracts/mocks/utils/mpc/Mux128TestsContract.sol +1 -1
  52. package/contracts/mocks/utils/mpc/Mux256TestsContract.sol +1 -1
  53. package/contracts/mocks/utils/mpc/OffboardToUserKeyTestContract.sol +1 -1
  54. package/contracts/mocks/utils/mpc/OnBoard128TestsContract.sol +1 -1
  55. package/contracts/mocks/utils/mpc/OnBoard256TestsContract.sol +1 -1
  56. package/contracts/mocks/utils/mpc/PrivacyImplementationV1.sol +1 -1
  57. package/contracts/mocks/utils/mpc/PrivacyImplementationV2.sol +1 -1
  58. package/contracts/mocks/utils/mpc/PrivacyProxy.sol +1 -1
  59. package/contracts/mocks/utils/mpc/Random128TestsContract.sol +1 -1
  60. package/contracts/mocks/utils/mpc/Random256TestsContract.sol +1 -1
  61. package/contracts/mocks/utils/mpc/Shift128TestsContract.sol +1 -1
  62. package/contracts/mocks/utils/mpc/Shift256TestsContract.sol +1 -1
  63. package/contracts/mocks/utils/mpc/ShiftTestsContract.sol +1 -1
  64. package/contracts/mocks/utils/mpc/StringTestsContract.sol +1 -1
  65. package/contracts/mocks/utils/mpc/Transfer128TestsContract.sol +1 -1
  66. package/contracts/mocks/utils/mpc/Transfer256TestsContract.sol +1 -1
  67. package/contracts/mocks/utils/mpc/TransferScalarTestsContract.sol +1 -1
  68. package/contracts/mocks/utils/mpc/TransferTestsContract.sol +1 -1
  69. package/contracts/mocks/utils/mpc/TransferWithAllowance128TestsContract.sol +1 -1
  70. package/contracts/mocks/utils/mpc/TransferWithAllowance256TestsContract.sol +1 -1
  71. package/contracts/mocks/utils/mpc/TransferWithAllowance64_16TestsContract.sol +1 -1
  72. package/contracts/mocks/utils/mpc/TransferWithAllowance64_32TestsContract.sol +1 -1
  73. package/contracts/mocks/utils/mpc/TransferWithAllowance64_64TestsContract.sol +1 -1
  74. package/contracts/mocks/utils/mpc/TransferWithAllowance64_8TestsContract.sol +1 -1
  75. package/contracts/mocks/utils/mpc/TransferWithAllowanceScalarTestsContract.sol +1 -1
  76. package/contracts/mocks/utils/mpc/TransferWithAllowanceTestsContract.sol +1 -1
  77. package/contracts/mocks/utils/mpc/ValidateCiphertext128TestsContract.sol +1 -1
  78. package/contracts/mocks/utils/mpc/ValidateCiphertext256TestsContract.sol +2 -2
  79. package/contracts/mocks/utils/mpc/ValidateCiphertextTestsContract.sol +1 -1
  80. package/contracts/mocks/wallet/PrivateERC20Wallet/PrivateERC20WalletMock.sol +1 -1
  81. package/contracts/node/CotiNodeRewards.sol +3 -3
  82. package/contracts/node/SoulboundNodeNFT.sol +23 -24
  83. package/contracts/onboard/AccountOnboard.sol +1 -1
  84. package/contracts/oracle/CotiPriceConsumer.sol +103 -0
  85. package/contracts/oracle/ICotiPriceConsumer.sol +15 -0
  86. package/contracts/oracle/IStdReference.sol +26 -0
  87. package/contracts/pod/IInbox.sol +231 -0
  88. package/contracts/pod/IInboxMiner.sol +53 -0
  89. package/contracts/pod/InboxUser.sol +29 -0
  90. package/contracts/pod/InboxUserCotiTestnet.sol +13 -0
  91. package/contracts/pod/PodNetworkConstants.sol +30 -0
  92. package/contracts/pod/examples/MpcAdder.sol +57 -0
  93. package/contracts/pod/examples/MpcAdderPausable.sol +25 -0
  94. package/contracts/pod/examples/MpcAdderPausable.sol.bak +25 -0
  95. package/contracts/pod/examples/it128/PodAdder128.sol +48 -0
  96. package/contracts/pod/examples/it256/PodAdder256.sol +48 -0
  97. package/contracts/pod/fee/IInboxFeeManager.sol +40 -0
  98. package/contracts/pod/manifest.json +52 -0
  99. package/contracts/pod/mpc/PodLib.sol +10 -0
  100. package/contracts/pod/mpc/PodLib128.sol +361 -0
  101. package/contracts/pod/mpc/PodLib256.sol +361 -0
  102. package/contracts/pod/mpc/PodLib64.sol +385 -0
  103. package/contracts/pod/mpc/PodLibBase.sol +72 -0
  104. package/contracts/pod/mpc/PodUser.sol +58 -0
  105. package/contracts/pod/mpc/PodUserFuji.sol +14 -0
  106. package/contracts/pod/mpc/PodUserSepolia.sol +13 -0
  107. package/contracts/pod/mpc/coti-side/IPodExecutorOps.sol +99 -0
  108. package/contracts/pod/mpccodec/MpcAbiCodec.sol +482 -0
  109. package/contracts/pod/privacy/IPodPriceOracle.sol +20 -0
  110. package/contracts/pod/privacy/IPrivacyPortal.sol +248 -0
  111. package/contracts/pod/privacy/IPrivacyPortalFactory.sol +88 -0
  112. package/contracts/pod/privacy/PortalFeeOracle.sol +51 -0
  113. package/contracts/pod/privacy/PrivacyPortal.sol +871 -0
  114. package/contracts/pod/privacy/PrivacyPortalFactory.sol +492 -0
  115. package/contracts/pod/privacy/PrivacyPortalFeeLib.sol +98 -0
  116. package/contracts/pod/privacy/mocks/CloneHelper.sol +14 -0
  117. package/contracts/pod/privacy/mocks/MockERC20.sol +26 -0
  118. package/contracts/pod/privacy/mocks/MockPodERC20ForPortal.sol +160 -0
  119. package/contracts/pod/privacy/mocks/MockPrivacyPortalFactory.sol +125 -0
  120. package/contracts/pod/privacy/mocks/MockWrappedNative.sol +24 -0
  121. package/contracts/pod/token/erc7984/Erc7984Constants.sol +9 -0
  122. package/contracts/pod/token/erc7984/Erc7984Pointers.sol +29 -0
  123. package/contracts/pod/token/erc7984/IERC7984.sol +69 -0
  124. package/contracts/pod/token/erc7984/IERC7984PortalWrapper.sol +31 -0
  125. package/contracts/pod/token/erc7984/PodErc7984Mixin.sol +125 -0
  126. package/contracts/pod/token/erc7984/README.md +60 -0
  127. package/contracts/pod/token/perc20/IPodERC20.sol +298 -0
  128. package/contracts/pod/token/perc20/PodERC20.sol +1021 -0
  129. package/contracts/pod/token/perc20/PodErc20Mintable.sol +88 -0
  130. package/contracts/pod/token/perc20/PodErc20MintableInitializable.sol +42 -0
  131. package/contracts/pod/token/perc20/cotiside/IPodErc20CotiSide.sol +88 -0
  132. package/contracts/pod/token/perc20/cotiside/PodErc20CotiMother.sol +529 -0
  133. package/contracts/pod/utils/IWrappedNative.sol +11 -0
  134. package/contracts/privacyBridge/PrivacyBridge.sol +376 -94
  135. package/contracts/privacyBridge/PrivacyBridgeCotiNative.sol +210 -162
  136. package/contracts/privacyBridge/PrivacyBridgeERC20.sol +242 -160
  137. package/contracts/privacyBridge/PrivacyBridgeUSDCe.sol +8 -2
  138. package/contracts/privacyBridge/PrivacyBridgeUSDT.sol +8 -2
  139. package/contracts/privacyBridge/PrivacyBridgeWADA.sol +8 -2
  140. package/contracts/privacyBridge/PrivacyBridgeWBTC.sol +8 -2
  141. package/contracts/privacyBridge/PrivacyBridgeWETH.sol +8 -2
  142. package/contracts/privacyBridge/PrivacyBridgegCoti.sol +8 -2
  143. package/contracts/token/PrivateERC20/IPrivateERC20.sol +1 -1
  144. package/contracts/token/PrivateERC20/ITokenReceiver.sol +1 -1
  145. package/contracts/token/PrivateERC20/ITokenReceiverEncrypted.sol +1 -1
  146. package/contracts/token/PrivateERC20/PrivateERC20.sol +5 -5
  147. package/contracts/token/PrivateERC20/tokens/PrivateBridgedUSDC.sol +1 -1
  148. package/contracts/token/PrivateERC20/tokens/PrivateCOTI.sol +1 -1
  149. package/contracts/token/PrivateERC20/tokens/PrivateCOTITreasuryGovernanceToken.sol +1 -1
  150. package/contracts/token/PrivateERC20/tokens/PrivateTetherUSD.sol +1 -1
  151. package/contracts/token/PrivateERC20/tokens/PrivateWrappedADA.sol +1 -1
  152. package/contracts/token/PrivateERC20/tokens/PrivateWrappedBTC.sol +1 -1
  153. package/contracts/token/PrivateERC20/tokens/PrivateWrappedEther.sol +1 -1
  154. package/contracts/token/PrivateERC721/IERC721Errors.sol +1 -1
  155. package/contracts/token/PrivateERC721/PrivateERC721.sol +1 -1
  156. package/contracts/token/PrivateERC721/extensions/IPrivateERC721URIStorage.sol +1 -1
  157. package/contracts/token/PrivateERC721/extensions/PrivateERC721URIStorage.sol +1 -1
  158. package/contracts/token/points/CotiTokenPoints004.sol +43 -0
  159. package/contracts/utils/mpc/MpcCore.sol +610 -1
  160. package/contracts/utils/mpc/MpcInterface.sol +1 -1
  161. package/hardhat.config.ts +9 -15
  162. package/package.json +4 -4
  163. package/scripts/add-bridge-operators.cjs +87 -0
  164. package/scripts/deploy-coti-price-consumer-mainnet.cjs +49 -0
  165. package/scripts/deployCotiNodeRewards.ts +51 -0
  166. package/scripts/deployCotiTokenPoints004.ts +61 -0
  167. package/scripts/deployFixedRatioCoinDisperserUnlimitedWindow.ts +68 -0
  168. package/scripts/redeploy-private-and-bridges.cjs +201 -0
  169. package/scripts/set-bridge-limits-mainnet.cjs +177 -0
  170. package/scripts/verify-mainnet-private-bridges.cjs +289 -0
  171. package/scripts/verifyCotiTokenPoints004.ts +123 -0
  172. package/scripts/verifyFixedRatioCoinDisperserUnlimitedWindow.ts +112 -0
  173. package/sonar-project.properties +11 -0
  174. package/test/messaging/PrivateMessaging.test.ts +158 -0
  175. package/test/pod/privacy/PrivacyPortal.access.test.ts +756 -0
  176. package/test/pod/privacy/PrivacyPortal.recovery.test.ts +263 -0
  177. package/test/privacyBridge/UnifiedPrivacyBridges.test.cjs +1665 -0
  178. package/test/token/PrivateERC20/PrivacyBridge.fees.test.ts +162 -239
  179. package/test/utils/mpc/CheckedSignedArithmetic256.test.ts +163 -0
  180. package/test/utils/mpc/NegativeCases.test.ts +3 -3
  181. package/test/utils/mpc/Precompile.test.ts +6 -6
  182. package/typechain-types/@openzeppelin/contracts/access/AccessControl.ts +324 -0
  183. package/typechain-types/@openzeppelin/contracts/access/AccessControlEnumerable.ts +361 -0
  184. package/typechain-types/@openzeppelin/contracts/access/IAccessControl.ts +292 -0
  185. package/typechain-types/@openzeppelin/contracts/access/IAccessControlEnumerable.ts +329 -0
  186. package/typechain-types/@openzeppelin/contracts/access/extensions/AccessControlEnumerable.ts +375 -0
  187. package/typechain-types/@openzeppelin/contracts/access/extensions/IAccessControlEnumerable.ts +329 -0
  188. package/typechain-types/@openzeppelin/contracts/access/extensions/index.ts +5 -0
  189. package/typechain-types/@openzeppelin/contracts/access/index.ts +6 -0
  190. package/typechain-types/@openzeppelin/contracts/index.ts +2 -0
  191. package/typechain-types/@openzeppelin/contracts/interfaces/IERC1363.ts +412 -0
  192. package/typechain-types/@openzeppelin/contracts/interfaces/IERC5267.ts +151 -0
  193. package/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors.ts +69 -0
  194. package/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors.ts +69 -0
  195. package/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors.ts +69 -0
  196. package/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/index.ts +6 -0
  197. package/typechain-types/@openzeppelin/contracts/interfaces/index.ts +4 -0
  198. package/typechain-types/@openzeppelin/contracts/security/Pausable.ts +150 -0
  199. package/typechain-types/@openzeppelin/contracts/security/index.ts +4 -0
  200. package/typechain-types/@openzeppelin/contracts/token/ERC20/ERC20.ts +286 -0
  201. package/typechain-types/@openzeppelin/contracts/token/ERC20/IERC20.ts +6 -6
  202. package/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.ts +313 -0
  203. package/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable.ts +356 -0
  204. package/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.ts +423 -0
  205. package/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.ts +286 -0
  206. package/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/index.ts +4 -0
  207. package/typechain-types/@openzeppelin/contracts/token/ERC20/index.ts +3 -0
  208. package/typechain-types/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.ts +69 -0
  209. package/typechain-types/@openzeppelin/contracts/token/ERC20/utils/index.ts +4 -0
  210. package/typechain-types/@openzeppelin/contracts/token/ERC721/ERC721.ts +420 -0
  211. package/typechain-types/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.ts +420 -0
  212. package/typechain-types/@openzeppelin/contracts/token/ERC721/extensions/index.ts +4 -0
  213. package/typechain-types/@openzeppelin/contracts/token/ERC721/index.ts +3 -0
  214. package/typechain-types/@openzeppelin/contracts/utils/Nonces.ts +85 -0
  215. package/typechain-types/@openzeppelin/contracts/utils/Pausable.ts +150 -0
  216. package/typechain-types/@openzeppelin/contracts/utils/ReentrancyGuard.ts +69 -0
  217. package/typechain-types/@openzeppelin/contracts/utils/ShortStrings.ts +69 -0
  218. package/typechain-types/@openzeppelin/contracts/utils/Strings.ts +69 -0
  219. package/typechain-types/@openzeppelin/contracts/utils/cryptography/ECDSA.ts +69 -0
  220. package/typechain-types/@openzeppelin/contracts/utils/cryptography/EIP712.ts +151 -0
  221. package/typechain-types/@openzeppelin/contracts/utils/cryptography/index.ts +5 -0
  222. package/typechain-types/@openzeppelin/contracts/utils/index.ts +9 -0
  223. package/typechain-types/@openzeppelin/contracts/utils/math/SafeCast.ts +69 -0
  224. package/typechain-types/@openzeppelin/contracts/utils/math/index.ts +4 -0
  225. package/typechain-types/contracts/disperse/coinByRatio/FixedRatioCoinDisperserLeftoverS1.ts +735 -0
  226. package/typechain-types/contracts/disperse/coinByRatio/FixedRatioCoinDisperserUnlimitedWindow.ts +734 -0
  227. package/typechain-types/contracts/disperse/coinByRatio/index.ts +2 -0
  228. package/typechain-types/contracts/disperse/disperseToken/MintDisperser.sol/IOwnable.ts +95 -0
  229. package/typechain-types/contracts/disperse/disperseToken/MintDisperser.sol/MintDisperser.ts +22 -0
  230. package/typechain-types/contracts/disperse/disperseToken/MintDisperser.sol/index.ts +1 -0
  231. package/typechain-types/contracts/index.ts +8 -0
  232. package/typechain-types/contracts/messaging/PrivateMessaging.ts +871 -0
  233. package/typechain-types/contracts/messaging/index.ts +4 -0
  234. package/typechain-types/contracts/mocks/index.ts +4 -0
  235. package/typechain-types/contracts/mocks/messaging/PrivateMessagingHarness.ts +951 -0
  236. package/typechain-types/contracts/mocks/messaging/index.ts +4 -0
  237. package/typechain-types/contracts/mocks/oracle/CotiPriceConsumerMock.ts +163 -0
  238. package/typechain-types/contracts/mocks/oracle/index.ts +4 -0
  239. package/typechain-types/contracts/mocks/token/ERC20DecimalsMock.ts +305 -0
  240. package/typechain-types/contracts/mocks/token/ERC20Mock.ts +324 -0
  241. package/typechain-types/contracts/mocks/token/PrivateERC20/EncryptedTokenReceiverMock.ts +108 -0
  242. package/typechain-types/contracts/mocks/token/PrivateERC20/PrivacyBridgeERC20Mock.ts +1906 -0
  243. package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20AuditorSupplyMock.ts +1296 -0
  244. package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20CappedMock.ts +1270 -0
  245. package/typechain-types/contracts/mocks/{utils/mpc/Bitwise128BitTestsContract.ts → token/PrivateERC20/PrivateERC20GtCallerMock.ts} +47 -67
  246. package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20Mock.ts +757 -25
  247. package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20ReentrantReceiverMock.sol/IPrivateERC20TransferAndCallEncrypted.ts +102 -0
  248. package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20ReentrantReceiverMock.sol/PrivateERC20ReentrantReceiverMock.ts +154 -0
  249. package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20ReentrantReceiverMock.sol/index.ts +5 -0
  250. package/typechain-types/contracts/mocks/token/PrivateERC20/PublicReentrantTokenReceiverMock.ts +155 -0
  251. package/typechain-types/contracts/mocks/token/PrivateERC20/PublicTokenReceiverBoolMock.ts +107 -0
  252. package/typechain-types/contracts/mocks/token/PrivateERC20/PublicTokenReceiverMock.ts +100 -0
  253. package/typechain-types/contracts/mocks/token/PrivateERC20/index.ts +10 -0
  254. package/typechain-types/contracts/mocks/token/index.ts +2 -0
  255. package/typechain-types/contracts/mocks/wallet/PrivateERC20Wallet/PrivateERC20WalletMock.ts +6 -6
  256. package/typechain-types/contracts/node/CotiNodeRewards.ts +566 -0
  257. package/typechain-types/contracts/node/SoulboundNodeNFT.sol/IERC5192.ts +123 -0
  258. package/typechain-types/contracts/node/SoulboundNodeNFT.sol/SoulboundNodeNFT.ts +975 -0
  259. package/typechain-types/contracts/node/SoulboundNodeNFT.sol/index.ts +5 -0
  260. package/typechain-types/contracts/node/index.ts +6 -0
  261. package/typechain-types/contracts/oracle/CotiPriceConsumer.ts +256 -0
  262. package/typechain-types/contracts/oracle/ICotiPriceConsumer.ts +119 -0
  263. package/typechain-types/contracts/oracle/IStdReference.ts +136 -0
  264. package/typechain-types/contracts/oracle/index.ts +6 -0
  265. package/typechain-types/contracts/privacyBridge/PrivacyBridge.ts +1642 -0
  266. package/typechain-types/contracts/privacyBridge/PrivacyBridgeCotiNative.ts +1884 -0
  267. package/typechain-types/contracts/privacyBridge/PrivacyBridgeERC20.sol/IHasDecimals.ts +84 -0
  268. package/typechain-types/contracts/privacyBridge/PrivacyBridgeERC20.sol/PrivacyBridgeERC20.ts +1906 -0
  269. package/typechain-types/contracts/privacyBridge/PrivacyBridgeERC20.sol/index.ts +5 -0
  270. package/typechain-types/contracts/privacyBridge/PrivacyBridgeUSDCe.ts +1906 -0
  271. package/typechain-types/contracts/privacyBridge/PrivacyBridgeUSDT.ts +1906 -0
  272. package/typechain-types/contracts/privacyBridge/PrivacyBridgeWADA.ts +1906 -0
  273. package/typechain-types/contracts/privacyBridge/PrivacyBridgeWBTC.ts +1906 -0
  274. package/typechain-types/contracts/privacyBridge/PrivacyBridgeWETH.ts +1906 -0
  275. package/typechain-types/contracts/privacyBridge/PrivacyBridgegCoti.ts +1906 -0
  276. package/typechain-types/contracts/privacyBridge/index.ts +13 -0
  277. package/typechain-types/contracts/token/PrivateERC20/IPrivateERC20.ts +439 -19
  278. package/typechain-types/contracts/token/PrivateERC20/ITokenReceiver.ts +100 -0
  279. package/typechain-types/contracts/token/PrivateERC20/ITokenReceiverEncrypted.ts +99 -0
  280. package/typechain-types/contracts/token/PrivateERC20/PrivateERC20.ts +763 -15
  281. package/typechain-types/contracts/token/PrivateERC20/index.ts +4 -0
  282. package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateBridgedUSDC.ts +1270 -0
  283. package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateCOTI.ts +1270 -0
  284. package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateCOTITreasuryGovernanceToken.ts +1270 -0
  285. package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateTetherUSD.ts +1270 -0
  286. package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateWrappedADA.ts +1270 -0
  287. package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateWrappedBTC.ts +1270 -0
  288. package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateWrappedEther.ts +1270 -0
  289. package/typechain-types/contracts/token/PrivateERC20/tokens/index.ts +10 -0
  290. package/typechain-types/contracts/token/index.ts +2 -0
  291. package/typechain-types/contracts/token/points/CotiTokenPoints004.sol/COTITokenPoints004.ts +826 -0
  292. package/typechain-types/contracts/token/points/CotiTokenPoints004.ts +826 -0
  293. package/typechain-types/contracts/token/points/index.ts +4 -0
  294. package/typechain-types/factories/@openzeppelin/contracts/access/AccessControlEnumerable__factory.ts +276 -0
  295. package/typechain-types/factories/@openzeppelin/contracts/access/AccessControl__factory.ts +250 -0
  296. package/typechain-types/factories/@openzeppelin/contracts/access/IAccessControlEnumerable__factory.ts +244 -0
  297. package/typechain-types/factories/@openzeppelin/contracts/access/IAccessControl__factory.ts +218 -0
  298. package/typechain-types/factories/@openzeppelin/contracts/access/Ownable__factory.ts +22 -0
  299. package/typechain-types/factories/@openzeppelin/contracts/access/extensions/AccessControlEnumerable__factory.ts +316 -0
  300. package/typechain-types/factories/@openzeppelin/contracts/access/extensions/IAccessControlEnumerable__factory.ts +265 -0
  301. package/typechain-types/factories/@openzeppelin/contracts/access/extensions/index.ts +5 -0
  302. package/typechain-types/factories/@openzeppelin/contracts/access/index.ts +5 -0
  303. package/typechain-types/factories/@openzeppelin/contracts/index.ts +1 -0
  304. package/typechain-types/factories/@openzeppelin/contracts/interfaces/IERC1363__factory.ts +393 -0
  305. package/typechain-types/factories/@openzeppelin/contracts/interfaces/IERC5267__factory.ts +71 -0
  306. package/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors__factory.ts +127 -0
  307. package/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors__factory.ts +111 -0
  308. package/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors__factory.ts +128 -0
  309. package/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/index.ts +6 -0
  310. package/typechain-types/factories/@openzeppelin/contracts/interfaces/index.ts +3 -0
  311. package/typechain-types/factories/@openzeppelin/contracts/security/Pausable__factory.ts +61 -0
  312. package/typechain-types/factories/@openzeppelin/contracts/security/index.ts +4 -0
  313. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/ERC20__factory.ts +330 -0
  314. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/IERC20__factory.ts +3 -3
  315. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable__factory.ts +364 -0
  316. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable__factory.ts +382 -0
  317. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit__factory.ts +540 -0
  318. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata__factory.ts +247 -0
  319. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/index.ts +4 -0
  320. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/index.ts +2 -0
  321. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/utils/SafeERC20__factory.ts +96 -0
  322. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/utils/index.ts +4 -0
  323. package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/ERC721__factory.ts +455 -0
  324. package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata__factory.ts +355 -0
  325. package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/extensions/index.ts +4 -0
  326. package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/index.ts +2 -0
  327. package/typechain-types/factories/@openzeppelin/contracts/utils/Nonces__factory.ts +57 -0
  328. package/typechain-types/factories/@openzeppelin/contracts/utils/Pausable__factory.ts +71 -0
  329. package/typechain-types/factories/@openzeppelin/contracts/utils/ReentrancyGuard__factory.ts +30 -0
  330. package/typechain-types/factories/@openzeppelin/contracts/utils/ShortStrings__factory.ts +83 -0
  331. package/typechain-types/factories/@openzeppelin/contracts/utils/Strings__factory.ts +90 -0
  332. package/typechain-types/factories/@openzeppelin/contracts/utils/cryptography/ECDSA__factory.ts +91 -0
  333. package/typechain-types/factories/@openzeppelin/contracts/utils/cryptography/EIP712__factory.ts +87 -0
  334. package/typechain-types/factories/@openzeppelin/contracts/utils/cryptography/index.ts +5 -0
  335. package/typechain-types/factories/@openzeppelin/contracts/utils/index.ts +7 -0
  336. package/typechain-types/factories/@openzeppelin/contracts/utils/math/SafeCast__factory.ts +118 -0
  337. package/typechain-types/factories/@openzeppelin/contracts/utils/math/index.ts +4 -0
  338. package/typechain-types/factories/contracts/disperse/coinByRatio/FixedRatioCoinDisperserLeftoverS1__factory.ts +802 -0
  339. package/typechain-types/factories/contracts/disperse/coinByRatio/FixedRatioCoinDisperserUnlimitedWindow__factory.ts +749 -0
  340. package/typechain-types/factories/contracts/disperse/coinByRatio/FixedRatioCoinDisperser__factory.ts +12 -1
  341. package/typechain-types/factories/contracts/disperse/coinByRatio/index.ts +2 -0
  342. package/typechain-types/factories/contracts/disperse/disperseToken/MintDisperser.sol/IOwnable__factory.ts +35 -0
  343. package/typechain-types/factories/contracts/disperse/disperseToken/MintDisperser.sol/MintDisperser__factory.ts +41 -1
  344. package/typechain-types/factories/contracts/disperse/disperseToken/MintDisperser.sol/index.ts +1 -0
  345. package/typechain-types/factories/contracts/disperse/disperseToken/TokenDisperser__factory.ts +12 -1
  346. package/typechain-types/factories/contracts/index.ts +4 -0
  347. package/typechain-types/factories/contracts/messaging/PrivateMessaging__factory.ts +1035 -0
  348. package/typechain-types/factories/contracts/messaging/index.ts +4 -0
  349. package/typechain-types/factories/contracts/mocks/access/DataPrivacyFramework/DataPrivacyFrameworkMock__factory.ts +1 -1
  350. package/typechain-types/factories/contracts/mocks/index.ts +2 -0
  351. package/typechain-types/factories/contracts/mocks/messaging/PrivateMessagingHarness__factory.ts +1161 -0
  352. package/typechain-types/factories/contracts/mocks/messaging/index.ts +4 -0
  353. package/typechain-types/factories/contracts/mocks/oracle/CotiPriceConsumerMock__factory.ts +159 -0
  354. package/typechain-types/factories/contracts/mocks/oracle/index.ts +4 -0
  355. package/typechain-types/factories/contracts/mocks/token/ERC20DecimalsMock__factory.ts +432 -0
  356. package/typechain-types/factories/contracts/mocks/token/ERC20Mock__factory.ts +430 -0
  357. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/EncryptedTokenReceiverMock__factory.ts +125 -0
  358. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivacyBridgeERC20Mock__factory.ts +1885 -0
  359. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20AuditorSupplyMock__factory.ts +1540 -0
  360. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20CappedMock__factory.ts +1492 -0
  361. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20GtCallerMock__factory.ts +165 -0
  362. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20Mock__factory.ts +794 -52
  363. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20ReentrantReceiverMock.sol/IPrivateERC20TransferAndCallEncrypted__factory.ts +54 -0
  364. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20ReentrantReceiverMock.sol/PrivateERC20ReentrantReceiverMock__factory.ts +159 -0
  365. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20ReentrantReceiverMock.sol/index.ts +5 -0
  366. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PublicReentrantTokenReceiverMock__factory.ts +164 -0
  367. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PublicTokenReceiverBoolMock__factory.ts +130 -0
  368. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PublicTokenReceiverMock__factory.ts +102 -0
  369. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/index.ts +9 -0
  370. package/typechain-types/factories/contracts/mocks/token/PrivateERC721/PrivateERC721URIStorageMock__factory.ts +1 -1
  371. package/typechain-types/factories/contracts/mocks/token/index.ts +2 -0
  372. package/typechain-types/factories/contracts/mocks/utils/mpc/Arithmetic128TestsContract__factory.ts +1 -1
  373. package/typechain-types/factories/contracts/mocks/utils/mpc/Arithmetic256TestsContract__factory.ts +1 -1
  374. package/typechain-types/factories/contracts/mocks/utils/mpc/ArithmeticTestsContract__factory.ts +1 -1
  375. package/typechain-types/factories/contracts/mocks/utils/mpc/Bitwise128TestsContract__factory.ts +1 -1
  376. package/typechain-types/factories/contracts/mocks/utils/mpc/Bitwise256TestsContract__factory.ts +1 -1
  377. package/typechain-types/factories/contracts/mocks/utils/mpc/BitwiseTestsContract__factory.ts +1 -1
  378. package/typechain-types/factories/contracts/mocks/utils/mpc/CheckedArithmetic128WithOverflowBitTestsContract__factory.ts +1 -1
  379. package/typechain-types/factories/contracts/mocks/utils/mpc/CheckedArithmetic256WithOverflowBitTestsContract__factory.ts +1 -1
  380. package/typechain-types/factories/contracts/mocks/utils/mpc/CheckedArithmeticWIthOverflowBitTestsContract.sol/CheckedArithmeticWithOverflowBitTestsContract__factory.ts +1 -1
  381. package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison128TestsContract__factory.ts +1 -1
  382. package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison1TestsContract__factory.ts +1 -1
  383. package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison256TestsContract__factory.ts +1 -1
  384. package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison2TestsContract__factory.ts +1 -1
  385. package/typechain-types/factories/contracts/mocks/utils/mpc/MinMax128TestsContract__factory.ts +1 -1
  386. package/typechain-types/factories/contracts/mocks/utils/mpc/MinMax256TestsContract__factory.ts +1 -1
  387. package/typechain-types/factories/contracts/mocks/utils/mpc/MinMaxTestsContract__factory.ts +1 -1
  388. package/typechain-types/factories/contracts/mocks/utils/mpc/MinimalImplementation__factory.ts +1 -1
  389. package/typechain-types/factories/contracts/mocks/utils/mpc/MinimalProxy__factory.ts +1 -1
  390. package/typechain-types/factories/contracts/mocks/utils/mpc/Miscellaneous1TestsContract__factory.ts +1 -1
  391. package/typechain-types/factories/contracts/mocks/utils/mpc/MiscellaneousTestsContract__factory.ts +1 -1
  392. package/typechain-types/factories/contracts/mocks/utils/mpc/MpcOperations128TestContract__factory.ts +1 -1
  393. package/typechain-types/factories/contracts/mocks/utils/mpc/MpcOperationsTestContract__factory.ts +1 -1
  394. package/typechain-types/factories/contracts/mocks/utils/mpc/Mux128TestsContract__factory.ts +1 -1
  395. package/typechain-types/factories/contracts/mocks/utils/mpc/Mux256TestsContract__factory.ts +1 -1
  396. package/typechain-types/factories/contracts/mocks/utils/mpc/OffboardToUserKeyTestContract__factory.ts +1 -1
  397. package/typechain-types/factories/contracts/mocks/utils/mpc/OnBoard128TestsContract__factory.ts +1 -1
  398. package/typechain-types/factories/contracts/mocks/utils/mpc/OnBoard256TestsContract__factory.ts +1 -1
  399. package/typechain-types/factories/contracts/mocks/utils/mpc/PrivacyImplementationV1__factory.ts +1 -1
  400. package/typechain-types/factories/contracts/mocks/utils/mpc/PrivacyImplementationV2__factory.ts +1 -1
  401. package/typechain-types/factories/contracts/mocks/utils/mpc/PrivacyProxy__factory.ts +1 -1
  402. package/typechain-types/factories/contracts/mocks/utils/mpc/Random128TestsContract__factory.ts +1 -1
  403. package/typechain-types/factories/contracts/mocks/utils/mpc/Random256TestsContract__factory.ts +1 -1
  404. package/typechain-types/factories/contracts/mocks/utils/mpc/Shift128TestsContract__factory.ts +1 -1
  405. package/typechain-types/factories/contracts/mocks/utils/mpc/Shift256TestsContract__factory.ts +1 -1
  406. package/typechain-types/factories/contracts/mocks/utils/mpc/ShiftTestsContract__factory.ts +1 -1
  407. package/typechain-types/factories/contracts/mocks/utils/mpc/StringTestsContract__factory.ts +1 -1
  408. package/typechain-types/factories/contracts/mocks/utils/mpc/Transfer128TestsContract__factory.ts +1 -1
  409. package/typechain-types/factories/contracts/mocks/utils/mpc/Transfer256TestsContract__factory.ts +1 -1
  410. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferScalarTestsContract__factory.ts +1 -1
  411. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferTestsContract__factory.ts +1 -1
  412. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance128TestsContract__factory.ts +1 -1
  413. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance256TestsContract__factory.ts +1 -1
  414. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance64_16TestsContract__factory.ts +1 -1
  415. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance64_32TestsContract__factory.ts +1 -1
  416. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance64_64TestsContract__factory.ts +1 -1
  417. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance64_8TestsContract__factory.ts +1 -1
  418. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowanceScalarTestsContract__factory.ts +1 -1
  419. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowanceTestsContract__factory.ts +1 -1
  420. package/typechain-types/factories/contracts/mocks/utils/mpc/ValidateCiphertext128TestsContract__factory.ts +1 -1
  421. package/typechain-types/factories/contracts/mocks/utils/mpc/ValidateCiphertext256TestsContract__factory.ts +1 -1
  422. package/typechain-types/factories/contracts/mocks/utils/mpc/ValidateCiphertextTestsContract__factory.ts +1 -1
  423. package/typechain-types/factories/contracts/mocks/wallet/PrivateERC20Wallet/PrivateERC20WalletMock__factory.ts +4 -22
  424. package/typechain-types/factories/contracts/node/CotiNodeRewards__factory.ts +576 -0
  425. package/typechain-types/factories/contracts/node/SoulboundNodeNFT.sol/IERC5192__factory.ts +54 -0
  426. package/typechain-types/factories/contracts/node/SoulboundNodeNFT.sol/SoulboundNodeNFT__factory.ts +1072 -0
  427. package/typechain-types/factories/contracts/node/SoulboundNodeNFT.sol/index.ts +5 -0
  428. package/typechain-types/factories/contracts/node/index.ts +5 -0
  429. package/typechain-types/factories/contracts/onboard/AccountOnboard__factory.ts +1 -1
  430. package/typechain-types/factories/contracts/oracle/CotiPriceConsumer__factory.ts +295 -0
  431. package/typechain-types/factories/contracts/oracle/ICotiPriceConsumer__factory.ts +73 -0
  432. package/typechain-types/factories/contracts/oracle/IStdReference__factory.ts +107 -0
  433. package/typechain-types/factories/contracts/oracle/index.ts +6 -0
  434. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeCotiNative__factory.ts +1753 -0
  435. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeERC20.sol/IHasDecimals__factory.ts +38 -0
  436. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeERC20.sol/PrivacyBridgeERC20__factory.ts +1766 -0
  437. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeERC20.sol/index.ts +5 -0
  438. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeUSDCe__factory.ts +1870 -0
  439. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeUSDT__factory.ts +1870 -0
  440. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeWADA__factory.ts +1870 -0
  441. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeWBTC__factory.ts +1870 -0
  442. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeWETH__factory.ts +1870 -0
  443. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridge__factory.ts +1444 -0
  444. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgegCoti__factory.ts +1870 -0
  445. package/typechain-types/factories/contracts/privacyBridge/index.ts +12 -0
  446. package/typechain-types/factories/contracts/token/PrivateERC20/IPrivateERC20__factory.ts +481 -35
  447. package/typechain-types/factories/contracts/token/PrivateERC20/ITokenReceiverEncrypted__factory.ts +53 -0
  448. package/typechain-types/factories/contracts/token/PrivateERC20/ITokenReceiver__factory.ts +54 -0
  449. package/typechain-types/factories/contracts/token/PrivateERC20/PrivateERC20__factory.ts +812 -52
  450. package/typechain-types/factories/contracts/token/PrivateERC20/index.ts +3 -0
  451. package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateBridgedUSDC__factory.ts +1471 -0
  452. package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateCOTITreasuryGovernanceToken__factory.ts +1477 -0
  453. package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateCOTI__factory.ts +1468 -0
  454. package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateTetherUSD__factory.ts +1471 -0
  455. package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateWrappedADA__factory.ts +1471 -0
  456. package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateWrappedBTC__factory.ts +1471 -0
  457. package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateWrappedEther__factory.ts +1477 -0
  458. package/typechain-types/factories/contracts/token/PrivateERC20/tokens/index.ts +10 -0
  459. package/typechain-types/factories/contracts/token/index.ts +1 -0
  460. package/typechain-types/factories/contracts/token/points/CotiTokenPoints004.sol/COTITokenPoints004__factory.ts +992 -0
  461. package/typechain-types/factories/contracts/token/points/CotiTokenPoints004__factory.ts +992 -0
  462. package/typechain-types/factories/contracts/token/points/index.ts +4 -0
  463. package/typechain-types/factories/contracts/utils/mpc/MpcCore__factory.ts +1 -1
  464. package/typechain-types/hardhat.d.ts +1414 -118
  465. package/typechain-types/index.ts +138 -2
  466. package/contracts/mocks/utils/mpc/ArithmeticTestsContract.sol +0 -408
  467. package/typechain-types/contracts/mocks/utils/mpc/Arithmetic128BitTestsContract.ts +0 -341
  468. package/typechain-types/contracts/mocks/utils/mpc/Arithmetic256BitTestsContract.ts +0 -347
  469. package/typechain-types/contracts/mocks/utils/mpc/Bitwise256BitTestsContract.ts +0 -186
  470. package/typechain-types/contracts/mocks/utils/mpc/Comparison128BitTestsContract.ts +0 -260
  471. package/typechain-types/contracts/mocks/utils/mpc/Comparison256BitTestsContract.ts +0 -260
  472. package/typechain-types/contracts/mocks/utils/mpc/Miscellaneous128BitTestsContract.ts +0 -302
  473. package/typechain-types/contracts/mocks/utils/mpc/Miscellaneous256BitTestsContract.ts +0 -322
  474. package/typechain-types/factories/contracts/mocks/utils/mpc/Arithmetic128BitTestsContract__factory.ts +0 -349
  475. package/typechain-types/factories/contracts/mocks/utils/mpc/Arithmetic256BitTestsContract__factory.ts +0 -364
  476. package/typechain-types/factories/contracts/mocks/utils/mpc/Bitwise128BitTestsContract__factory.ts +0 -182
  477. package/typechain-types/factories/contracts/mocks/utils/mpc/Bitwise256BitTestsContract__factory.ts +0 -182
  478. package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison128BitTestsContract__factory.ts +0 -255
  479. package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison256BitTestsContract__factory.ts +0 -255
  480. package/typechain-types/factories/contracts/mocks/utils/mpc/Miscellaneous128BitTestsContract__factory.ts +0 -332
  481. package/typechain-types/factories/contracts/mocks/utils/mpc/Miscellaneous256BitTestsContract__factory.ts +0 -380
@@ -0,0 +1,756 @@
1
+ import hre from "hardhat"
2
+ import { expect } from "chai"
3
+ import { parseEther, parseUnits } from "ethers"
4
+
5
+ describe("PrivacyPortal access controls", function () {
6
+ async function deployPortalFixture() {
7
+ const [owner, user, operator] = await hre.ethers.getSigners()
8
+ const other = operator
9
+
10
+ const MockFactory = await hre.ethers.getContractFactory("MockPrivacyPortalFactory")
11
+ const factory = await MockFactory.deploy(owner.address, owner.address)
12
+ await factory.waitForDeployment()
13
+
14
+ const MockERC20 = await hre.ethers.getContractFactory("MockERC20")
15
+ const underlying = await MockERC20.deploy("Mock USD", "mUSD", 6)
16
+ await underlying.waitForDeployment()
17
+
18
+ const MockPToken = await hre.ethers.getContractFactory("MockPodERC20ForPortal")
19
+ const pToken = await MockPToken.deploy()
20
+ await pToken.waitForDeployment()
21
+
22
+ const PortalImpl = await hre.ethers.getContractFactory("PrivacyPortal")
23
+ const portalImpl = await PortalImpl.deploy()
24
+ await portalImpl.waitForDeployment()
25
+
26
+ const CloneHelper = await hre.ethers.getContractFactory("CloneHelper")
27
+ const cloneHelper = await CloneHelper.deploy()
28
+ await cloneHelper.waitForDeployment()
29
+
30
+ await cloneHelper.clone(await portalImpl.getAddress())
31
+ const portalAddress = await cloneHelper.lastClone()
32
+ const portal = PortalImpl.attach(portalAddress) as Awaited<ReturnType<typeof PortalImpl.deploy>>
33
+
34
+ await portal.initialize(
35
+ await underlying.getAddress(),
36
+ await pToken.getAddress(),
37
+ 6,
38
+ false,
39
+ await factory.getAddress()
40
+ )
41
+
42
+ const depositAmount = parseUnits("100", 6)
43
+ await underlying.mint(user.address, depositAmount)
44
+
45
+ return {
46
+ owner,
47
+ user,
48
+ operator,
49
+ other,
50
+ factory,
51
+ underlying,
52
+ pToken,
53
+ portal,
54
+ depositAmount,
55
+ }
56
+ }
57
+
58
+ async function deployFactoryFixture() {
59
+ const [owner, operator, other] = await hre.ethers.getSigners()
60
+
61
+ const PortalImpl = await hre.ethers.getContractFactory("PrivacyPortal")
62
+ const portalImpl = await PortalImpl.deploy()
63
+ await portalImpl.waitForDeployment()
64
+
65
+ const PTokenImpl = await hre.ethers.getContractFactory("MockPodERC20ForPortal")
66
+ const pTokenImpl = await PTokenImpl.deploy()
67
+ await pTokenImpl.waitForDeployment()
68
+
69
+ const Factory = await hre.ethers.getContractFactory("PrivacyPortalFactory")
70
+ const factory = await Factory.deploy(
71
+ owner.address,
72
+ owner.address,
73
+ 7082400,
74
+ other.address,
75
+ await pTokenImpl.getAddress(),
76
+ await portalImpl.getAddress(),
77
+ owner.address,
78
+ owner.address,
79
+ owner.address,
80
+ hre.ethers.ZeroAddress,
81
+ 0,
82
+ 0,
83
+ 2n ** 128n - 1n,
84
+ 0,
85
+ 0,
86
+ 2n ** 128n - 1n
87
+ )
88
+ await factory.waitForDeployment()
89
+
90
+ return { owner, operator, other, factory }
91
+ }
92
+
93
+ async function deployNativePortalFixture() {
94
+ const [owner, user] = await hre.ethers.getSigners()
95
+
96
+ const MockFactory = await hre.ethers.getContractFactory("MockPrivacyPortalFactory")
97
+ const wrappedNative = await hre.ethers.getContractFactory("MockWrappedNative")
98
+ const weth = await wrappedNative.deploy("Wrapped Ether", "WETH")
99
+ await weth.waitForDeployment()
100
+ const wethAddress = await weth.getAddress()
101
+
102
+ const factory = await MockFactory.deploy(owner.address, wethAddress)
103
+ await factory.waitForDeployment()
104
+
105
+ const MockPToken = await hre.ethers.getContractFactory("MockPodERC20ForPortal")
106
+ const pToken = await MockPToken.deploy()
107
+ await pToken.waitForDeployment()
108
+
109
+ const PortalImpl = await hre.ethers.getContractFactory("PrivacyPortal")
110
+ const portalImpl = await PortalImpl.deploy()
111
+ await portalImpl.waitForDeployment()
112
+
113
+ const CloneHelper = await hre.ethers.getContractFactory("CloneHelper")
114
+ const cloneHelper = await CloneHelper.deploy()
115
+ await cloneHelper.waitForDeployment()
116
+
117
+ await cloneHelper.clone(await portalImpl.getAddress())
118
+ const portalAddress = await cloneHelper.lastClone()
119
+ const portal = PortalImpl.attach(portalAddress) as Awaited<ReturnType<typeof PortalImpl.deploy>>
120
+
121
+ await portal.initialize(wethAddress, await pToken.getAddress(), 18, true, await factory.getAddress())
122
+
123
+ const depositAmount = parseEther("1")
124
+
125
+ return { owner, user, factory, portal, depositAmount }
126
+ }
127
+
128
+ describe("portal per-tx limits", function () {
129
+ it("reverts deposits below the configured minimum", async function () {
130
+ const { owner, user, portal, underlying, factory, depositAmount } =
131
+ await deployPortalFixture()
132
+
133
+ await portal.connect(owner).setLimits(parseUnits("200", 6), parseUnits("1000", 6), 1, parseUnits("1000", 6))
134
+
135
+ await underlying.connect(user).approve(await portal.getAddress(), depositAmount)
136
+ await expect(
137
+ portal.connect(user).deposit(user.address, depositAmount, 0, 100, {
138
+ value: 1000,
139
+ })
140
+ ).to.be.revertedWithCustomError(portal, "DepositBelowMinimum")
141
+ })
142
+
143
+ it("reverts deposits above the configured maximum", async function () {
144
+ const { owner, user, portal, underlying, factory, depositAmount } =
145
+ await deployPortalFixture()
146
+
147
+ await portal.connect(owner).setLimits(1, parseUnits("50", 6), 1, depositAmount)
148
+
149
+ await underlying.connect(user).approve(await portal.getAddress(), depositAmount)
150
+ await expect(
151
+ portal.connect(user).deposit(user.address, depositAmount, 0, 100, {
152
+ value: 1000,
153
+ })
154
+ ).to.be.revertedWithCustomError(portal, "DepositExceedsMaximum")
155
+ })
156
+
157
+ it("reverts withdrawals above the configured maximum", async function () {
158
+ const { owner, user, portal, factory, depositAmount } = await deployPortalFixture()
159
+
160
+ await portal.connect(owner).setLimits(1, depositAmount, 1, parseUnits("50", 6))
161
+
162
+ await expect(
163
+ portal.connect(user).requestWithdrawWithPermit(
164
+ user.address,
165
+ depositAmount,
166
+ 0,
167
+ 1000,
168
+ 100,
169
+ Math.floor(Date.now() / 1000) + 3600,
170
+ 27,
171
+ hre.ethers.ZeroHash,
172
+ hre.ethers.ZeroHash,
173
+ { value: 1000 }
174
+ )
175
+ ).to.be.revertedWithCustomError(portal, "WithdrawExceedsMaximum")
176
+ })
177
+
178
+ it("allows only the factory admin to update limits", async function () {
179
+ const { owner, user, portal } = await deployPortalFixture()
180
+
181
+ await expect(
182
+ portal.connect(user).setLimits(1, 2, 3, 4)
183
+ ).to.be.revertedWithCustomError(portal, "OnlyFactoryAdmin")
184
+
185
+ await expect(portal.connect(owner).setLimits(1, 2, 3, 4)).to.not.be.reverted
186
+ })
187
+
188
+ it("reverts withdrawals below the configured minimum", async function () {
189
+ const { owner, user, portal, depositAmount } = await deployPortalFixture()
190
+
191
+ await portal.connect(owner).setLimits(1, depositAmount, parseUnits("200", 6), parseUnits("1000", 6))
192
+
193
+ await expect(
194
+ portal.connect(user).requestWithdrawWithPermit(
195
+ user.address,
196
+ depositAmount,
197
+ 0,
198
+ 1000,
199
+ 100,
200
+ Math.floor(Date.now() / 1000) + 3600,
201
+ 27,
202
+ hre.ethers.ZeroHash,
203
+ hre.ethers.ZeroHash,
204
+ { value: 1000 }
205
+ )
206
+ ).to.be.revertedWithCustomError(portal, "WithdrawBelowMinimum")
207
+ })
208
+
209
+ it("reverts native deposits below the configured minimum", async function () {
210
+ const { owner, user, portal, depositAmount } = await deployNativePortalFixture()
211
+
212
+ await portal.connect(owner).setLimits(parseEther("2"), parseEther("10"), 1, parseEther("10"))
213
+
214
+ await expect(
215
+ portal.connect(user).depositNative(user.address, depositAmount, 0, 100, {
216
+ value: depositAmount + 1000n,
217
+ })
218
+ ).to.be.revertedWithCustomError(portal, "DepositBelowMinimum")
219
+ })
220
+
221
+ it("reverts native deposits above the configured maximum", async function () {
222
+ const { owner, user, portal, depositAmount } = await deployNativePortalFixture()
223
+
224
+ await portal.connect(owner).setLimits(1, parseEther("0.5"), 1, parseEther("10"))
225
+
226
+ await expect(
227
+ portal.connect(user).depositNative(user.address, depositAmount, 0, 100, {
228
+ value: depositAmount + 1000n,
229
+ })
230
+ ).to.be.revertedWithCustomError(portal, "DepositExceedsMaximum")
231
+ })
232
+ })
233
+
234
+ describe("factory blacklist", function () {
235
+ it("blocks blacklisted users from depositing", async function () {
236
+ const { owner, user, portal, underlying, factory, depositAmount } =
237
+ await deployPortalFixture()
238
+
239
+ await factory.connect(owner).setBlacklisted(user.address, true)
240
+ await underlying.connect(user).approve(await portal.getAddress(), depositAmount)
241
+
242
+ await expect(
243
+ portal.connect(user).deposit(user.address, depositAmount, 0, 100, {
244
+ value: 1000,
245
+ })
246
+ ).to.be.revertedWithCustomError(portal, "AddressBlacklisted")
247
+ })
248
+
249
+ it("allows the factory owner to add and remove blacklist entries", async function () {
250
+ const { owner, operator, factory } = await deployFactoryFixture()
251
+
252
+ await factory.connect(owner).addToBlacklist(operator.address)
253
+ expect(await factory.blacklisted(operator.address)).to.equal(true)
254
+
255
+ await factory.connect(owner).removeFromBlacklist(operator.address)
256
+ expect(await factory.blacklisted(operator.address)).to.equal(false)
257
+ })
258
+
259
+ it("allows deposits again after blacklist removal", async function () {
260
+ const { owner, user, portal, underlying, factory, depositAmount } =
261
+ await deployPortalFixture()
262
+
263
+ await factory.connect(owner).setBlacklisted(user.address, true)
264
+ await underlying.connect(user).approve(await portal.getAddress(), depositAmount)
265
+ await expect(
266
+ portal.connect(user).deposit(user.address, depositAmount, 0, 100, {
267
+ value: 1000,
268
+ })
269
+ ).to.be.revertedWithCustomError(portal, "AddressBlacklisted")
270
+
271
+ await factory.connect(owner).setBlacklisted(user.address, false)
272
+ await expect(
273
+ portal.connect(user).deposit(user.address, depositAmount, 0, 100, {
274
+ value: 1000,
275
+ })
276
+ ).to.not.be.reverted
277
+ })
278
+ })
279
+
280
+ describe("factory admin vs operator", function () {
281
+ it("lets operators update default fee configs", async function () {
282
+ const { owner, operator, factory } = await deployFactoryFixture()
283
+ const operatorRole = await factory.OPERATOR_ROLE()
284
+
285
+ await factory.connect(owner).grantRole(operatorRole, operator.address)
286
+ await expect(
287
+ factory.connect(operator).setDefaultDepositFee(1, 0, 100)
288
+ ).to.not.be.reverted
289
+
290
+ const config = await factory.getFeeConfig(true)
291
+ expect(config.fixedFee).to.equal(1)
292
+ expect(config.maxFee).to.equal(100)
293
+ })
294
+
295
+ it("lets operators update default withdraw fee configs", async function () {
296
+ const { owner, operator, factory } = await deployFactoryFixture()
297
+ const operatorRole = await factory.OPERATOR_ROLE()
298
+
299
+ await factory.connect(owner).grantRole(operatorRole, operator.address)
300
+ await expect(
301
+ factory.connect(operator).setDefaultWithdrawFee(2, 0, 200)
302
+ ).to.not.be.reverted
303
+
304
+ const config = await factory.getFeeConfig(false)
305
+ expect(config.fixedFee).to.equal(2)
306
+ expect(config.maxFee).to.equal(200)
307
+ })
308
+
309
+ it("rejects non-operators from updating default fee configs", async function () {
310
+ const { other, factory } = await deployFactoryFixture()
311
+
312
+ await expect(
313
+ factory.connect(other).setDefaultDepositFee(1, 0, 100)
314
+ ).to.be.revertedWithCustomError(factory, "AccessControlUnauthorizedAccount")
315
+ })
316
+
317
+ it("keeps blacklist management admin-only", async function () {
318
+ const { owner, operator, other, factory } = await deployFactoryFixture()
319
+ const operatorRole = await factory.OPERATOR_ROLE()
320
+
321
+ await factory.connect(owner).grantRole(operatorRole, operator.address)
322
+ await expect(
323
+ factory.connect(operator).addToBlacklist(other.address)
324
+ ).to.be.revertedWithCustomError(factory, "AccessControlUnauthorizedAccount")
325
+ })
326
+
327
+ it("exposes owner() as the primary DEFAULT_ADMIN_ROLE holder", async function () {
328
+ const { owner, factory } = await deployFactoryFixture()
329
+
330
+ expect(await factory.owner()).to.equal(owner.address)
331
+ })
332
+
333
+ it("lets admin set rescue recipient (fee recipient is immutable)", async function () {
334
+ const { owner, operator, other, factory } = await deployFactoryFixture()
335
+
336
+ expect(await factory.feeRecipient()).to.equal(owner.address)
337
+
338
+ await expect(factory.connect(owner).setRescueRecipient(operator.address))
339
+ .to.emit(factory, "RescueRecipientUpdated")
340
+ .withArgs(owner.address, operator.address)
341
+ expect(await factory.rescueRecipient()).to.equal(operator.address)
342
+
343
+ await expect(
344
+ factory.connect(operator).setRescueRecipient(other.address)
345
+ ).to.be.revertedWithCustomError(factory, "AccessControlUnauthorizedAccount")
346
+ })
347
+
348
+ it("returns the first DEFAULT_ADMIN_ROLE holder when multiple admins exist", async function () {
349
+ const { owner, operator, factory } = await deployFactoryFixture()
350
+ const adminRole = await factory.DEFAULT_ADMIN_ROLE()
351
+
352
+ await factory.connect(owner).grantRole(adminRole, operator.address)
353
+ expect(await factory.owner()).to.equal(owner.address)
354
+ })
355
+ })
356
+
357
+ describe("pause (instance then factory)", function () {
358
+ it("lets portal owner pause only that instance", async function () {
359
+ const { owner, user, portal, underlying, depositAmount } = await deployPortalFixture()
360
+
361
+ await portal.connect(owner).pause()
362
+ expect(await portal.paused()).to.equal(true)
363
+
364
+ await underlying.connect(user).approve(await portal.getAddress(), depositAmount)
365
+ await expect(
366
+ portal.connect(user).deposit(user.address, depositAmount, 0, 100, { value: 1000 })
367
+ ).to.be.revertedWithCustomError(portal, "DepositsPaused")
368
+
369
+ await expect(
370
+ portal.connect(user).requestWithdrawWithPermit(
371
+ user.address,
372
+ 1,
373
+ 0,
374
+ 1000,
375
+ 100,
376
+ 999_999_999,
377
+ 27,
378
+ hre.ethers.ZeroHash,
379
+ hre.ethers.ZeroHash,
380
+ { value: 1000 }
381
+ )
382
+ ).to.be.revertedWithCustomError(portal, "WithdrawalsPaused")
383
+ })
384
+
385
+ it("rejects non-admin portal pause", async function () {
386
+ const { user, portal } = await deployPortalFixture()
387
+ await expect(portal.connect(user).pause()).to.be.revertedWithCustomError(
388
+ portal,
389
+ "OnlyFactoryAdmin"
390
+ )
391
+ })
392
+
393
+ it("factory pause pauses deposits and withdrawals on portals", async function () {
394
+ const { owner, user, portal, underlying, factory, depositAmount } =
395
+ await deployPortalFixture()
396
+
397
+ await factory.connect(owner).pause()
398
+ expect(await factory.paused()).to.equal(true)
399
+ expect(await factory.depositsPaused()).to.equal(true)
400
+ expect(await factory.withdrawalsPaused()).to.equal(true)
401
+
402
+ await underlying.connect(user).approve(await portal.getAddress(), depositAmount)
403
+ await expect(
404
+ portal.connect(user).deposit(user.address, depositAmount, 0, 100, { value: 1000 })
405
+ ).to.be.revertedWithCustomError(portal, "DepositsPaused")
406
+
407
+ await expect(
408
+ portal.connect(user).requestWithdrawWithPermit(
409
+ user.address,
410
+ 1,
411
+ 0,
412
+ 1000,
413
+ 100,
414
+ 999_999_999,
415
+ 27,
416
+ hre.ethers.ZeroHash,
417
+ hre.ethers.ZeroHash,
418
+ { value: 1000 }
419
+ )
420
+ ).to.be.revertedWithCustomError(portal, "WithdrawalsPaused")
421
+ })
422
+
423
+ it("rejects non-admin factory pause", async function () {
424
+ const { operator, factory } = await deployFactoryFixture()
425
+ await expect(factory.connect(operator).pause()).to.be.revertedWithCustomError(
426
+ factory,
427
+ "AccessControlUnauthorizedAccount"
428
+ )
429
+ })
430
+
431
+ it("unpausing the instance restores entry points when factory is not paused", async function () {
432
+ const { owner, user, portal, underlying, depositAmount } = await deployPortalFixture()
433
+
434
+ await portal.connect(owner).pause()
435
+ await portal.connect(owner).unpause()
436
+ expect(await portal.paused()).to.equal(false)
437
+
438
+ await underlying.connect(user).approve(await portal.getAddress(), depositAmount)
439
+ await expect(
440
+ portal.connect(user).deposit(user.address, depositAmount, 0, 100, { value: 1000 })
441
+ ).to.not.be.reverted
442
+ })
443
+
444
+ it("instance unpause does not clear factory pause", async function () {
445
+ const { owner, user, portal, underlying, factory, depositAmount } =
446
+ await deployPortalFixture()
447
+
448
+ await factory.connect(owner).pause()
449
+ await portal.connect(owner).pause()
450
+ await portal.connect(owner).unpause()
451
+
452
+ await underlying.connect(user).approve(await portal.getAddress(), depositAmount)
453
+ await expect(
454
+ portal.connect(user).deposit(user.address, depositAmount, 0, 100, { value: 1000 })
455
+ ).to.be.revertedWithCustomError(portal, "DepositsPaused")
456
+ })
457
+ })
458
+
459
+ describe("portal fee overrides", function () {
460
+ it("requires factory operator for portal fee overrides", async function () {
461
+ const { owner, user, operator, portal, factory } = await deployPortalFixture()
462
+
463
+ await expect(
464
+ portal.connect(user).setDepositFee(1, 0, 100)
465
+ ).to.be.revertedWithCustomError(portal, "OnlyFactoryOperator")
466
+
467
+ await factory.connect(owner).setOperator(operator.address, true)
468
+ await expect(portal.connect(operator).setDepositFee(1, 0, 100)).to.not.be.reverted
469
+
470
+ const config = await portal.getFeeConfig(true)
471
+ expect(config.fixedFee).to.equal(1)
472
+ expect(config.maxFee).to.equal(100)
473
+ })
474
+
475
+ it("overrides deposit and withdraw fees and clears back to factory defaults", async function () {
476
+ const { owner, operator, portal, factory } = await deployPortalFixture()
477
+ await factory.connect(owner).setDefaultDepositFee(5, 0, 50)
478
+ await factory.connect(owner).setDefaultWithdrawFee(7, 0, 70)
479
+ await factory.connect(owner).setOperator(operator.address, true)
480
+
481
+ await portal.connect(operator).setDepositFee(11, 0, 110)
482
+ await portal.connect(operator).setWithdrawFee(13, 0, 130)
483
+
484
+ expect((await portal.getFeeConfig(true)).fixedFee).to.equal(11)
485
+ expect((await portal.getFeeConfig(false)).fixedFee).to.equal(13)
486
+
487
+ const [depositOverride, depositSet] = await portal.getFeeConfigOverride(true)
488
+ expect(depositSet).to.equal(true)
489
+ expect(depositOverride.fixedFee).to.equal(11)
490
+
491
+ await portal.connect(operator).clearDepositFeeOverride()
492
+ await portal.connect(operator).clearWithdrawFeeOverride()
493
+
494
+ expect((await portal.getFeeConfig(true)).fixedFee).to.equal(5)
495
+ expect((await portal.getFeeConfig(false)).fixedFee).to.equal(7)
496
+ const [, cleared] = await portal.getFeeConfigOverride(true)
497
+ expect(cleared).to.equal(false)
498
+ })
499
+
500
+ it("lets factory operator toggle soft deposit enable", async function () {
501
+ const { owner, user, operator, portal, underlying, factory, depositAmount } =
502
+ await deployPortalFixture()
503
+
504
+ await factory.connect(owner).setOperator(operator.address, true)
505
+ await portal.connect(operator).setIsDepositEnabled(false)
506
+
507
+ await underlying.connect(user).approve(await portal.getAddress(), depositAmount)
508
+ await expect(
509
+ portal.connect(user).deposit(user.address, depositAmount, 0, 100, { value: 1000 })
510
+ ).to.be.revertedWithCustomError(portal, "DepositDisabled")
511
+
512
+ await portal.connect(operator).setIsDepositEnabled(true)
513
+ await expect(
514
+ portal.connect(user).deposit(user.address, depositAmount, 0, 100, { value: 1000 })
515
+ ).to.not.be.reverted
516
+ })
517
+ })
518
+
519
+ describe("factory configs", function () {
520
+ it("updates default deposit and withdraw fee configs as operator", async function () {
521
+ const { owner, operator, factory } = await deployFactoryFixture()
522
+ const operatorRole = await factory.OPERATOR_ROLE()
523
+ await factory.connect(owner).grantRole(operatorRole, operator.address)
524
+
525
+ await factory.connect(operator).setDefaultDepositFee(3, 100, 300)
526
+ await factory.connect(operator).setDefaultWithdrawFee(4, 200, 400)
527
+
528
+ const deposit = await factory.getFeeConfig(true)
529
+ expect(deposit.fixedFee).to.equal(3)
530
+ expect(deposit.percentageBps).to.equal(100)
531
+ expect(deposit.maxFee).to.equal(300)
532
+
533
+ const withdraw = await factory.getFeeConfig(false)
534
+ expect(withdraw.fixedFee).to.equal(4)
535
+ expect(withdraw.percentageBps).to.equal(200)
536
+ expect(withdraw.maxFee).to.equal(400)
537
+ })
538
+
539
+ it("updates rescue recipient as admin only; fee recipient is immutable", async function () {
540
+ const { owner, operator, factory } = await deployFactoryFixture()
541
+
542
+ expect(await factory.feeRecipient()).to.equal(owner.address)
543
+ await factory.connect(owner).setRescueRecipient(operator.address)
544
+ expect(await factory.rescueRecipient()).to.equal(operator.address)
545
+
546
+ await expect(
547
+ factory.connect(operator).setRescueRecipient(owner.address)
548
+ ).to.be.revertedWithCustomError(factory, "AccessControlUnauthorizedAccount")
549
+ })
550
+
551
+ it("updates price oracle as admin", async function () {
552
+ const { owner, operator, factory } = await deployFactoryFixture()
553
+
554
+ await expect(factory.connect(owner).setPriceOracle(operator.address))
555
+ .to.emit(factory, "PriceOracleUpdated")
556
+ expect(await factory.priceOracle()).to.equal(operator.address)
557
+ })
558
+
559
+ it("exposes isOperator for factory OPERATOR_ROLE", async function () {
560
+ const { owner, operator, factory } = await deployFactoryFixture()
561
+ expect(await factory.isOperator(owner.address)).to.equal(true)
562
+ expect(await factory.isOperator(operator.address)).to.equal(false)
563
+
564
+ const operatorRole = await factory.OPERATOR_ROLE()
565
+ await factory.connect(owner).grantRole(operatorRole, operator.address)
566
+ expect(await factory.isOperator(operator.address)).to.equal(true)
567
+ })
568
+ })
569
+
570
+ describe("factory roles propagate to all portals", function () {
571
+ async function deployTwoPortalsFixture() {
572
+ const [owner, user, operator, newAdmin] = await hre.ethers.getSigners()
573
+
574
+ const PortalImpl = await hre.ethers.getContractFactory("PrivacyPortal")
575
+ const portalImpl = await PortalImpl.deploy()
576
+ await portalImpl.waitForDeployment()
577
+
578
+ const PTokenImpl = await hre.ethers.getContractFactory("MockPodERC20ForPortal")
579
+ const pTokenImpl = await PTokenImpl.deploy()
580
+ await pTokenImpl.waitForDeployment()
581
+
582
+ const Factory = await hre.ethers.getContractFactory("PrivacyPortalFactory")
583
+ const factory = await Factory.deploy(
584
+ owner.address,
585
+ owner.address,
586
+ 7082400,
587
+ newAdmin.address,
588
+ await pTokenImpl.getAddress(),
589
+ await portalImpl.getAddress(),
590
+ owner.address,
591
+ owner.address,
592
+ owner.address,
593
+ hre.ethers.ZeroAddress,
594
+ 0,
595
+ 0,
596
+ 2n ** 128n - 1n,
597
+ 0,
598
+ 0,
599
+ 2n ** 128n - 1n
600
+ )
601
+ await factory.waitForDeployment()
602
+
603
+ const MockERC20 = await hre.ethers.getContractFactory("MockERC20")
604
+ const underlyingA = await MockERC20.deploy("Token A", "AAA", 6)
605
+ await underlyingA.waitForDeployment()
606
+ const underlyingB = await MockERC20.deploy("Token B", "BBB", 6)
607
+ await underlyingB.waitForDeployment()
608
+
609
+ const pTokenA = await PTokenImpl.deploy()
610
+ await pTokenA.waitForDeployment()
611
+ const pTokenB = await PTokenImpl.deploy()
612
+ await pTokenB.waitForDeployment()
613
+
614
+ const CloneHelper = await hre.ethers.getContractFactory("CloneHelper")
615
+ const cloneHelper = await CloneHelper.deploy()
616
+ await cloneHelper.waitForDeployment()
617
+
618
+ await cloneHelper.clone(await portalImpl.getAddress())
619
+ const portalA = PortalImpl.attach(await cloneHelper.lastClone()) as Awaited<
620
+ ReturnType<typeof PortalImpl.deploy>
621
+ >
622
+ await portalA.initialize(
623
+ await underlyingA.getAddress(),
624
+ await pTokenA.getAddress(),
625
+ 6,
626
+ false,
627
+ await factory.getAddress()
628
+ )
629
+
630
+ await cloneHelper.clone(await portalImpl.getAddress())
631
+ const portalB = PortalImpl.attach(await cloneHelper.lastClone()) as Awaited<
632
+ ReturnType<typeof PortalImpl.deploy>
633
+ >
634
+ await portalB.initialize(
635
+ await underlyingB.getAddress(),
636
+ await pTokenB.getAddress(),
637
+ 6,
638
+ false,
639
+ await factory.getAddress()
640
+ )
641
+
642
+ return { owner, user, operator, newAdmin, factory, portalA, portalB }
643
+ }
644
+
645
+ it("respects factory admin on every portal and updates after admin transfer", async function () {
646
+ const { owner, user, newAdmin, factory, portalA, portalB } = await deployTwoPortalsFixture()
647
+ const adminRole = await factory.DEFAULT_ADMIN_ROLE()
648
+
649
+ expect(await factory.isAdmin(owner.address)).to.equal(true)
650
+ expect(await factory.isAdmin(newAdmin.address)).to.equal(false)
651
+
652
+ // Non-admin cannot pause either portal.
653
+ await expect(portalA.connect(user).pause()).to.be.revertedWithCustomError(
654
+ portalA,
655
+ "OnlyFactoryAdmin"
656
+ )
657
+ await expect(portalB.connect(user).pause()).to.be.revertedWithCustomError(
658
+ portalB,
659
+ "OnlyFactoryAdmin"
660
+ )
661
+
662
+ // Current factory admin can admin both portals.
663
+ await portalA.connect(owner).setLimits(1, 100, 1, 100)
664
+ await portalB.connect(owner).setLimits(2, 200, 2, 200)
665
+ expect(await portalA.minDepositAmount()).to.equal(1)
666
+ expect(await portalB.minDepositAmount()).to.equal(2)
667
+
668
+ // Grant + revoke DEFAULT_ADMIN_ROLE on the factory — both portals follow immediately.
669
+ await factory.connect(owner).grantRole(adminRole, newAdmin.address)
670
+ await factory.connect(owner).revokeRole(adminRole, owner.address)
671
+ expect(await factory.isAdmin(owner.address)).to.equal(false)
672
+ expect(await factory.isAdmin(newAdmin.address)).to.equal(true)
673
+
674
+ await expect(portalA.connect(owner).pause()).to.be.revertedWithCustomError(
675
+ portalA,
676
+ "OnlyFactoryAdmin"
677
+ )
678
+ await expect(portalB.connect(owner).setLimits(9, 99, 9, 99)).to.be.revertedWithCustomError(
679
+ portalB,
680
+ "OnlyFactoryAdmin"
681
+ )
682
+
683
+ await portalA.connect(newAdmin).pause()
684
+ await portalB.connect(newAdmin).pause()
685
+ expect(await portalA.paused()).to.equal(true)
686
+ expect(await portalB.paused()).to.equal(true)
687
+
688
+ await portalA.connect(newAdmin).unpause()
689
+ await portalB.connect(newAdmin).unpause()
690
+ await portalA.connect(newAdmin).addToBlacklist(user.address)
691
+ await portalB.connect(newAdmin).addToBlacklist(user.address)
692
+ expect(await portalA.blacklisted(user.address)).to.equal(true)
693
+ expect(await portalB.blacklisted(user.address)).to.equal(true)
694
+ })
695
+
696
+ it("respects factory operator on every portal and updates after operator revoke/grant", async function () {
697
+ const { owner, user, operator, factory, portalA, portalB } = await deployTwoPortalsFixture()
698
+ const operatorRole = await factory.OPERATOR_ROLE()
699
+
700
+ // Initial operator is constructor admin (owner); outsider cannot toggle soft deposits.
701
+ await expect(
702
+ portalA.connect(user).setIsDepositEnabled(false)
703
+ ).to.be.revertedWithCustomError(portalA, "OnlyFactoryOperator")
704
+ await expect(
705
+ portalB.connect(operator).setDepositFee(1, 0, 10)
706
+ ).to.be.revertedWithCustomError(portalB, "OnlyFactoryOperator")
707
+
708
+ await factory.connect(owner).grantRole(operatorRole, operator.address)
709
+ expect(await factory.isOperator(operator.address)).to.equal(true)
710
+
711
+ await portalA.connect(operator).setIsDepositEnabled(false)
712
+ await portalB.connect(operator).setIsDepositEnabled(false)
713
+ expect(await portalA.isDepositEnabled()).to.equal(false)
714
+ expect(await portalB.isDepositEnabled()).to.equal(false)
715
+
716
+ await portalA.connect(operator).setDepositFee(5, 0, 50)
717
+ await portalB.connect(operator).setWithdrawFee(7, 0, 70)
718
+ expect((await portalA.getFeeConfigOverride(true))[1]).to.equal(true)
719
+ expect((await portalB.getFeeConfigOverride(false))[1]).to.equal(true)
720
+
721
+ // Revoke OPERATOR_ROLE — both portals reject the former operator immediately.
722
+ await factory.connect(owner).revokeRole(operatorRole, operator.address)
723
+ expect(await factory.isOperator(operator.address)).to.equal(false)
724
+
725
+ await expect(
726
+ portalA.connect(operator).setIsDepositEnabled(true)
727
+ ).to.be.revertedWithCustomError(portalA, "OnlyFactoryOperator")
728
+ await expect(
729
+ portalB.connect(operator).clearDepositFeeOverride()
730
+ ).to.be.revertedWithCustomError(portalB, "OnlyFactoryOperator")
731
+
732
+ // Owner (still OPERATOR_ROLE from constructor) can clear overrides on both.
733
+ await portalA.connect(owner).clearDepositFeeOverride()
734
+ await portalB.connect(owner).clearWithdrawFeeOverride()
735
+ expect((await portalA.getFeeConfigOverride(true))[1]).to.equal(false)
736
+ expect((await portalB.getFeeConfigOverride(false))[1]).to.equal(false)
737
+ })
738
+ })
739
+
740
+ describe("portal factory-admin actions", function () {
741
+ it("lets factory admin manage portal blacklist independently of factory blacklist", async function () {
742
+ const { owner, user, portal, underlying, depositAmount } = await deployPortalFixture()
743
+
744
+ await portal.connect(owner).addToBlacklist(user.address)
745
+ await underlying.connect(user).approve(await portal.getAddress(), depositAmount)
746
+ await expect(
747
+ portal.connect(user).deposit(user.address, depositAmount, 0, 100, { value: 1000 })
748
+ ).to.be.revertedWithCustomError(portal, "AddressBlacklisted")
749
+
750
+ await portal.connect(owner).removeFromBlacklist(user.address)
751
+ await expect(
752
+ portal.connect(user).deposit(user.address, depositAmount, 0, 100, { value: 1000 })
753
+ ).to.not.be.reverted
754
+ })
755
+ })
756
+ })