@coti-io/coti-contracts 1.0.9 → 1.2.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.
Files changed (271) hide show
  1. package/.github/workflows/npm-publish.yml +18 -14
  2. package/README.md +3 -1
  3. package/contracts/disperse/coinByRatio/FixedRatioCoinDisperser.sol +452 -0
  4. package/contracts/disperse/coinByRatio/FixedRatioCoinDisperserLeftoverS1.sol +490 -0
  5. package/contracts/disperse/coinByRatio/FixedRatioCoinDisperserUnlimitedWindow.sol +432 -0
  6. package/contracts/disperse/disperseToken/MintDisperser.sol +120 -0
  7. package/contracts/disperse/disperseToken/TokenDisperser.sol +139 -0
  8. package/contracts/mocks/token/ERC20Mock.sol +19 -0
  9. package/contracts/mocks/token/PrivateERC20/EncryptedTokenReceiverMock.sol +18 -0
  10. package/contracts/mocks/token/PrivateERC20/PrivacyBridgeERC20Mock.sol +13 -0
  11. package/contracts/mocks/token/PrivateERC20/PrivateERC20AuditorSupplyMock.sol +44 -0
  12. package/contracts/mocks/token/PrivateERC20/PrivateERC20CappedMock.sol +23 -0
  13. package/contracts/mocks/token/PrivateERC20/PrivateERC20GtCallerMock.sol +29 -0
  14. package/contracts/mocks/token/PrivateERC20/PrivateERC20Mock.sol +9 -4
  15. package/contracts/mocks/token/PrivateERC20/PrivateERC20ReentrantReceiverMock.sol +39 -0
  16. package/contracts/mocks/token/PrivateERC20/PublicReentrantTokenReceiverMock.sol +29 -0
  17. package/contracts/mocks/token/PrivateERC20/PublicTokenReceiverBoolMock.sol +18 -0
  18. package/contracts/mocks/token/PrivateERC20/PublicTokenReceiverMock.sol +12 -0
  19. package/contracts/mocks/utils/mpc/Arithmetic128TestsContract.sol +123 -0
  20. package/contracts/mocks/utils/mpc/Arithmetic256TestsContract.sol +122 -0
  21. package/contracts/mocks/utils/mpc/Bitwise128TestsContract.sol +65 -0
  22. package/contracts/mocks/utils/mpc/Bitwise256TestsContract.sol +65 -0
  23. package/contracts/mocks/utils/mpc/CheckedArithmetic128WithOverflowBitTestsContract.sol +64 -0
  24. package/contracts/mocks/utils/mpc/CheckedArithmetic256WithOverflowBitTestsContract.sol +64 -0
  25. package/contracts/mocks/utils/mpc/Comparison128TestsContract.sol +98 -0
  26. package/contracts/mocks/utils/mpc/Comparison256TestsContract.sol +98 -0
  27. package/contracts/mocks/utils/mpc/MinMax128TestsContract.sol +44 -0
  28. package/contracts/mocks/utils/mpc/MinMax256TestsContract.sol +44 -0
  29. package/contracts/mocks/utils/mpc/MinimalImplementation.sol +55 -0
  30. package/contracts/mocks/utils/mpc/MinimalProxy.sol +27 -0
  31. package/contracts/mocks/utils/mpc/MpcOperations128TestContract.sol +267 -0
  32. package/contracts/mocks/utils/mpc/MpcOperationsTestContract.sol +334 -0
  33. package/contracts/mocks/utils/mpc/Mux128TestsContract.sol +24 -0
  34. package/contracts/mocks/utils/mpc/Mux256TestsContract.sol +24 -0
  35. package/contracts/mocks/utils/mpc/OnBoard128TestsContract.sol +93 -0
  36. package/contracts/mocks/utils/mpc/OnBoard256TestsContract.sol +116 -0
  37. package/contracts/mocks/utils/mpc/PrivacyImplementationV1.sol +157 -0
  38. package/contracts/mocks/utils/mpc/PrivacyImplementationV2.sol +133 -0
  39. package/contracts/mocks/utils/mpc/PrivacyProxy.sol +137 -0
  40. package/contracts/mocks/utils/mpc/Random128TestsContract.sol +32 -0
  41. package/contracts/mocks/utils/mpc/Random256TestsContract.sol +32 -0
  42. package/contracts/mocks/utils/mpc/Shift128TestsContract.sol +36 -0
  43. package/contracts/mocks/utils/mpc/Shift256TestsContract.sol +36 -0
  44. package/contracts/mocks/utils/mpc/Transfer128TestsContract.sol +29 -0
  45. package/contracts/mocks/utils/mpc/Transfer256TestsContract.sol +29 -0
  46. package/contracts/mocks/utils/mpc/TransferWithAllowance128TestsContract.sol +32 -0
  47. package/contracts/mocks/utils/mpc/TransferWithAllowance256TestsContract.sol +32 -0
  48. package/contracts/mocks/utils/mpc/ValidateCiphertext128TestsContract.sol +59 -0
  49. package/contracts/mocks/utils/mpc/ValidateCiphertext256TestsContract.sol +63 -0
  50. package/contracts/mocks/utils/mpc/ValidateCiphertextTestsContract.sol +99 -0
  51. package/contracts/mocks/wallet/PrivateERC20Wallet/PrivateERC20WalletMock.sol +7 -6
  52. package/contracts/node/CotiNodeRewards.sol +199 -0
  53. package/contracts/node/SoulboundNodeNFT.sol +519 -0
  54. package/contracts/privacyBridge/PrivacyBridge.sol +318 -0
  55. package/contracts/privacyBridge/PrivacyBridgeCotiNative.sol +268 -0
  56. package/contracts/privacyBridge/PrivacyBridgeERC20.sol +251 -0
  57. package/contracts/privacyBridge/PrivacyBridgeUSDCe.sol +16 -0
  58. package/contracts/privacyBridge/PrivacyBridgeUSDT.sol +17 -0
  59. package/contracts/privacyBridge/PrivacyBridgeWADA.sol +17 -0
  60. package/contracts/privacyBridge/PrivacyBridgeWBTC.sol +17 -0
  61. package/contracts/privacyBridge/PrivacyBridgeWETH.sol +17 -0
  62. package/contracts/privacyBridge/PrivacyBridgegCoti.sol +17 -0
  63. package/contracts/token/PrivateERC20/IPrivateERC20.sol +273 -40
  64. package/contracts/token/PrivateERC20/ITokenReceiver.sol +17 -0
  65. package/contracts/token/PrivateERC20/ITokenReceiverEncrypted.sol +20 -0
  66. package/contracts/token/PrivateERC20/PrivateERC20.sol +861 -152
  67. package/contracts/token/PrivateERC20/tokens/PrivateBridgedUSDC.sol +17 -0
  68. package/contracts/token/PrivateERC20/tokens/PrivateCOTI.sol +13 -0
  69. package/contracts/token/PrivateERC20/tokens/PrivateCOTITreasuryGovernanceToken.sol +17 -0
  70. package/contracts/token/PrivateERC20/tokens/PrivateTetherUSD.sol +17 -0
  71. package/contracts/token/PrivateERC20/tokens/PrivateWrappedADA.sol +17 -0
  72. package/contracts/token/PrivateERC20/tokens/PrivateWrappedBTC.sol +17 -0
  73. package/contracts/token/PrivateERC20/tokens/PrivateWrappedEther.sol +13 -0
  74. package/contracts/utils/mpc/MpcCore.sol +10891 -2449
  75. package/contracts/utils/mpc/MpcInterface.sol +7 -2
  76. package/hardhat/gasPriceBump.ts +60 -0
  77. package/hardhat.config.ts +60 -12
  78. package/package.json +21 -3
  79. package/scripts/deploySoulboundNodeNFT.ts +57 -0
  80. package/test/token/PrivateERC20/PrivacyBridge.fees.test.ts +327 -0
  81. package/test/token/PrivateERC20/PrivateERC20.test.ts +1109 -268
  82. package/test/utils/mpc/Bitwise128.test.ts +92 -0
  83. package/test/utils/mpc/Bitwise256.test.ts +101 -0
  84. package/test/utils/mpc/BuildInputText128.test.ts +398 -0
  85. package/test/utils/mpc/CheckedArithmetic128.test.ts +45 -0
  86. package/test/utils/mpc/CheckedArithmetic256.test.ts +45 -0
  87. package/test/utils/mpc/Comparison128.test.ts +48 -0
  88. package/test/utils/mpc/Comparison256.test.ts +48 -0
  89. package/test/utils/mpc/InvalidCiphertext.test.ts +179 -0
  90. package/test/utils/mpc/InvalidCiphertext128.test.ts +179 -0
  91. package/test/utils/mpc/InvalidCiphertext256.test.ts +201 -0
  92. package/test/utils/mpc/InvalidTransfer128.test.ts +166 -0
  93. package/test/utils/mpc/InvalidTransfer256.test.ts +158 -0
  94. package/test/utils/mpc/MinMax128.test.ts +44 -0
  95. package/test/utils/mpc/MinMax256.test.ts +44 -0
  96. package/test/utils/mpc/MinimalProxyDemo.test.ts +280 -0
  97. package/test/utils/mpc/MpcOperations.test.ts +589 -0
  98. package/test/utils/mpc/MpcOperations128.test.ts +632 -0
  99. package/test/utils/mpc/Mux128.test.ts +41 -0
  100. package/test/utils/mpc/Mux256.test.ts +41 -0
  101. package/test/utils/mpc/NegativeCases.test.ts +478 -0
  102. package/test/utils/mpc/NegativeCases128.test.ts +237 -0
  103. package/test/utils/mpc/NegativeCases256.test.ts +236 -0
  104. package/test/utils/mpc/OnBoard128.test.ts +90 -0
  105. package/test/utils/mpc/OnBoard256.test.ts +114 -0
  106. package/test/utils/mpc/Precompile128.test.ts +51 -0
  107. package/test/utils/mpc/Precompile256.test.ts +115 -0
  108. package/test/utils/mpc/ProxyValidation.test.ts +199 -0
  109. package/test/utils/mpc/Random128.test.ts +47 -0
  110. package/test/utils/mpc/Random256.test.ts +47 -0
  111. package/test/utils/mpc/Shift128.test.ts +41 -0
  112. package/test/utils/mpc/Shift256.test.ts +41 -0
  113. package/test/utils/mpc/Transfer128.test.ts +46 -0
  114. package/test/utils/mpc/Transfer256.test.ts +46 -0
  115. package/test/utils/mpc/TransferWithAllowance128.test.ts +48 -0
  116. package/test/utils/mpc/TransferWithAllowance256.test.ts +48 -0
  117. package/test/utils/mpc/UpgradeablePrivacyProxy.test.ts +307 -0
  118. package/test/utils/mpc/ValidateCiphertext.test.ts +221 -0
  119. package/test/utils/mpc/ValidateCiphertext256.test.ts +161 -0
  120. package/test/utils/mpc/ValidateCiphertext256Decryption.test.ts +383 -0
  121. package/test/utils/mpc/WalletEncryptionFailures.test.ts +494 -0
  122. package/test/utils/privateErc20Helpers.ts +97 -0
  123. package/typechain-types/@openzeppelin/contracts/access/Ownable.ts +153 -0
  124. package/typechain-types/@openzeppelin/contracts/access/index.ts +4 -0
  125. package/typechain-types/@openzeppelin/contracts/index.ts +2 -0
  126. package/typechain-types/@openzeppelin/contracts/token/ERC20/IERC20.ts +262 -0
  127. package/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.ts +143 -0
  128. package/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/index.ts +4 -0
  129. package/typechain-types/@openzeppelin/contracts/token/ERC20/index.ts +6 -0
  130. package/typechain-types/@openzeppelin/contracts/token/index.ts +2 -0
  131. package/typechain-types/contracts/disperse/coinByRatio/FixedRatioCoinDisperser.ts +679 -0
  132. package/typechain-types/contracts/disperse/coinByRatio/index.ts +4 -0
  133. package/typechain-types/contracts/disperse/disperseToken/MintDisperser.sol/IMintableERC20.ts +97 -0
  134. package/typechain-types/contracts/disperse/disperseToken/MintDisperser.sol/MintDisperser.ts +206 -0
  135. package/typechain-types/contracts/disperse/disperseToken/MintDisperser.sol/index.ts +5 -0
  136. package/typechain-types/contracts/disperse/disperseToken/TokenDisperser.ts +191 -0
  137. package/typechain-types/contracts/disperse/disperseToken/index.ts +6 -0
  138. package/typechain-types/contracts/disperse/index.ts +7 -0
  139. package/typechain-types/contracts/index.ts +2 -0
  140. package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20Mock.ts +77 -60
  141. package/typechain-types/contracts/mocks/utils/mpc/Arithmetic128BitTestsContract.ts +341 -0
  142. package/typechain-types/contracts/mocks/utils/mpc/Arithmetic128TestsContract.ts +311 -0
  143. package/typechain-types/contracts/mocks/utils/mpc/Arithmetic256BitTestsContract.ts +347 -0
  144. package/typechain-types/contracts/mocks/utils/mpc/Arithmetic256TestsContract.ts +311 -0
  145. package/typechain-types/contracts/mocks/utils/mpc/Bitwise128BitTestsContract.ts +186 -0
  146. package/typechain-types/contracts/mocks/utils/mpc/Bitwise128TestsContract.ts +179 -0
  147. package/typechain-types/contracts/mocks/utils/mpc/Bitwise256BitTestsContract.ts +186 -0
  148. package/typechain-types/contracts/mocks/utils/mpc/Bitwise256TestsContract.ts +179 -0
  149. package/typechain-types/contracts/mocks/utils/mpc/CheckedArithmetic128WithOverflowBitTestsContract.ts +206 -0
  150. package/typechain-types/contracts/mocks/utils/mpc/CheckedArithmetic256WithOverflowBitTestsContract.ts +206 -0
  151. package/typechain-types/contracts/mocks/utils/mpc/Comparison128BitTestsContract.ts +260 -0
  152. package/typechain-types/contracts/mocks/utils/mpc/Comparison128TestsContract.ts +278 -0
  153. package/typechain-types/contracts/mocks/utils/mpc/Comparison256BitTestsContract.ts +260 -0
  154. package/typechain-types/contracts/mocks/utils/mpc/Comparison256TestsContract.ts +278 -0
  155. package/typechain-types/contracts/mocks/utils/mpc/MinMax128TestsContract.ts +142 -0
  156. package/typechain-types/contracts/mocks/utils/mpc/MinMax256TestsContract.ts +142 -0
  157. package/typechain-types/contracts/mocks/utils/mpc/MinimalImplementation.ts +259 -0
  158. package/typechain-types/contracts/mocks/utils/mpc/MinimalProxy.ts +90 -0
  159. package/typechain-types/contracts/mocks/utils/mpc/Miscellaneous128BitTestsContract.ts +302 -0
  160. package/typechain-types/contracts/mocks/utils/mpc/Miscellaneous256BitTestsContract.ts +322 -0
  161. package/typechain-types/contracts/mocks/utils/mpc/MpcOperations128TestContract.ts +388 -0
  162. package/typechain-types/contracts/mocks/utils/mpc/MpcOperationsTestContract.ts +455 -0
  163. package/typechain-types/contracts/mocks/utils/mpc/Mux128TestsContract.ts +109 -0
  164. package/typechain-types/contracts/mocks/utils/mpc/Mux256TestsContract.ts +109 -0
  165. package/typechain-types/contracts/mocks/utils/mpc/OnBoard128TestsContract.ts +166 -0
  166. package/typechain-types/contracts/mocks/utils/mpc/OnBoard256TestsContract.ts +194 -0
  167. package/typechain-types/contracts/mocks/utils/mpc/PrivacyImplementationV1.ts +385 -0
  168. package/typechain-types/contracts/mocks/utils/mpc/PrivacyImplementationV2.ts +441 -0
  169. package/typechain-types/contracts/mocks/utils/mpc/PrivacyProxy.ts +201 -0
  170. package/typechain-types/contracts/mocks/utils/mpc/Random128TestsContract.ts +131 -0
  171. package/typechain-types/contracts/mocks/utils/mpc/Random256TestsContract.ts +131 -0
  172. package/typechain-types/contracts/mocks/utils/mpc/Shift128TestsContract.ts +142 -0
  173. package/typechain-types/contracts/mocks/utils/mpc/Shift256TestsContract.ts +142 -0
  174. package/typechain-types/contracts/mocks/utils/mpc/Transfer128TestsContract.ts +109 -0
  175. package/typechain-types/contracts/mocks/utils/mpc/Transfer256TestsContract.ts +109 -0
  176. package/typechain-types/contracts/mocks/utils/mpc/TransferWithAllowance128TestsContract.ts +128 -0
  177. package/typechain-types/contracts/mocks/utils/mpc/TransferWithAllowance256TestsContract.ts +128 -0
  178. package/typechain-types/contracts/mocks/utils/mpc/ValidateCiphertext128TestsContract.ts +198 -0
  179. package/typechain-types/contracts/mocks/utils/mpc/ValidateCiphertext256TestsContract.ts +182 -0
  180. package/typechain-types/contracts/mocks/utils/mpc/ValidateCiphertextTestsContract.ts +257 -0
  181. package/typechain-types/contracts/mocks/utils/mpc/index.ts +32 -0
  182. package/typechain-types/contracts/token/PrivateERC20/IPrivateERC20.ts +77 -60
  183. package/typechain-types/contracts/token/PrivateERC20/PrivateERC20.ts +77 -60
  184. package/typechain-types/contracts/utils/mpc/MpcInterface.sol/ExtendedOperations.ts +111 -10
  185. package/typechain-types/factories/@openzeppelin/contracts/access/Ownable__factory.ts +74 -0
  186. package/typechain-types/factories/@openzeppelin/contracts/access/index.ts +4 -0
  187. package/typechain-types/factories/@openzeppelin/contracts/index.ts +1 -0
  188. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/IERC20__factory.ts +205 -0
  189. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit__factory.ts +100 -0
  190. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/index.ts +4 -0
  191. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/index.ts +5 -0
  192. package/typechain-types/factories/@openzeppelin/contracts/token/index.ts +1 -0
  193. package/typechain-types/factories/contracts/disperse/coinByRatio/FixedRatioCoinDisperser__factory.ts +759 -0
  194. package/typechain-types/factories/contracts/disperse/coinByRatio/index.ts +4 -0
  195. package/typechain-types/factories/contracts/disperse/disperseToken/MintDisperser.sol/IMintableERC20__factory.ts +43 -0
  196. package/typechain-types/factories/contracts/disperse/disperseToken/MintDisperser.sol/MintDisperser__factory.ts +185 -0
  197. package/typechain-types/factories/contracts/disperse/disperseToken/MintDisperser.sol/index.ts +5 -0
  198. package/typechain-types/factories/contracts/disperse/disperseToken/TokenDisperser__factory.ts +198 -0
  199. package/typechain-types/factories/contracts/disperse/disperseToken/index.ts +5 -0
  200. package/typechain-types/factories/contracts/disperse/index.ts +5 -0
  201. package/typechain-types/factories/contracts/index.ts +1 -0
  202. package/typechain-types/factories/contracts/mocks/access/DataPrivacyFramework/DataPrivacyFrameworkMock__factory.ts +1 -1
  203. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20Mock__factory.ts +179 -47
  204. package/typechain-types/factories/contracts/mocks/utils/mpc/Arithmetic128BitTestsContract__factory.ts +349 -0
  205. package/typechain-types/factories/contracts/mocks/utils/mpc/Arithmetic128TestsContract__factory.ts +330 -0
  206. package/typechain-types/factories/contracts/mocks/utils/mpc/Arithmetic256BitTestsContract__factory.ts +364 -0
  207. package/typechain-types/factories/contracts/mocks/utils/mpc/Arithmetic256TestsContract__factory.ts +330 -0
  208. package/typechain-types/factories/contracts/mocks/utils/mpc/ArithmeticTestsContract__factory.ts +1 -1
  209. package/typechain-types/factories/contracts/mocks/utils/mpc/Bitwise128BitTestsContract__factory.ts +182 -0
  210. package/typechain-types/factories/contracts/mocks/utils/mpc/Bitwise128TestsContract__factory.ts +184 -0
  211. package/typechain-types/factories/contracts/mocks/utils/mpc/Bitwise256BitTestsContract__factory.ts +182 -0
  212. package/typechain-types/factories/contracts/mocks/utils/mpc/Bitwise256TestsContract__factory.ts +184 -0
  213. package/typechain-types/factories/contracts/mocks/utils/mpc/BitwiseTestsContract__factory.ts +1 -1
  214. package/typechain-types/factories/contracts/mocks/utils/mpc/CheckedArithmetic128WithOverflowBitTestsContract__factory.ts +203 -0
  215. package/typechain-types/factories/contracts/mocks/utils/mpc/CheckedArithmetic256WithOverflowBitTestsContract__factory.ts +203 -0
  216. package/typechain-types/factories/contracts/mocks/utils/mpc/CheckedArithmeticWIthOverflowBitTestsContract.sol/CheckedArithmeticWithOverflowBitTestsContract__factory.ts +1 -1
  217. package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison128BitTestsContract__factory.ts +255 -0
  218. package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison128TestsContract__factory.ts +295 -0
  219. package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison1TestsContract__factory.ts +1 -1
  220. package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison256BitTestsContract__factory.ts +255 -0
  221. package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison256TestsContract__factory.ts +295 -0
  222. package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison2TestsContract__factory.ts +1 -1
  223. package/typechain-types/factories/contracts/mocks/utils/mpc/MinMax128TestsContract__factory.ts +147 -0
  224. package/typechain-types/factories/contracts/mocks/utils/mpc/MinMax256TestsContract__factory.ts +147 -0
  225. package/typechain-types/factories/contracts/mocks/utils/mpc/MinMaxTestsContract__factory.ts +1 -1
  226. package/typechain-types/factories/contracts/mocks/utils/mpc/MinimalImplementation__factory.ts +263 -0
  227. package/typechain-types/factories/contracts/mocks/utils/mpc/MinimalProxy__factory.ts +104 -0
  228. package/typechain-types/factories/contracts/mocks/utils/mpc/Miscellaneous128BitTestsContract__factory.ts +332 -0
  229. package/typechain-types/factories/contracts/mocks/utils/mpc/Miscellaneous1TestsContract__factory.ts +1 -1
  230. package/typechain-types/factories/contracts/mocks/utils/mpc/Miscellaneous256BitTestsContract__factory.ts +380 -0
  231. package/typechain-types/factories/contracts/mocks/utils/mpc/MiscellaneousTestsContract__factory.ts +1 -1
  232. package/typechain-types/factories/contracts/mocks/utils/mpc/MpcOperations128TestContract__factory.ts +723 -0
  233. package/typechain-types/factories/contracts/mocks/utils/mpc/MpcOperationsTestContract__factory.ts +1410 -0
  234. package/typechain-types/factories/contracts/mocks/utils/mpc/Mux128TestsContract__factory.ts +115 -0
  235. package/typechain-types/factories/contracts/mocks/utils/mpc/Mux256TestsContract__factory.ts +115 -0
  236. package/typechain-types/factories/contracts/mocks/utils/mpc/OffboardToUserKeyTestContract__factory.ts +1 -1
  237. package/typechain-types/factories/contracts/mocks/utils/mpc/OnBoard128TestsContract__factory.ts +175 -0
  238. package/typechain-types/factories/contracts/mocks/utils/mpc/OnBoard256TestsContract__factory.ts +205 -0
  239. package/typechain-types/factories/contracts/mocks/utils/mpc/PrivacyImplementationV1__factory.ts +521 -0
  240. package/typechain-types/factories/contracts/mocks/utils/mpc/PrivacyImplementationV2__factory.ts +648 -0
  241. package/typechain-types/factories/contracts/mocks/utils/mpc/PrivacyProxy__factory.ts +179 -0
  242. package/typechain-types/factories/contracts/mocks/utils/mpc/Random128TestsContract__factory.ts +131 -0
  243. package/typechain-types/factories/contracts/mocks/utils/mpc/Random256TestsContract__factory.ts +131 -0
  244. package/typechain-types/factories/contracts/mocks/utils/mpc/Shift128TestsContract__factory.ts +147 -0
  245. package/typechain-types/factories/contracts/mocks/utils/mpc/Shift256TestsContract__factory.ts +147 -0
  246. package/typechain-types/factories/contracts/mocks/utils/mpc/ShiftTestsContract__factory.ts +1 -1
  247. package/typechain-types/factories/contracts/mocks/utils/mpc/StringTestsContract__factory.ts +1 -1
  248. package/typechain-types/factories/contracts/mocks/utils/mpc/Transfer128TestsContract__factory.ts +135 -0
  249. package/typechain-types/factories/contracts/mocks/utils/mpc/Transfer256TestsContract__factory.ts +135 -0
  250. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferScalarTestsContract__factory.ts +1 -1
  251. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferTestsContract__factory.ts +1 -1
  252. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance128TestsContract__factory.ts +154 -0
  253. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance256TestsContract__factory.ts +154 -0
  254. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance64_16TestsContract__factory.ts +1 -1
  255. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance64_32TestsContract__factory.ts +1 -1
  256. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance64_64TestsContract__factory.ts +1 -1
  257. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance64_8TestsContract__factory.ts +1 -1
  258. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowanceScalarTestsContract__factory.ts +1 -1
  259. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowanceTestsContract__factory.ts +1 -1
  260. package/typechain-types/factories/contracts/mocks/utils/mpc/ValidateCiphertext128TestsContract__factory.ts +190 -0
  261. package/typechain-types/factories/contracts/mocks/utils/mpc/ValidateCiphertext256TestsContract__factory.ts +210 -0
  262. package/typechain-types/factories/contracts/mocks/utils/mpc/ValidateCiphertextTestsContract__factory.ts +260 -0
  263. package/typechain-types/factories/contracts/mocks/utils/mpc/index.ts +32 -0
  264. package/typechain-types/factories/contracts/mocks/wallet/PrivateERC20Wallet/PrivateERC20WalletMock__factory.ts +7 -7
  265. package/typechain-types/factories/contracts/token/PrivateERC20/IPrivateERC20__factory.ts +174 -42
  266. package/typechain-types/factories/contracts/token/PrivateERC20/PrivateERC20__factory.ts +174 -42
  267. package/typechain-types/factories/contracts/utils/mpc/MpcInterface.sol/ExtendedOperations__factory.ts +126 -0
  268. package/typechain-types/hardhat.d.ts +702 -0
  269. package/typechain-types/index.ts +78 -0
  270. package/contracts/mocks/utils/mpc/README.md +0 -486
  271. package/contracts/package.json +0 -11
@@ -0,0 +1,632 @@
1
+ import hre from "hardhat"
2
+ import { expect } from "chai"
3
+ import { setupAccounts } from "../accounts"
4
+ import { itUint, Wallet, ctUint } from "@coti-io/coti-ethers"
5
+ import { MpcOperations128TestContract } from "../../../typechain-types"
6
+
7
+ const GAS_LIMIT = 12000000
8
+
9
+ async function deploy() {
10
+ const [owner] = await setupAccounts()
11
+
12
+ const contractFactory = await hre.ethers.getContractFactory("MpcOperations128TestContract", owner as any)
13
+ const contract = await contractFactory.deploy({ gasLimit: GAS_LIMIT })
14
+ await contract.waitForDeployment()
15
+
16
+ return {
17
+ contract,
18
+ contractAddress: await contract.getAddress(),
19
+ owner
20
+ }
21
+ }
22
+
23
+ describe("MPC Operations uint128 with offBoardToUser - User Can Decrypt Results", function () {
24
+ this.timeout(300000) // 5 minutes timeout
25
+ let contract: MpcOperations128TestContract
26
+ let contractAddress: string
27
+ let owner: Wallet
28
+
29
+ before(async function () {
30
+ const deployment = await deploy()
31
+ contract = deployment.contract
32
+ contractAddress = deployment.contractAddress
33
+ owner = deployment.owner
34
+
35
+ const onboardInfo = owner.getUserOnboardInfo()
36
+ if (!onboardInfo || !onboardInfo.aesKey) {
37
+ throw new Error("User AES key not found. Please onboard the user first.")
38
+ }
39
+
40
+ console.log("\n" + "=".repeat(80))
41
+ console.log("🔐 MPC OPERATIONS uint128 TEST SETUP")
42
+ console.log("=".repeat(80))
43
+ console.log(`Contract Address: ${contractAddress}`)
44
+ console.log(`Owner Address: ${owner.address}`)
45
+ console.log(`User AES Key: ${onboardInfo.aesKey.substring(0, 8)}...${onboardInfo.aesKey.substring(onboardInfo.aesKey.length - 8)}`)
46
+ console.log("=".repeat(80) + "\n")
47
+ })
48
+
49
+ describe("Arithmetic Operations - uint128", function () {
50
+ it("Should perform addition and user can decrypt result", async function () {
51
+ const a = BigInt(1000)
52
+ const b = BigInt(500)
53
+ const expected = a + b
54
+ console.log(`\n➕ Testing uint128: ${a} + ${b} = ${expected}`)
55
+
56
+ const itA = await owner.encryptValue(a, contractAddress, contract.add128.fragment.selector) as itUint
57
+ const itB = await owner.encryptValue(b, contractAddress, contract.add128.fragment.selector) as itUint
58
+
59
+ console.log("📝 Performing addition on contract...")
60
+ const tx = await contract.add128(itA, itB, owner.address, { gasLimit: GAS_LIMIT })
61
+ const receipt = await tx.wait()
62
+ expect(receipt?.status).to.equal(1)
63
+
64
+ const resultEvent = receipt?.logs.find((log: any) => {
65
+ try {
66
+ return contract.interface.parseLog(log)?.name === "ValueOffBoarded128"
67
+ } catch {
68
+ return false
69
+ }
70
+ })
71
+
72
+ if (resultEvent) {
73
+ const parsedLog = contract.interface.parseLog(resultEvent)
74
+ const ctResult: ctUint = parsedLog?.args.result
75
+
76
+ console.log("📝 User decrypting result...")
77
+ const decrypted = await owner.decryptValue(ctResult)
78
+
79
+ console.log(`✓ Decrypted result: ${decrypted}`)
80
+ expect(decrypted).to.equal(expected)
81
+ console.log(` ✅ SUCCESS: Addition verified!\n`)
82
+ }
83
+ })
84
+
85
+ it("Should perform subtraction and user can decrypt result", async function () {
86
+ const a = BigInt(1000)
87
+ const b = BigInt(300)
88
+ const expected = a - b
89
+ console.log(`\n➖ Testing uint128: ${a} - ${b} = ${expected}`)
90
+
91
+ const itA = await owner.encryptValue(a, contractAddress, contract.sub128.fragment.selector) as itUint
92
+ const itB = await owner.encryptValue(b, contractAddress, contract.sub128.fragment.selector) as itUint
93
+
94
+ const tx = await contract.sub128(itA, itB, owner.address, { gasLimit: GAS_LIMIT })
95
+ const receipt = await tx.wait()
96
+ expect(receipt?.status).to.equal(1)
97
+
98
+ const resultEvent = receipt?.logs.find((log: any) => {
99
+ try {
100
+ return contract.interface.parseLog(log)?.name === "ValueOffBoarded128"
101
+ } catch {
102
+ return false
103
+ }
104
+ })
105
+
106
+ if (resultEvent) {
107
+ const parsedLog = contract.interface.parseLog(resultEvent)
108
+ const ctResult: ctUint = parsedLog?.args.result
109
+
110
+ const decrypted = await owner.decryptValue(ctResult)
111
+
112
+ console.log(`✓ Decrypted result: ${decrypted}`)
113
+ expect(decrypted).to.equal(expected)
114
+ console.log(` ✅ SUCCESS: Subtraction verified!\n`)
115
+ }
116
+ })
117
+
118
+ it("Should perform multiplication and user can decrypt result", async function () {
119
+ const a = BigInt(100)
120
+ const b = BigInt(50)
121
+ const expected = a * b
122
+ console.log(`\n✖️ Testing uint128: ${a} * ${b} = ${expected}`)
123
+
124
+ const itA = await owner.encryptValue(a, contractAddress, contract.mul128.fragment.selector) as itUint
125
+ const itB = await owner.encryptValue(b, contractAddress, contract.mul128.fragment.selector) as itUint
126
+
127
+ const tx = await contract.mul128(itA, itB, owner.address, { gasLimit: GAS_LIMIT })
128
+ const receipt = await tx.wait()
129
+ expect(receipt?.status).to.equal(1)
130
+
131
+ const resultEvent = receipt?.logs.find((log: any) => {
132
+ try {
133
+ return contract.interface.parseLog(log)?.name === "ValueOffBoarded128"
134
+ } catch {
135
+ return false
136
+ }
137
+ })
138
+
139
+ if (resultEvent) {
140
+ const parsedLog = contract.interface.parseLog(resultEvent)
141
+ const ctResult: ctUint = parsedLog?.args.result
142
+
143
+ const decrypted = await owner.decryptValue(ctResult)
144
+
145
+ console.log(`✓ Decrypted result: ${decrypted}`)
146
+ expect(decrypted).to.equal(expected)
147
+ console.log(` ✅ SUCCESS: Multiplication verified!\n`)
148
+ }
149
+ })
150
+
151
+ it("Should perform division and user can decrypt result", async function () {
152
+ const a = BigInt(1000)
153
+ const b = BigInt(10)
154
+ const expected = a / b
155
+ console.log(`\n➗ Testing uint128: ${a} / ${b} = ${expected}`)
156
+
157
+ const itA = await owner.encryptValue(a, contractAddress, contract.div128.fragment.selector) as itUint
158
+ const itB = await owner.encryptValue(b, contractAddress, contract.div128.fragment.selector) as itUint
159
+
160
+ const tx = await contract.div128(itA, itB, owner.address, { gasLimit: GAS_LIMIT })
161
+ const receipt = await tx.wait()
162
+ expect(receipt?.status).to.equal(1)
163
+
164
+ const resultEvent = receipt?.logs.find((log: any) => {
165
+ try {
166
+ return contract.interface.parseLog(log)?.name === "ValueOffBoarded128"
167
+ } catch {
168
+ return false
169
+ }
170
+ })
171
+
172
+ if (resultEvent) {
173
+ const parsedLog = contract.interface.parseLog(resultEvent)
174
+ const ctResult: ctUint = parsedLog?.args.result
175
+
176
+ const decrypted = await owner.decryptValue(ctResult)
177
+
178
+ console.log(`✓ Decrypted result: ${decrypted}`)
179
+ expect(decrypted).to.equal(expected)
180
+ console.log(` ✅ SUCCESS: Division verified!\n`)
181
+ }
182
+ })
183
+
184
+ it("Should perform modulo and user can decrypt result", async function () {
185
+ const a = BigInt(1000)
186
+ const b = BigInt(300)
187
+ const expected = a % b
188
+ console.log(`\n🔢 Testing uint128: ${a} % ${b} = ${expected}`)
189
+
190
+ const itA = await owner.encryptValue(a, contractAddress, contract.rem128.fragment.selector) as itUint
191
+ const itB = await owner.encryptValue(b, contractAddress, contract.rem128.fragment.selector) as itUint
192
+
193
+ const tx = await contract.rem128(itA, itB, owner.address, { gasLimit: GAS_LIMIT })
194
+ const receipt = await tx.wait()
195
+ expect(receipt?.status).to.equal(1)
196
+
197
+ const resultEvent = receipt?.logs.find((log: any) => {
198
+ try {
199
+ return contract.interface.parseLog(log)?.name === "ValueOffBoarded128"
200
+ } catch {
201
+ return false
202
+ }
203
+ })
204
+
205
+ if (resultEvent) {
206
+ const parsedLog = contract.interface.parseLog(resultEvent)
207
+ const ctResult: ctUint = parsedLog?.args.result
208
+
209
+ const decrypted = await owner.decryptValue(ctResult)
210
+
211
+ console.log(`✓ Decrypted result: ${decrypted}`)
212
+ expect(decrypted).to.equal(expected)
213
+ console.log(` ✅ SUCCESS: Modulo verified!\n`)
214
+ }
215
+ })
216
+ })
217
+
218
+ describe("Bitwise Operations - uint128", function () {
219
+ it("Should perform AND operation and user can decrypt result", async function () {
220
+ const a = BigInt(0xFF) // 255
221
+ const b = BigInt(0xF0) // 240
222
+ const expected = a & b // 240
223
+ console.log(`\n& Testing uint128: ${a} & ${b} = ${expected}`)
224
+
225
+ const itA = await owner.encryptValue(a, contractAddress, contract.and128.fragment.selector) as itUint
226
+ const itB = await owner.encryptValue(b, contractAddress, contract.and128.fragment.selector) as itUint
227
+
228
+ const tx = await contract.and128(itA, itB, owner.address, { gasLimit: GAS_LIMIT })
229
+ const receipt = await tx.wait()
230
+ expect(receipt?.status).to.equal(1)
231
+
232
+ const resultEvent = receipt?.logs.find((log: any) => {
233
+ try {
234
+ return contract.interface.parseLog(log)?.name === "ValueOffBoarded128"
235
+ } catch {
236
+ return false
237
+ }
238
+ })
239
+
240
+ if (resultEvent) {
241
+ const parsedLog = contract.interface.parseLog(resultEvent)
242
+ const ctResult: ctUint = parsedLog?.args.result
243
+
244
+ const decrypted = await owner.decryptValue(ctResult)
245
+
246
+ console.log(`✓ Decrypted result: ${decrypted}`)
247
+ expect(decrypted).to.equal(expected)
248
+ console.log(` ✅ SUCCESS: AND verified!\n`)
249
+ }
250
+ })
251
+
252
+ it("Should perform OR operation and user can decrypt result", async function () {
253
+ const a = BigInt(0xF0) // 240
254
+ const b = BigInt(0x0F) // 15
255
+ const expected = a | b // 255
256
+ console.log(`\n| Testing uint128: ${a} | ${b} = ${expected}`)
257
+
258
+ const itA = await owner.encryptValue(a, contractAddress, contract.or128.fragment.selector) as itUint
259
+ const itB = await owner.encryptValue(b, contractAddress, contract.or128.fragment.selector) as itUint
260
+
261
+ const tx = await contract.or128(itA, itB, owner.address, { gasLimit: GAS_LIMIT })
262
+ const receipt = await tx.wait()
263
+ expect(receipt?.status).to.equal(1)
264
+
265
+ const resultEvent = receipt?.logs.find((log: any) => {
266
+ try {
267
+ return contract.interface.parseLog(log)?.name === "ValueOffBoarded128"
268
+ } catch {
269
+ return false
270
+ }
271
+ })
272
+
273
+ if (resultEvent) {
274
+ const parsedLog = contract.interface.parseLog(resultEvent)
275
+ const ctResult: ctUint = parsedLog?.args.result
276
+
277
+ const decrypted = await owner.decryptValue(ctResult)
278
+
279
+ console.log(`✓ Decrypted result: ${decrypted}`)
280
+ expect(decrypted).to.equal(expected)
281
+ console.log(` ✅ SUCCESS: OR verified!\n`)
282
+ }
283
+ })
284
+
285
+ it("Should perform XOR operation and user can decrypt result", async function () {
286
+ const a = BigInt(0xFF) // 255
287
+ const b = BigInt(0xF0) // 240
288
+ const expected = a ^ b // 15
289
+ console.log(`\n^ Testing uint128: ${a} ^ ${b} = ${expected}`)
290
+
291
+ const itA = await owner.encryptValue(a, contractAddress, contract.xor128.fragment.selector) as itUint
292
+ const itB = await owner.encryptValue(b, contractAddress, contract.xor128.fragment.selector) as itUint
293
+
294
+ const tx = await contract.xor128(itA, itB, owner.address, { gasLimit: GAS_LIMIT })
295
+ const receipt = await tx.wait()
296
+ expect(receipt?.status).to.equal(1)
297
+
298
+ const resultEvent = receipt?.logs.find((log: any) => {
299
+ try {
300
+ return contract.interface.parseLog(log)?.name === "ValueOffBoarded128"
301
+ } catch {
302
+ return false
303
+ }
304
+ })
305
+
306
+ if (resultEvent) {
307
+ const parsedLog = contract.interface.parseLog(resultEvent)
308
+ const ctResult: ctUint = parsedLog?.args.result
309
+
310
+ const decrypted = await owner.decryptValue(ctResult)
311
+
312
+ console.log(`✓ Decrypted result: ${decrypted}`)
313
+ expect(decrypted).to.equal(expected)
314
+ console.log(` ✅ SUCCESS: XOR verified!\n`)
315
+ }
316
+ })
317
+
318
+ it("Should perform shift left and user can decrypt result", async function () {
319
+ const a = BigInt(10)
320
+ const bits = 2
321
+ const expected = a << BigInt(bits) // 40
322
+ console.log(`\n<< Testing uint128: ${a} << ${bits} = ${expected}`)
323
+
324
+ const itA = await owner.encryptValue(a, contractAddress, contract.shl128.fragment.selector) as itUint
325
+
326
+ const tx = await contract.shl128(itA, bits, owner.address, { gasLimit: GAS_LIMIT })
327
+ const receipt = await tx.wait()
328
+ expect(receipt?.status).to.equal(1)
329
+
330
+ const resultEvent = receipt?.logs.find((log: any) => {
331
+ try {
332
+ return contract.interface.parseLog(log)?.name === "ValueOffBoarded128"
333
+ } catch {
334
+ return false
335
+ }
336
+ })
337
+
338
+ if (resultEvent) {
339
+ const parsedLog = contract.interface.parseLog(resultEvent)
340
+ const ctResult: ctUint = parsedLog?.args.result
341
+
342
+ const decrypted = await owner.decryptValue(ctResult)
343
+
344
+ console.log(`✓ Decrypted result: ${decrypted}`)
345
+ expect(decrypted).to.equal(expected)
346
+ console.log(` ✅ SUCCESS: Shift left verified!\n`)
347
+ }
348
+ })
349
+
350
+ it("Should perform shift right and user can decrypt result", async function () {
351
+ const a = BigInt(40)
352
+ const bits = 2
353
+ const expected = a >> BigInt(bits) // 10
354
+ console.log(`\n>> Testing uint128: ${a} >> ${bits} = ${expected}`)
355
+
356
+ const itA = await owner.encryptValue(a, contractAddress, contract.shr128.fragment.selector) as itUint
357
+
358
+ const tx = await contract.shr128(itA, bits, owner.address, { gasLimit: GAS_LIMIT })
359
+ const receipt = await tx.wait()
360
+ expect(receipt?.status).to.equal(1)
361
+
362
+ const resultEvent = receipt?.logs.find((log: any) => {
363
+ try {
364
+ return contract.interface.parseLog(log)?.name === "ValueOffBoarded128"
365
+ } catch {
366
+ return false
367
+ }
368
+ })
369
+
370
+ if (resultEvent) {
371
+ const parsedLog = contract.interface.parseLog(resultEvent)
372
+ const ctResult: ctUint = parsedLog?.args.result
373
+
374
+ const decrypted = await owner.decryptValue(ctResult)
375
+
376
+ console.log(`✓ Decrypted result: ${decrypted}`)
377
+ expect(decrypted).to.equal(expected)
378
+ console.log(` ✅ SUCCESS: Shift right verified!\n`)
379
+ }
380
+ })
381
+ })
382
+
383
+ describe("Large uint128 Values (> 64-bit)", function () {
384
+ it("Should handle values at uint64 boundary", async function () {
385
+ const maxUint64 = BigInt("18446744073709551615") // 2^64 - 1
386
+ const a = maxUint64
387
+ const b = BigInt(1)
388
+ const expected = a + b // 2^64 (requires > 64 bits)
389
+ console.log(`\n➕ Testing uint128 boundary: ${a} + ${b}`)
390
+ console.log(` Expected: ${expected} (requires > 64 bits)`)
391
+
392
+ const itA = await owner.encryptValue(a, contractAddress, contract.add128.fragment.selector) as itUint
393
+ const itB = await owner.encryptValue(b, contractAddress, contract.add128.fragment.selector) as itUint
394
+
395
+ const tx = await contract.add128(itA, itB, owner.address, { gasLimit: GAS_LIMIT })
396
+ const receipt = await tx.wait()
397
+ expect(receipt?.status).to.equal(1)
398
+
399
+ const resultEvent = receipt?.logs.find((log: any) => {
400
+ try {
401
+ return contract.interface.parseLog(log)?.name === "ValueOffBoarded128"
402
+ } catch {
403
+ return false
404
+ }
405
+ })
406
+
407
+ if (resultEvent) {
408
+ const parsedLog = contract.interface.parseLog(resultEvent)
409
+ const ctResult: ctUint = parsedLog?.args.result
410
+
411
+ const decrypted = await owner.decryptValue(ctResult)
412
+
413
+ console.log(`✓ Decrypted result: ${decrypted}`)
414
+ expect(decrypted).to.equal(expected)
415
+ console.log(` ✅ SUCCESS: uint64 boundary crossed!\n`)
416
+ }
417
+ })
418
+
419
+ it("Should handle large uint128 multiplication", async function () {
420
+ const a = BigInt("4294967296") // 2^32
421
+ const b = BigInt("4294967296") // 2^32
422
+ const expected = a * b // 2^64
423
+ console.log(`\n✖️ Testing large uint128: ${a} * ${b}`)
424
+ console.log(` Expected: ${expected}`)
425
+
426
+ const itA = await owner.encryptValue(a, contractAddress, contract.mul128.fragment.selector) as itUint
427
+ const itB = await owner.encryptValue(b, contractAddress, contract.mul128.fragment.selector) as itUint
428
+
429
+ const tx = await contract.mul128(itA, itB, owner.address, { gasLimit: GAS_LIMIT })
430
+ const receipt = await tx.wait()
431
+ expect(receipt?.status).to.equal(1)
432
+
433
+ const resultEvent = receipt?.logs.find((log: any) => {
434
+ try {
435
+ return contract.interface.parseLog(log)?.name === "ValueOffBoarded128"
436
+ } catch {
437
+ return false
438
+ }
439
+ })
440
+
441
+ if (resultEvent) {
442
+ const parsedLog = contract.interface.parseLog(resultEvent)
443
+ const ctResult: ctUint = parsedLog?.args.result
444
+
445
+ const decrypted = await owner.decryptValue(ctResult)
446
+
447
+ console.log(`✓ Decrypted result: ${decrypted}`)
448
+ expect(decrypted).to.equal(expected)
449
+ console.log(` ✅ SUCCESS: Large multiplication verified!\n`)
450
+ }
451
+ })
452
+
453
+ it("Should handle large uint64-range values in uint128 context", async function () {
454
+ // Use max uint64 value (largest value supported by current encryption)
455
+ const largeValue = BigInt("18446744073709551615") // 2^64 - 1 (max uint64)
456
+ const mask = BigInt(0xFFFFFFFF)
457
+ const expected = largeValue & mask
458
+
459
+ console.log(`\n& Testing large uint64 value in uint128 context`)
460
+ console.log(` Using: ${largeValue} (max uint64)`)
461
+
462
+ const itA = await owner.encryptValue(largeValue, contractAddress, contract.and128.fragment.selector) as itUint
463
+ const itB = await owner.encryptValue(mask, contractAddress, contract.and128.fragment.selector) as itUint
464
+
465
+ const tx = await contract.and128(itA, itB, owner.address, { gasLimit: GAS_LIMIT })
466
+ const receipt = await tx.wait()
467
+ expect(receipt?.status).to.equal(1)
468
+
469
+ const resultEvent = receipt?.logs.find((log: any) => {
470
+ try {
471
+ return contract.interface.parseLog(log)?.name === "ValueOffBoarded128"
472
+ } catch {
473
+ return false
474
+ }
475
+ })
476
+
477
+ if (resultEvent) {
478
+ const parsedLog = contract.interface.parseLog(resultEvent)
479
+ const ctResult: ctUint = parsedLog?.args.result
480
+
481
+ const decrypted = await owner.decryptValue(ctResult)
482
+
483
+ console.log(`✓ Decrypted result: ${decrypted}`)
484
+ expect(decrypted).to.equal(expected)
485
+ console.log(` ✅ SUCCESS: Large uint64 operation in uint128 context verified!\n`)
486
+ }
487
+ })
488
+
489
+ it("Should handle full 128-bit range with prepareIT", async function () {
490
+ // Test with 100-bit value (requires full uint128 encryption)
491
+ const largeValue = BigInt("1267650600228229401496703205376") // 2^100
492
+ const small = BigInt(1000)
493
+ const expected = largeValue + small
494
+
495
+ console.log(`\n➕ Testing FULL uint128 range with prepareIT`)
496
+ console.log(` Using 100-bit value: ${largeValue}`)
497
+ console.log(` Expected: ${expected}`)
498
+
499
+ const itA = await owner.encryptValue(largeValue, contractAddress, contract.add128.fragment.selector) as itUint
500
+ const itB = await owner.encryptValue(small, contractAddress, contract.add128.fragment.selector) as itUint
501
+
502
+ const tx = await contract.add128(itA, itB, owner.address, { gasLimit: GAS_LIMIT })
503
+ const receipt = await tx.wait()
504
+ expect(receipt?.status).to.equal(1)
505
+
506
+ const resultEvent = receipt?.logs.find((log: any) => {
507
+ try {
508
+ return contract.interface.parseLog(log)?.name === "ValueOffBoarded128"
509
+ } catch {
510
+ return false
511
+ }
512
+ })
513
+
514
+ if (resultEvent) {
515
+ const parsedLog = contract.interface.parseLog(resultEvent)
516
+ const ctResult: ctUint = parsedLog?.args.result
517
+
518
+ const decrypted = await owner.decryptValue(ctResult)
519
+
520
+ console.log(`✓ Decrypted result: ${decrypted}`)
521
+ expect(decrypted).to.equal(expected)
522
+ console.log(` ✅ SUCCESS: FULL 128-bit range verified with prepareIT!\n`)
523
+ }
524
+ })
525
+
526
+ it("Should handle near-max uint128 with prepareIT", async function () {
527
+ // Test with value close to max uint128
528
+ const nearMax = BigInt("170141183460469231731687303715884105727") // 2^127 - 1
529
+ const one = BigInt(1)
530
+ const expected = nearMax + one // 2^127
531
+
532
+ console.log(`\n➕ Testing near-max uint128 with prepareIT`)
533
+ console.log(` Using: ${nearMax} (2^127 - 1)`)
534
+ console.log(` Expected: ${expected} (2^127)`)
535
+
536
+ const itA = await owner.encryptValue(nearMax, contractAddress, contract.add128.fragment.selector) as itUint
537
+ const itB = await owner.encryptValue(one, contractAddress, contract.add128.fragment.selector) as itUint
538
+
539
+ const tx = await contract.add128(itA, itB, owner.address, { gasLimit: GAS_LIMIT })
540
+ const receipt = await tx.wait()
541
+ expect(receipt?.status).to.equal(1)
542
+
543
+ const resultEvent = receipt?.logs.find((log: any) => {
544
+ try {
545
+ return contract.interface.parseLog(log)?.name === "ValueOffBoarded128"
546
+ } catch {
547
+ return false
548
+ }
549
+ })
550
+
551
+ if (resultEvent) {
552
+ const parsedLog = contract.interface.parseLog(resultEvent)
553
+ const ctResult: ctUint = parsedLog?.args.result
554
+
555
+ const decrypted = await owner.decryptValue(ctResult)
556
+
557
+ console.log(`✓ Decrypted result: ${decrypted}`)
558
+ expect(decrypted).to.equal(expected)
559
+ console.log(` ✅ SUCCESS: Near-max uint128 verified! Full 128-bit support confirmed!\n`)
560
+ }
561
+ })
562
+ })
563
+
564
+ describe("Min/Max Operations - uint128", function () {
565
+ it("Should get minimum of two values and user can decrypt result", async function () {
566
+ const a = BigInt(500)
567
+ const b = BigInt(1000)
568
+ const expected = BigInt(500)
569
+ console.log(`\nmin Testing uint128: min(${a}, ${b}) = ${expected}`)
570
+
571
+ const itA = await owner.encryptValue(a, contractAddress, contract.min128.fragment.selector) as itUint
572
+ const itB = await owner.encryptValue(b, contractAddress, contract.min128.fragment.selector) as itUint
573
+
574
+ const tx = await contract.min128(itA, itB, owner.address, { gasLimit: GAS_LIMIT })
575
+ const receipt = await tx.wait()
576
+ expect(receipt?.status).to.equal(1)
577
+
578
+ const resultEvent = receipt?.logs.find((log: any) => {
579
+ try {
580
+ return contract.interface.parseLog(log)?.name === "ValueOffBoarded128"
581
+ } catch {
582
+ return false
583
+ }
584
+ })
585
+
586
+ if (resultEvent) {
587
+ const parsedLog = contract.interface.parseLog(resultEvent)
588
+ const ctResult: ctUint = parsedLog?.args.result
589
+
590
+ const decrypted = await owner.decryptValue(ctResult)
591
+
592
+ console.log(`✓ Decrypted result: ${decrypted}`)
593
+ expect(decrypted).to.equal(expected)
594
+ console.log(` ✅ SUCCESS: Min verified!\n`)
595
+ }
596
+ })
597
+
598
+ it("Should get maximum of two values and user can decrypt result", async function () {
599
+ const a = BigInt(500)
600
+ const b = BigInt(1000)
601
+ const expected = BigInt(1000)
602
+ console.log(`\nmax Testing uint128: max(${a}, ${b}) = ${expected}`)
603
+
604
+ const itA = await owner.encryptValue(a, contractAddress, contract.max128.fragment.selector) as itUint
605
+ const itB = await owner.encryptValue(b, contractAddress, contract.max128.fragment.selector) as itUint
606
+
607
+ const tx = await contract.max128(itA, itB, owner.address, { gasLimit: GAS_LIMIT })
608
+ const receipt = await tx.wait()
609
+ expect(receipt?.status).to.equal(1)
610
+
611
+ const resultEvent = receipt?.logs.find((log: any) => {
612
+ try {
613
+ return contract.interface.parseLog(log)?.name === "ValueOffBoarded128"
614
+ } catch {
615
+ return false
616
+ }
617
+ })
618
+
619
+ if (resultEvent) {
620
+ const parsedLog = contract.interface.parseLog(resultEvent)
621
+ const ctResult: ctUint = parsedLog?.args.result
622
+
623
+ const decrypted = await owner.decryptValue(ctResult)
624
+
625
+ console.log(`✓ Decrypted result: ${decrypted}`)
626
+ expect(decrypted).to.equal(expected)
627
+ console.log(` ✅ SUCCESS: Max verified!\n`)
628
+ }
629
+ })
630
+ })
631
+ })
632
+
@@ -0,0 +1,41 @@
1
+ import hre from "hardhat"
2
+ import { expect } from "chai"
3
+ import { setupAccounts } from "../accounts"
4
+
5
+ const gasLimit = 12000000
6
+
7
+ function buildTest(
8
+ contractName: string,
9
+ func: string,
10
+ resFunc: string,
11
+ params: (bigint | boolean)[],
12
+ expectedResult: bigint
13
+ ) {
14
+ it(`${contractName}.${func}(${params}) should return ${expectedResult}`, async function () {
15
+ const [owner] = await setupAccounts()
16
+ const provider = owner.provider!
17
+
18
+ const factory = await hre.ethers.getContractFactory(contractName, owner as any)
19
+ const contract = await factory.deploy({ gasLimit })
20
+ await contract.waitForDeployment()
21
+
22
+ const tx = await contract.getFunction(func)(...params, { gasLimit })
23
+ const receipt = await tx.wait()
24
+
25
+ const result = await contract.getFunction(resFunc)()
26
+ expect(result).to.equal(expectedResult)
27
+
28
+ const txFromChain = await provider.getTransactionReceipt(receipt.hash)
29
+ expect(txFromChain).to.not.be.null
30
+ expect(txFromChain?.status).to.equal(1)
31
+ })
32
+ }
33
+
34
+ const bit = false
35
+ const a = BigInt("1000000000000000000")
36
+ const b = BigInt("500000000000000000")
37
+
38
+ describe("Mux 128-bit", function () {
39
+ buildTest("Mux128TestsContract", "muxTest", "getMuxResult", [bit, a, b], bit ? b : a)
40
+ })
41
+