@coti-io/coti-contracts 1.2.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (481) hide show
  1. package/.github/workflows/npm-publish.yml +1 -1
  2. package/contracts/access/DataPrivacyFramework/DataPrivacyFramework.sol +1 -1
  3. package/contracts/access/DataPrivacyFramework/extensions/DataPrivacyFrameworkMpc.sol +1 -1
  4. package/contracts/disperse/coinByRatio/FixedRatioCoinDisperserUnlimitedWindow.sol +2 -4
  5. package/contracts/disperse/disperseToken/MintDisperser.sol +1 -3
  6. package/contracts/disperse/disperseToken/TokenDisperser.sol +1 -1
  7. package/contracts/messaging/PrivateMessaging.sol +456 -0
  8. package/contracts/mocks/access/DataPrivacyFramework/DataPrivacyFrameworkMock.sol +1 -1
  9. package/contracts/mocks/messaging/PrivateMessagingHarness.sol +54 -0
  10. package/contracts/mocks/oracle/CotiPriceConsumerMock.sol +31 -0
  11. package/contracts/mocks/token/ERC20DecimalsMock.sol +21 -0
  12. package/contracts/mocks/token/ERC20Mock.sol +1 -1
  13. package/contracts/mocks/token/PrivateERC20/EncryptedTokenReceiverMock.sol +1 -1
  14. package/contracts/mocks/token/PrivateERC20/PrivacyBridgeERC20Mock.sol +9 -4
  15. package/contracts/mocks/token/PrivateERC20/PrivateERC20AuditorSupplyMock.sol +1 -1
  16. package/contracts/mocks/token/PrivateERC20/PrivateERC20CappedMock.sol +1 -1
  17. package/contracts/mocks/token/PrivateERC20/PrivateERC20GtCallerMock.sol +1 -1
  18. package/contracts/mocks/token/PrivateERC20/PrivateERC20Mock.sol +1 -1
  19. package/contracts/mocks/token/PrivateERC20/PrivateERC20ReentrantReceiverMock.sol +1 -1
  20. package/contracts/mocks/token/PrivateERC20/PublicReentrantTokenReceiverMock.sol +1 -1
  21. package/contracts/mocks/token/PrivateERC20/PublicTokenReceiverBoolMock.sol +1 -1
  22. package/contracts/mocks/token/PrivateERC20/PublicTokenReceiverMock.sol +1 -1
  23. package/contracts/mocks/token/PrivateERC721/PrivateERC721URIStorageMock.sol +1 -1
  24. package/contracts/mocks/utils/mpc/Arithmetic128TestsContract.sol +1 -1
  25. package/contracts/mocks/utils/mpc/Arithmetic256TestsContract.sol +1 -1
  26. package/contracts/mocks/utils/mpc/ArithmeticAddTestsContract.sol +196 -0
  27. package/contracts/mocks/utils/mpc/ArithmeticMulTestsContract.sol +194 -0
  28. package/contracts/mocks/utils/mpc/ArithmeticSigned128TestsContract.sol +63 -0
  29. package/contracts/mocks/utils/mpc/ArithmeticSigned256TestsContract.sol +107 -0
  30. package/contracts/mocks/utils/mpc/ArithmeticSignedNarrowTestsContract.sol +123 -0
  31. package/contracts/mocks/utils/mpc/ArithmeticSubTestsContract.sol +196 -0
  32. package/contracts/mocks/utils/mpc/Bitwise128TestsContract.sol +1 -1
  33. package/contracts/mocks/utils/mpc/Bitwise256TestsContract.sol +1 -1
  34. package/contracts/mocks/utils/mpc/BitwiseTestsContract.sol +1 -1
  35. package/contracts/mocks/utils/mpc/CheckedArithmetic128WithOverflowBitTestsContract.sol +1 -1
  36. package/contracts/mocks/utils/mpc/CheckedArithmetic256WithOverflowBitTestsContract.sol +1 -1
  37. package/contracts/mocks/utils/mpc/CheckedArithmeticWIthOverflowBitTestsContract.sol +1 -1
  38. package/contracts/mocks/utils/mpc/Comparison128TestsContract.sol +1 -1
  39. package/contracts/mocks/utils/mpc/Comparison1TestsContract.sol +1 -1
  40. package/contracts/mocks/utils/mpc/Comparison256TestsContract.sol +1 -1
  41. package/contracts/mocks/utils/mpc/Comparison2TestsContract.sol +1 -1
  42. package/contracts/mocks/utils/mpc/MinMax128TestsContract.sol +1 -1
  43. package/contracts/mocks/utils/mpc/MinMax256TestsContract.sol +1 -1
  44. package/contracts/mocks/utils/mpc/MinMaxTestsContract.sol +1 -1
  45. package/contracts/mocks/utils/mpc/MinimalImplementation.sol +1 -1
  46. package/contracts/mocks/utils/mpc/MinimalProxy.sol +1 -1
  47. package/contracts/mocks/utils/mpc/Miscellaneous1TestsContract.sol +1 -1
  48. package/contracts/mocks/utils/mpc/MiscellaneousTestsContract.sol +1 -1
  49. package/contracts/mocks/utils/mpc/MpcOperations128TestContract.sol +1 -1
  50. package/contracts/mocks/utils/mpc/MpcOperationsTestContract.sol +4 -4
  51. package/contracts/mocks/utils/mpc/Mux128TestsContract.sol +1 -1
  52. package/contracts/mocks/utils/mpc/Mux256TestsContract.sol +1 -1
  53. package/contracts/mocks/utils/mpc/OffboardToUserKeyTestContract.sol +1 -1
  54. package/contracts/mocks/utils/mpc/OnBoard128TestsContract.sol +1 -1
  55. package/contracts/mocks/utils/mpc/OnBoard256TestsContract.sol +1 -1
  56. package/contracts/mocks/utils/mpc/PrivacyImplementationV1.sol +1 -1
  57. package/contracts/mocks/utils/mpc/PrivacyImplementationV2.sol +1 -1
  58. package/contracts/mocks/utils/mpc/PrivacyProxy.sol +1 -1
  59. package/contracts/mocks/utils/mpc/Random128TestsContract.sol +1 -1
  60. package/contracts/mocks/utils/mpc/Random256TestsContract.sol +1 -1
  61. package/contracts/mocks/utils/mpc/Shift128TestsContract.sol +1 -1
  62. package/contracts/mocks/utils/mpc/Shift256TestsContract.sol +1 -1
  63. package/contracts/mocks/utils/mpc/ShiftTestsContract.sol +1 -1
  64. package/contracts/mocks/utils/mpc/StringTestsContract.sol +1 -1
  65. package/contracts/mocks/utils/mpc/Transfer128TestsContract.sol +1 -1
  66. package/contracts/mocks/utils/mpc/Transfer256TestsContract.sol +1 -1
  67. package/contracts/mocks/utils/mpc/TransferScalarTestsContract.sol +1 -1
  68. package/contracts/mocks/utils/mpc/TransferTestsContract.sol +1 -1
  69. package/contracts/mocks/utils/mpc/TransferWithAllowance128TestsContract.sol +1 -1
  70. package/contracts/mocks/utils/mpc/TransferWithAllowance256TestsContract.sol +1 -1
  71. package/contracts/mocks/utils/mpc/TransferWithAllowance64_16TestsContract.sol +1 -1
  72. package/contracts/mocks/utils/mpc/TransferWithAllowance64_32TestsContract.sol +1 -1
  73. package/contracts/mocks/utils/mpc/TransferWithAllowance64_64TestsContract.sol +1 -1
  74. package/contracts/mocks/utils/mpc/TransferWithAllowance64_8TestsContract.sol +1 -1
  75. package/contracts/mocks/utils/mpc/TransferWithAllowanceScalarTestsContract.sol +1 -1
  76. package/contracts/mocks/utils/mpc/TransferWithAllowanceTestsContract.sol +1 -1
  77. package/contracts/mocks/utils/mpc/ValidateCiphertext128TestsContract.sol +1 -1
  78. package/contracts/mocks/utils/mpc/ValidateCiphertext256TestsContract.sol +2 -2
  79. package/contracts/mocks/utils/mpc/ValidateCiphertextTestsContract.sol +1 -1
  80. package/contracts/mocks/wallet/PrivateERC20Wallet/PrivateERC20WalletMock.sol +1 -1
  81. package/contracts/node/CotiNodeRewards.sol +3 -3
  82. package/contracts/node/SoulboundNodeNFT.sol +23 -24
  83. package/contracts/onboard/AccountOnboard.sol +1 -1
  84. package/contracts/oracle/CotiPriceConsumer.sol +103 -0
  85. package/contracts/oracle/ICotiPriceConsumer.sol +15 -0
  86. package/contracts/oracle/IStdReference.sol +26 -0
  87. package/contracts/pod/IInbox.sol +231 -0
  88. package/contracts/pod/IInboxMiner.sol +53 -0
  89. package/contracts/pod/InboxUser.sol +29 -0
  90. package/contracts/pod/InboxUserCotiTestnet.sol +13 -0
  91. package/contracts/pod/PodNetworkConstants.sol +30 -0
  92. package/contracts/pod/examples/MpcAdder.sol +57 -0
  93. package/contracts/pod/examples/MpcAdderPausable.sol +25 -0
  94. package/contracts/pod/examples/MpcAdderPausable.sol.bak +25 -0
  95. package/contracts/pod/examples/it128/PodAdder128.sol +48 -0
  96. package/contracts/pod/examples/it256/PodAdder256.sol +48 -0
  97. package/contracts/pod/fee/IInboxFeeManager.sol +40 -0
  98. package/contracts/pod/manifest.json +52 -0
  99. package/contracts/pod/mpc/PodLib.sol +10 -0
  100. package/contracts/pod/mpc/PodLib128.sol +361 -0
  101. package/contracts/pod/mpc/PodLib256.sol +361 -0
  102. package/contracts/pod/mpc/PodLib64.sol +385 -0
  103. package/contracts/pod/mpc/PodLibBase.sol +72 -0
  104. package/contracts/pod/mpc/PodUser.sol +58 -0
  105. package/contracts/pod/mpc/PodUserFuji.sol +14 -0
  106. package/contracts/pod/mpc/PodUserSepolia.sol +13 -0
  107. package/contracts/pod/mpc/coti-side/IPodExecutorOps.sol +99 -0
  108. package/contracts/pod/mpccodec/MpcAbiCodec.sol +482 -0
  109. package/contracts/pod/privacy/IPodPriceOracle.sol +20 -0
  110. package/contracts/pod/privacy/IPrivacyPortal.sol +248 -0
  111. package/contracts/pod/privacy/IPrivacyPortalFactory.sol +88 -0
  112. package/contracts/pod/privacy/PortalFeeOracle.sol +51 -0
  113. package/contracts/pod/privacy/PrivacyPortal.sol +871 -0
  114. package/contracts/pod/privacy/PrivacyPortalFactory.sol +492 -0
  115. package/contracts/pod/privacy/PrivacyPortalFeeLib.sol +98 -0
  116. package/contracts/pod/privacy/mocks/CloneHelper.sol +14 -0
  117. package/contracts/pod/privacy/mocks/MockERC20.sol +26 -0
  118. package/contracts/pod/privacy/mocks/MockPodERC20ForPortal.sol +160 -0
  119. package/contracts/pod/privacy/mocks/MockPrivacyPortalFactory.sol +125 -0
  120. package/contracts/pod/privacy/mocks/MockWrappedNative.sol +24 -0
  121. package/contracts/pod/token/erc7984/Erc7984Constants.sol +9 -0
  122. package/contracts/pod/token/erc7984/Erc7984Pointers.sol +29 -0
  123. package/contracts/pod/token/erc7984/IERC7984.sol +69 -0
  124. package/contracts/pod/token/erc7984/IERC7984PortalWrapper.sol +31 -0
  125. package/contracts/pod/token/erc7984/PodErc7984Mixin.sol +125 -0
  126. package/contracts/pod/token/erc7984/README.md +60 -0
  127. package/contracts/pod/token/perc20/IPodERC20.sol +298 -0
  128. package/contracts/pod/token/perc20/PodERC20.sol +1021 -0
  129. package/contracts/pod/token/perc20/PodErc20Mintable.sol +88 -0
  130. package/contracts/pod/token/perc20/PodErc20MintableInitializable.sol +42 -0
  131. package/contracts/pod/token/perc20/cotiside/IPodErc20CotiSide.sol +88 -0
  132. package/contracts/pod/token/perc20/cotiside/PodErc20CotiMother.sol +529 -0
  133. package/contracts/pod/utils/IWrappedNative.sol +11 -0
  134. package/contracts/privacyBridge/PrivacyBridge.sol +376 -94
  135. package/contracts/privacyBridge/PrivacyBridgeCotiNative.sol +210 -162
  136. package/contracts/privacyBridge/PrivacyBridgeERC20.sol +242 -160
  137. package/contracts/privacyBridge/PrivacyBridgeUSDCe.sol +8 -2
  138. package/contracts/privacyBridge/PrivacyBridgeUSDT.sol +8 -2
  139. package/contracts/privacyBridge/PrivacyBridgeWADA.sol +8 -2
  140. package/contracts/privacyBridge/PrivacyBridgeWBTC.sol +8 -2
  141. package/contracts/privacyBridge/PrivacyBridgeWETH.sol +8 -2
  142. package/contracts/privacyBridge/PrivacyBridgegCoti.sol +8 -2
  143. package/contracts/token/PrivateERC20/IPrivateERC20.sol +1 -1
  144. package/contracts/token/PrivateERC20/ITokenReceiver.sol +1 -1
  145. package/contracts/token/PrivateERC20/ITokenReceiverEncrypted.sol +1 -1
  146. package/contracts/token/PrivateERC20/PrivateERC20.sol +5 -5
  147. package/contracts/token/PrivateERC20/tokens/PrivateBridgedUSDC.sol +1 -1
  148. package/contracts/token/PrivateERC20/tokens/PrivateCOTI.sol +1 -1
  149. package/contracts/token/PrivateERC20/tokens/PrivateCOTITreasuryGovernanceToken.sol +1 -1
  150. package/contracts/token/PrivateERC20/tokens/PrivateTetherUSD.sol +1 -1
  151. package/contracts/token/PrivateERC20/tokens/PrivateWrappedADA.sol +1 -1
  152. package/contracts/token/PrivateERC20/tokens/PrivateWrappedBTC.sol +1 -1
  153. package/contracts/token/PrivateERC20/tokens/PrivateWrappedEther.sol +1 -1
  154. package/contracts/token/PrivateERC721/IERC721Errors.sol +1 -1
  155. package/contracts/token/PrivateERC721/PrivateERC721.sol +1 -1
  156. package/contracts/token/PrivateERC721/extensions/IPrivateERC721URIStorage.sol +1 -1
  157. package/contracts/token/PrivateERC721/extensions/PrivateERC721URIStorage.sol +1 -1
  158. package/contracts/token/points/CotiTokenPoints004.sol +43 -0
  159. package/contracts/utils/mpc/MpcCore.sol +610 -1
  160. package/contracts/utils/mpc/MpcInterface.sol +1 -1
  161. package/hardhat.config.ts +9 -15
  162. package/package.json +4 -4
  163. package/scripts/add-bridge-operators.cjs +87 -0
  164. package/scripts/deploy-coti-price-consumer-mainnet.cjs +49 -0
  165. package/scripts/deployCotiNodeRewards.ts +51 -0
  166. package/scripts/deployCotiTokenPoints004.ts +61 -0
  167. package/scripts/deployFixedRatioCoinDisperserUnlimitedWindow.ts +68 -0
  168. package/scripts/redeploy-private-and-bridges.cjs +201 -0
  169. package/scripts/set-bridge-limits-mainnet.cjs +177 -0
  170. package/scripts/verify-mainnet-private-bridges.cjs +289 -0
  171. package/scripts/verifyCotiTokenPoints004.ts +123 -0
  172. package/scripts/verifyFixedRatioCoinDisperserUnlimitedWindow.ts +112 -0
  173. package/sonar-project.properties +11 -0
  174. package/test/messaging/PrivateMessaging.test.ts +158 -0
  175. package/test/pod/privacy/PrivacyPortal.access.test.ts +756 -0
  176. package/test/pod/privacy/PrivacyPortal.recovery.test.ts +263 -0
  177. package/test/privacyBridge/UnifiedPrivacyBridges.test.cjs +1665 -0
  178. package/test/token/PrivateERC20/PrivacyBridge.fees.test.ts +162 -239
  179. package/test/utils/mpc/CheckedSignedArithmetic256.test.ts +163 -0
  180. package/test/utils/mpc/NegativeCases.test.ts +3 -3
  181. package/test/utils/mpc/Precompile.test.ts +6 -6
  182. package/typechain-types/@openzeppelin/contracts/access/AccessControl.ts +324 -0
  183. package/typechain-types/@openzeppelin/contracts/access/AccessControlEnumerable.ts +361 -0
  184. package/typechain-types/@openzeppelin/contracts/access/IAccessControl.ts +292 -0
  185. package/typechain-types/@openzeppelin/contracts/access/IAccessControlEnumerable.ts +329 -0
  186. package/typechain-types/@openzeppelin/contracts/access/extensions/AccessControlEnumerable.ts +375 -0
  187. package/typechain-types/@openzeppelin/contracts/access/extensions/IAccessControlEnumerable.ts +329 -0
  188. package/typechain-types/@openzeppelin/contracts/access/extensions/index.ts +5 -0
  189. package/typechain-types/@openzeppelin/contracts/access/index.ts +6 -0
  190. package/typechain-types/@openzeppelin/contracts/index.ts +2 -0
  191. package/typechain-types/@openzeppelin/contracts/interfaces/IERC1363.ts +412 -0
  192. package/typechain-types/@openzeppelin/contracts/interfaces/IERC5267.ts +151 -0
  193. package/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors.ts +69 -0
  194. package/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors.ts +69 -0
  195. package/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors.ts +69 -0
  196. package/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/index.ts +6 -0
  197. package/typechain-types/@openzeppelin/contracts/interfaces/index.ts +4 -0
  198. package/typechain-types/@openzeppelin/contracts/security/Pausable.ts +150 -0
  199. package/typechain-types/@openzeppelin/contracts/security/index.ts +4 -0
  200. package/typechain-types/@openzeppelin/contracts/token/ERC20/ERC20.ts +286 -0
  201. package/typechain-types/@openzeppelin/contracts/token/ERC20/IERC20.ts +6 -6
  202. package/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.ts +313 -0
  203. package/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable.ts +356 -0
  204. package/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.ts +423 -0
  205. package/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.ts +286 -0
  206. package/typechain-types/@openzeppelin/contracts/token/ERC20/extensions/index.ts +4 -0
  207. package/typechain-types/@openzeppelin/contracts/token/ERC20/index.ts +3 -0
  208. package/typechain-types/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.ts +69 -0
  209. package/typechain-types/@openzeppelin/contracts/token/ERC20/utils/index.ts +4 -0
  210. package/typechain-types/@openzeppelin/contracts/token/ERC721/ERC721.ts +420 -0
  211. package/typechain-types/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.ts +420 -0
  212. package/typechain-types/@openzeppelin/contracts/token/ERC721/extensions/index.ts +4 -0
  213. package/typechain-types/@openzeppelin/contracts/token/ERC721/index.ts +3 -0
  214. package/typechain-types/@openzeppelin/contracts/utils/Nonces.ts +85 -0
  215. package/typechain-types/@openzeppelin/contracts/utils/Pausable.ts +150 -0
  216. package/typechain-types/@openzeppelin/contracts/utils/ReentrancyGuard.ts +69 -0
  217. package/typechain-types/@openzeppelin/contracts/utils/ShortStrings.ts +69 -0
  218. package/typechain-types/@openzeppelin/contracts/utils/Strings.ts +69 -0
  219. package/typechain-types/@openzeppelin/contracts/utils/cryptography/ECDSA.ts +69 -0
  220. package/typechain-types/@openzeppelin/contracts/utils/cryptography/EIP712.ts +151 -0
  221. package/typechain-types/@openzeppelin/contracts/utils/cryptography/index.ts +5 -0
  222. package/typechain-types/@openzeppelin/contracts/utils/index.ts +9 -0
  223. package/typechain-types/@openzeppelin/contracts/utils/math/SafeCast.ts +69 -0
  224. package/typechain-types/@openzeppelin/contracts/utils/math/index.ts +4 -0
  225. package/typechain-types/contracts/disperse/coinByRatio/FixedRatioCoinDisperserLeftoverS1.ts +735 -0
  226. package/typechain-types/contracts/disperse/coinByRatio/FixedRatioCoinDisperserUnlimitedWindow.ts +734 -0
  227. package/typechain-types/contracts/disperse/coinByRatio/index.ts +2 -0
  228. package/typechain-types/contracts/disperse/disperseToken/MintDisperser.sol/IOwnable.ts +95 -0
  229. package/typechain-types/contracts/disperse/disperseToken/MintDisperser.sol/MintDisperser.ts +22 -0
  230. package/typechain-types/contracts/disperse/disperseToken/MintDisperser.sol/index.ts +1 -0
  231. package/typechain-types/contracts/index.ts +8 -0
  232. package/typechain-types/contracts/messaging/PrivateMessaging.ts +871 -0
  233. package/typechain-types/contracts/messaging/index.ts +4 -0
  234. package/typechain-types/contracts/mocks/index.ts +4 -0
  235. package/typechain-types/contracts/mocks/messaging/PrivateMessagingHarness.ts +951 -0
  236. package/typechain-types/contracts/mocks/messaging/index.ts +4 -0
  237. package/typechain-types/contracts/mocks/oracle/CotiPriceConsumerMock.ts +163 -0
  238. package/typechain-types/contracts/mocks/oracle/index.ts +4 -0
  239. package/typechain-types/contracts/mocks/token/ERC20DecimalsMock.ts +305 -0
  240. package/typechain-types/contracts/mocks/token/ERC20Mock.ts +324 -0
  241. package/typechain-types/contracts/mocks/token/PrivateERC20/EncryptedTokenReceiverMock.ts +108 -0
  242. package/typechain-types/contracts/mocks/token/PrivateERC20/PrivacyBridgeERC20Mock.ts +1906 -0
  243. package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20AuditorSupplyMock.ts +1296 -0
  244. package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20CappedMock.ts +1270 -0
  245. package/typechain-types/contracts/mocks/{utils/mpc/Bitwise128BitTestsContract.ts → token/PrivateERC20/PrivateERC20GtCallerMock.ts} +47 -67
  246. package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20Mock.ts +757 -25
  247. package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20ReentrantReceiverMock.sol/IPrivateERC20TransferAndCallEncrypted.ts +102 -0
  248. package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20ReentrantReceiverMock.sol/PrivateERC20ReentrantReceiverMock.ts +154 -0
  249. package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20ReentrantReceiverMock.sol/index.ts +5 -0
  250. package/typechain-types/contracts/mocks/token/PrivateERC20/PublicReentrantTokenReceiverMock.ts +155 -0
  251. package/typechain-types/contracts/mocks/token/PrivateERC20/PublicTokenReceiverBoolMock.ts +107 -0
  252. package/typechain-types/contracts/mocks/token/PrivateERC20/PublicTokenReceiverMock.ts +100 -0
  253. package/typechain-types/contracts/mocks/token/PrivateERC20/index.ts +10 -0
  254. package/typechain-types/contracts/mocks/token/index.ts +2 -0
  255. package/typechain-types/contracts/mocks/wallet/PrivateERC20Wallet/PrivateERC20WalletMock.ts +6 -6
  256. package/typechain-types/contracts/node/CotiNodeRewards.ts +566 -0
  257. package/typechain-types/contracts/node/SoulboundNodeNFT.sol/IERC5192.ts +123 -0
  258. package/typechain-types/contracts/node/SoulboundNodeNFT.sol/SoulboundNodeNFT.ts +975 -0
  259. package/typechain-types/contracts/node/SoulboundNodeNFT.sol/index.ts +5 -0
  260. package/typechain-types/contracts/node/index.ts +6 -0
  261. package/typechain-types/contracts/oracle/CotiPriceConsumer.ts +256 -0
  262. package/typechain-types/contracts/oracle/ICotiPriceConsumer.ts +119 -0
  263. package/typechain-types/contracts/oracle/IStdReference.ts +136 -0
  264. package/typechain-types/contracts/oracle/index.ts +6 -0
  265. package/typechain-types/contracts/privacyBridge/PrivacyBridge.ts +1642 -0
  266. package/typechain-types/contracts/privacyBridge/PrivacyBridgeCotiNative.ts +1884 -0
  267. package/typechain-types/contracts/privacyBridge/PrivacyBridgeERC20.sol/IHasDecimals.ts +84 -0
  268. package/typechain-types/contracts/privacyBridge/PrivacyBridgeERC20.sol/PrivacyBridgeERC20.ts +1906 -0
  269. package/typechain-types/contracts/privacyBridge/PrivacyBridgeERC20.sol/index.ts +5 -0
  270. package/typechain-types/contracts/privacyBridge/PrivacyBridgeUSDCe.ts +1906 -0
  271. package/typechain-types/contracts/privacyBridge/PrivacyBridgeUSDT.ts +1906 -0
  272. package/typechain-types/contracts/privacyBridge/PrivacyBridgeWADA.ts +1906 -0
  273. package/typechain-types/contracts/privacyBridge/PrivacyBridgeWBTC.ts +1906 -0
  274. package/typechain-types/contracts/privacyBridge/PrivacyBridgeWETH.ts +1906 -0
  275. package/typechain-types/contracts/privacyBridge/PrivacyBridgegCoti.ts +1906 -0
  276. package/typechain-types/contracts/privacyBridge/index.ts +13 -0
  277. package/typechain-types/contracts/token/PrivateERC20/IPrivateERC20.ts +439 -19
  278. package/typechain-types/contracts/token/PrivateERC20/ITokenReceiver.ts +100 -0
  279. package/typechain-types/contracts/token/PrivateERC20/ITokenReceiverEncrypted.ts +99 -0
  280. package/typechain-types/contracts/token/PrivateERC20/PrivateERC20.ts +763 -15
  281. package/typechain-types/contracts/token/PrivateERC20/index.ts +4 -0
  282. package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateBridgedUSDC.ts +1270 -0
  283. package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateCOTI.ts +1270 -0
  284. package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateCOTITreasuryGovernanceToken.ts +1270 -0
  285. package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateTetherUSD.ts +1270 -0
  286. package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateWrappedADA.ts +1270 -0
  287. package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateWrappedBTC.ts +1270 -0
  288. package/typechain-types/contracts/token/PrivateERC20/tokens/PrivateWrappedEther.ts +1270 -0
  289. package/typechain-types/contracts/token/PrivateERC20/tokens/index.ts +10 -0
  290. package/typechain-types/contracts/token/index.ts +2 -0
  291. package/typechain-types/contracts/token/points/CotiTokenPoints004.sol/COTITokenPoints004.ts +826 -0
  292. package/typechain-types/contracts/token/points/CotiTokenPoints004.ts +826 -0
  293. package/typechain-types/contracts/token/points/index.ts +4 -0
  294. package/typechain-types/factories/@openzeppelin/contracts/access/AccessControlEnumerable__factory.ts +276 -0
  295. package/typechain-types/factories/@openzeppelin/contracts/access/AccessControl__factory.ts +250 -0
  296. package/typechain-types/factories/@openzeppelin/contracts/access/IAccessControlEnumerable__factory.ts +244 -0
  297. package/typechain-types/factories/@openzeppelin/contracts/access/IAccessControl__factory.ts +218 -0
  298. package/typechain-types/factories/@openzeppelin/contracts/access/Ownable__factory.ts +22 -0
  299. package/typechain-types/factories/@openzeppelin/contracts/access/extensions/AccessControlEnumerable__factory.ts +316 -0
  300. package/typechain-types/factories/@openzeppelin/contracts/access/extensions/IAccessControlEnumerable__factory.ts +265 -0
  301. package/typechain-types/factories/@openzeppelin/contracts/access/extensions/index.ts +5 -0
  302. package/typechain-types/factories/@openzeppelin/contracts/access/index.ts +5 -0
  303. package/typechain-types/factories/@openzeppelin/contracts/index.ts +1 -0
  304. package/typechain-types/factories/@openzeppelin/contracts/interfaces/IERC1363__factory.ts +393 -0
  305. package/typechain-types/factories/@openzeppelin/contracts/interfaces/IERC5267__factory.ts +71 -0
  306. package/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors__factory.ts +127 -0
  307. package/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors__factory.ts +111 -0
  308. package/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors__factory.ts +128 -0
  309. package/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/index.ts +6 -0
  310. package/typechain-types/factories/@openzeppelin/contracts/interfaces/index.ts +3 -0
  311. package/typechain-types/factories/@openzeppelin/contracts/security/Pausable__factory.ts +61 -0
  312. package/typechain-types/factories/@openzeppelin/contracts/security/index.ts +4 -0
  313. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/ERC20__factory.ts +330 -0
  314. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/IERC20__factory.ts +3 -3
  315. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable__factory.ts +364 -0
  316. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable__factory.ts +382 -0
  317. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit__factory.ts +540 -0
  318. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata__factory.ts +247 -0
  319. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/extensions/index.ts +4 -0
  320. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/index.ts +2 -0
  321. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/utils/SafeERC20__factory.ts +96 -0
  322. package/typechain-types/factories/@openzeppelin/contracts/token/ERC20/utils/index.ts +4 -0
  323. package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/ERC721__factory.ts +455 -0
  324. package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata__factory.ts +355 -0
  325. package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/extensions/index.ts +4 -0
  326. package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/index.ts +2 -0
  327. package/typechain-types/factories/@openzeppelin/contracts/utils/Nonces__factory.ts +57 -0
  328. package/typechain-types/factories/@openzeppelin/contracts/utils/Pausable__factory.ts +71 -0
  329. package/typechain-types/factories/@openzeppelin/contracts/utils/ReentrancyGuard__factory.ts +30 -0
  330. package/typechain-types/factories/@openzeppelin/contracts/utils/ShortStrings__factory.ts +83 -0
  331. package/typechain-types/factories/@openzeppelin/contracts/utils/Strings__factory.ts +90 -0
  332. package/typechain-types/factories/@openzeppelin/contracts/utils/cryptography/ECDSA__factory.ts +91 -0
  333. package/typechain-types/factories/@openzeppelin/contracts/utils/cryptography/EIP712__factory.ts +87 -0
  334. package/typechain-types/factories/@openzeppelin/contracts/utils/cryptography/index.ts +5 -0
  335. package/typechain-types/factories/@openzeppelin/contracts/utils/index.ts +7 -0
  336. package/typechain-types/factories/@openzeppelin/contracts/utils/math/SafeCast__factory.ts +118 -0
  337. package/typechain-types/factories/@openzeppelin/contracts/utils/math/index.ts +4 -0
  338. package/typechain-types/factories/contracts/disperse/coinByRatio/FixedRatioCoinDisperserLeftoverS1__factory.ts +802 -0
  339. package/typechain-types/factories/contracts/disperse/coinByRatio/FixedRatioCoinDisperserUnlimitedWindow__factory.ts +749 -0
  340. package/typechain-types/factories/contracts/disperse/coinByRatio/FixedRatioCoinDisperser__factory.ts +12 -1
  341. package/typechain-types/factories/contracts/disperse/coinByRatio/index.ts +2 -0
  342. package/typechain-types/factories/contracts/disperse/disperseToken/MintDisperser.sol/IOwnable__factory.ts +35 -0
  343. package/typechain-types/factories/contracts/disperse/disperseToken/MintDisperser.sol/MintDisperser__factory.ts +41 -1
  344. package/typechain-types/factories/contracts/disperse/disperseToken/MintDisperser.sol/index.ts +1 -0
  345. package/typechain-types/factories/contracts/disperse/disperseToken/TokenDisperser__factory.ts +12 -1
  346. package/typechain-types/factories/contracts/index.ts +4 -0
  347. package/typechain-types/factories/contracts/messaging/PrivateMessaging__factory.ts +1035 -0
  348. package/typechain-types/factories/contracts/messaging/index.ts +4 -0
  349. package/typechain-types/factories/contracts/mocks/access/DataPrivacyFramework/DataPrivacyFrameworkMock__factory.ts +1 -1
  350. package/typechain-types/factories/contracts/mocks/index.ts +2 -0
  351. package/typechain-types/factories/contracts/mocks/messaging/PrivateMessagingHarness__factory.ts +1161 -0
  352. package/typechain-types/factories/contracts/mocks/messaging/index.ts +4 -0
  353. package/typechain-types/factories/contracts/mocks/oracle/CotiPriceConsumerMock__factory.ts +159 -0
  354. package/typechain-types/factories/contracts/mocks/oracle/index.ts +4 -0
  355. package/typechain-types/factories/contracts/mocks/token/ERC20DecimalsMock__factory.ts +432 -0
  356. package/typechain-types/factories/contracts/mocks/token/ERC20Mock__factory.ts +430 -0
  357. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/EncryptedTokenReceiverMock__factory.ts +125 -0
  358. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivacyBridgeERC20Mock__factory.ts +1885 -0
  359. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20AuditorSupplyMock__factory.ts +1540 -0
  360. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20CappedMock__factory.ts +1492 -0
  361. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20GtCallerMock__factory.ts +165 -0
  362. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20Mock__factory.ts +794 -52
  363. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20ReentrantReceiverMock.sol/IPrivateERC20TransferAndCallEncrypted__factory.ts +54 -0
  364. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20ReentrantReceiverMock.sol/PrivateERC20ReentrantReceiverMock__factory.ts +159 -0
  365. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20ReentrantReceiverMock.sol/index.ts +5 -0
  366. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PublicReentrantTokenReceiverMock__factory.ts +164 -0
  367. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PublicTokenReceiverBoolMock__factory.ts +130 -0
  368. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PublicTokenReceiverMock__factory.ts +102 -0
  369. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/index.ts +9 -0
  370. package/typechain-types/factories/contracts/mocks/token/PrivateERC721/PrivateERC721URIStorageMock__factory.ts +1 -1
  371. package/typechain-types/factories/contracts/mocks/token/index.ts +2 -0
  372. package/typechain-types/factories/contracts/mocks/utils/mpc/Arithmetic128TestsContract__factory.ts +1 -1
  373. package/typechain-types/factories/contracts/mocks/utils/mpc/Arithmetic256TestsContract__factory.ts +1 -1
  374. package/typechain-types/factories/contracts/mocks/utils/mpc/ArithmeticTestsContract__factory.ts +1 -1
  375. package/typechain-types/factories/contracts/mocks/utils/mpc/Bitwise128TestsContract__factory.ts +1 -1
  376. package/typechain-types/factories/contracts/mocks/utils/mpc/Bitwise256TestsContract__factory.ts +1 -1
  377. package/typechain-types/factories/contracts/mocks/utils/mpc/BitwiseTestsContract__factory.ts +1 -1
  378. package/typechain-types/factories/contracts/mocks/utils/mpc/CheckedArithmetic128WithOverflowBitTestsContract__factory.ts +1 -1
  379. package/typechain-types/factories/contracts/mocks/utils/mpc/CheckedArithmetic256WithOverflowBitTestsContract__factory.ts +1 -1
  380. package/typechain-types/factories/contracts/mocks/utils/mpc/CheckedArithmeticWIthOverflowBitTestsContract.sol/CheckedArithmeticWithOverflowBitTestsContract__factory.ts +1 -1
  381. package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison128TestsContract__factory.ts +1 -1
  382. package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison1TestsContract__factory.ts +1 -1
  383. package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison256TestsContract__factory.ts +1 -1
  384. package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison2TestsContract__factory.ts +1 -1
  385. package/typechain-types/factories/contracts/mocks/utils/mpc/MinMax128TestsContract__factory.ts +1 -1
  386. package/typechain-types/factories/contracts/mocks/utils/mpc/MinMax256TestsContract__factory.ts +1 -1
  387. package/typechain-types/factories/contracts/mocks/utils/mpc/MinMaxTestsContract__factory.ts +1 -1
  388. package/typechain-types/factories/contracts/mocks/utils/mpc/MinimalImplementation__factory.ts +1 -1
  389. package/typechain-types/factories/contracts/mocks/utils/mpc/MinimalProxy__factory.ts +1 -1
  390. package/typechain-types/factories/contracts/mocks/utils/mpc/Miscellaneous1TestsContract__factory.ts +1 -1
  391. package/typechain-types/factories/contracts/mocks/utils/mpc/MiscellaneousTestsContract__factory.ts +1 -1
  392. package/typechain-types/factories/contracts/mocks/utils/mpc/MpcOperations128TestContract__factory.ts +1 -1
  393. package/typechain-types/factories/contracts/mocks/utils/mpc/MpcOperationsTestContract__factory.ts +1 -1
  394. package/typechain-types/factories/contracts/mocks/utils/mpc/Mux128TestsContract__factory.ts +1 -1
  395. package/typechain-types/factories/contracts/mocks/utils/mpc/Mux256TestsContract__factory.ts +1 -1
  396. package/typechain-types/factories/contracts/mocks/utils/mpc/OffboardToUserKeyTestContract__factory.ts +1 -1
  397. package/typechain-types/factories/contracts/mocks/utils/mpc/OnBoard128TestsContract__factory.ts +1 -1
  398. package/typechain-types/factories/contracts/mocks/utils/mpc/OnBoard256TestsContract__factory.ts +1 -1
  399. package/typechain-types/factories/contracts/mocks/utils/mpc/PrivacyImplementationV1__factory.ts +1 -1
  400. package/typechain-types/factories/contracts/mocks/utils/mpc/PrivacyImplementationV2__factory.ts +1 -1
  401. package/typechain-types/factories/contracts/mocks/utils/mpc/PrivacyProxy__factory.ts +1 -1
  402. package/typechain-types/factories/contracts/mocks/utils/mpc/Random128TestsContract__factory.ts +1 -1
  403. package/typechain-types/factories/contracts/mocks/utils/mpc/Random256TestsContract__factory.ts +1 -1
  404. package/typechain-types/factories/contracts/mocks/utils/mpc/Shift128TestsContract__factory.ts +1 -1
  405. package/typechain-types/factories/contracts/mocks/utils/mpc/Shift256TestsContract__factory.ts +1 -1
  406. package/typechain-types/factories/contracts/mocks/utils/mpc/ShiftTestsContract__factory.ts +1 -1
  407. package/typechain-types/factories/contracts/mocks/utils/mpc/StringTestsContract__factory.ts +1 -1
  408. package/typechain-types/factories/contracts/mocks/utils/mpc/Transfer128TestsContract__factory.ts +1 -1
  409. package/typechain-types/factories/contracts/mocks/utils/mpc/Transfer256TestsContract__factory.ts +1 -1
  410. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferScalarTestsContract__factory.ts +1 -1
  411. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferTestsContract__factory.ts +1 -1
  412. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance128TestsContract__factory.ts +1 -1
  413. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance256TestsContract__factory.ts +1 -1
  414. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance64_16TestsContract__factory.ts +1 -1
  415. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance64_32TestsContract__factory.ts +1 -1
  416. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance64_64TestsContract__factory.ts +1 -1
  417. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowance64_8TestsContract__factory.ts +1 -1
  418. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowanceScalarTestsContract__factory.ts +1 -1
  419. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferWithAllowanceTestsContract__factory.ts +1 -1
  420. package/typechain-types/factories/contracts/mocks/utils/mpc/ValidateCiphertext128TestsContract__factory.ts +1 -1
  421. package/typechain-types/factories/contracts/mocks/utils/mpc/ValidateCiphertext256TestsContract__factory.ts +1 -1
  422. package/typechain-types/factories/contracts/mocks/utils/mpc/ValidateCiphertextTestsContract__factory.ts +1 -1
  423. package/typechain-types/factories/contracts/mocks/wallet/PrivateERC20Wallet/PrivateERC20WalletMock__factory.ts +4 -22
  424. package/typechain-types/factories/contracts/node/CotiNodeRewards__factory.ts +576 -0
  425. package/typechain-types/factories/contracts/node/SoulboundNodeNFT.sol/IERC5192__factory.ts +54 -0
  426. package/typechain-types/factories/contracts/node/SoulboundNodeNFT.sol/SoulboundNodeNFT__factory.ts +1072 -0
  427. package/typechain-types/factories/contracts/node/SoulboundNodeNFT.sol/index.ts +5 -0
  428. package/typechain-types/factories/contracts/node/index.ts +5 -0
  429. package/typechain-types/factories/contracts/onboard/AccountOnboard__factory.ts +1 -1
  430. package/typechain-types/factories/contracts/oracle/CotiPriceConsumer__factory.ts +295 -0
  431. package/typechain-types/factories/contracts/oracle/ICotiPriceConsumer__factory.ts +73 -0
  432. package/typechain-types/factories/contracts/oracle/IStdReference__factory.ts +107 -0
  433. package/typechain-types/factories/contracts/oracle/index.ts +6 -0
  434. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeCotiNative__factory.ts +1753 -0
  435. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeERC20.sol/IHasDecimals__factory.ts +38 -0
  436. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeERC20.sol/PrivacyBridgeERC20__factory.ts +1766 -0
  437. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeERC20.sol/index.ts +5 -0
  438. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeUSDCe__factory.ts +1870 -0
  439. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeUSDT__factory.ts +1870 -0
  440. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeWADA__factory.ts +1870 -0
  441. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeWBTC__factory.ts +1870 -0
  442. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgeWETH__factory.ts +1870 -0
  443. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridge__factory.ts +1444 -0
  444. package/typechain-types/factories/contracts/privacyBridge/PrivacyBridgegCoti__factory.ts +1870 -0
  445. package/typechain-types/factories/contracts/privacyBridge/index.ts +12 -0
  446. package/typechain-types/factories/contracts/token/PrivateERC20/IPrivateERC20__factory.ts +481 -35
  447. package/typechain-types/factories/contracts/token/PrivateERC20/ITokenReceiverEncrypted__factory.ts +53 -0
  448. package/typechain-types/factories/contracts/token/PrivateERC20/ITokenReceiver__factory.ts +54 -0
  449. package/typechain-types/factories/contracts/token/PrivateERC20/PrivateERC20__factory.ts +812 -52
  450. package/typechain-types/factories/contracts/token/PrivateERC20/index.ts +3 -0
  451. package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateBridgedUSDC__factory.ts +1471 -0
  452. package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateCOTITreasuryGovernanceToken__factory.ts +1477 -0
  453. package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateCOTI__factory.ts +1468 -0
  454. package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateTetherUSD__factory.ts +1471 -0
  455. package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateWrappedADA__factory.ts +1471 -0
  456. package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateWrappedBTC__factory.ts +1471 -0
  457. package/typechain-types/factories/contracts/token/PrivateERC20/tokens/PrivateWrappedEther__factory.ts +1477 -0
  458. package/typechain-types/factories/contracts/token/PrivateERC20/tokens/index.ts +10 -0
  459. package/typechain-types/factories/contracts/token/index.ts +1 -0
  460. package/typechain-types/factories/contracts/token/points/CotiTokenPoints004.sol/COTITokenPoints004__factory.ts +992 -0
  461. package/typechain-types/factories/contracts/token/points/CotiTokenPoints004__factory.ts +992 -0
  462. package/typechain-types/factories/contracts/token/points/index.ts +4 -0
  463. package/typechain-types/factories/contracts/utils/mpc/MpcCore__factory.ts +1 -1
  464. package/typechain-types/hardhat.d.ts +1414 -118
  465. package/typechain-types/index.ts +138 -2
  466. package/contracts/mocks/utils/mpc/ArithmeticTestsContract.sol +0 -408
  467. package/typechain-types/contracts/mocks/utils/mpc/Arithmetic128BitTestsContract.ts +0 -341
  468. package/typechain-types/contracts/mocks/utils/mpc/Arithmetic256BitTestsContract.ts +0 -347
  469. package/typechain-types/contracts/mocks/utils/mpc/Bitwise256BitTestsContract.ts +0 -186
  470. package/typechain-types/contracts/mocks/utils/mpc/Comparison128BitTestsContract.ts +0 -260
  471. package/typechain-types/contracts/mocks/utils/mpc/Comparison256BitTestsContract.ts +0 -260
  472. package/typechain-types/contracts/mocks/utils/mpc/Miscellaneous128BitTestsContract.ts +0 -302
  473. package/typechain-types/contracts/mocks/utils/mpc/Miscellaneous256BitTestsContract.ts +0 -322
  474. package/typechain-types/factories/contracts/mocks/utils/mpc/Arithmetic128BitTestsContract__factory.ts +0 -349
  475. package/typechain-types/factories/contracts/mocks/utils/mpc/Arithmetic256BitTestsContract__factory.ts +0 -364
  476. package/typechain-types/factories/contracts/mocks/utils/mpc/Bitwise128BitTestsContract__factory.ts +0 -182
  477. package/typechain-types/factories/contracts/mocks/utils/mpc/Bitwise256BitTestsContract__factory.ts +0 -182
  478. package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison128BitTestsContract__factory.ts +0 -255
  479. package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison256BitTestsContract__factory.ts +0 -255
  480. package/typechain-types/factories/contracts/mocks/utils/mpc/Miscellaneous128BitTestsContract__factory.ts +0 -332
  481. package/typechain-types/factories/contracts/mocks/utils/mpc/Miscellaneous256BitTestsContract__factory.ts +0 -380
@@ -0,0 +1,1021 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.20;
3
+
4
+ import "../../InboxUser.sol";
5
+ import "../../fee/IInboxFeeManager.sol";
6
+ import "../../mpccodec/MpcAbiCodec.sol";
7
+ import "@openzeppelin/contracts/access/Ownable.sol";
8
+ import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
9
+ import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
10
+ import "./IPodERC20.sol";
11
+ import "./cotiside/IPodErc20CotiSide.sol";
12
+ import "../erc7984/PodErc7984Mixin.sol";
13
+
14
+ /// @title PodERC20
15
+ /// @notice PoD-side private ERC-20: ciphertext cache and inbox-mediated async moves; COTI holds authoritative garbled state via {IPodErc20CotiSide}.
16
+ /// @dev Callbacks only from `inbox` when the remote peer matches (`cotiChainId`, `cotiSideContract`). Public-amount methods expose amounts in calldata and logs; use encrypted `itUint256` entry points for privacy-sensitive flows.
17
+ /// {_sendPodTwoWay} is `nonReentrant` so a compromised inbox/oracle cannot re-enter before pending locks are written.
18
+ /// Uses storage `ReentrancyGuard` (not transient) so the whole tree can compile for Paris — COTI rejects Shanghai `PUSH0`.
19
+ /// Owner may rotate inbox / COTI peer via {configure}.
20
+ contract PodERC20 is IPodERC20, InboxUser, PodErc7984Mixin, ReentrancyGuard, Ownable {
21
+ using MpcAbiCodec for MpcAbiCodec.MpcMethodCallContext;
22
+
23
+ // --- State variables ---
24
+
25
+ uint256 public cotiChainId;
26
+ address public cotiSideContract;
27
+ string public name;
28
+ string public symbol;
29
+ uint8 public decimals;
30
+ uint256 public totalSupply;
31
+ bool private _podERC20Initialized;
32
+ /// @notice Nonces consumed by public transfer permits verified on PoD.
33
+ mapping(address => uint256) public nonces;
34
+
35
+ /// @dev Rough calldata size for the remote MPC method (itUint256 + two addresses or similar). Matches the test harness default.
36
+ uint256 private constant FEE_ESTIMATE_REMOTE_CALL_SIZE = 512;
37
+ /// @dev Rough calldata size for the PoD callback payload (`transferCallback`/`approveCallback`).
38
+ uint256 private constant FEE_ESTIMATE_CALLBACK_CALL_SIZE = 512;
39
+ /// @dev Headroom for COTI-side MPC execution (onBoard/sub/add/offBoard round-trip).
40
+ uint256 private constant FEE_ESTIMATE_REMOTE_EXEC_GAS = 300_000;
41
+ /// @dev Headroom for PoD callback execution (decode + storage writes).
42
+ uint256 private constant FEE_ESTIMATE_CALLBACK_EXEC_GAS = 300_000;
43
+ bytes32 private constant PUBLIC_TRANSFER_PERMIT_TYPEHASH =
44
+ keccak256("TransferPermit(address owner,address spender,address to,uint256 value,uint256 nonce,uint256 deadline)");
45
+ bytes32 private constant DOMAIN_TYPEHASH =
46
+ keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");
47
+ bytes32 private constant PERMIT_DOMAIN_VERSION_HASH = keccak256("1");
48
+ mapping(address => ctUint256) private _balances;
49
+ mapping(address => mapping(address => IPodERC20.Allowance)) private _allowance;
50
+ /// @dev One in-flight transfer or burn per sender; mints lock the recipient until callback.
51
+ mapping(address => bytes32) private _pendingTransferRequestIds;
52
+ mapping(address => mapping(address => bytes32)) private _pendingApprovalRequestIds;
53
+ /// @dev Optional `transferAndCall` payload keyed by inbox `sourceRequestId`, cleared after callback.
54
+ mapping(bytes32 => bytes) private _requestCallbacks;
55
+ /// @dev Status plus lock metadata (for system-error clear when payload has no accounts).
56
+ /// See {IPodERC20.RequestRecord}.
57
+ mapping(bytes32 => IPodERC20.RequestRecord) private _requests;
58
+ mapping(bytes32 => bytes) public failedRequests;
59
+ /// @dev Monotonic nonce from COTI; stale callbacks do not overwrite newer balances.
60
+ mapping(address => uint256) public balanceNonces;
61
+
62
+ // --- Events (PoD-specific; {Transfer}, {Approval}, etc. are declared on {IPodERC20}) ---
63
+
64
+ /// @notice Async transfer request was submitted to COTI.
65
+ event TransferRequestSubmitted(address indexed from, address indexed to, bytes32 requestId);
66
+ /// @notice Async approval request was submitted to COTI.
67
+ event ApprovalRequestSubmitted(address indexed owner, address indexed spender, bytes32 requestId);
68
+ /// @notice Async approval request failed on COTI.
69
+ event ApprovalFailed(address indexed owner, address indexed spender, bytes errorMsg);
70
+ /// @notice Async balance-sync request failed on COTI.
71
+ event SyncBalancesFailed(bytes32 requestId, bytes errorMsg);
72
+ /// @notice Async balance-sync request was submitted for accounts.
73
+ event SyncBalancesRequested(address[] accounts, bytes32 requestId);
74
+ /// @notice Inbox delivered a system error (encode/validateCiphertext); COTI app never ran; not retryable.
75
+ event SystemRequestFailed(bytes32 indexed requestId, uint64 errorCode, bytes errorMessage);
76
+
77
+ // --- Errors ---
78
+
79
+ /// @notice A transfer or burn lock already exists for the sender (or mint lock for the recipient).
80
+ error TransferAlreadyPending(address from, address to, bytes32 requestId);
81
+ /// @notice An approval lock already exists for the owner/spender pair.
82
+ error ApprovalAlreadyPending(address owner, address spender, bytes32 requestId);
83
+ /// @notice Inbox caller was not the configured COTI-side peer.
84
+ error OnlyCotiSideContract(uint256 remoteChainId, address remoteContract);
85
+ /// @notice Error callback invoked outside a system-error or app-raise delivery context.
86
+ error UnexpectedErrorContext();
87
+ /// @notice Error delivery has no linked source request id.
88
+ error ErrorRequestNotLinked();
89
+ /// @notice Linked source request is not Pending (already settled or unknown).
90
+ error ErrorRequestNotPending(bytes32 requestId, IPodERC20.RequestStatus status);
91
+ /// @notice Thrown by the default {_checkMinter} hook; subclasses (e.g. {PodErc20Mintable}) can override to allow minting.
92
+ error MintNotAllowed(address caller);
93
+ /// @notice Clone storage was already initialized.
94
+ error PodERC20AlreadyInitialized();
95
+ /// @notice Initializer received an invalid zero address or chain id.
96
+ error PodERC20InvalidInitialization();
97
+ /// @notice Public transfer permit deadline has passed.
98
+ error PermitExpired(uint256 deadline);
99
+ /// @notice Public transfer permit signer did not match the owner.
100
+ error InvalidPermitSigner(address signer, address owner);
101
+
102
+ // --- Constructor ---
103
+
104
+ /**
105
+ * @param _cotiChainId Chain id of COTI; must match {IInbox.inboxMsgSender} when the peer calls back.
106
+ * @param _inbox Cross-chain inbox used for two-way messages (also sets {InboxUser.inbox}).
107
+ * @param _cotiSideContract Deployed {IPodErc20CotiSide} this token talks to on COTI.
108
+ * @param _name ERC-20 name string (public metadata on PoD).
109
+ * @param _symbol ERC-20 symbol string (public metadata on PoD).
110
+ */
111
+ constructor(
112
+ uint256 _cotiChainId,
113
+ address _inbox,
114
+ address _cotiSideContract,
115
+ string memory _name,
116
+ string memory _symbol
117
+ ) Ownable(address(1)) {
118
+ _initializePodERC20(_cotiChainId, _inbox, _cotiSideContract, _name, _symbol);
119
+ // Direct deploys take ownership here. Factory clones never run this constructor; {PodErc20MintableInitializable.initialize} sets the owner.
120
+ _transferOwnership(msg.sender);
121
+ }
122
+
123
+ /// @notice Accept native funds used to pay inbox fees for async pToken operations.
124
+ /// @dev `_sendPodTwoWay` may spend existing contract balance, so operational tooling can pre-fund this token for auto-fee flows.
125
+ receive() external payable {}
126
+
127
+ /// @notice Owner-only: set inbox when `inbox_ != address(0)`; always updates COTI peer. {cotiChainId} is fixed at init.
128
+ /// @param inbox_ New inbox address, or zero to leave the existing inbox unchanged.
129
+ /// @param cotiSideContract_ New COTI-side ledger / MPC peer address.
130
+ function configure(address inbox_, address cotiSideContract_) external onlyOwner {
131
+ if (cotiSideContract_ == address(0)) {
132
+ revert PodERC20InvalidInitialization();
133
+ }
134
+ if (inbox_ != address(0)) {
135
+ setInbox(inbox_);
136
+ }
137
+ cotiSideContract = cotiSideContract_;
138
+ }
139
+
140
+ // --- External: mutating (user / admin) ---
141
+
142
+ /**
143
+ * @inheritdoc IPodERC20
144
+ * @dev **Gotcha:** reverts if either party already has a pending transfer. **Gotcha:** `TransferRequestSubmitted` indexes
145
+ * `msg.sender` as `from`, not the `from` argument of internal `_transfer` (same for direct `transfer`).
146
+ */
147
+ function transfer(address to, itUint256 calldata value, uint256 callbackFeeLocalWei) external payable returns (bytes32 requestId) {
148
+ return _transfer(IPodErc20CotiSide.transfer.selector, msg.sender, to, value, msg.value, callbackFeeLocalWei);
149
+ }
150
+
151
+ /// @inheritdoc IPodERC20
152
+ function transfer(address to, itUint256 calldata value) external payable returns (bytes32 requestId) {
153
+ (, uint256 callbackFeeLocalWei) = _estimateTwoWayFeeInLocalToken();
154
+ return _transfer(IPodErc20CotiSide.transfer.selector, msg.sender, to, value, msg.value, callbackFeeLocalWei);
155
+ }
156
+
157
+ /// @inheritdoc IPodERC20
158
+ function transferFrom(address from, address to, itUint256 calldata value, uint256 callbackFeeLocalWei) external payable returns (bytes32 requestId) {
159
+ return _transferFrom(IPodErc20CotiSide.transferFromAsSpender.selector, msg.sender, from, to, value, msg.value, callbackFeeLocalWei);
160
+ }
161
+
162
+ /// @inheritdoc IPodERC20
163
+ function transferFrom(address from, address to, itUint256 calldata value) external payable returns (bytes32 requestId) {
164
+ (, uint256 callbackFeeLocalWei) = _estimateTwoWayFeeInLocalToken();
165
+ return _transferFrom(IPodErc20CotiSide.transferFromAsSpender.selector, msg.sender, from, to, value, msg.value, callbackFeeLocalWei);
166
+ }
167
+
168
+ /**
169
+ * @inheritdoc IPodERC20
170
+ * @dev Stores `data` under the new `requestId` until {transferCallback} runs successfully and forwards it to `to`.
171
+ */
172
+ function transferAndCall(
173
+ address to,
174
+ itUint256 calldata amount,
175
+ bytes calldata data,
176
+ uint256 callbackFeeLocalWei
177
+ ) external payable returns (bytes32 requestId) {
178
+ requestId = _transfer(IPodErc20CotiSide.transfer.selector, msg.sender, to, amount, msg.value, callbackFeeLocalWei);
179
+ _requestCallbacks[requestId] = data;
180
+ return requestId;
181
+ }
182
+
183
+ /// @inheritdoc IPodERC20
184
+ function transferFromAndCall(
185
+ address from,
186
+ address to,
187
+ uint256 amount,
188
+ bytes calldata data,
189
+ uint256 callbackFeeLocalWei
190
+ ) external payable returns (bytes32 requestId) {
191
+ requestId = _transferPublicFrom(
192
+ IPodErc20CotiSide.transferFromPublicAsSpender.selector,
193
+ msg.sender,
194
+ from,
195
+ to,
196
+ amount,
197
+ msg.value,
198
+ callbackFeeLocalWei
199
+ );
200
+ _requestCallbacks[requestId] = data;
201
+ }
202
+
203
+ /// @inheritdoc IPodERC20
204
+ function transferFromAndCallWithPermit(
205
+ address from,
206
+ address to,
207
+ uint256 amount,
208
+ PublicPermit calldata permit,
209
+ bytes calldata data,
210
+ uint256 callbackFeeLocalWei
211
+ ) external payable returns (bytes32 requestId) {
212
+ requestId = _transferPublicFromWithPermit(
213
+ msg.sender,
214
+ from,
215
+ to,
216
+ amount,
217
+ permit,
218
+ msg.value,
219
+ callbackFeeLocalWei
220
+ );
221
+ _requestCallbacks[requestId] = data;
222
+ }
223
+
224
+ /// @inheritdoc IPodERC20
225
+ function approve(address spender, itUint256 calldata value, uint256 callbackFeeLocalWei) external payable returns (bytes32 requestId) {
226
+ return _approve(msg.sender, spender, value, msg.value, callbackFeeLocalWei);
227
+ }
228
+
229
+ /// @inheritdoc IPodERC20
230
+ function approve(address spender, itUint256 calldata value) external payable returns (bytes32 requestId) {
231
+ (, uint256 callbackFeeLocalWei) = _estimateTwoWayFeeInLocalToken();
232
+ return _approve(msg.sender, spender, value, msg.value, callbackFeeLocalWei);
233
+ }
234
+
235
+ /// @inheritdoc IPodERC20
236
+ function burn(itUint256 calldata value, uint256 callbackFeeLocalWei) external payable returns (bytes32 requestId) {
237
+ return _burn(msg.sender, value, msg.value, callbackFeeLocalWei);
238
+ }
239
+
240
+ /// @inheritdoc IPodERC20
241
+ function mint(address to, itUint256 calldata amount, uint256 callbackFeeLocalWei) external payable returns (bytes32 requestId) {
242
+ _checkMinter();
243
+ return _mint(to, amount, msg.value, callbackFeeLocalWei);
244
+ }
245
+
246
+ // --- External: mutating (plain uint256 variants) ---
247
+
248
+ /// @inheritdoc IPodERC20
249
+ function transfer(address to, uint256 amount, uint256 callbackFeeLocalWei) external payable returns (bytes32 requestId) {
250
+ return _transferPublic(IPodErc20CotiSide.transferPublic.selector, msg.sender, to, amount, msg.value, callbackFeeLocalWei);
251
+ }
252
+
253
+ /// @inheritdoc IPodERC20
254
+ function transferFrom(address from, address to, uint256 amount, uint256 callbackFeeLocalWei) external payable returns (bytes32 requestId) {
255
+ return _transferPublicFrom(IPodErc20CotiSide.transferFromPublicAsSpender.selector, msg.sender, from, to, amount, msg.value, callbackFeeLocalWei);
256
+ }
257
+
258
+ /// @inheritdoc IPodERC20
259
+ function approve(address spender, uint256 amount, uint256 callbackFeeLocalWei) external payable returns (bytes32 requestId) {
260
+ return _approvePublic(msg.sender, spender, amount, msg.value, callbackFeeLocalWei);
261
+ }
262
+
263
+ /// @inheritdoc IPodERC20
264
+ function burn(uint256 amount, uint256 callbackFeeLocalWei) external payable returns (bytes32 requestId) {
265
+ return _burnPublic(msg.sender, amount, msg.value, callbackFeeLocalWei);
266
+ }
267
+
268
+ /// @inheritdoc IPodERC20
269
+ function mint(address to, uint256 amount, uint256 callbackFeeLocalWei) external payable returns (bytes32 requestId) {
270
+ _checkMinter();
271
+ return _mintPublic(to, amount, msg.value, callbackFeeLocalWei);
272
+ }
273
+
274
+ /**
275
+ * @inheritdoc IPodERC20
276
+ * @dev Does not record a “pending” flag per account for sync; only transfers/burns use the pending-transfer map.
277
+ */
278
+ function syncBalances(address[] calldata accounts, uint256 callbackFeeLocalWei) external payable returns (bytes32 requestId) {
279
+ IInbox.MpcMethodCall memory mpcMethodCall = MpcAbiCodec.create(IPodErc20CotiSide.syncBalances.selector, 1)
280
+ .addArgument(accounts)
281
+ .build();
282
+
283
+ requestId = _sendPodTwoWay(
284
+ msg.value,
285
+ callbackFeeLocalWei,
286
+ mpcMethodCall,
287
+ PodERC20.syncBalancesCallback.selector,
288
+ PodERC20.syncBalancesError.selector
289
+ );
290
+ _setRequestStatus(requestId, IPodERC20.RequestStatus.Pending);
291
+ emit SyncBalancesRequested(accounts, requestId);
292
+ }
293
+
294
+ // --- External: inbox callbacks (success) ---
295
+
296
+ /**
297
+ * @notice Applies post-transfer ciphertext balances and optional `transferAndCall` hook.
298
+ * @dev **Gotcha:** balance updates apply only when `nonce` exceeds {balanceNonces}; replays with old nonces are ignored.
299
+ * COTI {PodErc20CotiMother} starts per-token callback nonces at 1 on registration so the first update applies.
300
+ * **Gotcha:** `to.call(callbackData)` uses all remaining gas; failures emit {RequestCallbackFailed} only.
301
+ */
302
+ function transferCallback(bytes memory data) external onlyInbox {
303
+ (uint256 remoteChainId, address remoteContract) = inbox.inboxMsgSender();
304
+ if (remoteChainId != cotiChainId || remoteContract != cotiSideContract) {
305
+ revert OnlyCotiSideContract(remoteChainId, remoteContract);
306
+ }
307
+ bytes32 sourceRequestId = inbox.inboxSourceRequestId();
308
+ _setRequestStatus(sourceRequestId, IPodERC20.RequestStatus.Success);
309
+ (
310
+ address from,
311
+ ctUint256 memory newBalanceFrom,
312
+ ctUint256 memory senderValue,
313
+ address to,
314
+ ctUint256 memory newBalanceTo,
315
+ ctUint256 memory receiverValue,
316
+ uint256 nonce
317
+ ) = abi.decode(data, (address, ctUint256, ctUint256, address, ctUint256, ctUint256, uint256));
318
+ _clearPendingByRequestId(sourceRequestId);
319
+ if (from != address(0)) {
320
+ if (balanceNonces[from] < nonce) {
321
+ _balances[from] = newBalanceFrom;
322
+ balanceNonces[from] = nonce;
323
+ }
324
+ }
325
+ if (to != address(0)) {
326
+ if (balanceNonces[to] < nonce) {
327
+ _balances[to] = newBalanceTo;
328
+ balanceNonces[to] = nonce;
329
+ }
330
+ }
331
+ bytes memory callbackData = _requestCallbacks[sourceRequestId];
332
+ emit Transfer(from, to, senderValue, receiverValue);
333
+ _emitConfidentialTransfer(from, to, senderValue, receiverValue);
334
+ if (callbackData.length != 0) {
335
+ (bool success, ) = address(to).call(callbackData);
336
+ if (success) {
337
+ delete _requestCallbacks[sourceRequestId];
338
+ } else {
339
+ emit RequestCallbackFailed(from, to, sourceRequestId, callbackData);
340
+ }
341
+ }
342
+ }
343
+
344
+ /**
345
+ * @notice Writes new allowance ciphertext after COTI approved the request.
346
+ * @dev Clears the pending approval slot for `(owner, spender)`.
347
+ */
348
+ function approveCallback(bytes memory data) external onlyInbox {
349
+ (uint256 remoteChainId, address remoteContract) = inbox.inboxMsgSender();
350
+ if (remoteChainId != cotiChainId || remoteContract != cotiSideContract) {
351
+ revert OnlyCotiSideContract(remoteChainId, remoteContract);
352
+ }
353
+ bytes32 sourceRequestId = inbox.inboxSourceRequestId();
354
+ _setRequestStatus(sourceRequestId, IPodERC20.RequestStatus.Success);
355
+ (address owner, ctUint256 memory ownerAmount, address spender, ctUint256 memory spenderAmount) = abi.decode(
356
+ data,
357
+ (address, ctUint256, address, ctUint256)
358
+ );
359
+ _clearPendingByRequestId(sourceRequestId);
360
+ _allowance[owner][spender] = Allowance({spenderCiphertext: spenderAmount, ownerCiphertext: ownerAmount});
361
+ emit Approval(owner, spender, ownerAmount, spenderAmount);
362
+ }
363
+
364
+ /**
365
+ * @notice Applies batched balance ciphertexts from COTI after `syncBalances`.
366
+ * @dev Per-account update only if `nonce` is newer than {balanceNonces}; emits {BalanceSynced} for each update applied.
367
+ * COTI callback nonces start at 1 when the pToken namespace is registered on the mother.
368
+ */
369
+ function syncBalancesCallback(bytes memory data) external onlyInbox {
370
+ (uint256 remoteChainId, address remoteContract) = inbox.inboxMsgSender();
371
+ if (remoteChainId != cotiChainId || remoteContract != cotiSideContract) {
372
+ revert OnlyCotiSideContract(remoteChainId, remoteContract);
373
+ }
374
+ bytes32 sourceRequestId = inbox.inboxSourceRequestId();
375
+ _setRequestStatus(sourceRequestId, IPodERC20.RequestStatus.Success);
376
+ (address[] memory addresses, ctUint256[] memory amounts, uint256 nonce) = abi.decode(
377
+ data,
378
+ (address[], ctUint256[], uint256)
379
+ );
380
+ for (uint256 i = 0; i < addresses.length; i++) {
381
+ if (balanceNonces[addresses[i]] < nonce) {
382
+ _balances[addresses[i]] = amounts[i];
383
+ balanceNonces[addresses[i]] = nonce;
384
+ emit BalanceSynced(addresses[i], amounts[i]);
385
+ }
386
+ }
387
+ }
388
+
389
+ // --- External: inbox callbacks (errors) ---
390
+ //
391
+ // Pattern for `errorSelector(bytes data)` — system and app `raise` share this entrypoint:
392
+ // 1. Auth: onlyInbox; _errorCallbackContext() reverts unless SystemError/Exception + Pending link.
393
+ // 2. Branch on inboxErrorType():
394
+ // SystemError → {IInbox.ErrorData}: abi.encode(uint64 code, bytes message)
395
+ // Exception → dApp raise layout for this selector
396
+
397
+ /// @notice Clears pending transfer/mint/burn state after COTI failure.
398
+ function transferError(bytes memory data) external onlyInbox {
399
+ (IInbox.InboxErrorType errType, bytes32 sourceRequestId) = _errorCallbackContext();
400
+ if (errType == IInbox.InboxErrorType.SystemError) {
401
+ _handleSystemError(sourceRequestId, data);
402
+ return;
403
+ }
404
+ (address from, address to, bytes memory errorMsg) = abi.decode(data, (address, address, bytes));
405
+ _setRequestStatus(sourceRequestId, IPodERC20.RequestStatus.Failed);
406
+ failedRequests[sourceRequestId] = errorMsg;
407
+ _clearPendingByRequestId(sourceRequestId);
408
+ emit TransferFailed(from, to, errorMsg);
409
+ }
410
+
411
+ /// @notice Clears pending approval state after COTI failure.
412
+ function approveError(bytes memory data) external onlyInbox {
413
+ (IInbox.InboxErrorType errType, bytes32 sourceRequestId) = _errorCallbackContext();
414
+ if (errType == IInbox.InboxErrorType.SystemError) {
415
+ _handleSystemError(sourceRequestId, data);
416
+ return;
417
+ }
418
+ (address owner, address spender, bytes memory errorMsg) = abi.decode(data, (address, address, bytes));
419
+ _setRequestStatus(sourceRequestId, IPodERC20.RequestStatus.Failed);
420
+ failedRequests[sourceRequestId] = errorMsg;
421
+ _clearPendingByRequestId(sourceRequestId);
422
+ emit ApprovalFailed(owner, spender, errorMsg);
423
+ }
424
+
425
+ /// @notice Marks sync failed after COTI failure.
426
+ function syncBalancesError(bytes memory data) external onlyInbox {
427
+ (IInbox.InboxErrorType errType, bytes32 sourceRequestId) = _errorCallbackContext();
428
+ if (errType == IInbox.InboxErrorType.SystemError) {
429
+ _handleSystemError(sourceRequestId, data);
430
+ return;
431
+ }
432
+ _setRequestStatus(sourceRequestId, IPodERC20.RequestStatus.Failed);
433
+ failedRequests[sourceRequestId] = data;
434
+ emit SyncBalancesFailed(sourceRequestId, data);
435
+ }
436
+
437
+ // --- External: views ---
438
+
439
+ /// @inheritdoc IPodERC20
440
+ function requests(bytes32 requestId) external view returns (IPodERC20.RequestRecord memory) {
441
+ return _requests[requestId];
442
+ }
443
+
444
+ /// @inheritdoc IPodERC20
445
+ function balanceOf(address account) external view returns (ctUint256 memory) {
446
+ return _balances[account];
447
+ }
448
+
449
+ /// @inheritdoc IPodERC20
450
+ function balanceOfWithStatus(address account) external view returns (ctUint256 memory, bool pending) {
451
+ return (_balances[account], _pendingTransferRequestIds[account] != bytes32(0));
452
+ }
453
+
454
+ /// @inheritdoc IPodERC20
455
+ function allowance(address owner, address spender) external view returns (Allowance memory) {
456
+ return _allowance[owner][spender];
457
+ }
458
+
459
+ /// @inheritdoc IPodERC20
460
+ function allowanceWithStatus(
461
+ address owner,
462
+ address spender
463
+ ) external view returns (Allowance memory, bool pending) {
464
+ return (_allowance[owner][spender], _pendingApprovalRequestIds[owner][spender] != bytes32(0));
465
+ }
466
+
467
+ /**
468
+ * @notice Estimate the native fee split used by auto-fee two-way token methods.
469
+ * @return totalFeeWei Sum of target and callback fee estimates.
470
+ * @return targetFeeWei Estimated local-token wei for the remote COTI execution leg.
471
+ * @return callbackFeeWei Estimated local-token wei for the PoD callback leg.
472
+ */
473
+ function estimateFee()
474
+ external
475
+ view
476
+ returns (uint256 totalFeeWei, uint256 targetFeeWei, uint256 callbackFeeWei)
477
+ {
478
+ (targetFeeWei, callbackFeeWei) = _estimateTwoWayFeeInLocalToken();
479
+ totalFeeWei = targetFeeWei + callbackFeeWei;
480
+ }
481
+
482
+ /// @notice EIP-712 domain separator used by {transferFromAndCallWithPermit}.
483
+ function publicTransferPermitDomainSeparator() external view returns (bytes32) {
484
+ return _publicTransferPermitDomainSeparator();
485
+ }
486
+
487
+ // --- Internal ---
488
+
489
+ function _initializePodERC20(
490
+ uint256 _cotiChainId,
491
+ address _inbox,
492
+ address _cotiSideContract,
493
+ string memory _name,
494
+ string memory _symbol
495
+ ) internal {
496
+ _initializePodERC20(_cotiChainId, _inbox, _cotiSideContract, _name, _symbol, 18);
497
+ }
498
+
499
+ function _initializePodERC20(
500
+ uint256 _cotiChainId,
501
+ address _inbox,
502
+ address _cotiSideContract,
503
+ string memory _name,
504
+ string memory _symbol,
505
+ uint8 _decimals
506
+ ) internal {
507
+ if (_podERC20Initialized) {
508
+ revert PodERC20AlreadyInitialized();
509
+ }
510
+ if (_cotiChainId == 0 || _inbox == address(0) || _cotiSideContract == address(0)) {
511
+ revert PodERC20InvalidInitialization();
512
+ }
513
+ _podERC20Initialized = true;
514
+ setInbox(_inbox);
515
+ cotiChainId = _cotiChainId;
516
+ cotiSideContract = _cotiSideContract;
517
+ name = _name;
518
+ symbol = _symbol;
519
+ decimals = _decimals;
520
+ totalSupply = 0;
521
+ }
522
+
523
+ /**
524
+ * @notice Access-control hook invoked by {mint} overloads; base implementation always reverts with {MintNotAllowed}.
525
+ * @dev Override in subclasses (e.g. {PodErc20Mintable}) to whitelist callers. The `msg.sender != address(0)` guard
526
+ * is always true at runtime but hides the unconditional revert from the compiler so callers don't trip the
527
+ * "unreachable code" warning in the base contract.
528
+ */
529
+ function _checkMinter() internal view virtual {
530
+ if (msg.sender != address(0)) {
531
+ revert MintNotAllowed(msg.sender);
532
+ }
533
+ }
534
+
535
+ /// @param totalValueWei Total native payment (e.g. `msg.value`); `callbackFeeLocalWei` is the caller-supplied callback slice.
536
+ function _sendPodTwoWay(
537
+ uint256 totalValueWei,
538
+ uint256 callbackFeeLocalWei,
539
+ IInbox.MpcMethodCall memory mpcMethodCall,
540
+ bytes4 callbackSelector_,
541
+ bytes4 errorSelector_
542
+ ) internal nonReentrant returns (bytes32) {
543
+ require(callbackFeeLocalWei >= 1, "PodERC20: callback fee min");
544
+ require(callbackFeeLocalWei <= totalValueWei, "PodERC20: callback exceeds total");
545
+ require(address(this).balance >= totalValueWei, "PodERC20: inbox fee");
546
+ return IInbox(inbox).sendTwoWayMessage{value: totalValueWei}(
547
+ cotiChainId,
548
+ cotiSideContract,
549
+ mpcMethodCall,
550
+ callbackSelector_,
551
+ errorSelector_,
552
+ callbackFeeLocalWei
553
+ );
554
+ }
555
+
556
+ function _setRequestStatus(bytes32 requestId, IPodERC20.RequestStatus status) internal {
557
+ _requests[requestId].status = status;
558
+ emit RequestStatusUpdated(requestId, status);
559
+ }
560
+
561
+ /// @dev Lock a single account for transfer/burn (`recipientLocked=false`) or mint (`recipientLocked=true`).
562
+ function _lockTransferPending(bytes32 requestId, address locked, bool recipientLocked) internal {
563
+ _pendingTransferRequestIds[locked] = requestId;
564
+ IPodERC20.RequestRecord storage rec = _requests[requestId];
565
+ rec.account = locked;
566
+ rec.spender = address(0);
567
+ rec.recipientLocked = recipientLocked;
568
+ }
569
+
570
+ function _lockApprovalPending(bytes32 requestId, address owner, address spender) internal {
571
+ _pendingApprovalRequestIds[owner][spender] = requestId;
572
+ IPodERC20.RequestRecord storage rec = _requests[requestId];
573
+ rec.account = owner;
574
+ rec.spender = spender;
575
+ rec.recipientLocked = false;
576
+ }
577
+
578
+ function _clearPendingByRequestId(bytes32 requestId) internal {
579
+ IPodERC20.RequestRecord storage rec = _requests[requestId];
580
+ if (rec.spender != address(0)) {
581
+ if (_pendingApprovalRequestIds[rec.account][rec.spender] == requestId) {
582
+ _pendingApprovalRequestIds[rec.account][rec.spender] = bytes32(0);
583
+ }
584
+ } else if (rec.account != address(0)) {
585
+ if (_pendingTransferRequestIds[rec.account] == requestId) {
586
+ _pendingTransferRequestIds[rec.account] = bytes32(0);
587
+ }
588
+ }
589
+ rec.account = address(0);
590
+ rec.spender = address(0);
591
+ rec.recipientLocked = false;
592
+ }
593
+
594
+ /// @dev Apply Inbox system-error payload: {IInbox.ErrorData} = abi.encode(uint64 code, bytes message).
595
+ function _handleSystemError(bytes32 sourceRequestId, bytes memory data) internal {
596
+ (uint64 errorCode, bytes memory errorMessage) = abi.decode(data, (uint64, bytes));
597
+ IPodERC20.RequestRecord storage rec = _requests[sourceRequestId];
598
+ address account = rec.account;
599
+ address spender = rec.spender;
600
+ bool recipientLocked = rec.recipientLocked;
601
+ _setRequestStatus(sourceRequestId, IPodERC20.RequestStatus.SystemFailed);
602
+ failedRequests[sourceRequestId] = data;
603
+ _clearPendingByRequestId(sourceRequestId);
604
+ emit SystemRequestFailed(sourceRequestId, errorCode, errorMessage);
605
+ if (spender != address(0)) {
606
+ emit ApprovalFailed(account, spender, errorMessage);
607
+ } else if (account != address(0) || recipientLocked) {
608
+ emit TransferFailed(
609
+ recipientLocked ? address(0) : account,
610
+ recipientLocked ? account : address(0),
611
+ errorMessage
612
+ );
613
+ } else {
614
+ emit SyncBalancesFailed(sourceRequestId, errorMessage);
615
+ }
616
+ }
617
+
618
+ /// @dev Validates error delivery context. Reverts on every invalid case; never returns a zero request id.
619
+ function _errorCallbackContext()
620
+ internal
621
+ view
622
+ returns (IInbox.InboxErrorType errType, bytes32 sourceRequestId)
623
+ {
624
+ errType = inbox.inboxErrorType();
625
+ if (errType == IInbox.InboxErrorType.NotErrorContext) {
626
+ revert UnexpectedErrorContext();
627
+ }
628
+ if (errType != IInbox.InboxErrorType.SystemError && errType != IInbox.InboxErrorType.Exception) {
629
+ revert UnexpectedErrorContext();
630
+ }
631
+
632
+ sourceRequestId = inbox.inboxSourceRequestId();
633
+ if (sourceRequestId == bytes32(0)) {
634
+ revert ErrorRequestNotLinked();
635
+ }
636
+
637
+ IPodERC20.RequestStatus status = _requests[sourceRequestId].status;
638
+ if (status != IPodERC20.RequestStatus.Pending) {
639
+ revert ErrorRequestNotPending(sourceRequestId, status);
640
+ }
641
+ }
642
+
643
+ function _approve(address owner, address spender, itUint256 calldata value, uint256 totalValueWei, uint256 callbackFeeLocalWei) internal returns (bytes32 requestId) {
644
+ if (_pendingApprovalRequestIds[owner][spender] != bytes32(0)) {
645
+ revert ApprovalAlreadyPending(owner, spender, _pendingApprovalRequestIds[owner][spender]);
646
+ }
647
+ IInbox.MpcMethodCall memory mpcMethodCall = MpcAbiCodec.create(IPodErc20CotiSide.approve.selector, 3)
648
+ .addArgument(owner)
649
+ .addArgument(spender)
650
+ .addArgument(value)
651
+ .build();
652
+
653
+ requestId = _sendPodTwoWay(
654
+ totalValueWei,
655
+ callbackFeeLocalWei,
656
+ mpcMethodCall,
657
+ PodERC20.approveCallback.selector,
658
+ PodERC20.approveError.selector
659
+ );
660
+ _setRequestStatus(requestId, IPodERC20.RequestStatus.Pending);
661
+ _lockApprovalPending(requestId, owner, spender);
662
+ emit ApprovalRequestSubmitted(owner, spender, requestId);
663
+ }
664
+
665
+ function _burn(address from, itUint256 calldata value, uint256 totalValueWei, uint256 callbackFeeLocalWei) internal returns (bytes32 requestId) {
666
+ if (_pendingTransferRequestIds[from] != bytes32(0)) {
667
+ revert TransferAlreadyPending(from, address(0), _pendingTransferRequestIds[from]);
668
+ }
669
+
670
+ IInbox.MpcMethodCall memory mpcMethodCall = MpcAbiCodec.create(IPodErc20CotiSide.burn.selector, 2)
671
+ .addArgument(from)
672
+ .addArgument(value)
673
+ .build();
674
+
675
+ requestId = _sendPodTwoWay(
676
+ totalValueWei,
677
+ callbackFeeLocalWei,
678
+ mpcMethodCall,
679
+ PodERC20.transferCallback.selector,
680
+ PodERC20.transferError.selector
681
+ );
682
+
683
+ _setRequestStatus(requestId, IPodERC20.RequestStatus.Pending);
684
+ _lockTransferPending(requestId, from, false);
685
+ emit TransferRequestSubmitted(from, address(0), requestId);
686
+ }
687
+
688
+ /**
689
+ * @dev Transfers lock only `from`; receivers accept concurrent in-flight credits (nonce ordering on callback).
690
+ */
691
+ function _transfer(
692
+ bytes4 remoteTransferSelector,
693
+ address from,
694
+ address to,
695
+ itUint256 calldata value,
696
+ uint256 totalValueWei,
697
+ uint256 callbackFeeLocalWei
698
+ ) internal returns (bytes32 requestId) {
699
+ if (_pendingTransferRequestIds[from] != bytes32(0)) {
700
+ revert TransferAlreadyPending(from, to, _pendingTransferRequestIds[from]);
701
+ }
702
+
703
+ IInbox.MpcMethodCall memory mpcMethodCall = MpcAbiCodec.create(remoteTransferSelector, 3)
704
+ .addArgument(from)
705
+ .addArgument(to)
706
+ .addArgument(value)
707
+ .build();
708
+
709
+ requestId = _sendPodTwoWay(
710
+ totalValueWei,
711
+ callbackFeeLocalWei,
712
+ mpcMethodCall,
713
+ PodERC20.transferCallback.selector,
714
+ PodERC20.transferError.selector
715
+ );
716
+ _setRequestStatus(requestId, IPodERC20.RequestStatus.Pending);
717
+ _lockTransferPending(requestId, from, false);
718
+ emit TransferRequestSubmitted(msg.sender, to, requestId);
719
+ }
720
+
721
+ function _transferFrom(
722
+ bytes4 remoteTransferSelector,
723
+ address spender,
724
+ address from,
725
+ address to,
726
+ itUint256 calldata value,
727
+ uint256 totalValueWei,
728
+ uint256 callbackFeeLocalWei
729
+ ) internal returns (bytes32 requestId) {
730
+ if (_pendingTransferRequestIds[from] != bytes32(0)) {
731
+ revert TransferAlreadyPending(from, to, _pendingTransferRequestIds[from]);
732
+ }
733
+
734
+ IInbox.MpcMethodCall memory mpcMethodCall = MpcAbiCodec.create(remoteTransferSelector, 4)
735
+ .addArgument(spender)
736
+ .addArgument(from)
737
+ .addArgument(to)
738
+ .addArgument(value)
739
+ .build();
740
+
741
+ requestId = _sendPodTwoWay(
742
+ totalValueWei,
743
+ callbackFeeLocalWei,
744
+ mpcMethodCall,
745
+ PodERC20.transferCallback.selector,
746
+ PodERC20.transferError.selector
747
+ );
748
+ _setRequestStatus(requestId, IPodERC20.RequestStatus.Pending);
749
+ _lockTransferPending(requestId, from, false);
750
+ emit TransferRequestSubmitted(from, to, requestId);
751
+ }
752
+
753
+ /**
754
+ * @notice Shared two-way-fee estimator used by the auto-fee overloads.
755
+ * @dev Uses {InboxFeeManager.calculateTwoWayFeeRequiredInLocalToken} with heuristic calldata/execution sizes.
756
+ * Amounts returned are in local (PoD) wei; the caller must send `msg.value >= targetFeeWei + callbackFeeWei`.
757
+ */
758
+ function _estimateTwoWayFeeInLocalToken()
759
+ internal
760
+ view
761
+ returns (uint256 targetFeeWei, uint256 callbackFeeWei)
762
+ {
763
+ (targetFeeWei, callbackFeeWei) = IInboxFeeManager(address(inbox)).calculateTwoWayFeeRequiredInLocalToken(
764
+ FEE_ESTIMATE_REMOTE_CALL_SIZE,
765
+ FEE_ESTIMATE_CALLBACK_CALL_SIZE,
766
+ FEE_ESTIMATE_REMOTE_EXEC_GAS,
767
+ FEE_ESTIMATE_CALLBACK_EXEC_GAS,
768
+ tx.gasprice
769
+ );
770
+ }
771
+
772
+ function _consumePublicTransferPermit(
773
+ address owner,
774
+ address spender,
775
+ address to,
776
+ uint256 amount,
777
+ PublicPermit calldata permit
778
+ ) internal {
779
+ if (block.timestamp > permit.deadline) {
780
+ revert PermitExpired(permit.deadline);
781
+ }
782
+
783
+ uint256 nonce = nonces[owner];
784
+ bytes32 structHash = keccak256(
785
+ abi.encode(PUBLIC_TRANSFER_PERMIT_TYPEHASH, owner, spender, to, amount, nonce, permit.deadline)
786
+ );
787
+ bytes32 digest = keccak256(abi.encodePacked("\x19\x01", _publicTransferPermitDomainSeparator(), structHash));
788
+ address signer = ECDSA.recover(digest, permit.v, permit.r, permit.s);
789
+ if (signer != owner) {
790
+ revert InvalidPermitSigner(signer, owner);
791
+ }
792
+ nonces[owner] = nonce + 1;
793
+ }
794
+
795
+ function _publicTransferPermitDomainSeparator() internal view returns (bytes32) {
796
+ return keccak256(
797
+ abi.encode(
798
+ DOMAIN_TYPEHASH,
799
+ keccak256(bytes(name)),
800
+ PERMIT_DOMAIN_VERSION_HASH,
801
+ block.chainid,
802
+ address(this)
803
+ )
804
+ );
805
+ }
806
+
807
+ /// @dev Encrypted mint: sends `(to, amount)` to COTI's {IPodErc20CotiSide.mint} and locks `to`'s pending slot.
808
+ function _mint(
809
+ address to,
810
+ itUint256 calldata amount,
811
+ uint256 totalValueWei,
812
+ uint256 callbackFeeLocalWei
813
+ ) internal returns (bytes32 requestId) {
814
+ if (_pendingTransferRequestIds[to] != bytes32(0)) {
815
+ revert TransferAlreadyPending(address(0), to, _pendingTransferRequestIds[to]);
816
+ }
817
+
818
+ IInbox.MpcMethodCall memory mpcMethodCall = MpcAbiCodec.create(IPodErc20CotiSide.mint.selector, 2)
819
+ .addArgument(to)
820
+ .addArgument(amount)
821
+ .build();
822
+
823
+ requestId = _sendPodTwoWay(
824
+ totalValueWei,
825
+ callbackFeeLocalWei,
826
+ mpcMethodCall,
827
+ PodERC20.transferCallback.selector,
828
+ PodERC20.transferError.selector
829
+ );
830
+ _setRequestStatus(requestId, IPodERC20.RequestStatus.Pending);
831
+ _lockTransferPending(requestId, to, true);
832
+ emit TransferRequestSubmitted(address(0), to, requestId);
833
+ }
834
+
835
+ /// @dev Plain-uint256 transfer / transferFrom; sends to `IPodErc20CotiSide.transferPublic` / `transferFromPublic`.
836
+ function _transferPublic(
837
+ bytes4 remoteSelector,
838
+ address from,
839
+ address to,
840
+ uint256 amount,
841
+ uint256 totalValueWei,
842
+ uint256 callbackFeeLocalWei
843
+ ) internal returns (bytes32 requestId) {
844
+ if (_pendingTransferRequestIds[from] != bytes32(0)) {
845
+ revert TransferAlreadyPending(from, to, _pendingTransferRequestIds[from]);
846
+ }
847
+
848
+ IInbox.MpcMethodCall memory mpcMethodCall = MpcAbiCodec.create(remoteSelector, 3)
849
+ .addArgument(from)
850
+ .addArgument(to)
851
+ .addArgument(amount)
852
+ .build();
853
+
854
+ requestId = _sendPodTwoWay(
855
+ totalValueWei,
856
+ callbackFeeLocalWei,
857
+ mpcMethodCall,
858
+ PodERC20.transferCallback.selector,
859
+ PodERC20.transferError.selector
860
+ );
861
+ _setRequestStatus(requestId, IPodERC20.RequestStatus.Pending);
862
+ _lockTransferPending(requestId, from, false);
863
+ emit TransferRequestSubmitted(msg.sender, to, requestId);
864
+ }
865
+
866
+ function _transferPublicFrom(
867
+ bytes4 remoteSelector,
868
+ address spender,
869
+ address from,
870
+ address to,
871
+ uint256 amount,
872
+ uint256 totalValueWei,
873
+ uint256 callbackFeeLocalWei
874
+ ) internal returns (bytes32 requestId) {
875
+ if (_pendingTransferRequestIds[from] != bytes32(0)) {
876
+ revert TransferAlreadyPending(from, to, _pendingTransferRequestIds[from]);
877
+ }
878
+
879
+ IInbox.MpcMethodCall memory mpcMethodCall = MpcAbiCodec.create(remoteSelector, 4)
880
+ .addArgument(spender)
881
+ .addArgument(from)
882
+ .addArgument(to)
883
+ .addArgument(amount)
884
+ .build();
885
+
886
+ requestId = _sendPodTwoWay(
887
+ totalValueWei,
888
+ callbackFeeLocalWei,
889
+ mpcMethodCall,
890
+ PodERC20.transferCallback.selector,
891
+ PodERC20.transferError.selector
892
+ );
893
+ _setRequestStatus(requestId, IPodERC20.RequestStatus.Pending);
894
+ _lockTransferPending(requestId, from, false);
895
+ emit TransferRequestSubmitted(from, to, requestId);
896
+ }
897
+
898
+ function _transferPublicFromWithPermit(
899
+ address spender,
900
+ address from,
901
+ address to,
902
+ uint256 amount,
903
+ PublicPermit calldata permit,
904
+ uint256 totalValueWei,
905
+ uint256 callbackFeeLocalWei
906
+ ) internal returns (bytes32 requestId) {
907
+ if (_pendingTransferRequestIds[from] != bytes32(0)) {
908
+ revert TransferAlreadyPending(from, to, _pendingTransferRequestIds[from]);
909
+ }
910
+ _consumePublicTransferPermit(from, spender, to, amount, permit);
911
+
912
+ IInbox.MpcMethodCall memory mpcMethodCall = MpcAbiCodec.create(IPodErc20CotiSide.transferFromPublic.selector, 3)
913
+ .addArgument(from)
914
+ .addArgument(to)
915
+ .addArgument(amount)
916
+ .build();
917
+
918
+ requestId = _sendPodTwoWay(
919
+ totalValueWei,
920
+ callbackFeeLocalWei,
921
+ mpcMethodCall,
922
+ PodERC20.transferCallback.selector,
923
+ PodERC20.transferError.selector
924
+ );
925
+ _setRequestStatus(requestId, IPodERC20.RequestStatus.Pending);
926
+ _lockTransferPending(requestId, from, false);
927
+ emit TransferRequestSubmitted(from, to, requestId);
928
+ }
929
+
930
+ /// @dev Plain-uint256 approve; sends to `IPodErc20CotiSide.approvePublic`.
931
+ function _approvePublic(
932
+ address owner,
933
+ address spender,
934
+ uint256 amount,
935
+ uint256 totalValueWei,
936
+ uint256 callbackFeeLocalWei
937
+ ) internal returns (bytes32 requestId) {
938
+ if (_pendingApprovalRequestIds[owner][spender] != bytes32(0)) {
939
+ revert ApprovalAlreadyPending(owner, spender, _pendingApprovalRequestIds[owner][spender]);
940
+ }
941
+
942
+ IInbox.MpcMethodCall memory mpcMethodCall = MpcAbiCodec.create(IPodErc20CotiSide.approvePublic.selector, 3)
943
+ .addArgument(owner)
944
+ .addArgument(spender)
945
+ .addArgument(amount)
946
+ .build();
947
+
948
+ requestId = _sendPodTwoWay(
949
+ totalValueWei,
950
+ callbackFeeLocalWei,
951
+ mpcMethodCall,
952
+ PodERC20.approveCallback.selector,
953
+ PodERC20.approveError.selector
954
+ );
955
+ _setRequestStatus(requestId, IPodERC20.RequestStatus.Pending);
956
+ _lockApprovalPending(requestId, owner, spender);
957
+ emit ApprovalRequestSubmitted(owner, spender, requestId);
958
+ }
959
+
960
+ /// @dev Plain-uint256 burn; sends to `IPodErc20CotiSide.burnPublic`.
961
+ function _burnPublic(
962
+ address from,
963
+ uint256 amount,
964
+ uint256 totalValueWei,
965
+ uint256 callbackFeeLocalWei
966
+ ) internal returns (bytes32 requestId) {
967
+ if (_pendingTransferRequestIds[from] != bytes32(0)) {
968
+ revert TransferAlreadyPending(from, address(0), _pendingTransferRequestIds[from]);
969
+ }
970
+
971
+ IInbox.MpcMethodCall memory mpcMethodCall = MpcAbiCodec.create(IPodErc20CotiSide.burnPublic.selector, 2)
972
+ .addArgument(from)
973
+ .addArgument(amount)
974
+ .build();
975
+
976
+ requestId = _sendPodTwoWay(
977
+ totalValueWei,
978
+ callbackFeeLocalWei,
979
+ mpcMethodCall,
980
+ PodERC20.transferCallback.selector,
981
+ PodERC20.transferError.selector
982
+ );
983
+ _setRequestStatus(requestId, IPodERC20.RequestStatus.Pending);
984
+ _lockTransferPending(requestId, from, false);
985
+ emit TransferRequestSubmitted(from, address(0), requestId);
986
+ }
987
+
988
+ /// @dev Plain-uint256 mint; sends to `IPodErc20CotiSide.mintPublic`.
989
+ function _mintPublic(
990
+ address to,
991
+ uint256 amount,
992
+ uint256 totalValueWei,
993
+ uint256 callbackFeeLocalWei
994
+ ) internal returns (bytes32 requestId) {
995
+ if (_pendingTransferRequestIds[to] != bytes32(0)) {
996
+ revert TransferAlreadyPending(address(0), to, _pendingTransferRequestIds[to]);
997
+ }
998
+
999
+ IInbox.MpcMethodCall memory mpcMethodCall = MpcAbiCodec.create(IPodErc20CotiSide.mintPublic.selector, 2)
1000
+ .addArgument(to)
1001
+ .addArgument(amount)
1002
+ .build();
1003
+
1004
+ requestId = _sendPodTwoWay(
1005
+ totalValueWei,
1006
+ callbackFeeLocalWei,
1007
+ mpcMethodCall,
1008
+ PodERC20.transferCallback.selector,
1009
+ PodERC20.transferError.selector
1010
+ );
1011
+ _setRequestStatus(requestId, IPodERC20.RequestStatus.Pending);
1012
+ _lockTransferPending(requestId, to, true);
1013
+ emit TransferRequestSubmitted(address(0), to, requestId);
1014
+ }
1015
+
1016
+ // --- ERC-7984 mixin hooks ---
1017
+
1018
+ function _erc7984BalanceOf(address account) internal view override returns (ctUint256 memory) {
1019
+ return _balances[account];
1020
+ }
1021
+ }