@towns-protocol/web3 0.0.191

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 (327) hide show
  1. package/LICENSE.txt +21 -0
  2. package/README.md +3 -0
  3. package/dist/ContractHelpers.d.ts +18 -0
  4. package/dist/ContractHelpers.d.ts.map +1 -0
  5. package/dist/ContractHelpers.js +75 -0
  6. package/dist/ContractHelpers.js.map +1 -0
  7. package/dist/ContractTypes.d.ts +143 -0
  8. package/dist/ContractTypes.d.ts.map +1 -0
  9. package/dist/ContractTypes.js +65 -0
  10. package/dist/ContractTypes.js.map +1 -0
  11. package/dist/ConvertersEntitlements.d.ts +10 -0
  12. package/dist/ConvertersEntitlements.d.ts.map +1 -0
  13. package/dist/ConvertersEntitlements.js +120 -0
  14. package/dist/ConvertersEntitlements.js.map +1 -0
  15. package/dist/ConvertersRoles.d.ts +8 -0
  16. package/dist/ConvertersRoles.d.ts.map +1 -0
  17. package/dist/ConvertersRoles.js +94 -0
  18. package/dist/ConvertersRoles.js.map +1 -0
  19. package/dist/DelegateRegistry.d.ts +3 -0
  20. package/dist/DelegateRegistry.d.ts.map +1 -0
  21. package/dist/DelegateRegistry.js +72 -0
  22. package/dist/DelegateRegistry.js.map +1 -0
  23. package/dist/EntitlementCache.d.ts +20 -0
  24. package/dist/EntitlementCache.d.ts.map +1 -0
  25. package/dist/EntitlementCache.js +41 -0
  26. package/dist/EntitlementCache.js.map +1 -0
  27. package/dist/EntitlementCache.test.d.ts +5 -0
  28. package/dist/EntitlementCache.test.d.ts.map +1 -0
  29. package/dist/EntitlementCache.test.js +130 -0
  30. package/dist/EntitlementCache.test.js.map +1 -0
  31. package/dist/ISpaceDapp.d.ts +193 -0
  32. package/dist/ISpaceDapp.d.ts.map +1 -0
  33. package/dist/ISpaceDapp.js +2 -0
  34. package/dist/ISpaceDapp.js.map +1 -0
  35. package/dist/IStaticContractsInfo.d.ts +28 -0
  36. package/dist/IStaticContractsInfo.d.ts.map +1 -0
  37. package/dist/IStaticContractsInfo.js +13 -0
  38. package/dist/IStaticContractsInfo.js.map +1 -0
  39. package/dist/LocalhostWeb3Provider.d.ts +15 -0
  40. package/dist/LocalhostWeb3Provider.d.ts.map +1 -0
  41. package/dist/LocalhostWeb3Provider.js +60 -0
  42. package/dist/LocalhostWeb3Provider.js.map +1 -0
  43. package/dist/MockCrossChainEntitlement.d.ts +6 -0
  44. package/dist/MockCrossChainEntitlement.d.ts.map +1 -0
  45. package/dist/MockCrossChainEntitlement.js +104 -0
  46. package/dist/MockCrossChainEntitlement.js.map +1 -0
  47. package/dist/MockERC1155.d.ts +6 -0
  48. package/dist/MockERC1155.d.ts.map +1 -0
  49. package/dist/MockERC1155.js +518 -0
  50. package/dist/MockERC1155.js.map +1 -0
  51. package/dist/MockERC20.d.ts +6 -0
  52. package/dist/MockERC20.d.ts.map +1 -0
  53. package/dist/MockERC20.js +574 -0
  54. package/dist/MockERC20.js.map +1 -0
  55. package/dist/MockERC721A.d.ts +1563 -0
  56. package/dist/MockERC721A.d.ts.map +1 -0
  57. package/dist/MockERC721A.js +1913 -0
  58. package/dist/MockERC721A.js.map +1 -0
  59. package/dist/RiverRegistryFactory.d.ts +5 -0
  60. package/dist/RiverRegistryFactory.d.ts.map +1 -0
  61. package/dist/RiverRegistryFactory.js +5 -0
  62. package/dist/RiverRegistryFactory.js.map +1 -0
  63. package/dist/SpaceDappFactory.d.ts +5 -0
  64. package/dist/SpaceDappFactory.d.ts.map +1 -0
  65. package/dist/SpaceDappFactory.js +8 -0
  66. package/dist/SpaceDappFactory.js.map +1 -0
  67. package/dist/TestCrossChainEntitlement.d.ts +14 -0
  68. package/dist/TestCrossChainEntitlement.d.ts.map +1 -0
  69. package/dist/TestCrossChainEntitlement.js +100 -0
  70. package/dist/TestCrossChainEntitlement.js.map +1 -0
  71. package/dist/TestEthBalance.d.ts +60 -0
  72. package/dist/TestEthBalance.d.ts.map +1 -0
  73. package/dist/TestEthBalance.js +94 -0
  74. package/dist/TestEthBalance.js.map +1 -0
  75. package/dist/TestGatingERC1155.d.ts +17 -0
  76. package/dist/TestGatingERC1155.d.ts.map +1 -0
  77. package/dist/TestGatingERC1155.js +101 -0
  78. package/dist/TestGatingERC1155.js.map +1 -0
  79. package/dist/TestGatingERC20.d.ts +17 -0
  80. package/dist/TestGatingERC20.d.ts.map +1 -0
  81. package/dist/TestGatingERC20.js +149 -0
  82. package/dist/TestGatingERC20.js.map +1 -0
  83. package/dist/TestGatingNFT.d.ts +17 -0
  84. package/dist/TestGatingNFT.d.ts.map +1 -0
  85. package/dist/TestGatingNFT.js +140 -0
  86. package/dist/TestGatingNFT.js.map +1 -0
  87. package/dist/TestGatingUtils.d.ts +15 -0
  88. package/dist/TestGatingUtils.d.ts.map +1 -0
  89. package/dist/TestGatingUtils.js +112 -0
  90. package/dist/TestGatingUtils.js.map +1 -0
  91. package/dist/Utils.d.ts +59 -0
  92. package/dist/Utils.d.ts.map +1 -0
  93. package/dist/Utils.js +122 -0
  94. package/dist/Utils.js.map +1 -0
  95. package/dist/Web3Constants.d.ts +6 -0
  96. package/dist/Web3Constants.d.ts.map +1 -0
  97. package/dist/Web3Constants.js +7 -0
  98. package/dist/Web3Constants.js.map +1 -0
  99. package/dist/Web3Constants.test.d.ts +2 -0
  100. package/dist/Web3Constants.test.d.ts.map +1 -0
  101. package/dist/Web3Constants.test.js +15 -0
  102. package/dist/Web3Constants.test.js.map +1 -0
  103. package/dist/chain.d.ts +65 -0
  104. package/dist/chain.d.ts.map +1 -0
  105. package/dist/chain.js +48 -0
  106. package/dist/chain.js.map +1 -0
  107. package/dist/entitlement.d.ts +146 -0
  108. package/dist/entitlement.d.ts.map +1 -0
  109. package/dist/entitlement.js +931 -0
  110. package/dist/entitlement.js.map +1 -0
  111. package/dist/entitlement.test.d.ts +2 -0
  112. package/dist/entitlement.test.d.ts.map +1 -0
  113. package/dist/entitlement.test.js +1743 -0
  114. package/dist/entitlement.test.js.map +1 -0
  115. package/dist/error-types.d.ts +7 -0
  116. package/dist/error-types.d.ts.map +1 -0
  117. package/dist/error-types.js +13 -0
  118. package/dist/error-types.js.map +1 -0
  119. package/dist/index.d.ts +76 -0
  120. package/dist/index.d.ts.map +1 -0
  121. package/dist/index.js +76 -0
  122. package/dist/index.js.map +1 -0
  123. package/dist/types.d.ts +29 -0
  124. package/dist/types.d.ts.map +1 -0
  125. package/dist/types.js +2 -0
  126. package/dist/types.js.map +1 -0
  127. package/dist/utils.test.d.ts +2 -0
  128. package/dist/utils.test.d.ts.map +1 -0
  129. package/dist/utils.test.js +44 -0
  130. package/dist/utils.test.js.map +1 -0
  131. package/dist/v3/BaseContractShim.d.ts +28 -0
  132. package/dist/v3/BaseContractShim.d.ts.map +1 -0
  133. package/dist/v3/BaseContractShim.js +185 -0
  134. package/dist/v3/BaseContractShim.js.map +1 -0
  135. package/dist/v3/BaseRegistry.d.ts +30 -0
  136. package/dist/v3/BaseRegistry.d.ts.map +1 -0
  137. package/dist/v3/BaseRegistry.js +64 -0
  138. package/dist/v3/BaseRegistry.js.map +1 -0
  139. package/dist/v3/EIP-712.d.ts +35 -0
  140. package/dist/v3/EIP-712.d.ts.map +1 -0
  141. package/dist/v3/EIP-712.js +57 -0
  142. package/dist/v3/EIP-712.js.map +1 -0
  143. package/dist/v3/IBanningShim.d.ts +7 -0
  144. package/dist/v3/IBanningShim.d.ts.map +1 -0
  145. package/dist/v3/IBanningShim.js +8 -0
  146. package/dist/v3/IBanningShim.js.map +1 -0
  147. package/dist/v3/IChannelShim.d.ts +8 -0
  148. package/dist/v3/IChannelShim.d.ts.map +1 -0
  149. package/dist/v3/IChannelShim.js +8 -0
  150. package/dist/v3/IChannelShim.js.map +1 -0
  151. package/dist/v3/ICreateSpaceShim.d.ts +9 -0
  152. package/dist/v3/ICreateSpaceShim.d.ts.map +1 -0
  153. package/dist/v3/ICreateSpaceShim.js +8 -0
  154. package/dist/v3/ICreateSpaceShim.js.map +1 -0
  155. package/dist/v3/IDropFacetShim.d.ts +7 -0
  156. package/dist/v3/IDropFacetShim.d.ts.map +1 -0
  157. package/dist/v3/IDropFacetShim.js +8 -0
  158. package/dist/v3/IDropFacetShim.js.map +1 -0
  159. package/dist/v3/IERC721AQueryableShim.d.ts +7 -0
  160. package/dist/v3/IERC721AQueryableShim.d.ts.map +1 -0
  161. package/dist/v3/IERC721AQueryableShim.js +8 -0
  162. package/dist/v3/IERC721AQueryableShim.js.map +1 -0
  163. package/dist/v3/IERC721AShim.d.ts +7 -0
  164. package/dist/v3/IERC721AShim.d.ts.map +1 -0
  165. package/dist/v3/IERC721AShim.js +8 -0
  166. package/dist/v3/IERC721AShim.js.map +1 -0
  167. package/dist/v3/IEntitlementCheckerShim.d.ts +7 -0
  168. package/dist/v3/IEntitlementCheckerShim.d.ts.map +1 -0
  169. package/dist/v3/IEntitlementCheckerShim.js +8 -0
  170. package/dist/v3/IEntitlementCheckerShim.js.map +1 -0
  171. package/dist/v3/IEntitlementDataQueryableShim.d.ts +8 -0
  172. package/dist/v3/IEntitlementDataQueryableShim.d.ts.map +1 -0
  173. package/dist/v3/IEntitlementDataQueryableShim.js +8 -0
  174. package/dist/v3/IEntitlementDataQueryableShim.js.map +1 -0
  175. package/dist/v3/IEntitlementsShim.d.ts +8 -0
  176. package/dist/v3/IEntitlementsShim.d.ts.map +1 -0
  177. package/dist/v3/IEntitlementsShim.js +8 -0
  178. package/dist/v3/IEntitlementsShim.js.map +1 -0
  179. package/dist/v3/ILegacySpaceArchitectShim.d.ts +8 -0
  180. package/dist/v3/ILegacySpaceArchitectShim.d.ts.map +1 -0
  181. package/dist/v3/ILegacySpaceArchitectShim.js +8 -0
  182. package/dist/v3/ILegacySpaceArchitectShim.js.map +1 -0
  183. package/dist/v3/IMembershipMetadataShim.d.ts +7 -0
  184. package/dist/v3/IMembershipMetadataShim.d.ts.map +1 -0
  185. package/dist/v3/IMembershipMetadataShim.js +8 -0
  186. package/dist/v3/IMembershipMetadataShim.js.map +1 -0
  187. package/dist/v3/IMembershipShim.d.ts +18 -0
  188. package/dist/v3/IMembershipShim.d.ts.map +1 -0
  189. package/dist/v3/IMembershipShim.js +73 -0
  190. package/dist/v3/IMembershipShim.js.map +1 -0
  191. package/dist/v3/IMulticallShim.d.ts +7 -0
  192. package/dist/v3/IMulticallShim.d.ts.map +1 -0
  193. package/dist/v3/IMulticallShim.js +8 -0
  194. package/dist/v3/IMulticallShim.js.map +1 -0
  195. package/dist/v3/INodeOperatorShim.d.ts +7 -0
  196. package/dist/v3/INodeOperatorShim.d.ts.map +1 -0
  197. package/dist/v3/INodeOperatorShim.js +8 -0
  198. package/dist/v3/INodeOperatorShim.js.map +1 -0
  199. package/dist/v3/INodeRegistryShim.d.ts +7 -0
  200. package/dist/v3/INodeRegistryShim.d.ts.map +1 -0
  201. package/dist/v3/INodeRegistryShim.js +8 -0
  202. package/dist/v3/INodeRegistryShim.js.map +1 -0
  203. package/dist/v3/IOperatorRegistryShim.d.ts +7 -0
  204. package/dist/v3/IOperatorRegistryShim.d.ts.map +1 -0
  205. package/dist/v3/IOperatorRegistryShim.js +8 -0
  206. package/dist/v3/IOperatorRegistryShim.js.map +1 -0
  207. package/dist/v3/IPrepayShim.d.ts +7 -0
  208. package/dist/v3/IPrepayShim.d.ts.map +1 -0
  209. package/dist/v3/IPrepayShim.js +8 -0
  210. package/dist/v3/IPrepayShim.js.map +1 -0
  211. package/dist/v3/IPricingShim.d.ts +8 -0
  212. package/dist/v3/IPricingShim.d.ts.map +1 -0
  213. package/dist/v3/IPricingShim.js +8 -0
  214. package/dist/v3/IPricingShim.js.map +1 -0
  215. package/dist/v3/IReviewShim.d.ts +61 -0
  216. package/dist/v3/IReviewShim.d.ts.map +1 -0
  217. package/dist/v3/IReviewShim.js +101 -0
  218. package/dist/v3/IReviewShim.js.map +1 -0
  219. package/dist/v3/IRiverPointsShim.d.ts +7 -0
  220. package/dist/v3/IRiverPointsShim.d.ts.map +1 -0
  221. package/dist/v3/IRiverPointsShim.js +8 -0
  222. package/dist/v3/IRiverPointsShim.js.map +1 -0
  223. package/dist/v3/IRolesShim.d.ts +8 -0
  224. package/dist/v3/IRolesShim.d.ts.map +1 -0
  225. package/dist/v3/IRolesShim.js +8 -0
  226. package/dist/v3/IRolesShim.js.map +1 -0
  227. package/dist/v3/IRuleEntitlementShim.d.ts +6 -0
  228. package/dist/v3/IRuleEntitlementShim.d.ts.map +1 -0
  229. package/dist/v3/IRuleEntitlementShim.js +3 -0
  230. package/dist/v3/IRuleEntitlementShim.js.map +1 -0
  231. package/dist/v3/IRuleEntitlementV2Shim.d.ts +6 -0
  232. package/dist/v3/IRuleEntitlementV2Shim.d.ts.map +1 -0
  233. package/dist/v3/IRuleEntitlementV2Shim.js +3 -0
  234. package/dist/v3/IRuleEntitlementV2Shim.js.map +1 -0
  235. package/dist/v3/ISpaceArchitectShim.d.ts +8 -0
  236. package/dist/v3/ISpaceArchitectShim.d.ts.map +1 -0
  237. package/dist/v3/ISpaceArchitectShim.js +38 -0
  238. package/dist/v3/ISpaceArchitectShim.js.map +1 -0
  239. package/dist/v3/ISpaceDelegationShim.d.ts +7 -0
  240. package/dist/v3/ISpaceDelegationShim.d.ts.map +1 -0
  241. package/dist/v3/ISpaceDelegationShim.js +8 -0
  242. package/dist/v3/ISpaceDelegationShim.js.map +1 -0
  243. package/dist/v3/ISpaceOwnerShim.d.ts +8 -0
  244. package/dist/v3/ISpaceOwnerShim.d.ts.map +1 -0
  245. package/dist/v3/ISpaceOwnerShim.js +8 -0
  246. package/dist/v3/ISpaceOwnerShim.js.map +1 -0
  247. package/dist/v3/IStreamRegistryShim.d.ts +7 -0
  248. package/dist/v3/IStreamRegistryShim.d.ts.map +1 -0
  249. package/dist/v3/IStreamRegistryShim.js +8 -0
  250. package/dist/v3/IStreamRegistryShim.js.map +1 -0
  251. package/dist/v3/ITippingShim.d.ts +20 -0
  252. package/dist/v3/ITippingShim.d.ts.map +1 -0
  253. package/dist/v3/ITippingShim.js +46 -0
  254. package/dist/v3/ITippingShim.js.map +1 -0
  255. package/dist/v3/ITreasuryShim.d.ts +7 -0
  256. package/dist/v3/ITreasuryShim.d.ts.map +1 -0
  257. package/dist/v3/ITreasuryShim.js +8 -0
  258. package/dist/v3/ITreasuryShim.js.map +1 -0
  259. package/dist/v3/MockERC721AShim.d.ts +7 -0
  260. package/dist/v3/MockERC721AShim.d.ts.map +1 -0
  261. package/dist/v3/MockERC721AShim.js +8 -0
  262. package/dist/v3/MockERC721AShim.js.map +1 -0
  263. package/dist/v3/OwnableFacetShim.d.ts +7 -0
  264. package/dist/v3/OwnableFacetShim.d.ts.map +1 -0
  265. package/dist/v3/OwnableFacetShim.js +8 -0
  266. package/dist/v3/OwnableFacetShim.js.map +1 -0
  267. package/dist/v3/PlatformRequirements.d.ts +10 -0
  268. package/dist/v3/PlatformRequirements.d.ts.map +1 -0
  269. package/dist/v3/PlatformRequirements.js +17 -0
  270. package/dist/v3/PlatformRequirements.js.map +1 -0
  271. package/dist/v3/PricingModules.d.ts +13 -0
  272. package/dist/v3/PricingModules.d.ts.map +1 -0
  273. package/dist/v3/PricingModules.js +23 -0
  274. package/dist/v3/PricingModules.js.map +1 -0
  275. package/dist/v3/RiverAirdropDapp.d.ts +16 -0
  276. package/dist/v3/RiverAirdropDapp.d.ts.map +1 -0
  277. package/dist/v3/RiverAirdropDapp.js +30 -0
  278. package/dist/v3/RiverAirdropDapp.js.map +1 -0
  279. package/dist/v3/RiverRegistry.d.ts +32 -0
  280. package/dist/v3/RiverRegistry.d.ts.map +1 -0
  281. package/dist/v3/RiverRegistry.js +96 -0
  282. package/dist/v3/RiverRegistry.js.map +1 -0
  283. package/dist/v3/RuleEntitlementShim.d.ts +11 -0
  284. package/dist/v3/RuleEntitlementShim.d.ts.map +1 -0
  285. package/dist/v3/RuleEntitlementShim.js +38 -0
  286. package/dist/v3/RuleEntitlementShim.js.map +1 -0
  287. package/dist/v3/RuleEntitlementV2Shim.d.ts +11 -0
  288. package/dist/v3/RuleEntitlementV2Shim.d.ts.map +1 -0
  289. package/dist/v3/RuleEntitlementV2Shim.js +38 -0
  290. package/dist/v3/RuleEntitlementV2Shim.js.map +1 -0
  291. package/dist/v3/Space.d.ts +97 -0
  292. package/dist/v3/Space.d.ts.map +1 -0
  293. package/dist/v3/Space.js +440 -0
  294. package/dist/v3/Space.js.map +1 -0
  295. package/dist/v3/SpaceDapp.d.ts +212 -0
  296. package/dist/v3/SpaceDapp.d.ts.map +1 -0
  297. package/dist/v3/SpaceDapp.js +1164 -0
  298. package/dist/v3/SpaceDapp.js.map +1 -0
  299. package/dist/v3/SpaceOwner.d.ts +13 -0
  300. package/dist/v3/SpaceOwner.d.ts.map +1 -0
  301. package/dist/v3/SpaceOwner.js +18 -0
  302. package/dist/v3/SpaceOwner.js.map +1 -0
  303. package/dist/v3/SpaceRegistrar.d.ts +25 -0
  304. package/dist/v3/SpaceRegistrar.d.ts.map +1 -0
  305. package/dist/v3/SpaceRegistrar.js +56 -0
  306. package/dist/v3/SpaceRegistrar.js.map +1 -0
  307. package/dist/v3/TokenPausableFacetShim.d.ts +7 -0
  308. package/dist/v3/TokenPausableFacetShim.d.ts.map +1 -0
  309. package/dist/v3/TokenPausableFacetShim.js +8 -0
  310. package/dist/v3/TokenPausableFacetShim.js.map +1 -0
  311. package/dist/v3/UserEntitlementShim.d.ts +11 -0
  312. package/dist/v3/UserEntitlementShim.d.ts.map +1 -0
  313. package/dist/v3/UserEntitlementShim.js +44 -0
  314. package/dist/v3/UserEntitlementShim.js.map +1 -0
  315. package/dist/v3/WalletLink.d.ts +50 -0
  316. package/dist/v3/WalletLink.d.ts.map +1 -0
  317. package/dist/v3/WalletLink.js +215 -0
  318. package/dist/v3/WalletLink.js.map +1 -0
  319. package/dist/v3/WalletLinkShim.d.ts +7 -0
  320. package/dist/v3/WalletLinkShim.d.ts.map +1 -0
  321. package/dist/v3/WalletLinkShim.js +8 -0
  322. package/dist/v3/WalletLinkShim.js.map +1 -0
  323. package/dist/v3/index.d.ts +24 -0
  324. package/dist/v3/index.d.ts.map +1 -0
  325. package/dist/v3/index.js +24 -0
  326. package/dist/v3/index.js.map +1 -0
  327. package/package.json +54 -0
@@ -0,0 +1,149 @@
1
+ import { createTestClient, http, publicActions, walletActions, parseEther } from 'viem';
2
+ import { foundry } from 'viem/chains';
3
+ import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts';
4
+ import { MockERC20 } from './MockERC20';
5
+ import { deployContract, Mutex } from './TestGatingUtils';
6
+ import { dlogger } from '@towns-protocol/dlog';
7
+ const logger = dlogger('csb:TestGatingERC20');
8
+ const erc20Contracts = new Map();
9
+ const erc20ContractsMutex = new Mutex();
10
+ async function getContractAddress(tokenName) {
11
+ try {
12
+ await erc20ContractsMutex.lock();
13
+ if (!erc20Contracts.has(tokenName)) {
14
+ const contractAddress = await deployContract(tokenName, MockERC20.abi, MockERC20.bytecode, ['TestERC20', 'TST']);
15
+ erc20Contracts.set(tokenName, contractAddress);
16
+ }
17
+ }
18
+ catch (e) {
19
+ logger.error('Failed to deploy contract', e);
20
+ throw new Error(
21
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
22
+ `Failed to get contract address: ${tokenName}`);
23
+ }
24
+ finally {
25
+ erc20ContractsMutex.unlock();
26
+ }
27
+ return erc20Contracts.get(tokenName);
28
+ }
29
+ async function publicMint(tokenName, toAddress, amount) {
30
+ const privateKey = generatePrivateKey();
31
+ const throwawayAccount = privateKeyToAccount(privateKey);
32
+ const client = createTestClient({
33
+ chain: foundry,
34
+ mode: 'anvil',
35
+ transport: http(),
36
+ account: throwawayAccount,
37
+ })
38
+ .extend(publicActions)
39
+ .extend(walletActions);
40
+ await client.setBalance({
41
+ address: throwawayAccount.address,
42
+ value: parseEther('1'),
43
+ });
44
+ const contractAddress = await getContractAddress(tokenName);
45
+ logger.log('minting', contractAddress, toAddress);
46
+ const nftReceipt = await client.writeContract({
47
+ address: contractAddress,
48
+ abi: MockERC20.abi,
49
+ functionName: 'mint',
50
+ args: [toAddress, amount],
51
+ account: throwawayAccount,
52
+ });
53
+ logger.log('minted', nftReceipt);
54
+ const receipt = await client.waitForTransactionReceipt({ hash: nftReceipt });
55
+ expect(receipt.status).toBe('success');
56
+ // create a filter to listen for the Transfer event to find the token id
57
+ // don't worry about the possibility of non-matching arguments, as we're specifying the contract
58
+ // address of the contract we're interested in.
59
+ const filter = await client.createContractEventFilter({
60
+ abi: MockERC20.abi,
61
+ address: contractAddress,
62
+ eventName: 'Transfer',
63
+ args: {
64
+ to: toAddress,
65
+ },
66
+ fromBlock: receipt.blockNumber,
67
+ toBlock: receipt.blockNumber,
68
+ });
69
+ const eventLogs = await client.getFilterLogs({ filter });
70
+ for (const eventLog of eventLogs) {
71
+ if (eventLog.transactionHash === receipt.transactionHash) {
72
+ logger.log('mint logs', eventLog.args);
73
+ return;
74
+ }
75
+ }
76
+ throw Error('No mint event found');
77
+ }
78
+ async function totalSupply(contractName) {
79
+ const contractAddress = await getContractAddress(contractName);
80
+ const privateKey = generatePrivateKey();
81
+ const throwawayAccount = privateKeyToAccount(privateKey);
82
+ const client = createTestClient({
83
+ chain: foundry,
84
+ mode: 'anvil',
85
+ transport: http(),
86
+ account: throwawayAccount,
87
+ })
88
+ .extend(publicActions)
89
+ .extend(walletActions);
90
+ const totalSupply = await client.readContract({
91
+ address: contractAddress,
92
+ abi: MockERC20.abi,
93
+ functionName: 'totalSupply',
94
+ args: [],
95
+ });
96
+ return Number(totalSupply);
97
+ }
98
+ async function balanceOf(contractName, address) {
99
+ const contractAddress = await getContractAddress(contractName);
100
+ const privateKey = generatePrivateKey();
101
+ const throwawayAccount = privateKeyToAccount(privateKey);
102
+ const client = createTestClient({
103
+ chain: foundry,
104
+ mode: 'anvil',
105
+ transport: http(),
106
+ account: throwawayAccount,
107
+ })
108
+ .extend(publicActions)
109
+ .extend(walletActions);
110
+ const balance = await client.readContract({
111
+ address: contractAddress,
112
+ abi: MockERC20.abi,
113
+ functionName: 'balanceOf',
114
+ args: [address],
115
+ });
116
+ return Number(balance);
117
+ }
118
+ async function transfer(contractName, to, privateKey, amount) {
119
+ const account = privateKeyToAccount(privateKey);
120
+ const client = createTestClient({
121
+ chain: foundry,
122
+ mode: 'anvil',
123
+ transport: http(),
124
+ account: account,
125
+ })
126
+ .extend(publicActions)
127
+ .extend(walletActions);
128
+ await client.setBalance({
129
+ address: account.address,
130
+ value: parseEther('1'),
131
+ });
132
+ const contractAddress = await getContractAddress(contractName);
133
+ const tx = await client.writeContract({
134
+ address: contractAddress,
135
+ abi: MockERC20.abi,
136
+ functionName: 'transfer',
137
+ args: [to, amount],
138
+ });
139
+ const { transactionHash } = await client.waitForTransactionReceipt({ hash: tx });
140
+ return { transactionHash };
141
+ }
142
+ export const TestERC20 = {
143
+ getContractAddress,
144
+ balanceOf,
145
+ totalSupply,
146
+ publicMint,
147
+ transfer,
148
+ };
149
+ //# sourceMappingURL=TestGatingERC20.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestGatingERC20.js","sourceRoot":"","sources":["../src/TestGatingERC20.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { Address } from './ContractTypes';
2
+ export declare class TestGatingNFT {
3
+ publicMint(toAddress: string): Promise<number>;
4
+ }
5
+ declare function getContractAddress(nftName: string): Promise<Address>;
6
+ export declare function getTestGatingNFTContractAddress(): Promise<Address>;
7
+ declare function publicMint(nftName: string, toAddress: Address): Promise<number>;
8
+ declare function burn(nftName: string, tokenId: number): Promise<void>;
9
+ declare function balanceOf(nftName: string, address: Address): Promise<number>;
10
+ export declare const TestERC721: {
11
+ publicMint: typeof publicMint;
12
+ burn: typeof burn;
13
+ balanceOf: typeof balanceOf;
14
+ getContractAddress: typeof getContractAddress;
15
+ };
16
+ export {};
17
+ //# sourceMappingURL=TestGatingNFT.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestGatingNFT.d.ts","sourceRoot":"","sources":["../src/TestGatingNFT.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAMzC,qBAAa,aAAa;IACT,UAAU,CAAC,SAAS,EAAE,MAAM;CAO5C;AAKD,iBAAe,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAsBnE;AAED,wBAAsB,+BAA+B,IAAI,OAAO,CAAC,OAAO,CAAC,CAExE;AAED,iBAAe,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAwD9E;AAED,iBAAe,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BnE;AAED,iBAAe,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAsB3E;AAED,eAAO,MAAM,UAAU;;;;;CAKtB,CAAA"}
@@ -0,0 +1,140 @@
1
+ import { createTestClient, http, publicActions, walletActions, parseEther } from 'viem';
2
+ import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts';
3
+ import { foundry } from 'viem/chains';
4
+ import { MockERC721a } from './MockERC721A';
5
+ import { isHexString, deployContract, Mutex } from './TestGatingUtils';
6
+ import { dlogger } from '@towns-protocol/dlog';
7
+ const logger = dlogger('csb:TestGatingNFT');
8
+ export class TestGatingNFT {
9
+ async publicMint(toAddress) {
10
+ if (!isHexString(toAddress)) {
11
+ throw new Error('Invalid address');
12
+ }
13
+ return await publicMint('TestGatingNFT', toAddress);
14
+ }
15
+ }
16
+ const nftContracts = new Map();
17
+ const nftContractsMutex = new Mutex();
18
+ async function getContractAddress(nftName) {
19
+ try {
20
+ await nftContractsMutex.lock();
21
+ if (!nftContracts.has(nftName)) {
22
+ const contractAddress = await deployContract(nftName, MockERC721a.abi, MockERC721a.bytecode.object);
23
+ nftContracts.set(nftName, contractAddress);
24
+ }
25
+ }
26
+ catch (e) {
27
+ logger.error('Failed to deploy contract', e);
28
+ throw new Error(
29
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
30
+ `Failed to get contract address: ${nftName}`);
31
+ }
32
+ finally {
33
+ nftContractsMutex.unlock();
34
+ }
35
+ return nftContracts.get(nftName);
36
+ }
37
+ export async function getTestGatingNFTContractAddress() {
38
+ return await getContractAddress('TestGatingNFT');
39
+ }
40
+ async function publicMint(nftName, toAddress) {
41
+ const privateKey = generatePrivateKey();
42
+ const throwawayAccount = privateKeyToAccount(privateKey);
43
+ const client = createTestClient({
44
+ chain: foundry,
45
+ mode: 'anvil',
46
+ transport: http(),
47
+ account: throwawayAccount,
48
+ })
49
+ .extend(publicActions)
50
+ .extend(walletActions);
51
+ await client.setBalance({
52
+ address: throwawayAccount.address,
53
+ value: parseEther('1'),
54
+ });
55
+ const contractAddress = await getContractAddress(nftName);
56
+ logger.log('minting', contractAddress, toAddress);
57
+ const nftReceipt = await client.writeContract({
58
+ address: contractAddress,
59
+ abi: MockERC721a.abi,
60
+ functionName: 'mint',
61
+ args: [toAddress, 1n],
62
+ account: throwawayAccount,
63
+ });
64
+ logger.log('minted', nftReceipt);
65
+ const receipt = await client.waitForTransactionReceipt({ hash: nftReceipt });
66
+ expect(receipt.status).toBe('success');
67
+ // create a filter to listen for the Transfer event to find the token id
68
+ // don't worry about the possibility of non-matching arguments, as we're specifying the contract
69
+ // address of the contract we're interested in.
70
+ const filter = await client.createContractEventFilter({
71
+ abi: MockERC721a.abi,
72
+ address: contractAddress,
73
+ eventName: 'Transfer',
74
+ args: {
75
+ to: toAddress,
76
+ },
77
+ fromBlock: receipt.blockNumber,
78
+ toBlock: receipt.blockNumber,
79
+ });
80
+ const eventLogs = await client.getFilterLogs({ filter });
81
+ for (const eventLog of eventLogs) {
82
+ if (eventLog.transactionHash === receipt.transactionHash) {
83
+ expect(eventLog.args.tokenId).toBeDefined();
84
+ return Number(eventLog.args.tokenId);
85
+ }
86
+ }
87
+ throw Error('No mint event found');
88
+ }
89
+ async function burn(nftName, tokenId) {
90
+ const privateKey = generatePrivateKey();
91
+ const throwawayAccount = privateKeyToAccount(privateKey);
92
+ const client = createTestClient({
93
+ chain: foundry,
94
+ mode: 'anvil',
95
+ transport: http(),
96
+ account: throwawayAccount,
97
+ })
98
+ .extend(publicActions)
99
+ .extend(walletActions);
100
+ await client.setBalance({
101
+ address: throwawayAccount.address,
102
+ value: parseEther('1'),
103
+ });
104
+ const nftReceipt = await client.writeContract({
105
+ address: await getContractAddress(nftName),
106
+ abi: MockERC721a.abi,
107
+ functionName: 'burn',
108
+ args: [BigInt(tokenId)],
109
+ account: throwawayAccount,
110
+ });
111
+ const receipt = await client.waitForTransactionReceipt({ hash: nftReceipt });
112
+ expect(receipt.status).toBe('success');
113
+ }
114
+ async function balanceOf(nftName, address) {
115
+ const privateKey = generatePrivateKey();
116
+ const throwawayAccount = privateKeyToAccount(privateKey);
117
+ const client = createTestClient({
118
+ chain: foundry,
119
+ mode: 'anvil',
120
+ transport: http(),
121
+ account: throwawayAccount,
122
+ })
123
+ .extend(publicActions)
124
+ .extend(walletActions);
125
+ const contractAddress = await getContractAddress(nftName);
126
+ const balanceEncoded = await client.readContract({
127
+ address: contractAddress,
128
+ abi: MockERC721a.abi,
129
+ functionName: 'balanceOf',
130
+ args: [address],
131
+ });
132
+ return Number(balanceEncoded);
133
+ }
134
+ export const TestERC721 = {
135
+ publicMint,
136
+ burn,
137
+ balanceOf,
138
+ getContractAddress,
139
+ };
140
+ //# sourceMappingURL=TestGatingNFT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestGatingNFT.js","sourceRoot":"","sources":["../src/TestGatingNFT.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { Abi } from 'abitype';
2
+ import { Address } from './ContractTypes';
3
+ export declare class Mutex {
4
+ queue: ((value: void | PromiseLike<void>) => void)[];
5
+ locked: boolean;
6
+ constructor();
7
+ lock(): Promise<void>;
8
+ unlock(): void;
9
+ }
10
+ export declare function toEIP55Address(address: Address): Address;
11
+ export declare function isEIP55Address(address: Address): boolean;
12
+ export declare function isHexString(value: unknown): value is Address;
13
+ export declare function deployContract(contractName: string, abi: Abi, bytecode: Address, // bytecode is a hex string
14
+ constructorArgs?: any[]): Promise<Address>;
15
+ //# sourceMappingURL=TestGatingUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestGatingUtils.d.ts","sourceRoot":"","sources":["../src/TestGatingUtils.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,SAAS,CAAA;AAElC,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAMzC,qBAAa,KAAK;IACd,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,CAAA;IACpD,MAAM,EAAE,OAAO,CAAA;;IAMf,IAAI;IAiBJ,MAAM;CAQT;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAaxD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAExD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,OAAO,CAM5D;AAED,wBAAsB,cAAc,CAChC,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,GAAG,EACR,QAAQ,EAAE,OAAO,EAAE,2BAA2B;AAC9C,eAAe,GAAE,GAAG,EAAO,GAC5B,OAAO,CAAC,OAAO,CAAC,CA4DlB"}
@@ -0,0 +1,112 @@
1
+ import { keccak256, parseEther } from 'viem/utils';
2
+ import { foundry } from 'viem/chains';
3
+ import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts';
4
+ import { createTestClient, http, publicActions, walletActions } from 'viem';
5
+ import { dlogger } from '@towns-protocol/dlog';
6
+ const logger = dlogger('csb:TestGatingUtils');
7
+ export class Mutex {
8
+ queue;
9
+ locked;
10
+ constructor() {
11
+ this.queue = [];
12
+ this.locked = false;
13
+ }
14
+ lock() {
15
+ if (!this.locked) {
16
+ this.locked = true;
17
+ return Promise.resolve();
18
+ }
19
+ let unlockNext;
20
+ const promise = new Promise((resolve) => {
21
+ unlockNext = resolve;
22
+ });
23
+ this.queue.push(unlockNext);
24
+ return promise;
25
+ }
26
+ unlock() {
27
+ if (this.queue.length > 0) {
28
+ const unlockNext = this.queue.shift();
29
+ unlockNext?.();
30
+ }
31
+ else {
32
+ this.locked = false;
33
+ }
34
+ }
35
+ }
36
+ export function toEIP55Address(address) {
37
+ const addressHash = keccak256(address.substring(2).toLowerCase());
38
+ let checksumAddress = '0x';
39
+ for (let i = 2; i < address.length; i++) {
40
+ if (parseInt(addressHash[i], 16) >= 8) {
41
+ checksumAddress += address[i].toUpperCase();
42
+ }
43
+ else {
44
+ checksumAddress += address[i].toLowerCase();
45
+ }
46
+ }
47
+ return checksumAddress;
48
+ }
49
+ export function isEIP55Address(address) {
50
+ return address === toEIP55Address(address);
51
+ }
52
+ export function isHexString(value) {
53
+ // Check if the value is undefined first
54
+ if (value === undefined) {
55
+ return false;
56
+ }
57
+ return typeof value === 'string' && /^0x[0-9a-fA-F]+$/.test(value);
58
+ }
59
+ export async function deployContract(contractName, abi, bytecode, // bytecode is a hex string
60
+ constructorArgs = []) {
61
+ let retryCount = 0;
62
+ let lastError;
63
+ while (retryCount++ < 5) {
64
+ try {
65
+ const privateKey = generatePrivateKey();
66
+ const throwawayAccount = privateKeyToAccount(privateKey);
67
+ const client = createTestClient({
68
+ chain: foundry,
69
+ mode: 'anvil',
70
+ transport: http(),
71
+ account: throwawayAccount,
72
+ })
73
+ .extend(publicActions)
74
+ .extend(walletActions);
75
+ await client.setBalance({
76
+ address: throwawayAccount.address,
77
+ value: parseEther('1'),
78
+ });
79
+ const hash = await client.deployContract({
80
+ abi,
81
+ account: throwawayAccount,
82
+ args: constructorArgs,
83
+ bytecode,
84
+ });
85
+ const receipt = await client.waitForTransactionReceipt({ hash });
86
+ if (receipt.contractAddress) {
87
+ logger.info('deployed', receipt.contractAddress, isEIP55Address(receipt.contractAddress));
88
+ return toEIP55Address(receipt.contractAddress);
89
+ }
90
+ else {
91
+ throw new Error(`Failed to deploy contract ${contractName}`);
92
+ }
93
+ }
94
+ catch (e) {
95
+ lastError = e;
96
+ if (typeof e === 'object' &&
97
+ e !== null &&
98
+ 'message' in e &&
99
+ typeof e.message === 'string' &&
100
+ (e.message.includes('nonce too low') ||
101
+ e.message.includes('NonceTooLowError') ||
102
+ e.message.includes('Nonce provided for the transaction is lower than the current nonce'))) {
103
+ logger.log('retrying because nonce too low', e, retryCount, contractName);
104
+ }
105
+ else {
106
+ throw e;
107
+ }
108
+ }
109
+ }
110
+ throw lastError;
111
+ }
112
+ //# sourceMappingURL=TestGatingUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestGatingUtils.js","sourceRoot":"","sources":["../src/TestGatingUtils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import { ethers } from 'ethers';
2
+ import { PublicClient } from 'viem';
3
+ import { PricingModuleStruct } from './ContractTypes';
4
+ import { ISpaceDapp } from './ISpaceDapp';
5
+ export declare const ETH_ADDRESS = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";
6
+ export declare const EVERYONE_ADDRESS = "0x0000000000000000000000000000000000000001";
7
+ export declare const MOCK_ADDRESS = "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef";
8
+ export declare const MOCK_ADDRESS_2 = "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbee2";
9
+ export declare const MOCK_ADDRESS_3 = "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbee3";
10
+ export declare const MOCK_ADDRESS_4 = "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbee4";
11
+ export declare const MOCK_ADDRESS_5 = "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbee5";
12
+ export declare class NoEntitledWalletError extends Error {
13
+ constructor();
14
+ /**
15
+ * throwIfRuntimeErrors is a helper function to process AggregateErrors emitted from Promise.any that may
16
+ * contain promises rejected with NoEntitledWalletErrors, which represent an entitlement check that evaluates
17
+ * to false, and not a true error condition. This method will filter out NoEntitledWalletErrors and throw an
18
+ * AggregateError with the remaining errors, if any exist. Otherwise, it will simply return undefined.
19
+ * @param error AggregateError
20
+ * @returns undefined
21
+ * @throws AggregateError
22
+ */
23
+ static throwIfRuntimeErrors: (error: AggregateError) => undefined;
24
+ }
25
+ export declare function isEthersProvider(provider: ethers.providers.Provider | PublicClient): provider is ethers.providers.Provider;
26
+ export declare function isPublicClient(provider: ethers.providers.Provider | PublicClient): provider is PublicClient;
27
+ export declare function SpaceAddressFromSpaceId(spaceId: string): string;
28
+ export declare function SpaceIdFromSpaceAddress(spaceAddress: string): string;
29
+ /**
30
+ * Use this function in the default case of a exhaustive switch statement to ensure that all cases are handled.
31
+ * Always throws JSON RPC error.
32
+ * @param value Switch value
33
+ * @param message Error message
34
+ * @param code JSON RPC error code
35
+ * @param data Optional data to include in the error
36
+ */
37
+ export declare function checkNever(value: never, message?: string): never;
38
+ /**
39
+ * @deprecated
40
+ * Use TIERED_PRICING_ORACLE_V2 or TIERED_PRICING_ORACLE_V3 instead
41
+ * Yes, the correct value for this constant is "TieredLogPricingOracleV2"
42
+ */
43
+ export declare const TIERED_PRICING_ORACLE = "TieredLogPricingOracleV2";
44
+ export declare const TIERED_PRICING_ORACLE_V2 = "TieredLogPricingOracleV2";
45
+ export declare const TIERED_PRICING_ORACLE_V3 = "TieredLogPricingOracleV3";
46
+ export declare const FIXED_PRICING = "FixedPricing";
47
+ export declare const getDynamicPricingModule: (spaceDapp: ISpaceDapp | undefined) => Promise<import("@towns-protocol/generated/dev/typings/IPricingModules").IPricingModulesBase.PricingModuleStruct>;
48
+ export declare const getFixedPricingModule: (spaceDapp: ISpaceDapp | undefined) => Promise<import("@towns-protocol/generated/dev/typings/IPricingModules").IPricingModulesBase.PricingModuleStruct>;
49
+ export declare const findDynamicPricingModule: (pricingModules: PricingModuleStruct[]) => import("@towns-protocol/generated/dev/typings/IPricingModules").IPricingModulesBase.PricingModuleStruct | undefined;
50
+ export declare const findFixedPricingModule: (pricingModules: PricingModuleStruct[]) => import("@towns-protocol/generated/dev/typings/IPricingModules").IPricingModulesBase.PricingModuleStruct | undefined;
51
+ export declare function stringifyChannelMetadataJSON({ name, description, }: {
52
+ name: string;
53
+ description: string;
54
+ }): string;
55
+ export declare function parseChannelMetadataJSON(metadataStr: string): {
56
+ name: string;
57
+ description: string;
58
+ };
59
+ //# sourceMappingURL=Utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Utils.d.ts","sourceRoot":"","sources":["../src/Utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAA;AACnC,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEzC,eAAO,MAAM,WAAW,+CAA+C,CAAA;AACvE,eAAO,MAAM,gBAAgB,+CAA+C,CAAA;AAC5E,eAAO,MAAM,YAAY,+CAA+C,CAAA;AACxE,eAAO,MAAM,cAAc,+CAA+C,CAAA;AAC1E,eAAO,MAAM,cAAc,+CAA+C,CAAA;AAC1E,eAAO,MAAM,cAAc,+CAA+C,CAAA;AAC1E,eAAO,MAAM,cAAc,+CAA+C,CAAA;AAE1E,qBAAa,qBAAsB,SAAQ,KAAK;;IAW5C;;;;;;;;OAQG;IACH,MAAM,CAAC,oBAAoB,GAAI,OAAO,cAAc,eAQnD;CACJ;AAED,wBAAgB,gBAAgB,CAC5B,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,GAAG,YAAY,GACnD,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,QAAQ,CAOvC;AAED,wBAAgB,cAAc,CAC1B,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,GAAG,YAAY,GACnD,QAAQ,IAAI,YAAY,CAO1B;AAID,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE/D;AAGD,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAEhE;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,6BAA6B,CAAA;AAC/D,eAAO,MAAM,wBAAwB,6BAA6B,CAAA;AAClE,eAAO,MAAM,wBAAwB,6BAA6B,CAAA;AAClE,eAAO,MAAM,aAAa,iBAAiB,CAAA;AAE3C,eAAO,MAAM,uBAAuB,GAAU,WAAW,UAAU,GAAG,SAAS,qHAU9E,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAU,WAAW,UAAU,GAAG,SAAS,qHAU5E,CAAA;AAED,eAAO,MAAM,wBAAwB,GAAI,gBAAgB,mBAAmB,EAAE,wHAED,CAAA;AAE7E,eAAO,MAAM,sBAAsB,GAAI,gBAAgB,mBAAmB,EAAE,wHACV,CAAA;AAElE,wBAAgB,4BAA4B,CAAC,EACzC,IAAI,EACJ,WAAW,GACd,EAAE;IACC,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;CACtB,GAAG,MAAM,CAET;AAED,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG;IAC3D,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;CACtB,CAkBA"}
package/dist/Utils.js ADDED
@@ -0,0 +1,122 @@
1
+ import { ethers } from 'ethers';
2
+ export const ETH_ADDRESS = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE';
3
+ export const EVERYONE_ADDRESS = '0x0000000000000000000000000000000000000001';
4
+ export const MOCK_ADDRESS = '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef';
5
+ export const MOCK_ADDRESS_2 = '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbee2';
6
+ export const MOCK_ADDRESS_3 = '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbee3';
7
+ export const MOCK_ADDRESS_4 = '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbee4';
8
+ export const MOCK_ADDRESS_5 = '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbee5';
9
+ export class NoEntitledWalletError extends Error {
10
+ constructor() {
11
+ super('No entitled wallet found');
12
+ this.name = 'NoEntitledWalletError';
13
+ // Setting the prototype is necessary for instanceof to work correctly
14
+ // It ensures that instanceof NoEntitledWalletError returns true
15
+ // This is because TypeScript's class syntax doesn't set up the prototype chain correctly for custom errors
16
+ Object.setPrototypeOf(this, NoEntitledWalletError.prototype);
17
+ }
18
+ /**
19
+ * throwIfRuntimeErrors is a helper function to process AggregateErrors emitted from Promise.any that may
20
+ * contain promises rejected with NoEntitledWalletErrors, which represent an entitlement check that evaluates
21
+ * to false, and not a true error condition. This method will filter out NoEntitledWalletErrors and throw an
22
+ * AggregateError with the remaining errors, if any exist. Otherwise, it will simply return undefined.
23
+ * @param error AggregateError
24
+ * @returns undefined
25
+ * @throws AggregateError
26
+ */
27
+ static throwIfRuntimeErrors = (error) => {
28
+ const runtimeErrors = error.errors.filter((e) => !(e instanceof NoEntitledWalletError));
29
+ if (runtimeErrors.length > 0) {
30
+ throw new AggregateError(runtimeErrors);
31
+ }
32
+ return undefined;
33
+ };
34
+ }
35
+ export function isEthersProvider(provider) {
36
+ return (typeof provider === 'object' &&
37
+ provider !== null &&
38
+ 'getNetwork' in provider &&
39
+ typeof provider.getNetwork === 'function');
40
+ }
41
+ export function isPublicClient(provider) {
42
+ return (typeof provider === 'object' &&
43
+ provider !== null &&
44
+ 'getNetwork' in provider &&
45
+ typeof provider.getNetwork !== 'function');
46
+ }
47
+ // River space stream ids are 64 characters long, and start with '10'
48
+ // incidentally this should also work if you just pass the space contract address with 0x prefix
49
+ export function SpaceAddressFromSpaceId(spaceId) {
50
+ return ethers.utils.getAddress(spaceId.slice(2, 42));
51
+ }
52
+ // River space stream ids are 64 characters long, and start with '10'
53
+ export function SpaceIdFromSpaceAddress(spaceAddress) {
54
+ return spaceAddress.toLowerCase().replace('0x', '10').padEnd(64, '0');
55
+ }
56
+ /**
57
+ * Use this function in the default case of a exhaustive switch statement to ensure that all cases are handled.
58
+ * Always throws JSON RPC error.
59
+ * @param value Switch value
60
+ * @param message Error message
61
+ * @param code JSON RPC error code
62
+ * @param data Optional data to include in the error
63
+ */
64
+ export function checkNever(value, message) {
65
+ throw new Error(message ?? `Unhandled switch value ${value}`);
66
+ }
67
+ /**
68
+ * @deprecated
69
+ * Use TIERED_PRICING_ORACLE_V2 or TIERED_PRICING_ORACLE_V3 instead
70
+ * Yes, the correct value for this constant is "TieredLogPricingOracleV2"
71
+ */
72
+ export const TIERED_PRICING_ORACLE = 'TieredLogPricingOracleV2';
73
+ export const TIERED_PRICING_ORACLE_V2 = 'TieredLogPricingOracleV2';
74
+ export const TIERED_PRICING_ORACLE_V3 = 'TieredLogPricingOracleV3';
75
+ export const FIXED_PRICING = 'FixedPricing';
76
+ export const getDynamicPricingModule = async (spaceDapp) => {
77
+ if (!spaceDapp) {
78
+ throw new Error('getDynamicPricingModule: No spaceDapp');
79
+ }
80
+ const pricingModules = await spaceDapp.listPricingModules();
81
+ const dynamicPricingModule = findDynamicPricingModule(pricingModules);
82
+ if (!dynamicPricingModule) {
83
+ throw new Error('getDynamicPricingModule: no dynamicPricingModule');
84
+ }
85
+ return dynamicPricingModule;
86
+ };
87
+ export const getFixedPricingModule = async (spaceDapp) => {
88
+ if (!spaceDapp) {
89
+ throw new Error('getFixedPricingModule: No spaceDapp');
90
+ }
91
+ const pricingModules = await spaceDapp.listPricingModules();
92
+ const fixedPricingModule = findFixedPricingModule(pricingModules);
93
+ if (!fixedPricingModule) {
94
+ throw new Error('getFixedPricingModule: no fixedPricingModule');
95
+ }
96
+ return fixedPricingModule;
97
+ };
98
+ export const findDynamicPricingModule = (pricingModules) => pricingModules.find((module) => module.name === TIERED_PRICING_ORACLE_V3) ||
99
+ pricingModules.find((module) => module.name === TIERED_PRICING_ORACLE_V2);
100
+ export const findFixedPricingModule = (pricingModules) => pricingModules.find((module) => module.name === FIXED_PRICING);
101
+ export function stringifyChannelMetadataJSON({ name, description, }) {
102
+ return JSON.stringify({ name, description });
103
+ }
104
+ export function parseChannelMetadataJSON(metadataStr) {
105
+ try {
106
+ const result = JSON.parse(metadataStr);
107
+ if (typeof result === 'object' &&
108
+ result !== null &&
109
+ 'name' in result &&
110
+ 'description' in result) {
111
+ return result;
112
+ }
113
+ }
114
+ catch (error) {
115
+ /* empty */
116
+ }
117
+ return {
118
+ name: metadataStr,
119
+ description: '',
120
+ };
121
+ }
122
+ //# sourceMappingURL=Utils.js.map