@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.
- package/LICENSE.txt +21 -0
- package/README.md +3 -0
- package/dist/ContractHelpers.d.ts +18 -0
- package/dist/ContractHelpers.d.ts.map +1 -0
- package/dist/ContractHelpers.js +75 -0
- package/dist/ContractHelpers.js.map +1 -0
- package/dist/ContractTypes.d.ts +143 -0
- package/dist/ContractTypes.d.ts.map +1 -0
- package/dist/ContractTypes.js +65 -0
- package/dist/ContractTypes.js.map +1 -0
- package/dist/ConvertersEntitlements.d.ts +10 -0
- package/dist/ConvertersEntitlements.d.ts.map +1 -0
- package/dist/ConvertersEntitlements.js +120 -0
- package/dist/ConvertersEntitlements.js.map +1 -0
- package/dist/ConvertersRoles.d.ts +8 -0
- package/dist/ConvertersRoles.d.ts.map +1 -0
- package/dist/ConvertersRoles.js +94 -0
- package/dist/ConvertersRoles.js.map +1 -0
- package/dist/DelegateRegistry.d.ts +3 -0
- package/dist/DelegateRegistry.d.ts.map +1 -0
- package/dist/DelegateRegistry.js +72 -0
- package/dist/DelegateRegistry.js.map +1 -0
- package/dist/EntitlementCache.d.ts +20 -0
- package/dist/EntitlementCache.d.ts.map +1 -0
- package/dist/EntitlementCache.js +41 -0
- package/dist/EntitlementCache.js.map +1 -0
- package/dist/EntitlementCache.test.d.ts +5 -0
- package/dist/EntitlementCache.test.d.ts.map +1 -0
- package/dist/EntitlementCache.test.js +130 -0
- package/dist/EntitlementCache.test.js.map +1 -0
- package/dist/ISpaceDapp.d.ts +193 -0
- package/dist/ISpaceDapp.d.ts.map +1 -0
- package/dist/ISpaceDapp.js +2 -0
- package/dist/ISpaceDapp.js.map +1 -0
- package/dist/IStaticContractsInfo.d.ts +28 -0
- package/dist/IStaticContractsInfo.d.ts.map +1 -0
- package/dist/IStaticContractsInfo.js +13 -0
- package/dist/IStaticContractsInfo.js.map +1 -0
- package/dist/LocalhostWeb3Provider.d.ts +15 -0
- package/dist/LocalhostWeb3Provider.d.ts.map +1 -0
- package/dist/LocalhostWeb3Provider.js +60 -0
- package/dist/LocalhostWeb3Provider.js.map +1 -0
- package/dist/MockCrossChainEntitlement.d.ts +6 -0
- package/dist/MockCrossChainEntitlement.d.ts.map +1 -0
- package/dist/MockCrossChainEntitlement.js +104 -0
- package/dist/MockCrossChainEntitlement.js.map +1 -0
- package/dist/MockERC1155.d.ts +6 -0
- package/dist/MockERC1155.d.ts.map +1 -0
- package/dist/MockERC1155.js +518 -0
- package/dist/MockERC1155.js.map +1 -0
- package/dist/MockERC20.d.ts +6 -0
- package/dist/MockERC20.d.ts.map +1 -0
- package/dist/MockERC20.js +574 -0
- package/dist/MockERC20.js.map +1 -0
- package/dist/MockERC721A.d.ts +1563 -0
- package/dist/MockERC721A.d.ts.map +1 -0
- package/dist/MockERC721A.js +1913 -0
- package/dist/MockERC721A.js.map +1 -0
- package/dist/RiverRegistryFactory.d.ts +5 -0
- package/dist/RiverRegistryFactory.d.ts.map +1 -0
- package/dist/RiverRegistryFactory.js +5 -0
- package/dist/RiverRegistryFactory.js.map +1 -0
- package/dist/SpaceDappFactory.d.ts +5 -0
- package/dist/SpaceDappFactory.d.ts.map +1 -0
- package/dist/SpaceDappFactory.js +8 -0
- package/dist/SpaceDappFactory.js.map +1 -0
- package/dist/TestCrossChainEntitlement.d.ts +14 -0
- package/dist/TestCrossChainEntitlement.d.ts.map +1 -0
- package/dist/TestCrossChainEntitlement.js +100 -0
- package/dist/TestCrossChainEntitlement.js.map +1 -0
- package/dist/TestEthBalance.d.ts +60 -0
- package/dist/TestEthBalance.d.ts.map +1 -0
- package/dist/TestEthBalance.js +94 -0
- package/dist/TestEthBalance.js.map +1 -0
- package/dist/TestGatingERC1155.d.ts +17 -0
- package/dist/TestGatingERC1155.d.ts.map +1 -0
- package/dist/TestGatingERC1155.js +101 -0
- package/dist/TestGatingERC1155.js.map +1 -0
- package/dist/TestGatingERC20.d.ts +17 -0
- package/dist/TestGatingERC20.d.ts.map +1 -0
- package/dist/TestGatingERC20.js +149 -0
- package/dist/TestGatingERC20.js.map +1 -0
- package/dist/TestGatingNFT.d.ts +17 -0
- package/dist/TestGatingNFT.d.ts.map +1 -0
- package/dist/TestGatingNFT.js +140 -0
- package/dist/TestGatingNFT.js.map +1 -0
- package/dist/TestGatingUtils.d.ts +15 -0
- package/dist/TestGatingUtils.d.ts.map +1 -0
- package/dist/TestGatingUtils.js +112 -0
- package/dist/TestGatingUtils.js.map +1 -0
- package/dist/Utils.d.ts +59 -0
- package/dist/Utils.d.ts.map +1 -0
- package/dist/Utils.js +122 -0
- package/dist/Utils.js.map +1 -0
- package/dist/Web3Constants.d.ts +6 -0
- package/dist/Web3Constants.d.ts.map +1 -0
- package/dist/Web3Constants.js +7 -0
- package/dist/Web3Constants.js.map +1 -0
- package/dist/Web3Constants.test.d.ts +2 -0
- package/dist/Web3Constants.test.d.ts.map +1 -0
- package/dist/Web3Constants.test.js +15 -0
- package/dist/Web3Constants.test.js.map +1 -0
- package/dist/chain.d.ts +65 -0
- package/dist/chain.d.ts.map +1 -0
- package/dist/chain.js +48 -0
- package/dist/chain.js.map +1 -0
- package/dist/entitlement.d.ts +146 -0
- package/dist/entitlement.d.ts.map +1 -0
- package/dist/entitlement.js +931 -0
- package/dist/entitlement.js.map +1 -0
- package/dist/entitlement.test.d.ts +2 -0
- package/dist/entitlement.test.d.ts.map +1 -0
- package/dist/entitlement.test.js +1743 -0
- package/dist/entitlement.test.js.map +1 -0
- package/dist/error-types.d.ts +7 -0
- package/dist/error-types.d.ts.map +1 -0
- package/dist/error-types.js +13 -0
- package/dist/error-types.js.map +1 -0
- package/dist/index.d.ts +76 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +76 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +29 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.test.d.ts +2 -0
- package/dist/utils.test.d.ts.map +1 -0
- package/dist/utils.test.js +44 -0
- package/dist/utils.test.js.map +1 -0
- package/dist/v3/BaseContractShim.d.ts +28 -0
- package/dist/v3/BaseContractShim.d.ts.map +1 -0
- package/dist/v3/BaseContractShim.js +185 -0
- package/dist/v3/BaseContractShim.js.map +1 -0
- package/dist/v3/BaseRegistry.d.ts +30 -0
- package/dist/v3/BaseRegistry.d.ts.map +1 -0
- package/dist/v3/BaseRegistry.js +64 -0
- package/dist/v3/BaseRegistry.js.map +1 -0
- package/dist/v3/EIP-712.d.ts +35 -0
- package/dist/v3/EIP-712.d.ts.map +1 -0
- package/dist/v3/EIP-712.js +57 -0
- package/dist/v3/EIP-712.js.map +1 -0
- package/dist/v3/IBanningShim.d.ts +7 -0
- package/dist/v3/IBanningShim.d.ts.map +1 -0
- package/dist/v3/IBanningShim.js +8 -0
- package/dist/v3/IBanningShim.js.map +1 -0
- package/dist/v3/IChannelShim.d.ts +8 -0
- package/dist/v3/IChannelShim.d.ts.map +1 -0
- package/dist/v3/IChannelShim.js +8 -0
- package/dist/v3/IChannelShim.js.map +1 -0
- package/dist/v3/ICreateSpaceShim.d.ts +9 -0
- package/dist/v3/ICreateSpaceShim.d.ts.map +1 -0
- package/dist/v3/ICreateSpaceShim.js +8 -0
- package/dist/v3/ICreateSpaceShim.js.map +1 -0
- package/dist/v3/IDropFacetShim.d.ts +7 -0
- package/dist/v3/IDropFacetShim.d.ts.map +1 -0
- package/dist/v3/IDropFacetShim.js +8 -0
- package/dist/v3/IDropFacetShim.js.map +1 -0
- package/dist/v3/IERC721AQueryableShim.d.ts +7 -0
- package/dist/v3/IERC721AQueryableShim.d.ts.map +1 -0
- package/dist/v3/IERC721AQueryableShim.js +8 -0
- package/dist/v3/IERC721AQueryableShim.js.map +1 -0
- package/dist/v3/IERC721AShim.d.ts +7 -0
- package/dist/v3/IERC721AShim.d.ts.map +1 -0
- package/dist/v3/IERC721AShim.js +8 -0
- package/dist/v3/IERC721AShim.js.map +1 -0
- package/dist/v3/IEntitlementCheckerShim.d.ts +7 -0
- package/dist/v3/IEntitlementCheckerShim.d.ts.map +1 -0
- package/dist/v3/IEntitlementCheckerShim.js +8 -0
- package/dist/v3/IEntitlementCheckerShim.js.map +1 -0
- package/dist/v3/IEntitlementDataQueryableShim.d.ts +8 -0
- package/dist/v3/IEntitlementDataQueryableShim.d.ts.map +1 -0
- package/dist/v3/IEntitlementDataQueryableShim.js +8 -0
- package/dist/v3/IEntitlementDataQueryableShim.js.map +1 -0
- package/dist/v3/IEntitlementsShim.d.ts +8 -0
- package/dist/v3/IEntitlementsShim.d.ts.map +1 -0
- package/dist/v3/IEntitlementsShim.js +8 -0
- package/dist/v3/IEntitlementsShim.js.map +1 -0
- package/dist/v3/ILegacySpaceArchitectShim.d.ts +8 -0
- package/dist/v3/ILegacySpaceArchitectShim.d.ts.map +1 -0
- package/dist/v3/ILegacySpaceArchitectShim.js +8 -0
- package/dist/v3/ILegacySpaceArchitectShim.js.map +1 -0
- package/dist/v3/IMembershipMetadataShim.d.ts +7 -0
- package/dist/v3/IMembershipMetadataShim.d.ts.map +1 -0
- package/dist/v3/IMembershipMetadataShim.js +8 -0
- package/dist/v3/IMembershipMetadataShim.js.map +1 -0
- package/dist/v3/IMembershipShim.d.ts +18 -0
- package/dist/v3/IMembershipShim.d.ts.map +1 -0
- package/dist/v3/IMembershipShim.js +73 -0
- package/dist/v3/IMembershipShim.js.map +1 -0
- package/dist/v3/IMulticallShim.d.ts +7 -0
- package/dist/v3/IMulticallShim.d.ts.map +1 -0
- package/dist/v3/IMulticallShim.js +8 -0
- package/dist/v3/IMulticallShim.js.map +1 -0
- package/dist/v3/INodeOperatorShim.d.ts +7 -0
- package/dist/v3/INodeOperatorShim.d.ts.map +1 -0
- package/dist/v3/INodeOperatorShim.js +8 -0
- package/dist/v3/INodeOperatorShim.js.map +1 -0
- package/dist/v3/INodeRegistryShim.d.ts +7 -0
- package/dist/v3/INodeRegistryShim.d.ts.map +1 -0
- package/dist/v3/INodeRegistryShim.js +8 -0
- package/dist/v3/INodeRegistryShim.js.map +1 -0
- package/dist/v3/IOperatorRegistryShim.d.ts +7 -0
- package/dist/v3/IOperatorRegistryShim.d.ts.map +1 -0
- package/dist/v3/IOperatorRegistryShim.js +8 -0
- package/dist/v3/IOperatorRegistryShim.js.map +1 -0
- package/dist/v3/IPrepayShim.d.ts +7 -0
- package/dist/v3/IPrepayShim.d.ts.map +1 -0
- package/dist/v3/IPrepayShim.js +8 -0
- package/dist/v3/IPrepayShim.js.map +1 -0
- package/dist/v3/IPricingShim.d.ts +8 -0
- package/dist/v3/IPricingShim.d.ts.map +1 -0
- package/dist/v3/IPricingShim.js +8 -0
- package/dist/v3/IPricingShim.js.map +1 -0
- package/dist/v3/IReviewShim.d.ts +61 -0
- package/dist/v3/IReviewShim.d.ts.map +1 -0
- package/dist/v3/IReviewShim.js +101 -0
- package/dist/v3/IReviewShim.js.map +1 -0
- package/dist/v3/IRiverPointsShim.d.ts +7 -0
- package/dist/v3/IRiverPointsShim.d.ts.map +1 -0
- package/dist/v3/IRiverPointsShim.js +8 -0
- package/dist/v3/IRiverPointsShim.js.map +1 -0
- package/dist/v3/IRolesShim.d.ts +8 -0
- package/dist/v3/IRolesShim.d.ts.map +1 -0
- package/dist/v3/IRolesShim.js +8 -0
- package/dist/v3/IRolesShim.js.map +1 -0
- package/dist/v3/IRuleEntitlementShim.d.ts +6 -0
- package/dist/v3/IRuleEntitlementShim.d.ts.map +1 -0
- package/dist/v3/IRuleEntitlementShim.js +3 -0
- package/dist/v3/IRuleEntitlementShim.js.map +1 -0
- package/dist/v3/IRuleEntitlementV2Shim.d.ts +6 -0
- package/dist/v3/IRuleEntitlementV2Shim.d.ts.map +1 -0
- package/dist/v3/IRuleEntitlementV2Shim.js +3 -0
- package/dist/v3/IRuleEntitlementV2Shim.js.map +1 -0
- package/dist/v3/ISpaceArchitectShim.d.ts +8 -0
- package/dist/v3/ISpaceArchitectShim.d.ts.map +1 -0
- package/dist/v3/ISpaceArchitectShim.js +38 -0
- package/dist/v3/ISpaceArchitectShim.js.map +1 -0
- package/dist/v3/ISpaceDelegationShim.d.ts +7 -0
- package/dist/v3/ISpaceDelegationShim.d.ts.map +1 -0
- package/dist/v3/ISpaceDelegationShim.js +8 -0
- package/dist/v3/ISpaceDelegationShim.js.map +1 -0
- package/dist/v3/ISpaceOwnerShim.d.ts +8 -0
- package/dist/v3/ISpaceOwnerShim.d.ts.map +1 -0
- package/dist/v3/ISpaceOwnerShim.js +8 -0
- package/dist/v3/ISpaceOwnerShim.js.map +1 -0
- package/dist/v3/IStreamRegistryShim.d.ts +7 -0
- package/dist/v3/IStreamRegistryShim.d.ts.map +1 -0
- package/dist/v3/IStreamRegistryShim.js +8 -0
- package/dist/v3/IStreamRegistryShim.js.map +1 -0
- package/dist/v3/ITippingShim.d.ts +20 -0
- package/dist/v3/ITippingShim.d.ts.map +1 -0
- package/dist/v3/ITippingShim.js +46 -0
- package/dist/v3/ITippingShim.js.map +1 -0
- package/dist/v3/ITreasuryShim.d.ts +7 -0
- package/dist/v3/ITreasuryShim.d.ts.map +1 -0
- package/dist/v3/ITreasuryShim.js +8 -0
- package/dist/v3/ITreasuryShim.js.map +1 -0
- package/dist/v3/MockERC721AShim.d.ts +7 -0
- package/dist/v3/MockERC721AShim.d.ts.map +1 -0
- package/dist/v3/MockERC721AShim.js +8 -0
- package/dist/v3/MockERC721AShim.js.map +1 -0
- package/dist/v3/OwnableFacetShim.d.ts +7 -0
- package/dist/v3/OwnableFacetShim.d.ts.map +1 -0
- package/dist/v3/OwnableFacetShim.js +8 -0
- package/dist/v3/OwnableFacetShim.js.map +1 -0
- package/dist/v3/PlatformRequirements.d.ts +10 -0
- package/dist/v3/PlatformRequirements.d.ts.map +1 -0
- package/dist/v3/PlatformRequirements.js +17 -0
- package/dist/v3/PlatformRequirements.js.map +1 -0
- package/dist/v3/PricingModules.d.ts +13 -0
- package/dist/v3/PricingModules.d.ts.map +1 -0
- package/dist/v3/PricingModules.js +23 -0
- package/dist/v3/PricingModules.js.map +1 -0
- package/dist/v3/RiverAirdropDapp.d.ts +16 -0
- package/dist/v3/RiverAirdropDapp.d.ts.map +1 -0
- package/dist/v3/RiverAirdropDapp.js +30 -0
- package/dist/v3/RiverAirdropDapp.js.map +1 -0
- package/dist/v3/RiverRegistry.d.ts +32 -0
- package/dist/v3/RiverRegistry.d.ts.map +1 -0
- package/dist/v3/RiverRegistry.js +96 -0
- package/dist/v3/RiverRegistry.js.map +1 -0
- package/dist/v3/RuleEntitlementShim.d.ts +11 -0
- package/dist/v3/RuleEntitlementShim.d.ts.map +1 -0
- package/dist/v3/RuleEntitlementShim.js +38 -0
- package/dist/v3/RuleEntitlementShim.js.map +1 -0
- package/dist/v3/RuleEntitlementV2Shim.d.ts +11 -0
- package/dist/v3/RuleEntitlementV2Shim.d.ts.map +1 -0
- package/dist/v3/RuleEntitlementV2Shim.js +38 -0
- package/dist/v3/RuleEntitlementV2Shim.js.map +1 -0
- package/dist/v3/Space.d.ts +97 -0
- package/dist/v3/Space.d.ts.map +1 -0
- package/dist/v3/Space.js +440 -0
- package/dist/v3/Space.js.map +1 -0
- package/dist/v3/SpaceDapp.d.ts +212 -0
- package/dist/v3/SpaceDapp.d.ts.map +1 -0
- package/dist/v3/SpaceDapp.js +1164 -0
- package/dist/v3/SpaceDapp.js.map +1 -0
- package/dist/v3/SpaceOwner.d.ts +13 -0
- package/dist/v3/SpaceOwner.d.ts.map +1 -0
- package/dist/v3/SpaceOwner.js +18 -0
- package/dist/v3/SpaceOwner.js.map +1 -0
- package/dist/v3/SpaceRegistrar.d.ts +25 -0
- package/dist/v3/SpaceRegistrar.d.ts.map +1 -0
- package/dist/v3/SpaceRegistrar.js +56 -0
- package/dist/v3/SpaceRegistrar.js.map +1 -0
- package/dist/v3/TokenPausableFacetShim.d.ts +7 -0
- package/dist/v3/TokenPausableFacetShim.d.ts.map +1 -0
- package/dist/v3/TokenPausableFacetShim.js +8 -0
- package/dist/v3/TokenPausableFacetShim.js.map +1 -0
- package/dist/v3/UserEntitlementShim.d.ts +11 -0
- package/dist/v3/UserEntitlementShim.d.ts.map +1 -0
- package/dist/v3/UserEntitlementShim.js +44 -0
- package/dist/v3/UserEntitlementShim.js.map +1 -0
- package/dist/v3/WalletLink.d.ts +50 -0
- package/dist/v3/WalletLink.d.ts.map +1 -0
- package/dist/v3/WalletLink.js +215 -0
- package/dist/v3/WalletLink.js.map +1 -0
- package/dist/v3/WalletLinkShim.d.ts +7 -0
- package/dist/v3/WalletLinkShim.d.ts.map +1 -0
- package/dist/v3/WalletLinkShim.js +8 -0
- package/dist/v3/WalletLinkShim.js.map +1 -0
- package/dist/v3/index.d.ts +24 -0
- package/dist/v3/index.d.ts.map +1 -0
- package/dist/v3/index.js +24 -0
- package/dist/v3/index.js.map +1 -0
- 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":"AAAA,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,MAAM,CAAA;AACvF,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAErC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE3C,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAGtE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAE9C,MAAM,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAA;AAE3C,MAAM,OAAO,aAAa;IACf,KAAK,CAAC,UAAU,CAAC,SAAiB;QACrC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;QACtC,CAAC;QAED,OAAO,MAAM,UAAU,CAAC,eAAe,EAAE,SAAS,CAAC,CAAA;IACvD,CAAC;CACJ;AAED,MAAM,YAAY,GAAG,IAAI,GAAG,EAAmB,CAAA;AAC/C,MAAM,iBAAiB,GAAG,IAAI,KAAK,EAAE,CAAA;AAErC,KAAK,UAAU,kBAAkB,CAAC,OAAe;IAC7C,IAAI,CAAC;QACD,MAAM,iBAAiB,CAAC,IAAI,EAAE,CAAA;QAC9B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,MAAM,eAAe,GAAG,MAAM,cAAc,CACxC,OAAO,EACP,WAAW,CAAC,GAAG,EACf,WAAW,CAAC,QAAQ,CAAC,MAAM,CAC9B,CAAA;YACD,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,eAAe,CAAC,CAAA;QAC9C,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,CAAC,CAAC,CAAA;QAC5C,MAAM,IAAI,KAAK;QACX,4EAA4E;QAC5E,mCAAmC,OAAO,EAAE,CAC/C,CAAA;IACL,CAAC;YAAS,CAAC;QACP,iBAAiB,CAAC,MAAM,EAAE,CAAA;IAC9B,CAAC;IAED,OAAO,YAAY,CAAC,GAAG,CAAC,OAAO,CAAE,CAAA;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,+BAA+B;IACjD,OAAO,MAAM,kBAAkB,CAAC,eAAe,CAAC,CAAA;AACpD,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,OAAe,EAAE,SAAkB;IACzD,MAAM,UAAU,GAAG,kBAAkB,EAAE,CAAA;IACvC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAA;IACxD,MAAM,MAAM,GAAG,gBAAgB,CAAC;QAC5B,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,OAAO;QACb,SAAS,EAAE,IAAI,EAAE;QACjB,OAAO,EAAE,gBAAgB;KAC5B,CAAC;SACG,MAAM,CAAC,aAAa,CAAC;SACrB,MAAM,CAAC,aAAa,CAAC,CAAA;IAE1B,MAAM,MAAM,CAAC,UAAU,CAAC;QACpB,OAAO,EAAE,gBAAgB,CAAC,OAAO;QACjC,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC;KACzB,CAAC,CAAA;IAEF,MAAM,eAAe,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAA;IAEzD,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,eAAe,EAAE,SAAS,CAAC,CAAA;IAEjD,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;QAC1C,OAAO,EAAE,eAAe;QACxB,GAAG,EAAE,WAAW,CAAC,GAAG;QACpB,YAAY,EAAE,MAAM;QACpB,IAAI,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC;QACrB,OAAO,EAAE,gBAAgB;KAC5B,CAAC,CAAA;IAEF,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;IAEhC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAA;IAC5E,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAEtC,wEAAwE;IACxE,gGAAgG;IAChG,+CAA+C;IAC/C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC;QAClD,GAAG,EAAE,WAAW,CAAC,GAAG;QACpB,OAAO,EAAE,eAAe;QACxB,SAAS,EAAE,UAAU;QACrB,IAAI,EAAE;YACF,EAAE,EAAE,SAAS;SAChB;QACD,SAAS,EAAE,OAAO,CAAC,WAAW;QAC9B,OAAO,EAAE,OAAO,CAAC,WAAW;KAC/B,CAAC,CAAA;IACF,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;IACxD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QAC/B,IAAI,QAAQ,CAAC,eAAe,KAAK,OAAO,CAAC,eAAe,EAAE,CAAC;YACvD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAA;YAC3C,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACxC,CAAC;IACL,CAAC;IAED,MAAM,KAAK,CAAC,qBAAqB,CAAC,CAAA;AACtC,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,OAAe,EAAE,OAAe;IAChD,MAAM,UAAU,GAAG,kBAAkB,EAAE,CAAA;IACvC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAA;IACxD,MAAM,MAAM,GAAG,gBAAgB,CAAC;QAC5B,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,OAAO;QACb,SAAS,EAAE,IAAI,EAAE;QACjB,OAAO,EAAE,gBAAgB;KAC5B,CAAC;SACG,MAAM,CAAC,aAAa,CAAC;SACrB,MAAM,CAAC,aAAa,CAAC,CAAA;IAE1B,MAAM,MAAM,CAAC,UAAU,CAAC;QACpB,OAAO,EAAE,gBAAgB,CAAC,OAAO;QACjC,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC;KACzB,CAAC,CAAA;IAEF,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;QAC1C,OAAO,EAAE,MAAM,kBAAkB,CAAC,OAAO,CAAC;QAC1C,GAAG,EAAE,WAAW,CAAC,GAAG;QACpB,YAAY,EAAE,MAAM;QACpB,IAAI,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvB,OAAO,EAAE,gBAAgB;KAC5B,CAAC,CAAA;IAEF,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAA;IAC5E,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;AAC1C,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,OAAe,EAAE,OAAgB;IACtD,MAAM,UAAU,GAAG,kBAAkB,EAAE,CAAA;IACvC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAA;IACxD,MAAM,MAAM,GAAG,gBAAgB,CAAC;QAC5B,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,OAAO;QACb,SAAS,EAAE,IAAI,EAAE;QACjB,OAAO,EAAE,gBAAgB;KAC5B,CAAC;SACG,MAAM,CAAC,aAAa,CAAC;SACrB,MAAM,CAAC,aAAa,CAAC,CAAA;IAE1B,MAAM,eAAe,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAA;IAEzD,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC;QAC7C,OAAO,EAAE,eAAe;QACxB,GAAG,EAAE,WAAW,CAAC,GAAG;QACpB,YAAY,EAAE,WAAW;QACzB,IAAI,EAAE,CAAC,OAAO,CAAC;KAClB,CAAC,CAAA;IAEF,OAAO,MAAM,CAAC,cAAc,CAAC,CAAA;AACjC,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG;IACtB,UAAU;IACV,IAAI;IACJ,SAAS;IACT,kBAAkB;CACrB,CAAA"}
|
|
@@ -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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"}
|
package/dist/Utils.d.ts
ADDED
|
@@ -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
|