@coti-io/coti-contracts 1.1.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (433) hide show
  1. package/.github/workflows/npm-publish.yml +19 -15
  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/messaging/PrivateMessaging.sol +456 -0
  9. package/contracts/mocks/messaging/PrivateMessagingHarness.sol +54 -0
  10. package/contracts/mocks/oracle/CotiPriceConsumerMock.sol +31 -0
  11. package/contracts/mocks/token/ERC20DecimalsMock.sol +21 -0
  12. package/contracts/mocks/token/ERC20Mock.sol +19 -0
  13. package/contracts/mocks/token/PrivateERC20/EncryptedTokenReceiverMock.sol +18 -0
  14. package/contracts/mocks/token/PrivateERC20/PrivacyBridgeERC20Mock.sol +18 -0
  15. package/contracts/mocks/token/PrivateERC20/PrivateERC20AuditorSupplyMock.sol +44 -0
  16. package/contracts/mocks/token/PrivateERC20/PrivateERC20CappedMock.sol +23 -0
  17. package/contracts/mocks/token/PrivateERC20/PrivateERC20GtCallerMock.sol +29 -0
  18. package/contracts/mocks/token/PrivateERC20/PrivateERC20Mock.sol +9 -4
  19. package/contracts/mocks/token/PrivateERC20/PrivateERC20ReentrantReceiverMock.sol +39 -0
  20. package/contracts/mocks/token/PrivateERC20/PublicReentrantTokenReceiverMock.sol +29 -0
  21. package/contracts/mocks/token/PrivateERC20/PublicTokenReceiverBoolMock.sol +18 -0
  22. package/contracts/mocks/token/PrivateERC20/PublicTokenReceiverMock.sol +12 -0
  23. package/contracts/mocks/utils/mpc/Arithmetic128TestsContract.sol +123 -0
  24. package/contracts/mocks/utils/mpc/Arithmetic256TestsContract.sol +122 -0
  25. package/contracts/mocks/utils/mpc/Bitwise128TestsContract.sol +65 -0
  26. package/contracts/mocks/utils/mpc/Bitwise256TestsContract.sol +65 -0
  27. package/contracts/mocks/utils/mpc/CheckedArithmetic128WithOverflowBitTestsContract.sol +64 -0
  28. package/contracts/mocks/utils/mpc/CheckedArithmetic256WithOverflowBitTestsContract.sol +64 -0
  29. package/contracts/mocks/utils/mpc/Comparison128TestsContract.sol +98 -0
  30. package/contracts/mocks/utils/mpc/Comparison256TestsContract.sol +98 -0
  31. package/contracts/mocks/utils/mpc/MinMax128TestsContract.sol +44 -0
  32. package/contracts/mocks/utils/mpc/MinMax256TestsContract.sol +44 -0
  33. package/contracts/mocks/utils/mpc/MinimalImplementation.sol +55 -0
  34. package/contracts/mocks/utils/mpc/MinimalProxy.sol +27 -0
  35. package/contracts/mocks/utils/mpc/MpcOperations128TestContract.sol +267 -0
  36. package/contracts/mocks/utils/mpc/MpcOperationsTestContract.sol +334 -0
  37. package/contracts/mocks/utils/mpc/Mux128TestsContract.sol +24 -0
  38. package/contracts/mocks/utils/mpc/Mux256TestsContract.sol +24 -0
  39. package/contracts/mocks/utils/mpc/OnBoard128TestsContract.sol +93 -0
  40. package/contracts/mocks/utils/mpc/OnBoard256TestsContract.sol +116 -0
  41. package/contracts/mocks/utils/mpc/PrivacyImplementationV1.sol +157 -0
  42. package/contracts/mocks/utils/mpc/PrivacyImplementationV2.sol +133 -0
  43. package/contracts/mocks/utils/mpc/PrivacyProxy.sol +137 -0
  44. package/contracts/mocks/utils/mpc/Random128TestsContract.sol +32 -0
  45. package/contracts/mocks/utils/mpc/Random256TestsContract.sol +32 -0
  46. package/contracts/mocks/utils/mpc/Shift128TestsContract.sol +36 -0
  47. package/contracts/mocks/utils/mpc/Shift256TestsContract.sol +36 -0
  48. package/contracts/mocks/utils/mpc/Transfer128TestsContract.sol +29 -0
  49. package/contracts/mocks/utils/mpc/Transfer256TestsContract.sol +29 -0
  50. package/contracts/mocks/utils/mpc/TransferWithAllowance128TestsContract.sol +32 -0
  51. package/contracts/mocks/utils/mpc/TransferWithAllowance256TestsContract.sol +32 -0
  52. package/contracts/mocks/utils/mpc/ValidateCiphertext128TestsContract.sol +59 -0
  53. package/contracts/mocks/utils/mpc/ValidateCiphertext256TestsContract.sol +63 -0
  54. package/contracts/mocks/utils/mpc/ValidateCiphertextTestsContract.sol +99 -0
  55. package/contracts/mocks/wallet/PrivateERC20Wallet/PrivateERC20WalletMock.sol +7 -6
  56. package/contracts/node/CotiNodeRewards.sol +199 -0
  57. package/contracts/node/SoulboundNodeNFT.sol +519 -0
  58. package/contracts/oracle/CotiPriceConsumer.sol +103 -0
  59. package/contracts/oracle/ICotiPriceConsumer.sol +15 -0
  60. package/contracts/oracle/IStdReference.sol +26 -0
  61. package/contracts/privacyBridge/PrivacyBridge.sol +600 -0
  62. package/contracts/privacyBridge/PrivacyBridgeCotiNative.sol +316 -0
  63. package/contracts/privacyBridge/PrivacyBridgeERC20.sol +333 -0
  64. package/contracts/privacyBridge/PrivacyBridgeUSDCe.sol +22 -0
  65. package/contracts/privacyBridge/PrivacyBridgeUSDT.sol +23 -0
  66. package/contracts/privacyBridge/PrivacyBridgeWADA.sol +23 -0
  67. package/contracts/privacyBridge/PrivacyBridgeWBTC.sol +23 -0
  68. package/contracts/privacyBridge/PrivacyBridgeWETH.sol +23 -0
  69. package/contracts/privacyBridge/PrivacyBridgegCoti.sol +23 -0
  70. package/contracts/token/PrivateERC20/IPrivateERC20.sol +273 -40
  71. package/contracts/token/PrivateERC20/ITokenReceiver.sol +17 -0
  72. package/contracts/token/PrivateERC20/ITokenReceiverEncrypted.sol +20 -0
  73. package/contracts/token/PrivateERC20/PrivateERC20.sol +861 -152
  74. package/contracts/token/PrivateERC20/tokens/PrivateBridgedUSDC.sol +17 -0
  75. package/contracts/token/PrivateERC20/tokens/PrivateCOTI.sol +13 -0
  76. package/contracts/token/PrivateERC20/tokens/PrivateCOTITreasuryGovernanceToken.sol +17 -0
  77. package/contracts/token/PrivateERC20/tokens/PrivateTetherUSD.sol +17 -0
  78. package/contracts/token/PrivateERC20/tokens/PrivateWrappedADA.sol +17 -0
  79. package/contracts/token/PrivateERC20/tokens/PrivateWrappedBTC.sol +17 -0
  80. package/contracts/token/PrivateERC20/tokens/PrivateWrappedEther.sol +13 -0
  81. package/contracts/utils/mpc/MpcCore.sol +10780 -4962
  82. package/contracts/utils/mpc/MpcInterface.sol +7 -2
  83. package/hardhat/gasPriceBump.ts +60 -0
  84. package/hardhat.config.ts +63 -12
  85. package/package.json +22 -4
  86. package/scripts/add-bridge-operators.cjs +87 -0
  87. package/scripts/deploy-coti-price-consumer-mainnet.cjs +49 -0
  88. package/scripts/deployCotiNodeRewards.ts +51 -0
  89. package/scripts/deploySoulboundNodeNFT.ts +57 -0
  90. package/scripts/redeploy-private-and-bridges.cjs +201 -0
  91. package/scripts/set-bridge-limits-mainnet.cjs +177 -0
  92. package/scripts/verify-mainnet-private-bridges.cjs +289 -0
  93. package/sonar-project.properties +11 -0
  94. package/test/messaging/PrivateMessaging.test.ts +158 -0
  95. package/test/privacyBridge/UnifiedPrivacyBridges.test.cjs +1663 -0
  96. package/test/token/PrivateERC20/PrivacyBridge.fees.test.ts +250 -0
  97. package/test/token/PrivateERC20/PrivateERC20.test.ts +1109 -268
  98. package/test/utils/mpc/Bitwise128.test.ts +92 -0
  99. package/test/utils/mpc/Bitwise256.test.ts +101 -0
  100. package/test/utils/mpc/BuildInputText128.test.ts +398 -0
  101. package/test/utils/mpc/CheckedArithmetic128.test.ts +45 -0
  102. package/test/utils/mpc/CheckedArithmetic256.test.ts +45 -0
  103. package/test/utils/mpc/Comparison128.test.ts +48 -0
  104. package/test/utils/mpc/Comparison256.test.ts +48 -0
  105. package/test/utils/mpc/InvalidCiphertext.test.ts +179 -0
  106. package/test/utils/mpc/InvalidCiphertext128.test.ts +179 -0
  107. package/test/utils/mpc/InvalidCiphertext256.test.ts +201 -0
  108. package/test/utils/mpc/InvalidTransfer128.test.ts +166 -0
  109. package/test/utils/mpc/InvalidTransfer256.test.ts +158 -0
  110. package/test/utils/mpc/MinMax128.test.ts +44 -0
  111. package/test/utils/mpc/MinMax256.test.ts +44 -0
  112. package/test/utils/mpc/MinimalProxyDemo.test.ts +280 -0
  113. package/test/utils/mpc/MpcOperations.test.ts +589 -0
  114. package/test/utils/mpc/MpcOperations128.test.ts +632 -0
  115. package/test/utils/mpc/Mux128.test.ts +41 -0
  116. package/test/utils/mpc/Mux256.test.ts +41 -0
  117. package/test/utils/mpc/NegativeCases.test.ts +478 -0
  118. package/test/utils/mpc/NegativeCases128.test.ts +237 -0
  119. package/test/utils/mpc/NegativeCases256.test.ts +236 -0
  120. package/test/utils/mpc/OnBoard128.test.ts +90 -0
  121. package/test/utils/mpc/OnBoard256.test.ts +114 -0
  122. package/test/utils/mpc/Precompile128.test.ts +51 -0
  123. package/test/utils/mpc/Precompile256.test.ts +115 -0
  124. package/test/utils/mpc/ProxyValidation.test.ts +199 -0
  125. package/test/utils/mpc/Random128.test.ts +47 -0
  126. package/test/utils/mpc/Random256.test.ts +47 -0
  127. package/test/utils/mpc/Shift128.test.ts +41 -0
  128. package/test/utils/mpc/Shift256.test.ts +41 -0
  129. package/test/utils/mpc/Transfer128.test.ts +46 -0
  130. package/test/utils/mpc/Transfer256.test.ts +46 -0
  131. package/test/utils/mpc/TransferWithAllowance128.test.ts +48 -0
  132. package/test/utils/mpc/TransferWithAllowance256.test.ts +48 -0
  133. package/test/utils/mpc/UpgradeablePrivacyProxy.test.ts +307 -0
  134. package/test/utils/mpc/ValidateCiphertext.test.ts +221 -0
  135. package/test/utils/mpc/ValidateCiphertext256.test.ts +161 -0
  136. package/test/utils/mpc/ValidateCiphertext256Decryption.test.ts +383 -0
  137. package/test/utils/mpc/WalletEncryptionFailures.test.ts +494 -0
  138. package/test/utils/privateErc20Helpers.ts +97 -0
  139. package/typechain-types/@openzeppelin/contracts/access/AccessControl.ts +324 -0
  140. package/typechain-types/@openzeppelin/contracts/access/AccessControlEnumerable.ts +361 -0
  141. package/typechain-types/@openzeppelin/contracts/access/IAccessControl.ts +292 -0
  142. package/typechain-types/@openzeppelin/contracts/access/IAccessControlEnumerable.ts +329 -0
  143. package/typechain-types/@openzeppelin/contracts/access/Ownable.ts +153 -0
  144. package/typechain-types/@openzeppelin/contracts/access/index.ts +8 -0
  145. package/typechain-types/@openzeppelin/contracts/index.ts +4 -0
  146. package/typechain-types/@openzeppelin/contracts/security/Pausable.ts +150 -0
  147. package/typechain-types/@openzeppelin/contracts/security/index.ts +4 -0
  148. package/typechain-types/@openzeppelin/contracts/token/ERC20/ERC20.ts +330 -0
  149. package/typechain-types/@openzeppelin/contracts/token/ERC20/IERC20.ts +262 -0
  150. package/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.ts +286 -0
  151. package/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.ts +143 -0
  152. package/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/index.ts +5 -0
  153. package/typechain-types/@openzeppelin/contracts/token/ERC20/index.ts +7 -0
  154. package/typechain-types/@openzeppelin/contracts/token/ERC721/ERC721.ts +420 -0
  155. package/typechain-types/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.ts +420 -0
  156. package/typechain-types/@openzeppelin/contracts/token/ERC721/extensions/index.ts +4 -0
  157. package/typechain-types/@openzeppelin/contracts/token/ERC721/index.ts +3 -0
  158. package/typechain-types/@openzeppelin/contracts/token/index.ts +2 -0
  159. package/typechain-types/contracts/disperse/coinByRatio/FixedRatioCoinDisperser.ts +679 -0
  160. package/typechain-types/contracts/disperse/coinByRatio/FixedRatioCoinDisperserLeftoverS1.ts +735 -0
  161. package/typechain-types/contracts/disperse/coinByRatio/FixedRatioCoinDisperserUnlimitedWindow.ts +734 -0
  162. package/typechain-types/contracts/disperse/coinByRatio/index.ts +6 -0
  163. package/typechain-types/contracts/disperse/disperseToken/MintDisperser.sol/IMintableERC20.ts +97 -0
  164. package/typechain-types/contracts/disperse/disperseToken/MintDisperser.sol/IOwnable.ts +95 -0
  165. package/typechain-types/contracts/disperse/disperseToken/MintDisperser.sol/MintDisperser.ts +228 -0
  166. package/typechain-types/contracts/disperse/disperseToken/MintDisperser.sol/index.ts +6 -0
  167. package/typechain-types/contracts/disperse/disperseToken/TokenDisperser.ts +191 -0
  168. package/typechain-types/contracts/disperse/disperseToken/index.ts +6 -0
  169. package/typechain-types/contracts/disperse/index.ts +7 -0
  170. package/typechain-types/contracts/index.ts +10 -0
  171. package/typechain-types/contracts/messaging/PrivateMessaging.ts +871 -0
  172. package/typechain-types/contracts/messaging/index.ts +4 -0
  173. package/typechain-types/contracts/mocks/index.ts +4 -0
  174. package/typechain-types/contracts/mocks/messaging/PrivateMessagingHarness.ts +951 -0
  175. package/typechain-types/contracts/mocks/messaging/index.ts +4 -0
  176. package/typechain-types/contracts/mocks/oracle/CotiPriceConsumerMock.ts +163 -0
  177. package/typechain-types/contracts/mocks/oracle/index.ts +4 -0
  178. package/typechain-types/contracts/mocks/token/ERC20DecimalsMock.ts +349 -0
  179. package/typechain-types/contracts/mocks/token/ERC20Mock.ts +368 -0
  180. package/typechain-types/contracts/mocks/token/PrivateERC20/EncryptedTokenReceiverMock.ts +108 -0
  181. package/typechain-types/contracts/mocks/token/PrivateERC20/PrivacyBridgeERC20Mock.ts +1892 -0
  182. package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20AuditorSupplyMock.ts +1296 -0
  183. package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20CappedMock.ts +1270 -0
  184. package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20GtCallerMock.ts +166 -0
  185. package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20Mock.ts +827 -78
  186. package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20ReentrantReceiverMock.sol/IPrivateERC20TransferAndCallEncrypted.ts +102 -0
  187. package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20ReentrantReceiverMock.sol/PrivateERC20ReentrantReceiverMock.ts +154 -0
  188. package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20ReentrantReceiverMock.sol/index.ts +5 -0
  189. package/typechain-types/contracts/mocks/token/PrivateERC20/PublicReentrantTokenReceiverMock.ts +155 -0
  190. package/typechain-types/contracts/mocks/token/PrivateERC20/PublicTokenReceiverBoolMock.ts +107 -0
  191. package/typechain-types/contracts/mocks/token/PrivateERC20/PublicTokenReceiverMock.ts +100 -0
  192. package/typechain-types/contracts/mocks/token/PrivateERC20/index.ts +10 -0
  193. package/typechain-types/contracts/mocks/token/index.ts +2 -0
  194. package/typechain-types/contracts/mocks/utils/mpc/{Arithmetic128BitTestsContract.ts → Arithmetic128TestsContract.ts} +96 -126
  195. package/typechain-types/contracts/mocks/utils/mpc/{Arithmetic256BitTestsContract.ts → Arithmetic256TestsContract.ts} +97 -133
  196. package/typechain-types/contracts/mocks/utils/mpc/{Bitwise128BitTestsContract.ts → Bitwise128TestsContract.ts} +52 -59
  197. package/typechain-types/contracts/mocks/utils/mpc/{Bitwise256BitTestsContract.ts → Bitwise256TestsContract.ts} +52 -59
  198. package/typechain-types/contracts/mocks/utils/mpc/CheckedArithmetic128WithOverflowBitTestsContract.ts +206 -0
  199. package/typechain-types/contracts/mocks/utils/mpc/CheckedArithmetic256WithOverflowBitTestsContract.ts +206 -0
  200. package/typechain-types/contracts/mocks/utils/mpc/{Comparison128BitTestsContract.ts → Comparison128TestsContract.ts} +115 -97
  201. package/typechain-types/contracts/mocks/utils/mpc/{Comparison256BitTestsContract.ts → Comparison256TestsContract.ts} +115 -97
  202. package/typechain-types/contracts/mocks/utils/mpc/MinMax128TestsContract.ts +142 -0
  203. package/typechain-types/contracts/mocks/utils/mpc/MinMax256TestsContract.ts +142 -0
  204. package/typechain-types/contracts/mocks/utils/mpc/MinimalImplementation.ts +259 -0
  205. package/typechain-types/contracts/mocks/utils/mpc/MinimalProxy.ts +90 -0
  206. package/typechain-types/contracts/mocks/utils/mpc/MpcOperations128TestContract.ts +388 -0
  207. package/typechain-types/contracts/mocks/utils/mpc/MpcOperationsTestContract.ts +455 -0
  208. package/typechain-types/contracts/mocks/utils/mpc/Mux128TestsContract.ts +109 -0
  209. package/typechain-types/contracts/mocks/utils/mpc/Mux256TestsContract.ts +109 -0
  210. package/typechain-types/contracts/mocks/utils/mpc/OnBoard128TestsContract.ts +166 -0
  211. package/typechain-types/contracts/mocks/utils/mpc/OnBoard256TestsContract.ts +194 -0
  212. package/typechain-types/contracts/mocks/utils/mpc/PrivacyImplementationV1.ts +385 -0
  213. package/typechain-types/contracts/mocks/utils/mpc/PrivacyImplementationV2.ts +441 -0
  214. package/typechain-types/contracts/mocks/utils/mpc/PrivacyProxy.ts +201 -0
  215. package/typechain-types/contracts/mocks/utils/mpc/Random128TestsContract.ts +131 -0
  216. package/typechain-types/contracts/mocks/utils/mpc/Random256TestsContract.ts +131 -0
  217. package/typechain-types/contracts/mocks/utils/mpc/Shift128TestsContract.ts +142 -0
  218. package/typechain-types/contracts/mocks/utils/mpc/Shift256TestsContract.ts +142 -0
  219. package/typechain-types/contracts/mocks/utils/mpc/Transfer128TestsContract.ts +109 -0
  220. package/typechain-types/contracts/mocks/utils/mpc/Transfer256TestsContract.ts +109 -0
  221. package/typechain-types/contracts/mocks/utils/mpc/TransferWithAllowance128TestsContract.ts +128 -0
  222. package/typechain-types/contracts/mocks/utils/mpc/TransferWithAllowance256TestsContract.ts +128 -0
  223. package/typechain-types/contracts/mocks/utils/mpc/ValidateCiphertext128TestsContract.ts +198 -0
  224. package/typechain-types/contracts/mocks/utils/mpc/ValidateCiphertext256TestsContract.ts +182 -0
  225. package/typechain-types/contracts/mocks/utils/mpc/ValidateCiphertextTestsContract.ts +257 -0
  226. package/typechain-types/contracts/mocks/utils/mpc/index.ts +32 -8
  227. package/typechain-types/contracts/mocks/wallet/PrivateERC20Wallet/PrivateERC20WalletMock.ts +6 -6
  228. package/typechain-types/contracts/node/CotiNodeRewards.ts +566 -0
  229. package/typechain-types/contracts/node/SoulboundNodeNFT.sol/IERC5192.ts +123 -0
  230. package/typechain-types/contracts/node/SoulboundNodeNFT.sol/SoulboundNodeNFT.ts +975 -0
  231. package/typechain-types/contracts/node/SoulboundNodeNFT.sol/index.ts +5 -0
  232. package/typechain-types/contracts/node/index.ts +6 -0
  233. package/typechain-types/contracts/oracle/CotiPriceConsumer.ts +256 -0
  234. package/typechain-types/contracts/oracle/ICotiPriceConsumer.ts +119 -0
  235. package/typechain-types/contracts/oracle/IStdReference.ts +136 -0
  236. package/typechain-types/contracts/oracle/index.ts +6 -0
  237. package/typechain-types/contracts/privacyBridge/PrivacyBridge.ts +1628 -0
  238. package/typechain-types/contracts/privacyBridge/PrivacyBridgeCotiNative.ts +1870 -0
  239. package/typechain-types/contracts/privacyBridge/PrivacyBridgeERC20.sol/IHasDecimals.ts +84 -0
  240. package/typechain-types/contracts/privacyBridge/PrivacyBridgeERC20.sol/PrivacyBridgeERC20.ts +1892 -0
  241. package/typechain-types/contracts/privacyBridge/PrivacyBridgeERC20.sol/index.ts +5 -0
  242. package/typechain-types/contracts/privacyBridge/PrivacyBridgeUSDCe.ts +1892 -0
  243. package/typechain-types/contracts/privacyBridge/PrivacyBridgeUSDT.ts +1892 -0
  244. package/typechain-types/contracts/privacyBridge/PrivacyBridgeWADA.ts +1892 -0
  245. package/typechain-types/contracts/privacyBridge/PrivacyBridgeWBTC.ts +1892 -0
  246. package/typechain-types/contracts/privacyBridge/PrivacyBridgeWETH.ts +1892 -0
  247. package/typechain-types/contracts/privacyBridge/PrivacyBridgegCoti.ts +1892 -0
  248. package/typechain-types/contracts/privacyBridge/index.ts +13 -0
  249. package/typechain-types/contracts/token/PrivateERC20/IPrivateERC20.ts +507 -70
  250. package/typechain-types/contracts/token/PrivateERC20/ITokenReceiver.ts +100 -0
  251. package/typechain-types/contracts/token/PrivateERC20/ITokenReceiverEncrypted.ts +99 -0
  252. package/typechain-types/contracts/token/PrivateERC20/PrivateERC20.ts +833 -68
  253. package/typechain-types/contracts/token/PrivateERC20/index.ts +4 -0
  254. package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateBridgedUSDC.ts +1270 -0
  255. package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateCOTI.ts +1270 -0
  256. package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateCOTITreasuryGovernanceToken.ts +1270 -0
  257. package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateTetherUSD.ts +1270 -0
  258. package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateWrappedADA.ts +1270 -0
  259. package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateWrappedBTC.ts +1270 -0
  260. package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateWrappedEther.ts +1270 -0
  261. package/typechain-types/contracts/token/PrivateERC20/tokens/index.ts +10 -0
  262. package/typechain-types/contracts/utils/mpc/MpcInterface.sol/ExtendedOperations.ts +111 -10
  263. package/typechain-types/factories/@openzeppelin/contracts/access/AccessControlEnumerable__factory.ts +276 -0
  264. package/typechain-types/factories/@openzeppelin/contracts/access/AccessControl__factory.ts +229 -0
  265. package/typechain-types/factories/@openzeppelin/contracts/access/IAccessControlEnumerable__factory.ts +244 -0
  266. package/typechain-types/factories/@openzeppelin/contracts/access/IAccessControl__factory.ts +197 -0
  267. package/typechain-types/factories/@openzeppelin/contracts/access/Ownable__factory.ts +74 -0
  268. package/typechain-types/factories/@openzeppelin/contracts/access/index.ts +8 -0
  269. package/typechain-types/factories/@openzeppelin/contracts/index.ts +2 -0
  270. package/typechain-types/factories/@openzeppelin/contracts/security/Pausable__factory.ts +61 -0
  271. package/typechain-types/factories/@openzeppelin/contracts/security/index.ts +4 -0
  272. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/ERC20__factory.ts +356 -0
  273. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/IERC20__factory.ts +205 -0
  274. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata__factory.ts +247 -0
  275. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit__factory.ts +100 -0
  276. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/index.ts +5 -0
  277. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/index.ts +6 -0
  278. package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/ERC721__factory.ts +416 -0
  279. package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata__factory.ts +355 -0
  280. package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/extensions/index.ts +4 -0
  281. package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/index.ts +2 -0
  282. package/typechain-types/factories/@openzeppelin/contracts/token/index.ts +1 -0
  283. package/typechain-types/factories/contracts/disperse/coinByRatio/FixedRatioCoinDisperserLeftoverS1__factory.ts +791 -0
  284. package/typechain-types/factories/contracts/disperse/coinByRatio/FixedRatioCoinDisperserUnlimitedWindow__factory.ts +711 -0
  285. package/typechain-types/factories/contracts/disperse/coinByRatio/FixedRatioCoinDisperser__factory.ts +759 -0
  286. package/typechain-types/factories/contracts/disperse/coinByRatio/index.ts +6 -0
  287. package/typechain-types/factories/contracts/disperse/disperseToken/MintDisperser.sol/IMintableERC20__factory.ts +43 -0
  288. package/typechain-types/factories/contracts/disperse/disperseToken/MintDisperser.sol/IOwnable__factory.ts +35 -0
  289. package/typechain-types/factories/contracts/disperse/disperseToken/MintDisperser.sol/MintDisperser__factory.ts +203 -0
  290. package/typechain-types/factories/contracts/disperse/disperseToken/MintDisperser.sol/index.ts +6 -0
  291. package/typechain-types/factories/contracts/disperse/disperseToken/TokenDisperser__factory.ts +198 -0
  292. package/typechain-types/factories/contracts/disperse/disperseToken/index.ts +5 -0
  293. package/typechain-types/factories/contracts/disperse/index.ts +5 -0
  294. package/typechain-types/factories/contracts/index.ts +5 -0
  295. package/typechain-types/factories/contracts/messaging/PrivateMessaging__factory.ts +1035 -0
  296. package/typechain-types/factories/contracts/messaging/index.ts +4 -0
  297. package/typechain-types/factories/contracts/mocks/access/DataPrivacyFramework/DataPrivacyFrameworkMock__factory.ts +1 -1
  298. package/typechain-types/factories/contracts/mocks/index.ts +2 -0
  299. package/typechain-types/factories/contracts/mocks/messaging/PrivateMessagingHarness__factory.ts +1161 -0
  300. package/typechain-types/factories/contracts/mocks/messaging/index.ts +4 -0
  301. package/typechain-types/factories/contracts/mocks/oracle/CotiPriceConsumerMock__factory.ts +159 -0
  302. package/typechain-types/factories/contracts/mocks/oracle/index.ts +4 -0
  303. package/typechain-types/factories/contracts/mocks/token/ERC20DecimalsMock__factory.ts +394 -0
  304. package/typechain-types/factories/contracts/mocks/token/ERC20Mock__factory.ts +392 -0
  305. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/EncryptedTokenReceiverMock__factory.ts +125 -0
  306. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivacyBridgeERC20Mock__factory.ts +1797 -0
  307. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20AuditorSupplyMock__factory.ts +1514 -0
  308. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20CappedMock__factory.ts +1466 -0
  309. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20GtCallerMock__factory.ts +165 -0
  310. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20Mock__factory.ts +975 -127
  311. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20ReentrantReceiverMock.sol/IPrivateERC20TransferAndCallEncrypted__factory.ts +54 -0
  312. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20ReentrantReceiverMock.sol/PrivateERC20ReentrantReceiverMock__factory.ts +159 -0
  313. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20ReentrantReceiverMock.sol/index.ts +5 -0
  314. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PublicReentrantTokenReceiverMock__factory.ts +164 -0
  315. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PublicTokenReceiverBoolMock__factory.ts +130 -0
  316. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PublicTokenReceiverMock__factory.ts +102 -0
  317. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/index.ts +9 -0
  318. package/typechain-types/factories/contracts/mocks/token/PrivateERC721/PrivateERC721URIStorageMock__factory.ts +1 -1
  319. package/typechain-types/factories/contracts/mocks/token/index.ts +2 -0
  320. package/typechain-types/factories/contracts/mocks/utils/mpc/Arithmetic128TestsContract__factory.ts +330 -0
  321. package/typechain-types/factories/contracts/mocks/utils/mpc/Arithmetic256TestsContract__factory.ts +330 -0
  322. package/typechain-types/factories/contracts/mocks/utils/mpc/ArithmeticTestsContract__factory.ts +1 -1
  323. package/typechain-types/factories/contracts/mocks/utils/mpc/Bitwise128TestsContract__factory.ts +184 -0
  324. package/typechain-types/factories/contracts/mocks/utils/mpc/Bitwise256TestsContract__factory.ts +184 -0
  325. package/typechain-types/factories/contracts/mocks/utils/mpc/BitwiseTestsContract__factory.ts +1 -1
  326. package/typechain-types/factories/contracts/mocks/utils/mpc/CheckedArithmetic128WithOverflowBitTestsContract__factory.ts +203 -0
  327. package/typechain-types/factories/contracts/mocks/utils/mpc/CheckedArithmetic256WithOverflowBitTestsContract__factory.ts +203 -0
  328. package/typechain-types/factories/contracts/mocks/utils/mpc/CheckedArithmeticWIthOverflowBitTestsContract.sol/CheckedArithmeticWithOverflowBitTestsContract__factory.ts +1 -1
  329. package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison128TestsContract__factory.ts +295 -0
  330. package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison1TestsContract__factory.ts +1 -1
  331. package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison256TestsContract__factory.ts +295 -0
  332. package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison2TestsContract__factory.ts +1 -1
  333. package/typechain-types/factories/contracts/mocks/utils/mpc/MinMax128TestsContract__factory.ts +147 -0
  334. package/typechain-types/factories/contracts/mocks/utils/mpc/MinMax256TestsContract__factory.ts +147 -0
  335. package/typechain-types/factories/contracts/mocks/utils/mpc/MinMaxTestsContract__factory.ts +1 -1
  336. package/typechain-types/factories/contracts/mocks/utils/mpc/MinimalImplementation__factory.ts +263 -0
  337. package/typechain-types/factories/contracts/mocks/utils/mpc/MinimalProxy__factory.ts +104 -0
  338. package/typechain-types/factories/contracts/mocks/utils/mpc/Miscellaneous1TestsContract__factory.ts +1 -1
  339. package/typechain-types/factories/contracts/mocks/utils/mpc/MiscellaneousTestsContract__factory.ts +1 -1
  340. package/typechain-types/factories/contracts/mocks/utils/mpc/MpcOperations128TestContract__factory.ts +723 -0
  341. package/typechain-types/factories/contracts/mocks/utils/mpc/MpcOperationsTestContract__factory.ts +1410 -0
  342. package/typechain-types/factories/contracts/mocks/utils/mpc/Mux128TestsContract__factory.ts +115 -0
  343. package/typechain-types/factories/contracts/mocks/utils/mpc/Mux256TestsContract__factory.ts +115 -0
  344. package/typechain-types/factories/contracts/mocks/utils/mpc/OffboardToUserKeyTestContract__factory.ts +1 -1
  345. package/typechain-types/factories/contracts/mocks/utils/mpc/OnBoard128TestsContract__factory.ts +175 -0
  346. package/typechain-types/factories/contracts/mocks/utils/mpc/OnBoard256TestsContract__factory.ts +205 -0
  347. package/typechain-types/factories/contracts/mocks/utils/mpc/PrivacyImplementationV1__factory.ts +521 -0
  348. package/typechain-types/factories/contracts/mocks/utils/mpc/PrivacyImplementationV2__factory.ts +648 -0
  349. package/typechain-types/factories/contracts/mocks/utils/mpc/PrivacyProxy__factory.ts +179 -0
  350. package/typechain-types/factories/contracts/mocks/utils/mpc/Random128TestsContract__factory.ts +131 -0
  351. package/typechain-types/factories/contracts/mocks/utils/mpc/Random256TestsContract__factory.ts +131 -0
  352. package/typechain-types/factories/contracts/mocks/utils/mpc/Shift128TestsContract__factory.ts +147 -0
  353. package/typechain-types/factories/contracts/mocks/utils/mpc/Shift256TestsContract__factory.ts +147 -0
  354. package/typechain-types/factories/contracts/mocks/utils/mpc/ShiftTestsContract__factory.ts +1 -1
  355. package/typechain-types/factories/contracts/mocks/utils/mpc/StringTestsContract__factory.ts +1 -1
  356. package/typechain-types/factories/contracts/mocks/utils/mpc/Transfer128TestsContract__factory.ts +135 -0
  357. package/typechain-types/factories/contracts/mocks/utils/mpc/Transfer256TestsContract__factory.ts +135 -0
  358. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferScalarTestsContract__factory.ts +1 -1
  359. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferTestsContract__factory.ts +1 -1
  360. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance128TestsContract__factory.ts +154 -0
  361. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance256TestsContract__factory.ts +154 -0
  362. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance64_16TestsContract__factory.ts +1 -1
  363. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance64_32TestsContract__factory.ts +1 -1
  364. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance64_64TestsContract__factory.ts +1 -1
  365. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance64_8TestsContract__factory.ts +1 -1
  366. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowanceScalarTestsContract__factory.ts +1 -1
  367. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowanceTestsContract__factory.ts +1 -1
  368. package/typechain-types/factories/contracts/mocks/utils/mpc/ValidateCiphertext128TestsContract__factory.ts +190 -0
  369. package/typechain-types/factories/contracts/mocks/utils/mpc/ValidateCiphertext256TestsContract__factory.ts +210 -0
  370. package/typechain-types/factories/contracts/mocks/utils/mpc/ValidateCiphertextTestsContract__factory.ts +260 -0
  371. package/typechain-types/factories/contracts/mocks/utils/mpc/index.ts +32 -8
  372. package/typechain-types/factories/contracts/mocks/wallet/PrivateERC20Wallet/PrivateERC20WalletMock__factory.ts +10 -28
  373. package/typechain-types/factories/contracts/node/CotiNodeRewards__factory.ts +549 -0
  374. package/typechain-types/factories/contracts/node/SoulboundNodeNFT.sol/IERC5192__factory.ts +54 -0
  375. package/typechain-types/factories/contracts/node/SoulboundNodeNFT.sol/SoulboundNodeNFT__factory.ts +947 -0
  376. package/typechain-types/factories/contracts/node/SoulboundNodeNFT.sol/index.ts +5 -0
  377. package/typechain-types/factories/contracts/node/index.ts +5 -0
  378. package/typechain-types/factories/contracts/onboard/AccountOnboard__factory.ts +1 -1
  379. package/typechain-types/factories/contracts/oracle/CotiPriceConsumer__factory.ts +295 -0
  380. package/typechain-types/factories/contracts/oracle/ICotiPriceConsumer__factory.ts +73 -0
  381. package/typechain-types/factories/contracts/oracle/IStdReference__factory.ts +107 -0
  382. package/typechain-types/factories/contracts/oracle/index.ts +6 -0
  383. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeCotiNative__factory.ts +1676 -0
  384. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeERC20.sol/IHasDecimals__factory.ts +38 -0
  385. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeERC20.sol/PrivacyBridgeERC20__factory.ts +1678 -0
  386. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeERC20.sol/index.ts +5 -0
  387. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeUSDCe__factory.ts +1782 -0
  388. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeUSDT__factory.ts +1782 -0
  389. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeWADA__factory.ts +1782 -0
  390. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeWBTC__factory.ts +1782 -0
  391. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeWETH__factory.ts +1782 -0
  392. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridge__factory.ts +1367 -0
  393. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgegCoti__factory.ts +1782 -0
  394. package/typechain-types/factories/contracts/privacyBridge/index.ts +12 -0
  395. package/typechain-types/factories/contracts/token/PrivateERC20/IPrivateERC20__factory.ts +639 -61
  396. package/typechain-types/factories/contracts/token/PrivateERC20/ITokenReceiverEncrypted__factory.ts +53 -0
  397. package/typechain-types/factories/contracts/token/PrivateERC20/ITokenReceiver__factory.ts +54 -0
  398. package/typechain-types/factories/contracts/token/PrivateERC20/PrivateERC20__factory.ts +986 -120
  399. package/typechain-types/factories/contracts/token/PrivateERC20/index.ts +3 -0
  400. package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateBridgedUSDC__factory.ts +1445 -0
  401. package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateCOTITreasuryGovernanceToken__factory.ts +1451 -0
  402. package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateCOTI__factory.ts +1442 -0
  403. package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateTetherUSD__factory.ts +1445 -0
  404. package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateWrappedADA__factory.ts +1445 -0
  405. package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateWrappedBTC__factory.ts +1445 -0
  406. package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateWrappedEther__factory.ts +1451 -0
  407. package/typechain-types/factories/contracts/token/PrivateERC20/tokens/index.ts +10 -0
  408. package/typechain-types/factories/contracts/utils/mpc/MpcCore__factory.ts +1 -1
  409. package/typechain-types/factories/contracts/utils/mpc/MpcInterface.sol/ExtendedOperations__factory.ts +126 -0
  410. package/typechain-types/hardhat.d.ts +1772 -278
  411. package/typechain-types/index.ts +182 -16
  412. package/contracts/mocks/utils/mpc/Arithmetic128BitTestsContract.sol +0 -260
  413. package/contracts/mocks/utils/mpc/Arithmetic256BitTestsContract.sol +0 -264
  414. package/contracts/mocks/utils/mpc/Bitwise128BitTestsContract.sol +0 -91
  415. package/contracts/mocks/utils/mpc/Bitwise256BitTestsContract.sol +0 -91
  416. package/contracts/mocks/utils/mpc/Comparison128BitTestsContract.sol +0 -158
  417. package/contracts/mocks/utils/mpc/Comparison256BitTestsContract.sol +0 -158
  418. package/contracts/mocks/utils/mpc/Miscellaneous128BitTestsContract.sol +0 -185
  419. package/contracts/mocks/utils/mpc/Miscellaneous256BitTestsContract.sol +0 -190
  420. package/contracts/mocks/utils/mpc/README.md +0 -486
  421. package/test/utils/mpc/Unsigned128BitIntegers.test.ts +0 -945
  422. package/test/utils/mpc/Unsigned256BitIntegers.test.ts +0 -1124
  423. package/test/utils/mpc/helpers.ts +0 -77
  424. package/typechain-types/contracts/mocks/utils/mpc/Miscellaneous128BitTestsContract.ts +0 -302
  425. package/typechain-types/contracts/mocks/utils/mpc/Miscellaneous256BitTestsContract.ts +0 -322
  426. package/typechain-types/factories/contracts/mocks/utils/mpc/Arithmetic128BitTestsContract__factory.ts +0 -349
  427. package/typechain-types/factories/contracts/mocks/utils/mpc/Arithmetic256BitTestsContract__factory.ts +0 -364
  428. package/typechain-types/factories/contracts/mocks/utils/mpc/Bitwise128BitTestsContract__factory.ts +0 -182
  429. package/typechain-types/factories/contracts/mocks/utils/mpc/Bitwise256BitTestsContract__factory.ts +0 -182
  430. package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison128BitTestsContract__factory.ts +0 -255
  431. package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison256BitTestsContract__factory.ts +0 -255
  432. package/typechain-types/factories/contracts/mocks/utils/mpc/Miscellaneous128BitTestsContract__factory.ts +0 -332
  433. package/typechain-types/factories/contracts/mocks/utils/mpc/Miscellaneous256BitTestsContract__factory.ts +0 -380
@@ -1,5 +1,6 @@
1
- # This workflow will run tests using node and then publish a package to GitHub Packages when a release is created
2
- # For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages
1
+ # Test on PR; publish @coti-io/coti-contracts via npm Trusted Publishing (OIDC) on tags no npm_token secret.
2
+ # On npmjs: Package Settings → Trusted publishing → GitHub Actions. Match owner, repo, and workflow filename
3
+ # exactly: npm-publish.yml (see https://docs.npmjs.com/trusted-publishers).
3
4
 
4
5
  name: Node.js Package
5
6
 
@@ -9,25 +10,31 @@ on:
9
10
  types: [ created ]
10
11
  pull_request:
11
12
  types: [ review_requested ]
13
+
12
14
  jobs:
13
15
  build:
14
16
  runs-on: ubuntu-latest
17
+ permissions:
18
+ contents: read
15
19
  steps:
16
- - uses: actions/checkout@v4
17
- - uses: actions/setup-node@v3
20
+ - uses: actions/checkout@v5
21
+ - uses: actions/setup-node@v5
18
22
  with:
19
- node-version: 16
23
+ node-version: 24
20
24
  - run: npm ci
21
25
 
22
26
  update-version-and-publish:
23
27
  needs: build
24
28
  runs-on: ubuntu-latest
25
29
  if: startsWith(github.ref, 'refs/tags/')
30
+ permissions:
31
+ contents: write
32
+ id-token: write
26
33
  steps:
27
- - uses: actions/checkout@v4
28
- - name: Update setup.py version
34
+ - uses: actions/checkout@v5
35
+ - name: Update package.json version from tag
29
36
  run: |
30
- TAG_NAME=$(echo ${{github.ref_name}})
37
+ TAG_NAME=$(echo ${{github.ref_name}})
31
38
  jq --arg tag "$TAG_NAME" '.version = $tag' package.json > tmp.$$.json && mv tmp.$$.json package.json
32
39
  - name: Commit and push changes
33
40
  run: |
@@ -40,14 +47,11 @@ jobs:
40
47
  git tag -f $TAG_NAME
41
48
  git push --force origin $TAG_NAME
42
49
  env:
43
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
44
- - uses: actions/setup-node@v3
50
+ GITHUB_TOKEN: ${{ github.token }}
51
+ - uses: actions/setup-node@v5
45
52
  with:
46
- node-version: 18
47
- registry-url: https://registry.npmjs.org/
53
+ node-version: '24'
54
+ registry-url: 'https://registry.npmjs.org'
48
55
  scope: '@coti-io'
49
56
  - run: npm ci
50
57
  - run: npm publish --access=public
51
- env:
52
- NODE_AUTH_TOKEN: ${{secrets.npm_token}}
53
-
package/README.md CHANGED
@@ -1,7 +1,9 @@
1
+ [![image](https://img.shields.io/badge/Visit-COTI%20Website-green?style=for-the-badge&logo=internet-explorer)](https://coti.io/)
1
2
  [![image](https://img.shields.io/badge/Telegram-2CA5E0?style=for-the-badge&logo=telegram&logoColor=white)](https://telegram.coti.io)
2
3
  [![image](https://img.shields.io/badge/Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white)](https://discord.coti.io)
3
4
  [![image](https://img.shields.io/badge/X-000000?style=for-the-badge&logo=x&logoColor=white)](https://twitter.coti.io)
4
5
  [![image](https://img.shields.io/badge/YouTube-FF0000?style=for-the-badge&logo=youtube&logoColor=white)](https://youtube.coti.io)
6
+ [![COTI Website](https://img.shields.io/badge/COTI%20WEBSITE-4CAF50?style=for-the-badge)](https://coti.io)
5
7
 
6
8
  # COTI Contracts
7
9
 
@@ -28,4 +30,4 @@ npx hardhat test
28
30
 
29
31
  ---
30
32
 
31
- To report an issue, please see the [issues](https://github.com/coti-io/coti-contracts/issues/new) tab.
33
+ To report an issue, please see the [issues](https://github.com/coti-io/coti-contracts/issues/new) tab.
@@ -0,0 +1,452 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.20;
3
+
4
+ import {Math} from "@openzeppelin/contracts/utils/math/Math.sol";
5
+ import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
6
+ import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
7
+
8
+ abstract contract ReentrancyGuard {
9
+ uint256 private constant _NOT_ENTERED = 1;
10
+ uint256 private constant _ENTERED = 2;
11
+ uint256 private _status = _NOT_ENTERED;
12
+ modifier nonReentrant() {
13
+ require(_status != _ENTERED, "REENTRANCY");
14
+ _status = _ENTERED;
15
+ _;
16
+ _status = _NOT_ENTERED;
17
+ }
18
+ }
19
+
20
+ /**
21
+ * @title FixedRatioCoinDisperser
22
+ * @notice Redeem ERC20 "points" for native ETH payout pool
23
+ * - Order-independent fixed-index redemption
24
+ * - Pull-based withdrawals (DoS safe)
25
+ * - Optional push for EOAs only
26
+ * - Native ETH payouts
27
+ */
28
+ contract FixedRatioCoinDisperser is ReentrancyGuard {
29
+ using SafeERC20 for IERC20;
30
+
31
+ // --- Custom Errors ---
32
+ error TokenZeroAddress();
33
+ error OwnerZeroAddress();
34
+ error InvalidBlockRange();
35
+ error NotOwner();
36
+ error AlreadyFinalized();
37
+ error PoolZero();
38
+ error SupplyZero();
39
+ error NotFinalized();
40
+ error NoExcess();
41
+ error WindowActive();
42
+ error NoDust();
43
+ error WithdrawFailed();
44
+ error ContractMustPull();
45
+ error NothingToWithdraw();
46
+ error ContractPaused();
47
+ error OutOfWindow();
48
+ error AmountZero();
49
+ error SnapshotZero();
50
+ error NoPointsLeft();
51
+ error OverCapacity();
52
+ error BalanceManipulation();
53
+ error PayoutZero();
54
+ error RedemptionNotClosed();
55
+ error InvalidAddress();
56
+ error InsufficientBalance();
57
+ error InsufficientEthBalance();
58
+ error EthTransferFailed();
59
+
60
+ // --- Events ---
61
+ event Funded(address indexed from, uint256 amount);
62
+ event Finalized(uint256 totalPayoutPool, uint256 totalRedeemablePoints, uint256 accPayoutPerPoint);
63
+ event Redeemed(address indexed user, uint256 pointsRequested, uint256 pointsReceived, uint256 payout, bool pushed);
64
+ event Paused(bool isPaused);
65
+ event DustWithdrawn(uint256 amount);
66
+ event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
67
+ event Withdrawal(address indexed user, uint256 amount);
68
+
69
+ // --- Config ---
70
+ IERC20 public immutable POINTS_TOKEN;
71
+ address public owner;
72
+
73
+ // --- Redemption window ---
74
+ uint256 public immutable START_BLOCK;
75
+ uint256 public immutable END_BLOCK;
76
+
77
+ // --- Lifecycle ---
78
+ bool public finalized;
79
+ bool public paused;
80
+
81
+ // --- Accounting ---
82
+ uint256 public totalPayoutPool; // ETH reserved for redemptions (snapshot)
83
+ uint256 public totalRedeemablePoints; // points supply snapshot at finalize
84
+ uint256 public accPayoutPerPoint; // index = totalPayoutPool * 1e18 / totalRedeemablePoints
85
+ uint256 public totalPointsRedeemed; // cumulative points locked
86
+ uint256 public totalPayoutSent; // cumulative ETH sent
87
+
88
+ // --- Pull ledger ---
89
+ mapping(address => uint256) public pendingWithdrawals;
90
+ uint256 public pendingTotal;
91
+
92
+ uint256 private constant ONE = 1e18;
93
+
94
+ modifier onlyOwner() {
95
+ if (msg.sender != owner) revert NotOwner();
96
+ _;
97
+ }
98
+
99
+ /**
100
+ * @dev Constructor to initialize the FixedRatioCoinDisperser contract
101
+ * @param _pointsToken Address of the ERC20 points token that can be redeemed
102
+ * @param _owner Address that will have admin privileges (can pause, finalize, etc.)
103
+ * @param _startBlock Block number when redemption window opens
104
+ * @param _endBlock Block number when redemption window closes
105
+ */
106
+ constructor(
107
+ address _pointsToken,
108
+ address _owner,
109
+ uint256 _startBlock,
110
+ uint256 _endBlock
111
+ ) {
112
+ if (_pointsToken == address(0)) revert TokenZeroAddress();
113
+ if (_owner == address(0)) revert OwnerZeroAddress();
114
+ if (_endBlock <= _startBlock) revert InvalidBlockRange();
115
+
116
+ POINTS_TOKEN = IERC20(_pointsToken);
117
+ owner = _owner;
118
+ START_BLOCK = _startBlock;
119
+ END_BLOCK = _endBlock;
120
+ }
121
+
122
+ // --- Admin ---
123
+
124
+ /**
125
+ * @dev Pause or unpause the redemption system
126
+ * @param _paused True to pause redemptions, false to unpause
127
+ * @notice Only the owner can call this function
128
+ * @notice When paused, users cannot redeem points but can still withdraw pending amounts
129
+ */
130
+ function setPaused(bool _paused) external onlyOwner {
131
+ paused = _paused;
132
+ emit Paused(_paused);
133
+ }
134
+
135
+ /**
136
+ * @dev Fund the contract with ETH for redemptions
137
+ * @notice Only the owner can call this function
138
+ * @notice The ETH sent will be used to pay out redemptions
139
+ * @notice Can be called multiple times to add more ETH
140
+ */
141
+ function fundEth() external payable onlyOwner {
142
+ if (msg.value == 0) revert AmountZero();
143
+ totalPayoutPool += msg.value;
144
+ emit Funded(msg.sender, msg.value);
145
+ }
146
+
147
+ /**
148
+ * @dev Move existing contract balance to the payout pool
149
+ * @notice Only owner can call this function
150
+ * @notice Can only be called before finalization
151
+ * @notice Moves all ETH currently in contract balance to totalPayoutPool
152
+ */
153
+ function moveBalanceToPool() external onlyOwner {
154
+ if (finalized) revert AlreadyFinalized();
155
+ uint256 balance = address(this).balance;
156
+ if (balance == 0) revert PoolZero();
157
+
158
+ // Only add the difference to avoid double-counting
159
+ uint256 currentPool = totalPayoutPool;
160
+ if (balance > currentPool) {
161
+ uint256 difference = balance - currentPool;
162
+ totalPayoutPool += difference;
163
+ emit Funded(msg.sender, difference);
164
+ }
165
+ }
166
+
167
+ /**
168
+ * @dev Finalize the redemption system and calculate payout rates
169
+ * @notice Only the owner can call this function
170
+ * @notice Can only be called once
171
+ * @notice Snapshot the current ETH balance and points token supply
172
+ * @notice Calculate the payout rate per point (ETH per point)
173
+ * @notice After finalization, redemptions can begin during the redemption window
174
+ */
175
+ function finalize() external onlyOwner {
176
+ if (finalized) revert AlreadyFinalized();
177
+
178
+ uint256 pool = address(this).balance;
179
+ uint256 supply = POINTS_TOKEN.totalSupply();
180
+ if (pool == 0) revert PoolZero();
181
+ if (supply == 0) revert SupplyZero();
182
+
183
+ uint256 index = Math.mulDiv(pool, ONE, supply);
184
+
185
+ totalPayoutPool = pool;
186
+ totalRedeemablePoints = supply;
187
+ accPayoutPerPoint = index;
188
+ finalized = true;
189
+
190
+ emit Finalized(pool, supply, index);
191
+ }
192
+
193
+ // --- Owner utilities ---
194
+
195
+ /**
196
+ * @dev Withdraw excess ETH that is not needed for redemptions
197
+ * @notice Only the owner can call this function
198
+ * @notice Can only be called after finalization and redemption window closes
199
+ * @notice Withdraws ETH in excess of what's needed for pending withdrawals
200
+ * @notice ETH is sent to the owner address
201
+ */
202
+ function withdrawDust() external onlyOwner nonReentrant {
203
+ if (!finalized) revert NotFinalized();
204
+ if (block.number <= END_BLOCK) revert WindowActive();
205
+
206
+ uint256 requiredReserve = pendingTotal;
207
+ uint256 bal = address(this).balance;
208
+ if (bal <= requiredReserve) revert NoDust();
209
+
210
+ uint256 amount = bal - requiredReserve;
211
+ (bool success,) = owner.call{value: amount}("");
212
+ if (!success) revert EthTransferFailed();
213
+ emit DustWithdrawn(amount);
214
+ }
215
+
216
+ // --- Redeem API ---
217
+
218
+ /**
219
+ * @dev Redeem points for ETH using pull pattern (user must call withdraw later)
220
+ * @param amount Amount of points to redeem
221
+ * @notice User must have approved the contract to spend their points
222
+ * @notice ETH payout is added to user's pending withdrawals
223
+ * @notice User must call withdraw() later to receive the ETH
224
+ * @notice Can only be called during redemption window and when not paused
225
+ */
226
+ function redeemPull(uint256 amount) external nonReentrant {
227
+ (uint256 payout, uint256 received) = _redeemCore(msg.sender, amount);
228
+ pendingWithdrawals[msg.sender] += payout;
229
+ pendingTotal += payout;
230
+ emit Redeemed(msg.sender, amount, received, payout, false);
231
+ }
232
+
233
+ /**
234
+ * @dev Redeem points for ETH using push pattern (immediate ETH transfer)
235
+ * @param amount Amount of points to redeem
236
+ * @notice User must have approved the contract to spend their points
237
+ * @notice ETH is sent directly to the user's address
238
+ * @notice Only works for EOA (externally owned accounts), not contracts
239
+ * @notice Can only be called during redemption window and when not paused
240
+ */
241
+ function redeemPush(uint256 amount) external nonReentrant {
242
+ if (!_isEoa(msg.sender)) revert ContractMustPull();
243
+ (uint256 payout, uint256 received) = _redeemCore(msg.sender, amount);
244
+
245
+ (bool success,) = msg.sender.call{value: payout}("");
246
+ if (!success) revert EthTransferFailed();
247
+ emit Redeemed(msg.sender, amount, received, payout, true);
248
+ }
249
+
250
+ /**
251
+ * @dev Withdraw pending ETH from pull redemptions
252
+ * @notice Withdraws all pending ETH for the caller
253
+ * @notice ETH is sent directly to the caller's address
254
+ * @notice Can be called anytime after a pull redemption
255
+ * @notice Sets caller's pending balance to zero after withdrawal
256
+ */
257
+ function withdraw() external nonReentrant {
258
+ uint256 amount = pendingWithdrawals[msg.sender];
259
+ if (amount == 0) revert NothingToWithdraw();
260
+ pendingWithdrawals[msg.sender] = 0;
261
+ pendingTotal -= amount;
262
+
263
+ (bool success,) = msg.sender.call{value: amount}("");
264
+ if (!success) revert EthTransferFailed();
265
+ emit Withdrawal(msg.sender, amount);
266
+ }
267
+
268
+ // --- Core math ---
269
+ /**
270
+ * @dev Internal function that handles the core redemption logic
271
+ * @param user Address of the user redeeming points
272
+ * @param amount Amount of points to redeem
273
+ * @return payout Amount of ETH to be paid out
274
+ * @return received Actual amount of points received (transferred to contract)
275
+ * @notice Handles all validation, point transfer, and payout calculation
276
+ * @notice Points are transferred from user to contract and locked forever
277
+ * @notice Updates global accounting (totalPointsRedeemed, totalPayoutSent)
278
+ */
279
+ function _redeemCore(address user, uint256 amount)
280
+ internal
281
+ returns (uint256 payout, uint256 received)
282
+ {
283
+ if (!finalized) revert NotFinalized();
284
+ if (paused) revert ContractPaused();
285
+ uint256 bn = block.number;
286
+ if (bn < START_BLOCK || bn > END_BLOCK) revert OutOfWindow();
287
+ if (amount == 0) revert AmountZero();
288
+
289
+ uint256 trp = totalRedeemablePoints;
290
+ uint256 tpr = totalPointsRedeemed;
291
+ if (trp == 0) revert SnapshotZero();
292
+
293
+ uint256 remaining = trp - tpr;
294
+ if (remaining == 0) revert NoPointsLeft();
295
+
296
+ // --- Pull points token (requires allowance from user)
297
+ uint256 beforeBal = POINTS_TOKEN.balanceOf(address(this));
298
+ POINTS_TOKEN.safeTransferFrom(user, address(this), amount);
299
+ uint256 afterBal = POINTS_TOKEN.balanceOf(address(this));
300
+ received = afterBal - beforeBal;
301
+
302
+ if (received == 0) revert PayoutZero();
303
+ if (received > amount) revert BalanceManipulation();
304
+ if (received > remaining) revert OverCapacity();
305
+
306
+ payout = Math.mulDiv(received, accPayoutPerPoint, ONE);
307
+
308
+ uint256 reserve = _safeRemainingReserve();
309
+ if (payout > reserve) payout = reserve;
310
+ if (payout == 0) revert PayoutZero();
311
+
312
+ // Check if contract has enough ETH
313
+ if (payout > address(this).balance) revert InsufficientEthBalance();
314
+
315
+ unchecked {
316
+ totalPointsRedeemed = tpr + received;
317
+ totalPayoutSent += payout;
318
+ }
319
+ }
320
+
321
+ // --- Views ---
322
+
323
+ /**
324
+ * @dev Check if redemptions are currently open
325
+ * @return True if redemptions are open (finalized, not paused, within window)
326
+ */
327
+ function isRedemptionOpen() public view returns (bool) {
328
+ return finalized && !paused && block.number >= START_BLOCK && block.number <= END_BLOCK;
329
+ }
330
+
331
+ /**
332
+ * @dev Get the remaining ETH reserve available for redemptions
333
+ * @return Amount of ETH still available for redemptions
334
+ * @notice Returns 0 if not finalized or if all ETH has been paid out
335
+ */
336
+ function remainingReserve() public view returns (uint256) {
337
+ if (!finalized) return 0;
338
+ if (totalPayoutSent >= totalPayoutPool) return 0;
339
+ return totalPayoutPool - totalPayoutSent;
340
+ }
341
+
342
+ /**
343
+ * @dev Internal function to get the safe remaining reserve
344
+ * @return The minimum of theoretical reserve and actual ETH balance
345
+ * @notice Ensures we don't try to pay out more ETH than we actually have
346
+ */
347
+ function _safeRemainingReserve() internal view returns (uint256) {
348
+ if (!finalized) return 0;
349
+ uint256 theoreticalReserve = totalPayoutSent >= totalPayoutPool ? 0 : (totalPayoutPool - totalPayoutSent);
350
+ uint256 actualBalance = address(this).balance;
351
+ return theoreticalReserve > actualBalance ? actualBalance : theoreticalReserve;
352
+ }
353
+
354
+ /**
355
+ * @dev Preview the ETH payout for a given amount of points
356
+ * @param amount Amount of points to redeem
357
+ * @return Expected ETH payout amount
358
+ * @notice This is an estimate and actual payout may be lower due to reserve limits
359
+ * @notice Returns 0 if not finalized, no points left, or amount exceeds remaining points
360
+ */
361
+ function previewPayout(uint256 amount) external view returns (uint256) {
362
+ if (!finalized || amount == 0) return 0;
363
+
364
+ uint256 trp = totalRedeemablePoints;
365
+ if (trp == 0) return 0;
366
+ uint256 tpr = totalPointsRedeemed;
367
+ if (tpr >= trp) return 0;
368
+
369
+ uint256 remaining = trp - tpr;
370
+ if (amount > remaining) return 0;
371
+
372
+ uint256 est = Math.mulDiv(amount, accPayoutPerPoint, ONE);
373
+ uint256 reserve = remainingReserve();
374
+ return est > reserve ? reserve : est;
375
+ }
376
+
377
+ // --- Ownership ---
378
+
379
+ /**
380
+ * @dev Transfer ownership of the contract to a new address
381
+ * @param newOwner Address of the new owner
382
+ * @notice Only the current owner can call this function
383
+ * @notice New owner cannot be zero address
384
+ * @notice Emits OwnershipTransferred event
385
+ */
386
+ function transferOwnership(address newOwner) external onlyOwner {
387
+ if (newOwner == address(0)) revert OwnerZeroAddress();
388
+ address prev = owner;
389
+ owner = newOwner;
390
+ emit OwnershipTransferred(prev, newOwner);
391
+ }
392
+
393
+ // Rescue after window closes
394
+
395
+ /**
396
+ * @dev Rescue ERC20 tokens sent to the contract after redemption window closes
397
+ * @param tokenAddr Address of the ERC20 token to rescue
398
+ * @param to Address to send the tokens to
399
+ * @param amount Amount of tokens to rescue
400
+ * @notice Only the owner can call this function
401
+ * @notice Can only be called after finalization and redemption window closes
402
+ * @notice Used to recover accidentally sent tokens
403
+ */
404
+ function rescueTokens(address tokenAddr, address to, uint256 amount) external onlyOwner {
405
+ if (!(finalized && block.number > END_BLOCK)) revert RedemptionNotClosed();
406
+ if (to == address(0)) revert InvalidAddress();
407
+ if (amount == 0) revert AmountZero();
408
+ IERC20(tokenAddr).safeTransfer(to, amount);
409
+ }
410
+
411
+ // Rescue ETH after window closes
412
+ /**
413
+ * @dev Rescue ETH sent to the contract after redemption window closes
414
+ * @param to Address to send the ETH to
415
+ * @param amount Amount of ETH to rescue
416
+ * @notice Only the owner can call this function
417
+ * @notice Can only be called after finalization and redemption window closes
418
+ * @notice Used to recover accidentally sent ETH
419
+ */
420
+ function rescueEth(address to, uint256 amount) external onlyOwner {
421
+ if (!(finalized && block.number > END_BLOCK)) revert RedemptionNotClosed();
422
+ if (to == address(0)) revert InvalidAddress();
423
+ if (amount == 0) revert AmountZero();
424
+ if (amount > address(this).balance) revert InsufficientEthBalance();
425
+
426
+ (bool success,) = to.call{value: amount}("");
427
+ if (!success) revert EthTransferFailed();
428
+ }
429
+
430
+ // --- Utils ---
431
+
432
+ /**
433
+ * @dev Check if an address is an externally owned account (EOA)
434
+ * @param a Address to check
435
+ * @return True if the address is an EOA (no code), false if it's a contract
436
+ * @notice Used to determine if push redemptions are allowed
437
+ */
438
+ function _isEoa(address a) internal view returns (bool) {
439
+ return a.code.length == 0;
440
+ }
441
+
442
+
443
+ /**
444
+ * @dev Allow the contract to receive ETH from any sender.
445
+ * @notice This is triggered automatically when ETH is sent directly (no data).
446
+ * @notice The ETH is NOT automatically added to the redemption pool.
447
+ * @notice Use fundEth() or moveBalanceToPool() to add ETH to the pool.
448
+ */
449
+ receive() external payable {
450
+ if (msg.value == 0) return; // ignore zero-value sends to save gas
451
+ }
452
+ }