@coti-io/coti-contracts 1.3.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (360) hide show
  1. package/contracts/access/DataPrivacyFramework/DataPrivacyFramework.sol +1 -1
  2. package/contracts/access/DataPrivacyFramework/extensions/DataPrivacyFrameworkMpc.sol +1 -1
  3. package/contracts/disperse/coinByRatio/FixedRatioCoinDisperserUnlimitedWindow.sol +2 -4
  4. package/contracts/disperse/disperseToken/MintDisperser.sol +1 -3
  5. package/contracts/disperse/disperseToken/TokenDisperser.sol +1 -1
  6. package/contracts/messaging/PrivateMessaging.sol +1 -1
  7. package/contracts/mocks/access/DataPrivacyFramework/DataPrivacyFrameworkMock.sol +1 -1
  8. package/contracts/mocks/messaging/PrivateMessagingHarness.sol +1 -1
  9. package/contracts/mocks/oracle/CotiPriceConsumerMock.sol +1 -1
  10. package/contracts/mocks/token/ERC20DecimalsMock.sol +1 -1
  11. package/contracts/mocks/token/ERC20Mock.sol +1 -1
  12. package/contracts/mocks/token/PrivateERC20/EncryptedTokenReceiverMock.sol +1 -1
  13. package/contracts/mocks/token/PrivateERC20/PrivacyBridgeERC20Mock.sol +1 -1
  14. package/contracts/mocks/token/PrivateERC20/PrivateERC20AuditorSupplyMock.sol +1 -1
  15. package/contracts/mocks/token/PrivateERC20/PrivateERC20CappedMock.sol +1 -1
  16. package/contracts/mocks/token/PrivateERC20/PrivateERC20GtCallerMock.sol +1 -1
  17. package/contracts/mocks/token/PrivateERC20/PrivateERC20Mock.sol +1 -1
  18. package/contracts/mocks/token/PrivateERC20/PrivateERC20ReentrantReceiverMock.sol +1 -1
  19. package/contracts/mocks/token/PrivateERC20/PublicReentrantTokenReceiverMock.sol +1 -1
  20. package/contracts/mocks/token/PrivateERC20/PublicTokenReceiverBoolMock.sol +1 -1
  21. package/contracts/mocks/token/PrivateERC20/PublicTokenReceiverMock.sol +1 -1
  22. package/contracts/mocks/token/PrivateERC721/PrivateERC721URIStorageMock.sol +1 -1
  23. package/contracts/mocks/utils/mpc/Arithmetic128TestsContract.sol +1 -1
  24. package/contracts/mocks/utils/mpc/Arithmetic256TestsContract.sol +1 -1
  25. package/contracts/mocks/utils/mpc/ArithmeticAddTestsContract.sol +196 -0
  26. package/contracts/mocks/utils/mpc/ArithmeticMulTestsContract.sol +194 -0
  27. package/contracts/mocks/utils/mpc/ArithmeticSigned128TestsContract.sol +63 -0
  28. package/contracts/mocks/utils/mpc/ArithmeticSigned256TestsContract.sol +107 -0
  29. package/contracts/mocks/utils/mpc/ArithmeticSignedNarrowTestsContract.sol +123 -0
  30. package/contracts/mocks/utils/mpc/ArithmeticSubTestsContract.sol +196 -0
  31. package/contracts/mocks/utils/mpc/Bitwise128TestsContract.sol +1 -1
  32. package/contracts/mocks/utils/mpc/Bitwise256TestsContract.sol +1 -1
  33. package/contracts/mocks/utils/mpc/BitwiseTestsContract.sol +1 -1
  34. package/contracts/mocks/utils/mpc/CheckedArithmetic128WithOverflowBitTestsContract.sol +1 -1
  35. package/contracts/mocks/utils/mpc/CheckedArithmetic256WithOverflowBitTestsContract.sol +1 -1
  36. package/contracts/mocks/utils/mpc/CheckedArithmeticWIthOverflowBitTestsContract.sol +1 -1
  37. package/contracts/mocks/utils/mpc/Comparison128TestsContract.sol +1 -1
  38. package/contracts/mocks/utils/mpc/Comparison1TestsContract.sol +1 -1
  39. package/contracts/mocks/utils/mpc/Comparison256TestsContract.sol +1 -1
  40. package/contracts/mocks/utils/mpc/Comparison2TestsContract.sol +1 -1
  41. package/contracts/mocks/utils/mpc/MinMax128TestsContract.sol +1 -1
  42. package/contracts/mocks/utils/mpc/MinMax256TestsContract.sol +1 -1
  43. package/contracts/mocks/utils/mpc/MinMaxTestsContract.sol +1 -1
  44. package/contracts/mocks/utils/mpc/MinimalImplementation.sol +1 -1
  45. package/contracts/mocks/utils/mpc/MinimalProxy.sol +1 -1
  46. package/contracts/mocks/utils/mpc/Miscellaneous1TestsContract.sol +1 -1
  47. package/contracts/mocks/utils/mpc/MiscellaneousTestsContract.sol +1 -1
  48. package/contracts/mocks/utils/mpc/MpcOperations128TestContract.sol +1 -1
  49. package/contracts/mocks/utils/mpc/MpcOperationsTestContract.sol +4 -4
  50. package/contracts/mocks/utils/mpc/Mux128TestsContract.sol +1 -1
  51. package/contracts/mocks/utils/mpc/Mux256TestsContract.sol +1 -1
  52. package/contracts/mocks/utils/mpc/OffboardToUserKeyTestContract.sol +1 -1
  53. package/contracts/mocks/utils/mpc/OnBoard128TestsContract.sol +1 -1
  54. package/contracts/mocks/utils/mpc/OnBoard256TestsContract.sol +1 -1
  55. package/contracts/mocks/utils/mpc/PrivacyImplementationV1.sol +1 -1
  56. package/contracts/mocks/utils/mpc/PrivacyImplementationV2.sol +1 -1
  57. package/contracts/mocks/utils/mpc/PrivacyProxy.sol +1 -1
  58. package/contracts/mocks/utils/mpc/Random128TestsContract.sol +1 -1
  59. package/contracts/mocks/utils/mpc/Random256TestsContract.sol +1 -1
  60. package/contracts/mocks/utils/mpc/Shift128TestsContract.sol +1 -1
  61. package/contracts/mocks/utils/mpc/Shift256TestsContract.sol +1 -1
  62. package/contracts/mocks/utils/mpc/ShiftTestsContract.sol +1 -1
  63. package/contracts/mocks/utils/mpc/StringTestsContract.sol +1 -1
  64. package/contracts/mocks/utils/mpc/Transfer128TestsContract.sol +1 -1
  65. package/contracts/mocks/utils/mpc/Transfer256TestsContract.sol +1 -1
  66. package/contracts/mocks/utils/mpc/TransferScalarTestsContract.sol +1 -1
  67. package/contracts/mocks/utils/mpc/TransferTestsContract.sol +1 -1
  68. package/contracts/mocks/utils/mpc/TransferWithAllowance128TestsContract.sol +1 -1
  69. package/contracts/mocks/utils/mpc/TransferWithAllowance256TestsContract.sol +1 -1
  70. package/contracts/mocks/utils/mpc/TransferWithAllowance64_16TestsContract.sol +1 -1
  71. package/contracts/mocks/utils/mpc/TransferWithAllowance64_32TestsContract.sol +1 -1
  72. package/contracts/mocks/utils/mpc/TransferWithAllowance64_64TestsContract.sol +1 -1
  73. package/contracts/mocks/utils/mpc/TransferWithAllowance64_8TestsContract.sol +1 -1
  74. package/contracts/mocks/utils/mpc/TransferWithAllowanceScalarTestsContract.sol +1 -1
  75. package/contracts/mocks/utils/mpc/TransferWithAllowanceTestsContract.sol +1 -1
  76. package/contracts/mocks/utils/mpc/ValidateCiphertext128TestsContract.sol +1 -1
  77. package/contracts/mocks/utils/mpc/ValidateCiphertext256TestsContract.sol +2 -2
  78. package/contracts/mocks/utils/mpc/ValidateCiphertextTestsContract.sol +1 -1
  79. package/contracts/mocks/wallet/PrivateERC20Wallet/PrivateERC20WalletMock.sol +1 -1
  80. package/contracts/node/CotiNodeRewards.sol +3 -3
  81. package/contracts/node/SoulboundNodeNFT.sol +1 -2
  82. package/contracts/onboard/AccountOnboard.sol +1 -1
  83. package/contracts/oracle/ICotiPriceConsumer.sol +1 -1
  84. package/contracts/pod/IInbox.sol +231 -0
  85. package/contracts/pod/IInboxMiner.sol +53 -0
  86. package/contracts/pod/InboxUser.sol +29 -0
  87. package/contracts/pod/InboxUserCotiTestnet.sol +13 -0
  88. package/contracts/pod/PodNetworkConstants.sol +30 -0
  89. package/contracts/pod/examples/MpcAdder.sol +57 -0
  90. package/contracts/pod/examples/MpcAdderPausable.sol +25 -0
  91. package/contracts/pod/examples/MpcAdderPausable.sol.bak +25 -0
  92. package/contracts/pod/examples/it128/PodAdder128.sol +48 -0
  93. package/contracts/pod/examples/it256/PodAdder256.sol +48 -0
  94. package/contracts/pod/fee/IInboxFeeManager.sol +40 -0
  95. package/contracts/pod/manifest.json +52 -0
  96. package/contracts/pod/mpc/PodLib.sol +10 -0
  97. package/contracts/pod/mpc/PodLib128.sol +361 -0
  98. package/contracts/pod/mpc/PodLib256.sol +361 -0
  99. package/contracts/pod/mpc/PodLib64.sol +385 -0
  100. package/contracts/pod/mpc/PodLibBase.sol +72 -0
  101. package/contracts/pod/mpc/PodUser.sol +58 -0
  102. package/contracts/pod/mpc/PodUserFuji.sol +14 -0
  103. package/contracts/pod/mpc/PodUserSepolia.sol +13 -0
  104. package/contracts/pod/mpc/coti-side/IPodExecutorOps.sol +99 -0
  105. package/contracts/pod/mpccodec/MpcAbiCodec.sol +482 -0
  106. package/contracts/pod/privacy/IPodPriceOracle.sol +20 -0
  107. package/contracts/pod/privacy/IPrivacyPortal.sol +248 -0
  108. package/contracts/pod/privacy/IPrivacyPortalFactory.sol +88 -0
  109. package/contracts/pod/privacy/PortalFeeOracle.sol +51 -0
  110. package/contracts/pod/privacy/PrivacyPortal.sol +871 -0
  111. package/contracts/pod/privacy/PrivacyPortalFactory.sol +492 -0
  112. package/contracts/pod/privacy/PrivacyPortalFeeLib.sol +98 -0
  113. package/contracts/pod/privacy/mocks/CloneHelper.sol +14 -0
  114. package/contracts/pod/privacy/mocks/MockERC20.sol +26 -0
  115. package/contracts/pod/privacy/mocks/MockPodERC20ForPortal.sol +160 -0
  116. package/contracts/pod/privacy/mocks/MockPrivacyPortalFactory.sol +125 -0
  117. package/contracts/pod/privacy/mocks/MockWrappedNative.sol +24 -0
  118. package/contracts/pod/token/erc7984/Erc7984Constants.sol +9 -0
  119. package/contracts/pod/token/erc7984/Erc7984Pointers.sol +29 -0
  120. package/contracts/pod/token/erc7984/IERC7984.sol +69 -0
  121. package/contracts/pod/token/erc7984/IERC7984PortalWrapper.sol +31 -0
  122. package/contracts/pod/token/erc7984/PodErc7984Mixin.sol +125 -0
  123. package/contracts/pod/token/erc7984/README.md +60 -0
  124. package/contracts/pod/token/perc20/IPodERC20.sol +298 -0
  125. package/contracts/pod/token/perc20/PodERC20.sol +1021 -0
  126. package/contracts/pod/token/perc20/PodErc20Mintable.sol +88 -0
  127. package/contracts/pod/token/perc20/PodErc20MintableInitializable.sol +42 -0
  128. package/contracts/pod/token/perc20/cotiside/IPodErc20CotiSide.sol +88 -0
  129. package/contracts/pod/token/perc20/cotiside/PodErc20CotiMother.sol +529 -0
  130. package/contracts/pod/utils/IWrappedNative.sol +11 -0
  131. package/contracts/privacyBridge/PrivacyBridge.sol +5 -5
  132. package/contracts/privacyBridge/PrivacyBridgeCotiNative.sol +1 -1
  133. package/contracts/privacyBridge/PrivacyBridgeERC20.sol +1 -1
  134. package/contracts/privacyBridge/PrivacyBridgeUSDCe.sol +1 -1
  135. package/contracts/privacyBridge/PrivacyBridgeUSDT.sol +1 -1
  136. package/contracts/privacyBridge/PrivacyBridgeWADA.sol +1 -1
  137. package/contracts/privacyBridge/PrivacyBridgeWBTC.sol +1 -1
  138. package/contracts/privacyBridge/PrivacyBridgeWETH.sol +1 -1
  139. package/contracts/privacyBridge/PrivacyBridgegCoti.sol +1 -1
  140. package/contracts/token/PrivateERC20/IPrivateERC20.sol +1 -1
  141. package/contracts/token/PrivateERC20/ITokenReceiver.sol +1 -1
  142. package/contracts/token/PrivateERC20/ITokenReceiverEncrypted.sol +1 -1
  143. package/contracts/token/PrivateERC20/PrivateERC20.sol +5 -5
  144. package/contracts/token/PrivateERC20/tokens/PrivateBridgedUSDC.sol +1 -1
  145. package/contracts/token/PrivateERC20/tokens/PrivateCOTI.sol +1 -1
  146. package/contracts/token/PrivateERC20/tokens/PrivateCOTITreasuryGovernanceToken.sol +1 -1
  147. package/contracts/token/PrivateERC20/tokens/PrivateTetherUSD.sol +1 -1
  148. package/contracts/token/PrivateERC20/tokens/PrivateWrappedADA.sol +1 -1
  149. package/contracts/token/PrivateERC20/tokens/PrivateWrappedBTC.sol +1 -1
  150. package/contracts/token/PrivateERC20/tokens/PrivateWrappedEther.sol +1 -1
  151. package/contracts/token/PrivateERC721/IERC721Errors.sol +1 -1
  152. package/contracts/token/PrivateERC721/PrivateERC721.sol +1 -1
  153. package/contracts/token/PrivateERC721/extensions/IPrivateERC721URIStorage.sol +1 -1
  154. package/contracts/token/PrivateERC721/extensions/PrivateERC721URIStorage.sol +1 -1
  155. package/contracts/token/points/CotiTokenPoints004.sol +43 -0
  156. package/contracts/utils/mpc/MpcCore.sol +610 -1
  157. package/contracts/utils/mpc/MpcInterface.sol +1 -1
  158. package/hardhat.config.ts +5 -14
  159. package/package.json +4 -4
  160. package/scripts/deployCotiTokenPoints004.ts +61 -0
  161. package/scripts/deployFixedRatioCoinDisperserUnlimitedWindow.ts +68 -0
  162. package/scripts/verifyCotiTokenPoints004.ts +123 -0
  163. package/scripts/verifyFixedRatioCoinDisperserUnlimitedWindow.ts +112 -0
  164. package/test/messaging/PrivateMessaging.test.ts +5 -5
  165. package/test/pod/privacy/PrivacyPortal.access.test.ts +756 -0
  166. package/test/pod/privacy/PrivacyPortal.recovery.test.ts +263 -0
  167. package/test/privacyBridge/UnifiedPrivacyBridges.test.cjs +5 -3
  168. package/test/utils/mpc/CheckedSignedArithmetic256.test.ts +163 -0
  169. package/test/utils/mpc/NegativeCases.test.ts +3 -3
  170. package/test/utils/mpc/Precompile.test.ts +6 -6
  171. package/typechain-types/@openzeppelin/contracts/access/AccessControl.ts +2 -2
  172. package/typechain-types/@openzeppelin/contracts/access/IAccessControl.ts +2 -2
  173. package/typechain-types/@openzeppelin/contracts/access/extensions/AccessControlEnumerable.ts +375 -0
  174. package/typechain-types/@openzeppelin/contracts/access/extensions/IAccessControlEnumerable.ts +329 -0
  175. package/typechain-types/@openzeppelin/contracts/access/extensions/index.ts +5 -0
  176. package/typechain-types/@openzeppelin/contracts/access/index.ts +2 -0
  177. package/typechain-types/@openzeppelin/contracts/interfaces/IERC1363.ts +412 -0
  178. package/typechain-types/@openzeppelin/contracts/interfaces/IERC5267.ts +151 -0
  179. package/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors.ts +69 -0
  180. package/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors.ts +69 -0
  181. package/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors.ts +69 -0
  182. package/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/index.ts +6 -0
  183. package/typechain-types/@openzeppelin/contracts/interfaces/index.ts +4 -0
  184. package/typechain-types/@openzeppelin/contracts/token/ERC20/ERC20.ts +6 -50
  185. package/typechain-types/@openzeppelin/contracts/token/ERC20/IERC20.ts +6 -6
  186. package/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.ts +313 -0
  187. package/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable.ts +356 -0
  188. package/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.ts +423 -0
  189. package/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.ts +6 -6
  190. package/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/index.ts +3 -0
  191. package/typechain-types/@openzeppelin/contracts/token/ERC20/index.ts +2 -0
  192. package/typechain-types/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.ts +69 -0
  193. package/typechain-types/@openzeppelin/contracts/token/ERC20/utils/index.ts +4 -0
  194. package/typechain-types/@openzeppelin/contracts/utils/Nonces.ts +85 -0
  195. package/typechain-types/@openzeppelin/contracts/utils/Pausable.ts +150 -0
  196. package/typechain-types/@openzeppelin/contracts/utils/ReentrancyGuard.ts +69 -0
  197. package/typechain-types/@openzeppelin/contracts/utils/ShortStrings.ts +69 -0
  198. package/typechain-types/@openzeppelin/contracts/utils/Strings.ts +69 -0
  199. package/typechain-types/@openzeppelin/contracts/utils/cryptography/ECDSA.ts +69 -0
  200. package/typechain-types/@openzeppelin/contracts/utils/cryptography/EIP712.ts +151 -0
  201. package/typechain-types/@openzeppelin/contracts/utils/cryptography/index.ts +5 -0
  202. package/typechain-types/@openzeppelin/contracts/utils/index.ts +9 -0
  203. package/typechain-types/@openzeppelin/contracts/utils/math/SafeCast.ts +69 -0
  204. package/typechain-types/@openzeppelin/contracts/utils/math/index.ts +4 -0
  205. package/typechain-types/contracts/mocks/token/ERC20DecimalsMock.ts +6 -50
  206. package/typechain-types/contracts/mocks/token/ERC20Mock.ts +6 -50
  207. package/typechain-types/contracts/mocks/token/PrivateERC20/PrivacyBridgeERC20Mock.ts +16 -2
  208. package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20AuditorSupplyMock.ts +2 -2
  209. package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20CappedMock.ts +2 -2
  210. package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20Mock.ts +2 -2
  211. package/typechain-types/contracts/privacyBridge/PrivacyBridge.ts +16 -2
  212. package/typechain-types/contracts/privacyBridge/PrivacyBridgeCotiNative.ts +16 -2
  213. package/typechain-types/contracts/privacyBridge/PrivacyBridgeERC20.sol/PrivacyBridgeERC20.ts +16 -2
  214. package/typechain-types/contracts/privacyBridge/PrivacyBridgeUSDCe.ts +16 -2
  215. package/typechain-types/contracts/privacyBridge/PrivacyBridgeUSDT.ts +16 -2
  216. package/typechain-types/contracts/privacyBridge/PrivacyBridgeWADA.ts +16 -2
  217. package/typechain-types/contracts/privacyBridge/PrivacyBridgeWBTC.ts +16 -2
  218. package/typechain-types/contracts/privacyBridge/PrivacyBridgeWETH.ts +16 -2
  219. package/typechain-types/contracts/privacyBridge/PrivacyBridgegCoti.ts +16 -2
  220. package/typechain-types/contracts/token/PrivateERC20/PrivateERC20.ts +2 -2
  221. package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateBridgedUSDC.ts +2 -2
  222. package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateCOTI.ts +2 -2
  223. package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateCOTITreasuryGovernanceToken.ts +2 -2
  224. package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateTetherUSD.ts +2 -2
  225. package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateWrappedADA.ts +2 -2
  226. package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateWrappedBTC.ts +2 -2
  227. package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateWrappedEther.ts +2 -2
  228. package/typechain-types/contracts/token/index.ts +2 -0
  229. package/typechain-types/contracts/token/points/CotiTokenPoints004.sol/COTITokenPoints004.ts +826 -0
  230. package/typechain-types/contracts/token/points/CotiTokenPoints004.ts +826 -0
  231. package/typechain-types/contracts/token/points/index.ts +4 -0
  232. package/typechain-types/factories/@openzeppelin/contracts/access/AccessControl__factory.ts +22 -1
  233. package/typechain-types/factories/@openzeppelin/contracts/access/IAccessControl__factory.ts +22 -1
  234. package/typechain-types/factories/@openzeppelin/contracts/access/Ownable__factory.ts +22 -0
  235. package/typechain-types/factories/@openzeppelin/contracts/access/extensions/AccessControlEnumerable__factory.ts +316 -0
  236. package/typechain-types/factories/@openzeppelin/contracts/access/extensions/IAccessControlEnumerable__factory.ts +265 -0
  237. package/typechain-types/factories/@openzeppelin/contracts/access/extensions/index.ts +5 -0
  238. package/typechain-types/factories/@openzeppelin/contracts/access/index.ts +1 -0
  239. package/typechain-types/factories/@openzeppelin/contracts/interfaces/IERC1363__factory.ts +393 -0
  240. package/typechain-types/factories/@openzeppelin/contracts/interfaces/IERC5267__factory.ts +71 -0
  241. package/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors__factory.ts +127 -0
  242. package/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors__factory.ts +111 -0
  243. package/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors__factory.ts +128 -0
  244. package/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/index.ts +6 -0
  245. package/typechain-types/factories/@openzeppelin/contracts/interfaces/index.ts +3 -0
  246. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/ERC20__factory.ts +84 -110
  247. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/IERC20__factory.ts +3 -3
  248. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable__factory.ts +364 -0
  249. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable__factory.ts +382 -0
  250. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit__factory.ts +540 -0
  251. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata__factory.ts +3 -3
  252. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/index.ts +3 -0
  253. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/index.ts +1 -0
  254. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/utils/SafeERC20__factory.ts +96 -0
  255. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/utils/index.ts +4 -0
  256. package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/ERC721__factory.ts +98 -59
  257. package/typechain-types/factories/@openzeppelin/contracts/utils/Nonces__factory.ts +57 -0
  258. package/typechain-types/factories/@openzeppelin/contracts/utils/Pausable__factory.ts +71 -0
  259. package/typechain-types/factories/@openzeppelin/contracts/utils/ReentrancyGuard__factory.ts +30 -0
  260. package/typechain-types/factories/@openzeppelin/contracts/utils/ShortStrings__factory.ts +83 -0
  261. package/typechain-types/factories/@openzeppelin/contracts/utils/Strings__factory.ts +90 -0
  262. package/typechain-types/factories/@openzeppelin/contracts/utils/cryptography/ECDSA__factory.ts +91 -0
  263. package/typechain-types/factories/@openzeppelin/contracts/utils/cryptography/EIP712__factory.ts +87 -0
  264. package/typechain-types/factories/@openzeppelin/contracts/utils/cryptography/index.ts +5 -0
  265. package/typechain-types/factories/@openzeppelin/contracts/utils/index.ts +7 -0
  266. package/typechain-types/factories/@openzeppelin/contracts/utils/math/SafeCast__factory.ts +118 -0
  267. package/typechain-types/factories/@openzeppelin/contracts/utils/math/index.ts +4 -0
  268. package/typechain-types/factories/contracts/disperse/coinByRatio/FixedRatioCoinDisperserLeftoverS1__factory.ts +12 -1
  269. package/typechain-types/factories/contracts/disperse/coinByRatio/FixedRatioCoinDisperserUnlimitedWindow__factory.ts +39 -1
  270. package/typechain-types/factories/contracts/disperse/coinByRatio/FixedRatioCoinDisperser__factory.ts +12 -1
  271. package/typechain-types/factories/contracts/disperse/disperseToken/MintDisperser.sol/MintDisperser__factory.ts +23 -1
  272. package/typechain-types/factories/contracts/disperse/disperseToken/TokenDisperser__factory.ts +12 -1
  273. package/typechain-types/factories/contracts/messaging/PrivateMessaging__factory.ts +1 -1
  274. package/typechain-types/factories/contracts/mocks/messaging/PrivateMessagingHarness__factory.ts +1 -1
  275. package/typechain-types/factories/contracts/mocks/token/ERC20DecimalsMock__factory.ts +90 -52
  276. package/typechain-types/factories/contracts/mocks/token/ERC20Mock__factory.ts +90 -52
  277. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivacyBridgeERC20Mock__factory.ts +90 -2
  278. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20AuditorSupplyMock__factory.ts +28 -2
  279. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20CappedMock__factory.ts +28 -2
  280. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20GtCallerMock__factory.ts +1 -1
  281. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20Mock__factory.ts +28 -2
  282. package/typechain-types/factories/contracts/mocks/token/PrivateERC721/PrivateERC721URIStorageMock__factory.ts +1 -1
  283. package/typechain-types/factories/contracts/mocks/utils/mpc/Arithmetic128TestsContract__factory.ts +1 -1
  284. package/typechain-types/factories/contracts/mocks/utils/mpc/Arithmetic256TestsContract__factory.ts +1 -1
  285. package/typechain-types/factories/contracts/mocks/utils/mpc/ArithmeticTestsContract__factory.ts +1 -1
  286. package/typechain-types/factories/contracts/mocks/utils/mpc/Bitwise128TestsContract__factory.ts +1 -1
  287. package/typechain-types/factories/contracts/mocks/utils/mpc/Bitwise256TestsContract__factory.ts +1 -1
  288. package/typechain-types/factories/contracts/mocks/utils/mpc/BitwiseTestsContract__factory.ts +1 -1
  289. package/typechain-types/factories/contracts/mocks/utils/mpc/CheckedArithmetic128WithOverflowBitTestsContract__factory.ts +1 -1
  290. package/typechain-types/factories/contracts/mocks/utils/mpc/CheckedArithmetic256WithOverflowBitTestsContract__factory.ts +1 -1
  291. package/typechain-types/factories/contracts/mocks/utils/mpc/CheckedArithmeticWIthOverflowBitTestsContract.sol/CheckedArithmeticWithOverflowBitTestsContract__factory.ts +1 -1
  292. package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison128TestsContract__factory.ts +1 -1
  293. package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison1TestsContract__factory.ts +1 -1
  294. package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison256TestsContract__factory.ts +1 -1
  295. package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison2TestsContract__factory.ts +1 -1
  296. package/typechain-types/factories/contracts/mocks/utils/mpc/MinMax128TestsContract__factory.ts +1 -1
  297. package/typechain-types/factories/contracts/mocks/utils/mpc/MinMax256TestsContract__factory.ts +1 -1
  298. package/typechain-types/factories/contracts/mocks/utils/mpc/MinMaxTestsContract__factory.ts +1 -1
  299. package/typechain-types/factories/contracts/mocks/utils/mpc/MinimalImplementation__factory.ts +1 -1
  300. package/typechain-types/factories/contracts/mocks/utils/mpc/Miscellaneous1TestsContract__factory.ts +1 -1
  301. package/typechain-types/factories/contracts/mocks/utils/mpc/MiscellaneousTestsContract__factory.ts +1 -1
  302. package/typechain-types/factories/contracts/mocks/utils/mpc/MpcOperations128TestContract__factory.ts +1 -1
  303. package/typechain-types/factories/contracts/mocks/utils/mpc/MpcOperationsTestContract__factory.ts +1 -1
  304. package/typechain-types/factories/contracts/mocks/utils/mpc/Mux128TestsContract__factory.ts +1 -1
  305. package/typechain-types/factories/contracts/mocks/utils/mpc/Mux256TestsContract__factory.ts +1 -1
  306. package/typechain-types/factories/contracts/mocks/utils/mpc/OffboardToUserKeyTestContract__factory.ts +1 -1
  307. package/typechain-types/factories/contracts/mocks/utils/mpc/OnBoard128TestsContract__factory.ts +1 -1
  308. package/typechain-types/factories/contracts/mocks/utils/mpc/OnBoard256TestsContract__factory.ts +1 -1
  309. package/typechain-types/factories/contracts/mocks/utils/mpc/PrivacyImplementationV1__factory.ts +1 -1
  310. package/typechain-types/factories/contracts/mocks/utils/mpc/PrivacyImplementationV2__factory.ts +1 -1
  311. package/typechain-types/factories/contracts/mocks/utils/mpc/Random128TestsContract__factory.ts +1 -1
  312. package/typechain-types/factories/contracts/mocks/utils/mpc/Random256TestsContract__factory.ts +1 -1
  313. package/typechain-types/factories/contracts/mocks/utils/mpc/Shift128TestsContract__factory.ts +1 -1
  314. package/typechain-types/factories/contracts/mocks/utils/mpc/Shift256TestsContract__factory.ts +1 -1
  315. package/typechain-types/factories/contracts/mocks/utils/mpc/ShiftTestsContract__factory.ts +1 -1
  316. package/typechain-types/factories/contracts/mocks/utils/mpc/StringTestsContract__factory.ts +1 -1
  317. package/typechain-types/factories/contracts/mocks/utils/mpc/Transfer128TestsContract__factory.ts +1 -1
  318. package/typechain-types/factories/contracts/mocks/utils/mpc/Transfer256TestsContract__factory.ts +1 -1
  319. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferScalarTestsContract__factory.ts +1 -1
  320. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferTestsContract__factory.ts +1 -1
  321. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance128TestsContract__factory.ts +1 -1
  322. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance256TestsContract__factory.ts +1 -1
  323. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance64_16TestsContract__factory.ts +1 -1
  324. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance64_32TestsContract__factory.ts +1 -1
  325. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance64_64TestsContract__factory.ts +1 -1
  326. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance64_8TestsContract__factory.ts +1 -1
  327. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowanceScalarTestsContract__factory.ts +1 -1
  328. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowanceTestsContract__factory.ts +1 -1
  329. package/typechain-types/factories/contracts/mocks/utils/mpc/ValidateCiphertext128TestsContract__factory.ts +1 -1
  330. package/typechain-types/factories/contracts/mocks/utils/mpc/ValidateCiphertext256TestsContract__factory.ts +1 -1
  331. package/typechain-types/factories/contracts/mocks/utils/mpc/ValidateCiphertextTestsContract__factory.ts +1 -1
  332. package/typechain-types/factories/contracts/mocks/wallet/PrivateERC20Wallet/PrivateERC20WalletMock__factory.ts +1 -1
  333. package/typechain-types/factories/contracts/node/CotiNodeRewards__factory.ts +28 -1
  334. package/typechain-types/factories/contracts/node/SoulboundNodeNFT.sol/SoulboundNodeNFT__factory.ts +126 -1
  335. package/typechain-types/factories/contracts/onboard/AccountOnboard__factory.ts +1 -1
  336. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeCotiNative__factory.ts +79 -2
  337. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeERC20.sol/PrivacyBridgeERC20__factory.ts +89 -1
  338. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeUSDCe__factory.ts +90 -2
  339. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeUSDT__factory.ts +90 -2
  340. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeWADA__factory.ts +90 -2
  341. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeWBTC__factory.ts +90 -2
  342. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeWETH__factory.ts +90 -2
  343. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridge__factory.ts +78 -1
  344. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgegCoti__factory.ts +90 -2
  345. package/typechain-types/factories/contracts/token/PrivateERC20/PrivateERC20__factory.ts +27 -1
  346. package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateBridgedUSDC__factory.ts +28 -2
  347. package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateCOTITreasuryGovernanceToken__factory.ts +28 -2
  348. package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateCOTI__factory.ts +28 -2
  349. package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateTetherUSD__factory.ts +28 -2
  350. package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateWrappedADA__factory.ts +28 -2
  351. package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateWrappedBTC__factory.ts +28 -2
  352. package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateWrappedEther__factory.ts +28 -2
  353. package/typechain-types/factories/contracts/token/index.ts +1 -0
  354. package/typechain-types/factories/contracts/token/points/CotiTokenPoints004.sol/COTITokenPoints004__factory.ts +992 -0
  355. package/typechain-types/factories/contracts/token/points/CotiTokenPoints004__factory.ts +992 -0
  356. package/typechain-types/factories/contracts/token/points/index.ts +4 -0
  357. package/typechain-types/factories/contracts/utils/mpc/MpcCore__factory.ts +1 -1
  358. package/typechain-types/hardhat.d.ts +360 -0
  359. package/typechain-types/index.ts +36 -4
  360. package/contracts/mocks/utils/mpc/ArithmeticTestsContract.sol +0 -408
@@ -0,0 +1,529 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ pragma solidity ^0.8.20;
4
+
5
+ import "../../../../utils/mpc/MpcCore.sol";
6
+ import "@openzeppelin/contracts/access/Ownable.sol";
7
+
8
+ import "../../../InboxUser.sol";
9
+ import "./IPodErc20CotiSide.sol";
10
+
11
+ /// @title PodErc20CotiMother
12
+ /// @notice Unified COTI-side ledger for all paired {PodERC20} tokens. Balances are namespaced by `(sourceChainId, sourcePToken)`.
13
+ /// @dev Source-chain {PrivacyPortalFactory} registers tokens via one-way inbox messages. MPC ops use {inboxMsgSender} as token context.
14
+ contract PodErc20CotiMother is IPodErc20CotiSide, InboxUser, Ownable {
15
+ // --- Types ---
16
+
17
+ struct TokenMeta {
18
+ string name;
19
+ string symbol;
20
+ uint8 decimals;
21
+ }
22
+
23
+ // --- State variables ---
24
+
25
+ /// @dev Per-token monotonic nonce included in PoD callbacks. Starts at 1 on registration so the first
26
+ /// callback satisfies PoD `balanceNonces[account] < nonce` (PoD nonces default to 0).
27
+ mapping(bytes32 => uint256) private _tokenNonce;
28
+ uint256 private constant INITIAL_TOKEN_NONCE = 1;
29
+ /// @dev Balance ciphertext per token and account.
30
+ mapping(bytes32 => mapping(address => ctUint256)) private _balanceCiphertext;
31
+ /// @dev Allowance ciphertext per token: `owner => spender => ctUint256`.
32
+ mapping(bytes32 => mapping(address => mapping(address => ctUint256))) private _allowanceCiphertext;
33
+ /// @dev Whether a `(sourceChainId, remotePToken)` namespace is registered.
34
+ mapping(bytes32 => bool) public registered;
35
+ /// @dev Public metadata recorded at registration.
36
+ mapping(bytes32 => TokenMeta) public tokenMeta;
37
+ /// @dev Allowlisted source-chain factories that may register tokens.
38
+ mapping(uint256 => mapping(address => bool)) public allowedFactories;
39
+
40
+ // --- Events ---
41
+
42
+ event CotiMotherInitialized(address indexed inbox, address indexed owner);
43
+ event AllowedFactoryUpdated(uint256 indexed sourceChainId, address indexed factory, bool allowed);
44
+ event TokenRegistered(
45
+ uint256 indexed sourceChainId,
46
+ address indexed remotePToken,
47
+ string name,
48
+ string symbol,
49
+ uint8 decimals
50
+ );
51
+ event SyncBalancesResponded(bytes32 indexed tokenId, address[] accounts, uint256 nonce);
52
+ event TransferCompleted(
53
+ bytes32 indexed tokenId,
54
+ address indexed spender,
55
+ address indexed from,
56
+ address to,
57
+ bool allowanceSpent,
58
+ bool amountIsPublic,
59
+ uint256 publicAmount,
60
+ uint256 nonce
61
+ );
62
+ event BurnCompleted(
63
+ bytes32 indexed tokenId,
64
+ address indexed from,
65
+ bool amountIsPublic,
66
+ uint256 publicAmount,
67
+ uint256 nonce
68
+ );
69
+ event MintCompleted(
70
+ bytes32 indexed tokenId,
71
+ address indexed to,
72
+ bool amountIsPublic,
73
+ uint256 publicAmount,
74
+ uint256 nonce
75
+ );
76
+ event ApprovalCompleted(
77
+ bytes32 indexed tokenId,
78
+ address indexed tokenOwner,
79
+ address indexed spender,
80
+ bool amountIsPublic,
81
+ uint256 publicAmount
82
+ );
83
+ event TransferFailureRaised(bytes32 indexed tokenId, address indexed from, address indexed to, bytes reason);
84
+ event ApprovalFailureRaised(bytes32 indexed tokenId, address indexed tokenOwner, address indexed spender, bytes reason);
85
+ event SyncBalancesFailureRaised(bytes32 indexed tokenId, bytes reason);
86
+
87
+ // --- Errors ---
88
+
89
+ error InvalidAddress();
90
+ error FactoryNotAllowed(uint256 sourceChainId, address factory);
91
+ error InvalidRemotePToken();
92
+ error TokenAlreadyRegistered(bytes32 tokenId);
93
+ error TokenNotRegistered(bytes32 tokenId);
94
+ error MintToZeroAddress();
95
+ error OwnerMintNotSupported();
96
+ error ChainIdOverflow(uint256 sourceChainId);
97
+
98
+ // --- Modifiers ---
99
+
100
+ modifier onlyRegisteredFactoryMessage() {
101
+ if (msg.sender != address(inbox)) {
102
+ revert OnlyInbox(msg.sender);
103
+ }
104
+ (uint256 sourceChainId, address factory) = inbox.inboxMsgSender();
105
+ if (!allowedFactories[sourceChainId][factory]) {
106
+ revert FactoryNotAllowed(sourceChainId, factory);
107
+ }
108
+ _;
109
+ }
110
+
111
+ modifier onlyRegisteredPTokenMessage() {
112
+ if (msg.sender != address(inbox)) {
113
+ revert OnlyInbox(msg.sender);
114
+ }
115
+ (uint256 sourceChainId, address remotePToken) = inbox.inboxMsgSender();
116
+ bytes32 id = _tokenId(sourceChainId, remotePToken);
117
+ if (!registered[id]) {
118
+ revert TokenNotRegistered(id);
119
+ }
120
+ _;
121
+ }
122
+
123
+ // --- Constructor ---
124
+
125
+ /// @param inboxAddress COTI-side inbox allowed to deliver remote pToken requests.
126
+ /// @param initialOwner Owner allowed to configure factories.
127
+ constructor(address inboxAddress, address initialOwner) Ownable(initialOwner) {
128
+ if (inboxAddress == address(0) || initialOwner == address(0)) {
129
+ revert InvalidAddress();
130
+ }
131
+ setInbox(inboxAddress);
132
+ emit CotiMotherInitialized(inboxAddress, initialOwner);
133
+ }
134
+
135
+ // --- External: views ---
136
+
137
+ /// @notice Compute the namespace id for a source-chain pToken.
138
+ function tokenId(uint256 sourceChainId, address remotePToken) public pure returns (bytes32) {
139
+ return _tokenId(sourceChainId, remotePToken);
140
+ }
141
+
142
+ /// @notice Whether a source-chain pToken namespace is registered.
143
+ function isRegistered(uint256 sourceChainId, address remotePToken) external view returns (bool) {
144
+ return registered[_tokenId(sourceChainId, remotePToken)];
145
+ }
146
+
147
+ // --- External: owner ---
148
+
149
+ /// @notice Allow or disallow a source-chain factory to register tokens.
150
+ function setAllowedFactory(uint256 sourceChainId, address factory, bool allowed) external onlyOwner {
151
+ if (sourceChainId == 0 || factory == address(0)) {
152
+ revert InvalidAddress();
153
+ }
154
+ allowedFactories[sourceChainId][factory] = allowed;
155
+ emit AllowedFactoryUpdated(sourceChainId, factory, allowed);
156
+ }
157
+
158
+ /// @notice Owner-only: rotate the COTI-side inbox used for remote pToken / factory messages.
159
+ function configure(address inbox_) external onlyOwner {
160
+ if (inbox_ == address(0)) {
161
+ revert InvalidAddress();
162
+ }
163
+ setInbox(inbox_);
164
+ emit CotiMotherInitialized(inbox_, owner());
165
+ }
166
+
167
+ /// @inheritdoc IPodErc20CotiSide
168
+ /// @dev Not supported on the unified mother ledger; mint via inbox {mintPublic} from the paired pToken minter.
169
+ function ownerMint(address, uint256) external pure override {
170
+ revert OwnerMintNotSupported();
171
+ }
172
+
173
+ // --- External: registration ---
174
+
175
+ /// @notice Register a new source-chain pToken namespace. Callable only via inbox from an allowlisted factory.
176
+ function registerToken(
177
+ address remotePToken,
178
+ string calldata name,
179
+ string calldata symbol,
180
+ uint8 decimals
181
+ ) external onlyRegisteredFactoryMessage {
182
+ if (remotePToken == address(0)) {
183
+ revert InvalidRemotePToken();
184
+ }
185
+
186
+ (uint256 sourceChainId,) = inbox.inboxMsgSender();
187
+ bytes32 id = _tokenId(sourceChainId, remotePToken);
188
+ if (registered[id]) {
189
+ revert TokenAlreadyRegistered(id);
190
+ }
191
+
192
+ registered[id] = true;
193
+ tokenMeta[id] = TokenMeta(name, symbol, decimals);
194
+ _tokenNonce[id] = INITIAL_TOKEN_NONCE;
195
+ emit TokenRegistered(sourceChainId, remotePToken, name, symbol, decimals);
196
+ }
197
+
198
+ // --- External: inbox + registered pToken ---
199
+
200
+ /// @inheritdoc IPodErc20CotiSide
201
+ function syncBalances(address[] calldata accounts) external override onlyRegisteredPTokenMessage {
202
+ bytes32 id = _activeTokenId();
203
+ if (accounts.length == 0) {
204
+ _sendSyncFailureToPod(id, bytes("PodErc20CotiMother: empty accounts"));
205
+ return;
206
+ }
207
+
208
+ uint256 count = accounts.length;
209
+ address[] memory addresses = new address[](count);
210
+ ctUint256[] memory ciphertextAmounts = new ctUint256[](count);
211
+
212
+ for (uint256 i = 0; i < count; ++i) {
213
+ address account = accounts[i];
214
+ addresses[i] = account;
215
+ gtUint256 garbledBalance = _readGarbledBalance(id, account);
216
+ ciphertextAmounts[i] = MpcCore.offBoardToUser(garbledBalance, account);
217
+ }
218
+
219
+ uint256 callbackNonce = _tokenNonce[id];
220
+ inbox.respond(abi.encode(addresses, ciphertextAmounts, callbackNonce));
221
+ emit SyncBalancesResponded(id, addresses, callbackNonce);
222
+ _tokenNonce[id] = callbackNonce + 1;
223
+ }
224
+
225
+ /// @inheritdoc IPodErc20CotiSide
226
+ function transfer(address from, address to, gtUint256 value) external override onlyRegisteredPTokenMessage {
227
+ _moveOrBurn(_activeTokenId(), from, to, value, false, false, 0);
228
+ }
229
+
230
+ /// @inheritdoc IPodErc20CotiSide
231
+ function transferPublic(address from, address to, uint256 value) external override onlyRegisteredPTokenMessage {
232
+ _moveOrBurn(_activeTokenId(), from, to, MpcCore.setPublic256(value), false, true, value);
233
+ }
234
+
235
+ /// @inheritdoc IPodErc20CotiSide
236
+ function transferFrom(
237
+ address from,
238
+ address to,
239
+ gtUint256 value
240
+ ) external override onlyRegisteredPTokenMessage {
241
+ _moveOrBurn(_activeTokenId(), from, to, value, false, false, 0);
242
+ }
243
+
244
+ /// @inheritdoc IPodErc20CotiSide
245
+ function transferFromPublic(
246
+ address from,
247
+ address to,
248
+ uint256 value
249
+ ) external override onlyRegisteredPTokenMessage {
250
+ _moveOrBurn(_activeTokenId(), from, to, MpcCore.setPublic256(value), false, true, value);
251
+ }
252
+
253
+ /// @inheritdoc IPodErc20CotiSide
254
+ function transferFromAsSpender(
255
+ address spender,
256
+ address from,
257
+ address to,
258
+ gtUint256 value
259
+ ) external override onlyRegisteredPTokenMessage {
260
+ _moveWithOptionalAllowance(
261
+ _activeTokenId(), spender, from, to, value, true, false, false, 0
262
+ );
263
+ }
264
+
265
+ /// @inheritdoc IPodErc20CotiSide
266
+ function transferFromPublicAsSpender(
267
+ address spender,
268
+ address from,
269
+ address to,
270
+ uint256 value
271
+ ) external override onlyRegisteredPTokenMessage {
272
+ _moveWithOptionalAllowance(
273
+ _activeTokenId(), spender, from, to, MpcCore.setPublic256(value), true, false, true, value
274
+ );
275
+ }
276
+
277
+ /// @inheritdoc IPodErc20CotiSide
278
+ function approve(
279
+ address tokenOwner,
280
+ address spender,
281
+ gtUint256 value
282
+ ) external override onlyRegisteredPTokenMessage {
283
+ _approveInternal(_activeTokenId(), tokenOwner, spender, value, false, 0);
284
+ }
285
+
286
+ /// @inheritdoc IPodErc20CotiSide
287
+ function approvePublic(
288
+ address tokenOwner,
289
+ address spender,
290
+ uint256 value
291
+ ) external override onlyRegisteredPTokenMessage {
292
+ _approveInternal(_activeTokenId(), tokenOwner, spender, MpcCore.setPublic256(value), true, value);
293
+ }
294
+
295
+ /// @inheritdoc IPodErc20CotiSide
296
+ function burn(address from, gtUint256 value) external override onlyRegisteredPTokenMessage {
297
+ _moveOrBurn(_activeTokenId(), from, address(0), value, true, false, 0);
298
+ }
299
+
300
+ /// @inheritdoc IPodErc20CotiSide
301
+ function burnPublic(address from, uint256 value) external override onlyRegisteredPTokenMessage {
302
+ _moveOrBurn(_activeTokenId(), from, address(0), MpcCore.setPublic256(value), true, true, value);
303
+ }
304
+
305
+ /// @inheritdoc IPodErc20CotiSide
306
+ function mint(address to, gtUint256 value) external override onlyRegisteredPTokenMessage {
307
+ _mintInternal(_activeTokenId(), to, value, false, 0);
308
+ }
309
+
310
+ /// @inheritdoc IPodErc20CotiSide
311
+ function mintPublic(address to, uint256 value) external override onlyRegisteredPTokenMessage {
312
+ _mintInternal(_activeTokenId(), to, MpcCore.setPublic256(value), true, value);
313
+ }
314
+
315
+ // --- Internal: token context ---
316
+
317
+ /// @dev Packs `sourceChainId` (uint64) in the high 64 bits and `remotePToken` (uint160) in the low 160 bits.
318
+ function _tokenId(uint256 sourceChainId, address remotePToken) internal pure returns (bytes32) {
319
+ if (sourceChainId > type(uint64).max) {
320
+ revert ChainIdOverflow(sourceChainId);
321
+ }
322
+ return bytes32((uint256(uint64(sourceChainId)) << 160) | uint256(uint160(remotePToken)));
323
+ }
324
+
325
+ function _activeTokenId() internal view returns (bytes32) {
326
+ (uint256 sourceChainId, address remotePToken) = inbox.inboxMsgSender();
327
+ return _tokenId(sourceChainId, remotePToken);
328
+ }
329
+
330
+ // --- Private: garbled balance helpers ---
331
+
332
+ function _ciphertextPlainZero() private returns (ctUint256 memory) {
333
+ return MpcCore.offBoard(MpcCore.setPublic256(uint256(0)));
334
+ }
335
+
336
+ function _isEmptyCtUint256(ctUint256 memory ct) private pure returns (bool) {
337
+ return ctUint128.unwrap(ct.ciphertextHigh) == 0 && ctUint128.unwrap(ct.ciphertextLow) == 0;
338
+ }
339
+
340
+ function _readGarbledBalance(bytes32 id, address account) private returns (gtUint256) {
341
+ ctUint256 memory ct = _balanceCiphertext[id][account];
342
+ if (_isEmptyCtUint256(ct)) {
343
+ return MpcCore.onBoard(_ciphertextPlainZero());
344
+ }
345
+ return MpcCore.onBoard(ct);
346
+ }
347
+
348
+ function _writeGarbledBalance(bytes32 id, address account, gtUint256 newBalance) private {
349
+ _balanceCiphertext[id][account] = MpcCore.offBoard(newBalance);
350
+ }
351
+
352
+ function _moveOrBurn(
353
+ bytes32 id,
354
+ address from,
355
+ address to,
356
+ gtUint256 amount,
357
+ bool burning,
358
+ bool amountIsPublic,
359
+ uint256 publicAmount
360
+ ) private {
361
+ _moveWithOptionalAllowance(id, address(0), from, to, amount, false, burning, amountIsPublic, publicAmount);
362
+ }
363
+
364
+ function _moveWithOptionalAllowance(
365
+ bytes32 id,
366
+ address spender,
367
+ address from,
368
+ address to,
369
+ gtUint256 amount,
370
+ bool spendAllowance,
371
+ bool burning,
372
+ bool amountIsPublic,
373
+ uint256 publicAmount
374
+ ) private {
375
+ if (from == address(0)) {
376
+ _sendTransferFailureToPod(id, from, to, bytes("PodErc20CotiMother: zero from"));
377
+ return;
378
+ }
379
+ if (!burning && to == address(0)) {
380
+ _sendTransferFailureToPod(id, from, to, bytes("PodErc20CotiMother: zero to"));
381
+ return;
382
+ }
383
+
384
+ gtUint256 senderBalance = _readGarbledBalance(id, from);
385
+
386
+ if (!MpcCore.decrypt(MpcCore.ge(senderBalance, amount))) {
387
+ _sendTransferFailureToPod(id, from, to, bytes("PodErc20CotiMother: insufficient balance"));
388
+ return;
389
+ }
390
+
391
+ gtUint256 allowanceAfter;
392
+ if (spendAllowance && spender != from) {
393
+ gtUint256 currentAllowance = _readGarbledAllowance(id, from, spender);
394
+ if (!MpcCore.decrypt(MpcCore.ge(currentAllowance, amount))) {
395
+ _sendTransferFailureToPod(id, from, to, bytes("PodErc20CotiMother: insufficient allowance"));
396
+ return;
397
+ }
398
+ allowanceAfter = MpcCore.sub(currentAllowance, amount);
399
+ }
400
+
401
+ gtUint256 senderAfter = MpcCore.sub(senderBalance, amount);
402
+ _writeGarbledBalance(id, from, senderAfter);
403
+ if (spendAllowance && spender != from) {
404
+ _allowanceCiphertext[id][from][spender] = MpcCore.offBoard(allowanceAfter);
405
+ }
406
+
407
+ if (burning) {
408
+ ctUint256 memory zeroCiphertext = _ciphertextPlainZero();
409
+ uint256 burnNonce = _tokenNonce[id];
410
+ inbox.respond(
411
+ abi.encode(
412
+ from,
413
+ MpcCore.offBoardToUser(senderAfter, from),
414
+ MpcCore.offBoardToUser(amount, from),
415
+ address(0),
416
+ zeroCiphertext,
417
+ zeroCiphertext,
418
+ burnNonce
419
+ )
420
+ );
421
+ emit BurnCompleted(id, from, amountIsPublic, publicAmount, burnNonce);
422
+ _tokenNonce[id] = burnNonce + 1;
423
+ return;
424
+ }
425
+
426
+ gtUint256 recipientBefore = _readGarbledBalance(id, to);
427
+ gtUint256 recipientAfter = MpcCore.add(recipientBefore, amount);
428
+ _writeGarbledBalance(id, to, recipientAfter);
429
+
430
+ uint256 transferNonce = _tokenNonce[id];
431
+ inbox.respond(_encodePodTransferCallback(from, to, amount, senderAfter, recipientAfter, transferNonce));
432
+ emit TransferCompleted(
433
+ id, spender, from, to, spendAllowance && spender != from, amountIsPublic, publicAmount, transferNonce
434
+ );
435
+ _tokenNonce[id] = transferNonce + 1;
436
+ }
437
+
438
+ function _readGarbledAllowance(bytes32 id, address tokenOwner, address spender) private returns (gtUint256) {
439
+ ctUint256 memory ct = _allowanceCiphertext[id][tokenOwner][spender];
440
+ if (_isEmptyCtUint256(ct)) {
441
+ return MpcCore.onBoard(_ciphertextPlainZero());
442
+ }
443
+ return MpcCore.onBoard(ct);
444
+ }
445
+
446
+ function _encodePodTransferCallback(
447
+ address from,
448
+ address to,
449
+ gtUint256 amount,
450
+ gtUint256 senderBalanceAfter,
451
+ gtUint256 recipientBalanceAfter,
452
+ uint256 callbackNonce
453
+ ) private returns (bytes memory) {
454
+ ctUint256 memory senderBalanceCt = MpcCore.offBoardToUser(senderBalanceAfter, from);
455
+ ctUint256 memory amountForSender = MpcCore.offBoardToUser(amount, from);
456
+ ctUint256 memory recipientBalanceCt = MpcCore.offBoardToUser(recipientBalanceAfter, to);
457
+ ctUint256 memory amountForRecipient = MpcCore.offBoardToUser(amount, to);
458
+ return abi.encode(from, senderBalanceCt, amountForSender, to, recipientBalanceCt, amountForRecipient, callbackNonce);
459
+ }
460
+
461
+ function _approveInternal(
462
+ bytes32 id,
463
+ address tokenOwner,
464
+ address spender,
465
+ gtUint256 garbledAllowance,
466
+ bool amountIsPublic,
467
+ uint256 publicAmount
468
+ ) private {
469
+ if (tokenOwner == address(0) || spender == address(0)) {
470
+ _sendApproveFailureToPod(id, tokenOwner, spender, bytes("PodErc20CotiMother: zero owner or spender"));
471
+ return;
472
+ }
473
+
474
+ _allowanceCiphertext[id][tokenOwner][spender] = MpcCore.offBoard(garbledAllowance);
475
+
476
+ ctUint256 memory ciphertextForOwner = MpcCore.offBoardToUser(garbledAllowance, tokenOwner);
477
+ ctUint256 memory ciphertextForSpender = MpcCore.offBoardToUser(garbledAllowance, spender);
478
+ inbox.respond(abi.encode(tokenOwner, ciphertextForOwner, spender, ciphertextForSpender));
479
+ emit ApprovalCompleted(id, tokenOwner, spender, amountIsPublic, publicAmount);
480
+ }
481
+
482
+ function _mintInternal(
483
+ bytes32 id,
484
+ address to,
485
+ gtUint256 amount,
486
+ bool amountIsPublic,
487
+ uint256 publicAmount
488
+ ) private {
489
+ if (to == address(0)) {
490
+ _sendTransferFailureToPod(id, address(0), to, bytes("PodErc20CotiMother: mint zero to"));
491
+ return;
492
+ }
493
+
494
+ gtUint256 recipientBefore = _readGarbledBalance(id, to);
495
+ gtUint256 recipientAfter = MpcCore.add(recipientBefore, amount);
496
+ _writeGarbledBalance(id, to, recipientAfter);
497
+
498
+ ctUint256 memory zeroCiphertext = _ciphertextPlainZero();
499
+ uint256 callbackNonce = _tokenNonce[id];
500
+ inbox.respond(
501
+ abi.encode(
502
+ address(0),
503
+ zeroCiphertext,
504
+ zeroCiphertext,
505
+ to,
506
+ MpcCore.offBoardToUser(recipientAfter, to),
507
+ MpcCore.offBoardToUser(amount, to),
508
+ callbackNonce
509
+ )
510
+ );
511
+ emit MintCompleted(id, to, amountIsPublic, publicAmount, callbackNonce);
512
+ _tokenNonce[id] = callbackNonce + 1;
513
+ }
514
+
515
+ function _sendTransferFailureToPod(bytes32 id, address from, address to, bytes memory reason) private {
516
+ emit TransferFailureRaised(id, from, to, reason);
517
+ inbox.raise(abi.encode(from, to, reason));
518
+ }
519
+
520
+ function _sendApproveFailureToPod(bytes32 id, address tokenOwner, address spender, bytes memory reason) private {
521
+ emit ApprovalFailureRaised(id, tokenOwner, spender, reason);
522
+ inbox.raise(abi.encode(tokenOwner, spender, reason));
523
+ }
524
+
525
+ function _sendSyncFailureToPod(bytes32 id, bytes memory reason) private {
526
+ emit SyncBalancesFailureRaised(id, reason);
527
+ inbox.raise(reason);
528
+ }
529
+ }
@@ -0,0 +1,11 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.20;
3
+
4
+ /// @notice Minimal WETH9 / WAVAX interface for wrap-on-deposit and unwrap-on-withdraw.
5
+ interface IWrappedNative {
6
+ /// @notice Wrap native coin into the ERC-20 underlying (mints WETH/WAVAX to `msg.sender`).
7
+ function deposit() external payable;
8
+
9
+ /// @notice Unwrap `wad` to native coin (burns caller balance, sends native to `msg.sender`).
10
+ function withdraw(uint256 wad) external;
11
+ }
@@ -1,10 +1,10 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.19;
2
+ pragma solidity ^0.8.20;
3
3
 
4
- import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
5
- import "@openzeppelin/contracts/security/Pausable.sol";
4
+ import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
5
+ import "@openzeppelin/contracts/utils/Pausable.sol";
6
6
  import "@openzeppelin/contracts/access/Ownable.sol";
7
- import "@openzeppelin/contracts/access/AccessControlEnumerable.sol";
7
+ import "@openzeppelin/contracts/access/extensions/AccessControlEnumerable.sol";
8
8
  import "../oracle/ICotiPriceConsumer.sol";
9
9
 
10
10
  /**
@@ -209,7 +209,7 @@ abstract contract PrivacyBridge is ReentrancyGuard, Pausable, Ownable, AccessCon
209
209
  * @param _rescueRecipient Non-zero recipient for emergency rescue paths (immutable for contract lifetime—no setter)
210
210
  * @param _priceOracle Non-zero {ICotiPriceConsumer} used for dynamic fees (owner may later {setPriceOracle})
211
211
  */
212
- constructor(address _feeRecipient, address _rescueRecipient, address _priceOracle) Ownable() {
212
+ constructor(address _feeRecipient, address _rescueRecipient, address _priceOracle) Ownable(msg.sender) {
213
213
  if (_feeRecipient == address(0)) revert InvalidAddress();
214
214
  if (_rescueRecipient == address(0)) revert InvalidAddress();
215
215
  if (_priceOracle == address(0)) revert InvalidAddress();
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.19;
2
+ pragma solidity ^0.8.20;
3
3
 
4
4
  import "./PrivacyBridge.sol";
5
5
  import "@openzeppelin/contracts/utils/math/Math.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.19;
2
+ pragma solidity ^0.8.20;
3
3
 
4
4
  import "./PrivacyBridge.sol";
5
5
  import "@openzeppelin/contracts/utils/math/Math.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.19;
2
+ pragma solidity ^0.8.20;
3
3
 
4
4
  import "./PrivacyBridgeERC20.sol";
5
5
  import "../token/PrivateERC20/tokens/PrivateBridgedUSDC.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.19;
2
+ pragma solidity ^0.8.20;
3
3
 
4
4
  import "./PrivacyBridgeERC20.sol";
5
5
  import "../token/PrivateERC20/tokens/PrivateTetherUSD.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.19;
2
+ pragma solidity ^0.8.20;
3
3
 
4
4
  import "./PrivacyBridgeERC20.sol";
5
5
  import "../token/PrivateERC20/tokens/PrivateWrappedADA.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.19;
2
+ pragma solidity ^0.8.20;
3
3
 
4
4
  import "./PrivacyBridgeERC20.sol";
5
5
  import "../token/PrivateERC20/tokens/PrivateWrappedBTC.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.19;
2
+ pragma solidity ^0.8.20;
3
3
 
4
4
  import "./PrivacyBridgeERC20.sol";
5
5
  import "../token/PrivateERC20/tokens/PrivateWrappedEther.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.19;
2
+ pragma solidity ^0.8.20;
3
3
 
4
4
  import "./PrivacyBridgeERC20.sol";
5
5
  import "../token/PrivateERC20/tokens/PrivateCOTITreasuryGovernanceToken.sol";
@@ -1,6 +1,6 @@
1
1
  // SPDX-License-Identifier: MIT
2
2
 
3
- pragma solidity ^0.8.19;
3
+ pragma solidity ^0.8.20;
4
4
 
5
5
  import "../../utils/mpc/MpcCore.sol";
6
6
 
@@ -1,6 +1,6 @@
1
1
  // SPDX-License-Identifier: MIT
2
2
 
3
- pragma solidity ^0.8.19;
3
+ pragma solidity ^0.8.20;
4
4
 
5
5
  /**
6
6
  * @dev Interface for receiving Private ERC-20 tokens via `transferAndCall` with a **public** `uint256` amount.
@@ -1,6 +1,6 @@
1
1
  // SPDX-License-Identifier: MIT
2
2
 
3
- pragma solidity ^0.8.19;
3
+ pragma solidity ^0.8.20;
4
4
 
5
5
  /**
6
6
  * @dev Callback for the **encrypted-amount** `transferAndCall(to, itUint256, data)` overload on {PrivateERC20}.