@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,92 @@
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[],
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
+ // buildNotTest function removed - NOT operation is not supported for 128-bit and 256-bit types
35
+
36
+ // Basic test values
37
+ const params = [
38
+ BigInt("1000000000000000000"),
39
+ BigInt("500000000000000000")
40
+ ]
41
+ const [a, b] = params
42
+
43
+ // For 128-bit, we need to mask to 128 bits for NOT operation
44
+ // MASK_128 = 2^128 - 1 (all bits set)
45
+ const MASK_128 = (BigInt(1) << BigInt(128)) - BigInt(1)
46
+
47
+ // Note: NOT operation helper removed - NOT is not supported for 128-bit and 256-bit types
48
+
49
+ // Test values that exercise upper bits
50
+ const HALF_MAX_128 = BigInt(1) << BigInt(127) // 2^127 - tests upper bit
51
+ const UPPER_BITS_128 = BigInt("0xFFFFFFFFFFFFFFFF0000000000000000") // Upper 64 bits set
52
+ const LOWER_BITS_128 = BigInt("0x0000000000000000FFFFFFFFFFFFFFFF") // Lower 64 bits set
53
+ const SINGLE_BIT_127 = BigInt(1) << BigInt(127) // Bit 127 set (highest bit)
54
+ const SINGLE_BIT_64 = BigInt(1) << BigInt(64) // Bit 64 set (middle boundary)
55
+
56
+ describe("Bitwise 128-bit", function () {
57
+ describe("Basic operations with small values", function () {
58
+ buildTest("Bitwise128TestsContract", "andTest", "getAndResult", params, a & b)
59
+ buildTest("Bitwise128TestsContract", "orTest", "getOrResult", params, a | b)
60
+ buildTest("Bitwise128TestsContract", "xorTest", "getXorResult", params, a ^ b)
61
+ // Note: NOT operation is not supported for 128-bit and 256-bit types in the MPC precompile
62
+ // It only supports NOT for boolean types
63
+ })
64
+
65
+ describe("Edge cases - zero and max values", function () {
66
+ buildTest("Bitwise128TestsContract", "andTest", "getAndResult", [BigInt(0), MASK_128], BigInt(0))
67
+ buildTest("Bitwise128TestsContract", "orTest", "getOrResult", [BigInt(0), MASK_128], MASK_128)
68
+ buildTest("Bitwise128TestsContract", "xorTest", "getXorResult", [BigInt(0), MASK_128], MASK_128)
69
+ buildTest("Bitwise128TestsContract", "andTest", "getAndResult", [MASK_128, MASK_128], MASK_128)
70
+ buildTest("Bitwise128TestsContract", "orTest", "getOrResult", [MASK_128, MASK_128], MASK_128)
71
+ buildTest("Bitwise128TestsContract", "xorTest", "getXorResult", [MASK_128, MASK_128], BigInt(0))
72
+ })
73
+
74
+ describe("Operations with upper bits (2^127)", function () {
75
+ buildTest("Bitwise128TestsContract", "andTest", "getAndResult", [HALF_MAX_128, HALF_MAX_128], HALF_MAX_128)
76
+ buildTest("Bitwise128TestsContract", "orTest", "getOrResult", [HALF_MAX_128, HALF_MAX_128], HALF_MAX_128)
77
+ buildTest("Bitwise128TestsContract", "xorTest", "getXorResult", [HALF_MAX_128, HALF_MAX_128], BigInt(0))
78
+ })
79
+
80
+ describe("Operations with upper and lower bit patterns (64-bit boundary)", function () {
81
+ buildTest("Bitwise128TestsContract", "andTest", "getAndResult", [UPPER_BITS_128, LOWER_BITS_128], BigInt(0))
82
+ buildTest("Bitwise128TestsContract", "orTest", "getOrResult", [UPPER_BITS_128, LOWER_BITS_128], MASK_128)
83
+ buildTest("Bitwise128TestsContract", "xorTest", "getXorResult", [UPPER_BITS_128, LOWER_BITS_128], MASK_128)
84
+ })
85
+
86
+ describe("Operations with single bits at key positions", function () {
87
+ buildTest("Bitwise128TestsContract", "andTest", "getAndResult", [SINGLE_BIT_127, SINGLE_BIT_64], BigInt(0))
88
+ buildTest("Bitwise128TestsContract", "orTest", "getOrResult", [SINGLE_BIT_127, SINGLE_BIT_64], SINGLE_BIT_127 | SINGLE_BIT_64)
89
+ buildTest("Bitwise128TestsContract", "xorTest", "getXorResult", [SINGLE_BIT_127, SINGLE_BIT_64], SINGLE_BIT_127 | SINGLE_BIT_64)
90
+ })
91
+ })
92
+
@@ -0,0 +1,101 @@
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[],
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
+ // buildNotTest function removed - NOT operation is not supported for 128-bit and 256-bit types
35
+
36
+ // Basic test values
37
+ const params = [
38
+ BigInt("1000000000000000000"), // 1e18
39
+ BigInt("500000000000000000") // 0.5e18
40
+ ]
41
+ const [a, b] = params
42
+
43
+ // For 256-bit, we need to mask to 256 bits for NOT operation
44
+ // MASK_256 = 2^256 - 1 (all bits set)
45
+ const MASK_256 = (BigInt(1) << BigInt(256)) - BigInt(1)
46
+
47
+ // Note: NOT operation helper removed - NOT is not supported for 128-bit and 256-bit types
48
+
49
+ // Test values that exercise upper bits
50
+ const HALF_MAX_256 = BigInt(1) << BigInt(255) // 2^255 - tests upper bit
51
+ const UPPER_128_BITS_256 = BigInt("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000") // Upper 128 bits set
52
+ const LOWER_128_BITS_256 = BigInt("0x00000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF") // Lower 128 bits set
53
+ const SINGLE_BIT_255 = BigInt(1) << BigInt(255) // Bit 255 set (highest bit)
54
+ const SINGLE_BIT_128 = BigInt(1) << BigInt(128) // Bit 128 set (128-bit boundary)
55
+ const SINGLE_BIT_64 = BigInt(1) << BigInt(64) // Bit 64 set
56
+
57
+ describe("Bitwise 256-bit", function () {
58
+ describe("Basic operations with small values", function () {
59
+ buildTest("Bitwise256TestsContract", "andTest", "getAndResult", params, a & b)
60
+ buildTest("Bitwise256TestsContract", "orTest", "getOrResult", params, a | b)
61
+ buildTest("Bitwise256TestsContract", "xorTest", "getXorResult", params, a ^ b)
62
+ // Note: NOT operation is not supported for 128-bit and 256-bit types in the MPC precompile
63
+ // It only supports NOT for boolean types
64
+ })
65
+
66
+ describe("Edge cases - zero and max values", function () {
67
+ buildTest("Bitwise256TestsContract", "andTest", "getAndResult", [BigInt(0), MASK_256], BigInt(0))
68
+ buildTest("Bitwise256TestsContract", "orTest", "getOrResult", [BigInt(0), MASK_256], MASK_256)
69
+ buildTest("Bitwise256TestsContract", "xorTest", "getXorResult", [BigInt(0), MASK_256], MASK_256)
70
+ buildTest("Bitwise256TestsContract", "andTest", "getAndResult", [MASK_256, MASK_256], MASK_256)
71
+ buildTest("Bitwise256TestsContract", "orTest", "getOrResult", [MASK_256, MASK_256], MASK_256)
72
+ buildTest("Bitwise256TestsContract", "xorTest", "getXorResult", [MASK_256, MASK_256], BigInt(0))
73
+ })
74
+
75
+ describe("Operations with upper bits (2^255)", function () {
76
+ buildTest("Bitwise256TestsContract", "andTest", "getAndResult", [HALF_MAX_256, HALF_MAX_256], HALF_MAX_256)
77
+ buildTest("Bitwise256TestsContract", "orTest", "getOrResult", [HALF_MAX_256, HALF_MAX_256], HALF_MAX_256)
78
+ buildTest("Bitwise256TestsContract", "xorTest", "getXorResult", [HALF_MAX_256, HALF_MAX_256], BigInt(0))
79
+ })
80
+
81
+ describe("Operations with upper and lower 128-bit patterns (128-bit boundary)", function () {
82
+ buildTest("Bitwise256TestsContract", "andTest", "getAndResult", [UPPER_128_BITS_256, LOWER_128_BITS_256], BigInt(0))
83
+ buildTest("Bitwise256TestsContract", "orTest", "getOrResult", [UPPER_128_BITS_256, LOWER_128_BITS_256], MASK_256)
84
+ buildTest("Bitwise256TestsContract", "xorTest", "getXorResult", [UPPER_128_BITS_256, LOWER_128_BITS_256], MASK_256)
85
+ })
86
+
87
+ describe("Operations with single bits at key positions", function () {
88
+ buildTest("Bitwise256TestsContract", "andTest", "getAndResult", [SINGLE_BIT_255, SINGLE_BIT_128], BigInt(0))
89
+ buildTest("Bitwise256TestsContract", "orTest", "getOrResult", [SINGLE_BIT_255, SINGLE_BIT_128], SINGLE_BIT_255 | SINGLE_BIT_128)
90
+ buildTest("Bitwise256TestsContract", "xorTest", "getXorResult", [SINGLE_BIT_255, SINGLE_BIT_128], SINGLE_BIT_255 | SINGLE_BIT_128)
91
+ })
92
+
93
+ describe("Operations crossing 128-bit boundary", function () {
94
+ const cross128_1 = (BigInt(1) << BigInt(127)) | (BigInt(1) << BigInt(128)) // Bits 127 and 128 set
95
+ const cross128_2 = (BigInt(1) << BigInt(126)) | (BigInt(1) << BigInt(129)) // Bits 126 and 129 set
96
+ buildTest("Bitwise256TestsContract", "andTest", "getAndResult", [cross128_1, cross128_2], cross128_1 & cross128_2)
97
+ buildTest("Bitwise256TestsContract", "orTest", "getOrResult", [cross128_1, cross128_2], cross128_1 | cross128_2)
98
+ buildTest("Bitwise256TestsContract", "xorTest", "getXorResult", [cross128_1, cross128_2], cross128_1 ^ cross128_2)
99
+ })
100
+ })
101
+
@@ -0,0 +1,398 @@
1
+ import hre from "hardhat"
2
+ import { expect } from "chai"
3
+ import { setupAccounts } from "../accounts"
4
+ import { Wallet, itUint, ctUint } from "@coti-io/coti-ethers"
5
+ import { ValidateCiphertext128TestsContract } 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("ValidateCiphertext128TestsContract", 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("buildInputText 128-bit Full Cycle Test - coti-private", function () {
24
+ this.timeout(300000) // 5 minutes timeout
25
+ let contract: ValidateCiphertext128TestsContract
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("šŸ” buildInputText 128-bit FULL CYCLE TEST")
42
+ console.log("=".repeat(80))
43
+ console.log(`Network: ${hre.network.name}`)
44
+ console.log(`Contract Address: ${contractAddress}`)
45
+ console.log(`Owner Address: ${owner.address}`)
46
+ console.log(`User AES Key: ${onboardInfo.aesKey.substring(0, 8)}...${onboardInfo.aesKey.substring(onboardInfo.aesKey.length - 8)}`)
47
+ console.log("=".repeat(80) + "\n")
48
+ })
49
+
50
+ describe("Single Value Validation - Testing buildInputText with Large Values", function () {
51
+ it("Should validate and decrypt 80-bit value (>70 bits)", async function () {
52
+ const plaintext = (2n ** 80n) - 1n // 80-bit max value
53
+ const bitSize = plaintext.toString(2).length
54
+ expect(bitSize).to.equal(80)
55
+
56
+ console.log(`\nšŸ“Š Testing 80-bit value`)
57
+ console.log(` Value: ${plaintext.toString()}`)
58
+ console.log(` Bit size: ${bitSize} bits`)
59
+
60
+ // Step 1: Encrypt using Wallet.encryptValue (which uses buildInputText internally)
61
+ const functionSelector = contract.validateAndReturn.fragment.selector
62
+ console.log(`\nšŸ” Step 1: Encrypting with Wallet.encryptValue (uses buildInputText internally)...`)
63
+ const itValue = await owner.encryptValue(plaintext, contractAddress, functionSelector) as itUint
64
+
65
+ console.log(` āœ… Encrypted: ciphertext = ${itValue.ciphertext.toString()}`)
66
+ console.log(` āœ… Signature length: ${(itValue.signature as Uint8Array).length} bytes`)
67
+
68
+ // Step 2: Send to contract for validation
69
+ console.log(`\nšŸ“¤ Step 2: Sending to contract for validation...`)
70
+ const tx = await contract.validateAndReturn(itValue, { gasLimit: GAS_LIMIT })
71
+ const receipt = await tx.wait()
72
+ expect(receipt?.status).to.equal(1)
73
+ console.log(` āœ… Transaction confirmed in block ${receipt?.blockNumber}`)
74
+
75
+ // Step 3: Extract result from event
76
+ const resultEvents = receipt?.logs.filter((log: any) => {
77
+ try {
78
+ const parsed = contract.interface.parseLog(log)
79
+ return parsed?.name === "ValueOffBoarded128"
80
+ } catch {
81
+ return false
82
+ }
83
+ })
84
+
85
+ expect(resultEvents).to.not.be.undefined
86
+ expect(resultEvents?.length).to.equal(1, "Expected exactly one ValueOffBoarded128 event")
87
+
88
+ const parsedLog = contract.interface.parseLog(resultEvents![0])
89
+ const ctResult: ctUint = parsedLog?.args.result
90
+
91
+ console.log(`\nšŸ”“ Step 3: Decrypting result...`)
92
+ console.log(` CT value: ${ctResult.toString()}`)
93
+
94
+ // Step 4: Decrypt using Wallet.decryptValue
95
+ const decrypted = await owner.decryptValue(ctResult)
96
+
97
+ console.log(` āœ… Decrypted: ${decrypted.toString()}`)
98
+ console.log(` āœ… Original: ${plaintext.toString()}`)
99
+
100
+ expect(decrypted).to.equal(plaintext)
101
+ console.log(`\n āœ…āœ…āœ… SUCCESS: 80-bit value full cycle verified!\n`)
102
+ })
103
+
104
+ it("Should validate and decrypt 100-bit value", async function () {
105
+ const plaintext = (2n ** 100n) - 12345n // 100-bit value
106
+ const bitSize = plaintext.toString(2).length
107
+ expect(bitSize).to.equal(100)
108
+
109
+ console.log(`\nšŸ“Š Testing 100-bit value`)
110
+ console.log(` Value: ${plaintext.toString()}`)
111
+ console.log(` Bit size: ${bitSize} bits`)
112
+
113
+ const functionSelector = contract.validateAndReturn.fragment.selector
114
+ console.log(`\nšŸ” Step 1: Encrypting with Wallet.encryptValue...`)
115
+ const itValue = await owner.encryptValue(plaintext, contractAddress, functionSelector) as itUint
116
+
117
+ console.log(` āœ… Encrypted successfully`)
118
+
119
+ console.log(`\nšŸ“¤ Step 2: Sending to contract...`)
120
+ const tx = await contract.validateAndReturn(itValue, { gasLimit: GAS_LIMIT })
121
+ const receipt = await tx.wait()
122
+ expect(receipt?.status).to.equal(1)
123
+ console.log(` āœ… Transaction confirmed in block ${receipt?.blockNumber}`)
124
+ console.log(` šŸ“ Total logs: ${receipt?.logs.length}`)
125
+
126
+ // Debug: Log all events
127
+ console.log(`\n šŸ” Parsing all events...`)
128
+ receipt?.logs.forEach((log: any, index: number) => {
129
+ try {
130
+ const parsed = contract.interface.parseLog(log)
131
+ if (parsed) {
132
+ console.log(` Event ${index}: ${parsed.name}`)
133
+ if (parsed.name === "ValueOffBoarded128") {
134
+ console.log(` Result: ${parsed.args.result.toString()}`)
135
+ }
136
+ }
137
+ } catch (e) {
138
+ // Not our contract's event
139
+ }
140
+ })
141
+
142
+ // Find the ValueOffBoarded128 event - there should be exactly one
143
+ const resultEvents = receipt?.logs.filter((log: any) => {
144
+ try {
145
+ const parsed = contract.interface.parseLog(log)
146
+ return parsed?.name === "ValueOffBoarded128"
147
+ } catch {
148
+ return false
149
+ }
150
+ })
151
+
152
+ expect(resultEvents).to.not.be.undefined
153
+ expect(resultEvents?.length).to.equal(1, `Expected exactly one ValueOffBoarded128 event, found ${resultEvents?.length}`)
154
+
155
+ const parsedLog = contract.interface.parseLog(resultEvents![0])
156
+ const ctResult: ctUint = parsedLog?.args.result
157
+
158
+ console.log(`\nšŸ”“ Step 3: Decrypting...`)
159
+ console.log(` CT value: ${ctResult.toString()}`)
160
+ const decrypted = await owner.decryptValue(ctResult)
161
+
162
+ console.log(` āœ… Decrypted: ${decrypted.toString()}`)
163
+ console.log(` āœ… Original: ${plaintext.toString()}`)
164
+ expect(decrypted).to.equal(plaintext)
165
+ console.log(`\n āœ…āœ…āœ… SUCCESS: 100-bit value verified!\n`)
166
+ })
167
+
168
+ it("Should validate and decrypt 120-bit value", async function () {
169
+ const plaintext = (2n ** 120n) - 1n // 120-bit max value
170
+ const bitSize = plaintext.toString(2).length
171
+ expect(bitSize).to.equal(120)
172
+
173
+ console.log(`\nšŸ“Š Testing 120-bit value`)
174
+ console.log(` Value: ${plaintext.toString()}`)
175
+ console.log(` Bit size: ${bitSize} bits`)
176
+
177
+ const functionSelector = contract.validateAndReturn.fragment.selector
178
+ const itValue = await owner.encryptValue(plaintext, contractAddress, functionSelector) as itUint
179
+
180
+ const tx = await contract.validateAndReturn(itValue, { gasLimit: GAS_LIMIT })
181
+ const receipt = await tx.wait()
182
+ expect(receipt?.status).to.equal(1)
183
+ console.log(` āœ… Transaction confirmed in block ${receipt?.blockNumber}`)
184
+
185
+ const resultEvents = receipt?.logs.filter((log: any) => {
186
+ try {
187
+ const parsed = contract.interface.parseLog(log)
188
+ return parsed?.name === "ValueOffBoarded128"
189
+ } catch {
190
+ return false
191
+ }
192
+ })
193
+
194
+ expect(resultEvents?.length).to.equal(1, "Expected exactly one ValueOffBoarded128 event")
195
+
196
+ const parsedLog = contract.interface.parseLog(resultEvents![0])
197
+ const ctResult: ctUint = parsedLog?.args.result
198
+
199
+ console.log(`\nšŸ”“ Decrypting...`)
200
+ console.log(` CT value: ${ctResult.toString()}`)
201
+ const decrypted = await owner.decryptValue(ctResult)
202
+
203
+ console.log(` āœ… Decrypted: ${decrypted.toString()}`)
204
+ console.log(` āœ… Original: ${plaintext.toString()}`)
205
+ expect(decrypted).to.equal(plaintext)
206
+ console.log(`\n āœ…āœ…āœ… SUCCESS: 120-bit value verified!\n`)
207
+ })
208
+
209
+ it("Should validate and decrypt 128-bit value (maximum)", async function () {
210
+ const plaintext = (2n ** 128n) - 1n // Maximum 128-bit value
211
+ const bitSize = plaintext.toString(2).length
212
+ expect(bitSize).to.equal(128)
213
+
214
+ console.log(`\nšŸ“Š Testing MAXIMUM 128-bit value`)
215
+ console.log(` Value: ${plaintext.toString()}`)
216
+ console.log(` Bit size: ${bitSize} bits (MAXIMUM)`)
217
+
218
+ const functionSelector = contract.validateAndReturn.fragment.selector
219
+ console.log(`\nšŸ” Encrypting with Wallet.encryptValue...`)
220
+ const itValue = await owner.encryptValue(plaintext, contractAddress, functionSelector) as itUint
221
+
222
+ console.log(` āœ… Encrypted successfully`)
223
+
224
+ console.log(`\nšŸ“¤ Sending to contract...`)
225
+ const tx = await contract.validateAndReturn(itValue, { gasLimit: GAS_LIMIT })
226
+ const receipt = await tx.wait()
227
+ expect(receipt?.status).to.equal(1)
228
+ console.log(` āœ… Transaction confirmed in block ${receipt?.blockNumber}`)
229
+ console.log(` šŸ“ Total logs: ${receipt?.logs.length}`)
230
+
231
+ // Debug: Log all events
232
+ console.log(`\n šŸ” Parsing all events...`)
233
+ receipt?.logs.forEach((log: any, index: number) => {
234
+ try {
235
+ const parsed = contract.interface.parseLog(log)
236
+ if (parsed) {
237
+ console.log(` Event ${index}: ${parsed.name}`)
238
+ if (parsed.name === "ValueOffBoarded128") {
239
+ console.log(` Result: ${parsed.args.result.toString()}`)
240
+ }
241
+ }
242
+ } catch (e) {
243
+ // Not our contract's event
244
+ }
245
+ })
246
+
247
+ const resultEvents = receipt?.logs.filter((log: any) => {
248
+ try {
249
+ const parsed = contract.interface.parseLog(log)
250
+ return parsed?.name === "ValueOffBoarded128"
251
+ } catch {
252
+ return false
253
+ }
254
+ })
255
+
256
+ expect(resultEvents?.length).to.equal(1, `Expected exactly one ValueOffBoarded128 event, found ${resultEvents?.length}`)
257
+
258
+ const parsedLog = contract.interface.parseLog(resultEvents![0])
259
+ const ctResult: ctUint = parsedLog?.args.result
260
+
261
+ console.log(`\nšŸ”“ Decrypting...`)
262
+ console.log(` CT value: ${ctResult.toString()}`)
263
+ const decrypted = await owner.decryptValue(ctResult)
264
+
265
+ console.log(` āœ… Decrypted: ${decrypted.toString()}`)
266
+ console.log(` āœ… Original: ${plaintext.toString()}`)
267
+ expect(decrypted).to.equal(plaintext)
268
+ console.log(`\n āœ…āœ…āœ… SUCCESS: MAXIMUM 128-bit value verified! buildInputText works perfectly!\n`)
269
+ })
270
+ })
271
+
272
+ describe("Addition Operation - Testing buildInputText with Operations", function () {
273
+ it("Should add two 100-bit values using buildInputText", async function () {
274
+ const a = (2n ** 100n) - 1000n
275
+ const b = (2n ** 100n) - 2000n
276
+ const expected = a + b
277
+ const bitSizeA = a.toString(2).length
278
+ const bitSizeB = b.toString(2).length
279
+
280
+ console.log(`\nšŸ“Š Testing addition with 100-bit values`)
281
+ console.log(` A: ${a.toString()} (${bitSizeA} bits)`)
282
+ console.log(` B: ${b.toString()} (${bitSizeB} bits)`)
283
+ console.log(` Expected: ${expected.toString()}`)
284
+
285
+ const functionSelector = contract.validateAndAdd.fragment.selector
286
+
287
+ console.log(`\nšŸ” Encrypting both values with Wallet.encryptValue...`)
288
+ const itA = await owner.encryptValue(a, contractAddress, functionSelector) as itUint
289
+ const itB = await owner.encryptValue(b, contractAddress, functionSelector) as itUint
290
+
291
+ console.log(` āœ… Both values encrypted`)
292
+
293
+ console.log(`\nšŸ“¤ Sending to contract for addition...`)
294
+ const tx = await contract.validateAndAdd(itA, itB, { gasLimit: GAS_LIMIT })
295
+ const receipt = await tx.wait()
296
+ expect(receipt?.status).to.equal(1)
297
+
298
+ const resultEvents = receipt?.logs.filter((log: any) => {
299
+ try {
300
+ const parsed = contract.interface.parseLog(log)
301
+ return parsed?.name === "ValueOffBoarded128"
302
+ } catch {
303
+ return false
304
+ }
305
+ })
306
+
307
+ expect(resultEvents?.length).to.equal(1, "Expected exactly one ValueOffBoarded128 event")
308
+
309
+ const parsedLog = contract.interface.parseLog(resultEvents![0])
310
+ const ctResult: ctUint = parsedLog?.args.result
311
+
312
+ console.log(`\nšŸ”“ Decrypting result...`)
313
+ console.log(` CT value: ${ctResult.toString()}`)
314
+ const decrypted = await owner.decryptValue(ctResult)
315
+
316
+ console.log(` āœ… Decrypted: ${decrypted.toString()}`)
317
+ console.log(` āœ… Expected: ${expected.toString()}`)
318
+ expect(decrypted).to.equal(expected)
319
+ console.log(`\n āœ…āœ…āœ… SUCCESS: Addition with 100-bit values verified!\n`)
320
+ })
321
+
322
+ it("Should add two 128-bit values using buildInputText", async function () {
323
+ const a = (2n ** 127n) - 1n // Near max
324
+ const b = 1n
325
+ const expected = a + b // Will be 2^127
326
+
327
+ console.log(`\nšŸ“Š Testing addition with near-max 128-bit values`)
328
+ console.log(` A: ${a.toString()} (127 bits)`)
329
+ console.log(` B: ${b.toString()}`)
330
+ console.log(` Expected: ${expected.toString()} (128 bits)`)
331
+
332
+ const functionSelector = contract.validateAndAdd.fragment.selector
333
+
334
+ const itA = await owner.encryptValue(a, contractAddress, functionSelector) as itUint
335
+ const itB = await owner.encryptValue(b, contractAddress, functionSelector) as itUint
336
+
337
+ const tx = await contract.validateAndAdd(itA, itB, { gasLimit: GAS_LIMIT })
338
+ const receipt = await tx.wait()
339
+ expect(receipt?.status).to.equal(1)
340
+ console.log(` āœ… Transaction confirmed in block ${receipt?.blockNumber}`)
341
+ console.log(` šŸ“ Total logs: ${receipt?.logs.length}`)
342
+
343
+ // Debug: Log all events
344
+ console.log(`\n šŸ” Parsing all events...`)
345
+ receipt?.logs.forEach((log: any, index: number) => {
346
+ try {
347
+ const parsed = contract.interface.parseLog(log)
348
+ if (parsed) {
349
+ console.log(` Event ${index}: ${parsed.name}`)
350
+ if (parsed.name === "ValueOffBoarded128") {
351
+ console.log(` Result: ${parsed.args.result.toString()}`)
352
+ }
353
+ }
354
+ } catch (e) {
355
+ // Not our contract's event
356
+ }
357
+ })
358
+
359
+ const resultEvents = receipt?.logs.filter((log: any) => {
360
+ try {
361
+ const parsed = contract.interface.parseLog(log)
362
+ return parsed?.name === "ValueOffBoarded128"
363
+ } catch {
364
+ return false
365
+ }
366
+ })
367
+
368
+ expect(resultEvents?.length).to.equal(1, `Expected exactly one ValueOffBoarded128 event, found ${resultEvents?.length}`)
369
+
370
+ const parsedLog = contract.interface.parseLog(resultEvents![0])
371
+ const ctResult: ctUint = parsedLog?.args.result
372
+
373
+ console.log(`\nšŸ”“ Decrypting result...`)
374
+ console.log(` CT value: ${ctResult.toString()}`)
375
+ const decrypted = await owner.decryptValue(ctResult)
376
+
377
+ console.log(` āœ… Decrypted: ${decrypted.toString()}`)
378
+ console.log(` āœ… Expected: ${expected.toString()}`)
379
+ expect(decrypted).to.equal(expected)
380
+ console.log(`\n āœ…āœ…āœ… SUCCESS: Addition with near-max 128-bit values verified!\n`)
381
+ })
382
+ })
383
+
384
+ after(function() {
385
+ console.log("\n" + "=".repeat(80))
386
+ console.log("šŸ“‹ TEST SUMMARY")
387
+ console.log("=".repeat(80))
388
+ console.log("āœ… Wallet.encryptValue (buildInputText) supports 80-bit values (>70 bits)")
389
+ console.log("āœ… Wallet.encryptValue (buildInputText) supports 100-bit values")
390
+ console.log("āœ… Wallet.encryptValue (buildInputText) supports 120-bit values")
391
+ console.log("āœ… Wallet.encryptValue (buildInputText) supports 128-bit values (MAXIMUM)")
392
+ console.log("āœ… Full cycle: encrypt → validate → decrypt works perfectly")
393
+ console.log("āœ… Operations (addition) work with large values")
394
+ console.log("\nšŸŽ‰ CONCLUSION: buildInputText 128-bit support via Wallet.encryptValue is FULLY WORKING!")
395
+ console.log("=".repeat(80) + "\n")
396
+ })
397
+ })
398
+
@@ -0,0 +1,45 @@
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[],
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 params = [
35
+ BigInt("1000000000000000000"), // 1e18
36
+ BigInt("500000000000000000") // 0.5e18
37
+ ]
38
+ const [a, b] = params
39
+
40
+ describe("Checked Arithmetic 128-bit with Overflow Bit", function () {
41
+ buildTest("CheckedArithmetic128WithOverflowBitTestsContract", "checkedAddWithOverflowBitTest", "getAddResult", params, a + b)
42
+ buildTest("CheckedArithmetic128WithOverflowBitTestsContract", "checkedSubWithOverflowBitTest", "getSubResult", params, a - b)
43
+ buildTest("CheckedArithmetic128WithOverflowBitTestsContract", "checkedMulWithOverflowBitTest", "getMulResult", params, a * b)
44
+ })
45
+