@towns-protocol/sdk 0.0.257 → 0.0.258

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 (62) hide show
  1. package/dist/client.d.ts +1 -0
  2. package/dist/client.d.ts.map +1 -1
  3. package/dist/client.js +39 -27
  4. package/dist/client.js.map +1 -1
  5. package/dist/clientDecryptionExtensions.js +1 -1
  6. package/dist/clientDecryptionExtensions.js.map +1 -1
  7. package/dist/id.d.ts +4 -4
  8. package/dist/id.d.ts.map +1 -1
  9. package/dist/id.js +6 -16
  10. package/dist/id.js.map +1 -1
  11. package/dist/rpcInterceptors.js +1 -1
  12. package/dist/rpcInterceptors.js.map +1 -1
  13. package/dist/streamEvents.d.ts +7 -0
  14. package/dist/streamEvents.d.ts.map +1 -1
  15. package/dist/syncedStreamsLoop.d.ts +2 -0
  16. package/dist/syncedStreamsLoop.d.ts.map +1 -1
  17. package/dist/syncedStreamsLoop.js +22 -0
  18. package/dist/syncedStreamsLoop.js.map +1 -1
  19. package/dist/tests/multi/appRegistryService.test.js +1 -1
  20. package/dist/tests/multi/appRegistryService.test.js.map +1 -1
  21. package/dist/tests/multi/botEntitlements.test.d.ts +5 -0
  22. package/dist/tests/multi/botEntitlements.test.d.ts.map +1 -0
  23. package/dist/tests/multi/botEntitlements.test.js +128 -0
  24. package/dist/tests/multi/botEntitlements.test.js.map +1 -0
  25. package/dist/tests/multi/botMembership.test.d.ts +5 -0
  26. package/dist/tests/multi/botMembership.test.d.ts.map +1 -0
  27. package/dist/tests/multi/botMembership.test.js +276 -0
  28. package/dist/tests/multi/botMembership.test.js.map +1 -0
  29. package/dist/tests/multi/botStreamCreation.test.d.ts +5 -0
  30. package/dist/tests/multi/botStreamCreation.test.d.ts.map +1 -0
  31. package/dist/tests/multi/botStreamCreation.test.js +58 -0
  32. package/dist/tests/multi/botStreamCreation.test.js.map +1 -0
  33. package/dist/tests/multi/transactions.test.js +1 -1
  34. package/dist/tests/multi/transactions.test.js.map +1 -1
  35. package/dist/tests/multi/transactions_Tip.test.js +1 -1
  36. package/dist/tests/multi/transactions_Tip.test.js.map +1 -1
  37. package/dist/tests/multi_ne/sign.test.js +4 -4
  38. package/dist/tests/multi_ne/sign.test.js.map +1 -1
  39. package/dist/tests/testUtils.js +2 -2
  40. package/dist/tests/testUtils.js.map +1 -1
  41. package/dist/utils.d.ts +8 -0
  42. package/dist/utils.d.ts.map +1 -1
  43. package/dist/utils.js +27 -1
  44. package/dist/utils.js.map +1 -1
  45. package/dist/views/streams/spaceMentionsTransform.js +1 -1
  46. package/dist/views/streams/spaceMentionsTransform.js.map +1 -1
  47. package/dist/views/streams/timelines.js +1 -1
  48. package/dist/views/streams/timelines.js.map +1 -1
  49. package/dist/views/streams/timelinesModel.d.ts.map +1 -1
  50. package/dist/views/streams/timelinesModel.js +1 -2
  51. package/dist/views/streams/timelinesModel.js.map +1 -1
  52. package/dist/views/transforms/blockedUserIdsTransform.js +1 -1
  53. package/dist/views/transforms/blockedUserIdsTransform.js.map +1 -1
  54. package/dist/views/transforms/dmsAndGdmsTransform.js +1 -1
  55. package/dist/views/transforms/dmsAndGdmsTransform.js.map +1 -1
  56. package/dist/views/transforms/dmsAndGdmsUnreadIdsTransform.js +1 -1
  57. package/dist/views/transforms/dmsAndGdmsUnreadIdsTransform.js.map +1 -1
  58. package/dist/views/transforms/membershipsTransform.js +1 -1
  59. package/dist/views/transforms/membershipsTransform.js.map +1 -1
  60. package/dist/views/transforms/spaceIdsTransform.js +1 -1
  61. package/dist/views/transforms/spaceIdsTransform.js.map +1 -1
  62. package/package.json +11 -14
@@ -0,0 +1,128 @@
1
+ /**
2
+ * @group with-entitlements
3
+ */
4
+ import { AppRegistryDapp, Permission, SpaceAddressFromSpaceId, NoopRuleData, } from '@towns-protocol/web3';
5
+ import { createSpaceAndDefaultChannel, everyoneMembershipStruct, setupWalletsAndContexts, waitFor, createChannel, createRole, } from '../testUtils';
6
+ import { makeBaseChainConfig } from '../../riverConfig';
7
+ import { ethers } from 'ethers';
8
+ import { MembershipOp } from '@towns-protocol/proto';
9
+ import { make_MemberPayload_KeySolicitation } from '../../types';
10
+ describe('bot entitlements tests', () => {
11
+ test('bot has READ permissions to channels when granted by isAppEntitled', async () => {
12
+ const { bob: bot, bobsWallet: botWallet, bobProvider: botProvider, carol: spaceOwner, carolProvider: spaceOwnerProvider, carolSpaceDapp: spaceOwnerSpaceDapp, } = await setupWalletsAndContexts();
13
+ const appRegistryDapp = new AppRegistryDapp(makeBaseChainConfig().chainConfig, spaceOwnerProvider);
14
+ // Create bot app contract with READ permission only
15
+ const tx = await appRegistryDapp.createApp(botProvider.signer, 'read-only-bot', [Permission.Read], // Only READ permission, no WRITE
16
+ botWallet.address, ethers.utils.parseEther('0.01').toBigInt(), 31536000n);
17
+ const receipt = await tx.wait();
18
+ const { app: foundAppAddress } = appRegistryDapp.getCreateAppEvent(receipt);
19
+ expect(foundAppAddress).toBeDefined();
20
+ // Create bot user streams
21
+ await expect(bot.initializeUser({ appAddress: foundAppAddress })).resolves.toBeDefined();
22
+ bot.startSync();
23
+ // Create a town with channels (everyone can join)
24
+ const everyoneMembership = await everyoneMembershipStruct(spaceOwnerSpaceDapp, spaceOwner);
25
+ const { spaceId } = await createSpaceAndDefaultChannel(spaceOwner, spaceOwnerSpaceDapp, spaceOwnerProvider.wallet, "space owner's town", everyoneMembership);
26
+ // Install the bot to the space (as space owner)
27
+ const installTx = await appRegistryDapp.installApp(spaceOwnerProvider.signer, foundAppAddress, SpaceAddressFromSpaceId(spaceId), ethers.utils.parseEther('0.02').toBigInt());
28
+ const installReceipt = await installTx.wait();
29
+ expect(installReceipt.status).toBe(1);
30
+ // Create a role that only grants WRITE permission (not READ) to everyone
31
+ // This will deny the bot WRITE access to the channel
32
+ const { error: roleError } = await createRole(spaceOwnerSpaceDapp, spaceOwnerProvider, spaceId, 'write-only-role', [Permission.Write], // Only WRITE permission, no READ
33
+ [], // No specific users - this role won't help the bot
34
+ NoopRuleData, spaceOwnerProvider.wallet);
35
+ expect(roleError).toBeUndefined();
36
+ // Create a custom channel that requires WRITE permission
37
+ // The bot won't have WRITE permission through roles, but should have READ through app entitlements
38
+ const { channelId: restrictedChannelId, error: channelError } = await createChannel(spaceOwnerSpaceDapp, spaceOwnerProvider, spaceId, 'read-only-channel', [1], // Use the write-only role (role ID 1) - bot won't qualify
39
+ spaceOwnerProvider.wallet);
40
+ expect(channelError).toBeUndefined();
41
+ expect(restrictedChannelId).toBeDefined();
42
+ // Create the channel stream
43
+ const { streamId: returnedChannelId } = await spaceOwner.createChannel(spaceId, 'read-only-channel', '', restrictedChannelId);
44
+ expect(returnedChannelId).toEqual(restrictedChannelId);
45
+ // Have space owner add bot to space and channel
46
+ await expect(spaceOwner.joinUser(spaceId, bot.userId)).resolves.toBeDefined();
47
+ await expect(spaceOwner.joinUser(restrictedChannelId, bot.userId)).resolves.toBeDefined();
48
+ // Validate bot is a member of both space and channel
49
+ const botUserStreamView = bot.stream(bot.userStreamId).view;
50
+ await waitFor(() => {
51
+ expect(botUserStreamView.userContent.isMember(spaceId, MembershipOp.SO_JOIN)).toBe(true);
52
+ expect(botUserStreamView.userContent.isMember(restrictedChannelId, MembershipOp.SO_JOIN)).toBe(true);
53
+ });
54
+ // Bot should be able to post a key solicitation because it has READ permission through isAppEntitled
55
+ // Key solicitations require READ permission, not WRITE permission
56
+ const payload = make_MemberPayload_KeySolicitation({
57
+ deviceKey: 'bot-device-key',
58
+ sessionIds: [],
59
+ fallbackKey: 'bot-fallback-key',
60
+ isNewDevice: true,
61
+ });
62
+ // This should succeed because the bot has READ permission via app entitlements
63
+ const { error } = await bot.makeEventAndAddToStream(restrictedChannelId, payload);
64
+ expect(error).toBeUndefined();
65
+ // Cleanup
66
+ await bot.stopSync();
67
+ await spaceOwner.stopSync();
68
+ });
69
+ test('bot has write permissions to channels when granted by isAppEntitled', async () => {
70
+ const { alice: spaceOwner, aliceProvider: spaceOwnerProvider, aliceSpaceDapp: spaceOwnerSpaceDapp, bob: botWithoutWrite, bobsWallet: botWithoutWriteWallet, bobProvider: botWithoutWriteProvider, carol: botWithWrite, carolsWallet: botWithWriteWallet, carolProvider: botWithWriteProvider, } = await setupWalletsAndContexts();
71
+ const appRegistryDapp = new AppRegistryDapp(makeBaseChainConfig().chainConfig, spaceOwnerProvider);
72
+ // Create first bot app contract with READ permission only (no WRITE)
73
+ const tx1 = await appRegistryDapp.createApp(botWithoutWriteProvider.signer, 'read-only-bot', [Permission.Read], // Only READ permission, no WRITE
74
+ botWithoutWriteWallet.address, ethers.utils.parseEther('0.01').toBigInt(), 31536000n);
75
+ const receipt1 = await tx1.wait();
76
+ const { app: readOnlyBotAddress } = appRegistryDapp.getCreateAppEvent(receipt1);
77
+ expect(readOnlyBotAddress).toBeDefined();
78
+ // Create second bot app contract with both READ and WRITE permissions
79
+ const tx2 = await appRegistryDapp.createApp(botWithWriteProvider.signer, 'read-write-bot', [Permission.Read, Permission.Write], // Both READ and WRITE permissions
80
+ botWithWriteWallet.address, ethers.utils.parseEther('0.01').toBigInt(), 31536000n);
81
+ const receipt2 = await tx2.wait();
82
+ const { app: readWriteBotAddress } = appRegistryDapp.getCreateAppEvent(receipt2);
83
+ expect(readWriteBotAddress).toBeDefined();
84
+ // Create bot user streams for both bots
85
+ await expect(botWithoutWrite.initializeUser({ appAddress: readOnlyBotAddress })).resolves.toBeDefined();
86
+ await expect(botWithWrite.initializeUser({ appAddress: readWriteBotAddress })).resolves.toBeDefined();
87
+ botWithoutWrite.startSync();
88
+ botWithWrite.startSync();
89
+ // Create a town with channels (everyone can join)
90
+ const everyoneMembership = await everyoneMembershipStruct(spaceOwnerSpaceDapp, spaceOwner);
91
+ const { spaceId, defaultChannelId } = await createSpaceAndDefaultChannel(spaceOwner, spaceOwnerSpaceDapp, spaceOwnerProvider.wallet, "space owner's town", everyoneMembership);
92
+ // Install both bots to the space (as space owner)
93
+ const installTx1 = await appRegistryDapp.installApp(spaceOwnerProvider.signer, readOnlyBotAddress, SpaceAddressFromSpaceId(spaceId), ethers.utils.parseEther('0.02').toBigInt());
94
+ const installReceipt1 = await installTx1.wait();
95
+ expect(installReceipt1.status).toBe(1);
96
+ const installTx2 = await appRegistryDapp.installApp(spaceOwnerProvider.signer, readWriteBotAddress, SpaceAddressFromSpaceId(spaceId), ethers.utils.parseEther('0.02').toBigInt());
97
+ const installReceipt2 = await installTx2.wait();
98
+ expect(installReceipt2.status).toBe(1);
99
+ // Verify both bots are installed
100
+ const space = spaceOwnerSpaceDapp.getSpace(spaceId);
101
+ const installedApps = await space.AppAccount.read.getInstalledApps();
102
+ expect(installedApps).toContain(readOnlyBotAddress);
103
+ expect(installedApps).toContain(readWriteBotAddress);
104
+ // Have space owner add both bots to space and default channel
105
+ await expect(spaceOwner.joinUser(spaceId, botWithoutWrite.userId)).resolves.toBeDefined();
106
+ await expect(spaceOwner.joinUser(defaultChannelId, botWithoutWrite.userId)).resolves.toBeDefined();
107
+ await expect(spaceOwner.joinUser(spaceId, botWithWrite.userId)).resolves.toBeDefined();
108
+ await expect(spaceOwner.joinUser(defaultChannelId, botWithWrite.userId)).resolves.toBeDefined();
109
+ // Validate both bots are members of space and default channel
110
+ const botWithoutWriteUserStreamView = botWithoutWrite.stream(botWithoutWrite.userStreamId).view;
111
+ const botWithWriteUserStreamView = botWithWrite.stream(botWithWrite.userStreamId).view;
112
+ await waitFor(() => {
113
+ expect(botWithoutWriteUserStreamView.userContent.isMember(spaceId, MembershipOp.SO_JOIN)).toBe(true);
114
+ expect(botWithoutWriteUserStreamView.userContent.isMember(defaultChannelId, MembershipOp.SO_JOIN)).toBe(true);
115
+ expect(botWithWriteUserStreamView.userContent.isMember(spaceId, MembershipOp.SO_JOIN)).toBe(true);
116
+ expect(botWithWriteUserStreamView.userContent.isMember(defaultChannelId, MembershipOp.SO_JOIN)).toBe(true);
117
+ });
118
+ // Bot without WRITE permission should NOT be able to post a message
119
+ await expect(botWithoutWrite.sendMessage(defaultChannelId, 'Message from read-only bot')).rejects.toThrow(/PERMISSION_DENIED/);
120
+ // Bot with WRITE permission should be able to post a message
121
+ await expect(botWithWrite.sendMessage(defaultChannelId, 'Message from read-write bot')).resolves.not.toThrow();
122
+ // Cleanup
123
+ await botWithoutWrite.stopSync();
124
+ await botWithWrite.stopSync();
125
+ await spaceOwner.stopSync();
126
+ });
127
+ });
128
+ //# sourceMappingURL=botEntitlements.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"botEntitlements.test.js","sourceRoot":"","sources":["../../../src/tests/multi/botEntitlements.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @group with-entitlements
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=botMembership.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"botMembership.test.d.ts","sourceRoot":"","sources":["../../../src/tests/multi/botMembership.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,276 @@
1
+ /**
2
+ * @group with-entitlements
3
+ */
4
+ import { AppRegistryDapp, Permission, SpaceAddressFromSpaceId, NoopRuleData, } from '@towns-protocol/web3';
5
+ import { createSpaceAndDefaultChannel, everyoneMembershipStruct, setupWalletsAndContexts, waitFor, createTownWithRequirements, createChannel, getXchainConfigForTesting, makeTestClient, } from '../testUtils';
6
+ import { makeBaseChainConfig } from '../../riverConfig';
7
+ import { ethers } from 'ethers';
8
+ import { MembershipOp } from '@towns-protocol/proto';
9
+ describe('bot membership tests', () => {
10
+ test('registered and installed bots can join spaces and channels', async () => {
11
+ const { aliceProvider: ownerProvider, bob: bot, bobsWallet: botWallet, bobProvider: botProvider, carol: spaceOwner, carolProvider: spaceOwnerProvider, carolSpaceDapp: spaceOwnerSpaceDapp, } = await setupWalletsAndContexts();
12
+ const appRegistryDapp = new AppRegistryDapp(makeBaseChainConfig().chainConfig, ownerProvider);
13
+ // Create bot app contract
14
+ const tx = await appRegistryDapp.createApp(botProvider.signer, 'bob-bot', [Permission.Read, Permission.Write], botWallet.address, ethers.utils.parseEther('0.01').toBigInt(), 31536000n);
15
+ const receipt = await tx.wait();
16
+ const { app: foundAppAddress } = appRegistryDapp.getCreateAppEvent(receipt);
17
+ expect(foundAppAddress).toBeDefined();
18
+ // Create bot user streams
19
+ await expect(bot.initializeUser({ appAddress: foundAppAddress })).resolves.toBeDefined();
20
+ bot.startSync();
21
+ // Create a town with channels
22
+ const everyoneMembership = await everyoneMembershipStruct(spaceOwnerSpaceDapp, spaceOwner);
23
+ const { spaceId, defaultChannelId: channelId } = await createSpaceAndDefaultChannel(spaceOwner, spaceOwnerSpaceDapp, spaceOwnerProvider.wallet, "space owner's town", everyoneMembership);
24
+ // Install the bot to the space
25
+ const tx2 = await appRegistryDapp.installApp(spaceOwnerProvider.signer, foundAppAddress, SpaceAddressFromSpaceId(spaceId), ethers.utils.parseEther('0.02').toBigInt());
26
+ // Confirm installation transaction succeeded
27
+ const receipt2 = await tx2.wait();
28
+ expect(receipt2.status).toBe(1);
29
+ const space = spaceOwnerSpaceDapp.getSpace(spaceId);
30
+ expect(space).toBeDefined();
31
+ // Sanity check: the spaceDapp reports that the app is installed.
32
+ const installedApps = await space.AppAccount.read.getInstalledApps();
33
+ expect(installedApps).toContain(foundAppAddress);
34
+ // Have space owner add the bot to the space
35
+ await spaceOwner.joinUser(spaceId, bot.userId);
36
+ // Validate the bot is now a member of both space and channel
37
+ const botUserStreamView = bot.stream(bot.userStreamId).view;
38
+ expect(botUserStreamView).toBeDefined();
39
+ await waitFor(() => {
40
+ expect(botUserStreamView.userContent.isMember(spaceId, MembershipOp.SO_JOIN)).toBe(true);
41
+ });
42
+ // Have space owner add the bot to the channel
43
+ await expect(spaceOwner.joinUser(channelId, bot.userId)).resolves.toBeDefined();
44
+ // Validate that the bot is a channel member
45
+ await waitFor(() => {
46
+ expect(botUserStreamView.userContent.isMember(channelId, MembershipOp.SO_JOIN)).toBe(true);
47
+ });
48
+ // Cleanup
49
+ await bot.stopSync();
50
+ await spaceOwner.stopSync();
51
+ });
52
+ test('registered and installed bots can join spaces and channels in towns with gated membership', async () => {
53
+ // Create a town with user entitlements that only allows 'bob' (space owner)
54
+ // The bot is NOT in this list, so it doesn't satisfy the space entitlements.
55
+ const { spaceId, channelId: defaultChannelId, bob: spaceOwner, bobProvider: spaceOwnerProvider, bobSpaceDapp: spaceOwnerSpaceDapp, alice: bot, alicesWallet: botWallet, aliceProvider: botProvider, } = await createTownWithRequirements({
56
+ everyone: false,
57
+ users: ['bob'], // No one but the space owner can join this town
58
+ ruleData: NoopRuleData,
59
+ });
60
+ const appRegistryDapp = new AppRegistryDapp(makeBaseChainConfig().chainConfig, spaceOwnerProvider);
61
+ // Create bot app contract
62
+ const tx = await appRegistryDapp.createApp(botProvider.signer, 'bot-restricted-test', [Permission.Read, Permission.Write], botWallet.address, ethers.utils.parseEther('0.01').toBigInt(), 31536000n);
63
+ const receipt = await tx.wait();
64
+ const { app: foundAppAddress } = appRegistryDapp.getCreateAppEvent(receipt);
65
+ expect(foundAppAddress).toBeDefined();
66
+ // Create bot user streams
67
+ await expect(bot.initializeUser({ appAddress: foundAppAddress })).resolves.toBeDefined();
68
+ bot.startSync();
69
+ // Install the bot to the space (as space owner)
70
+ const installTx = await appRegistryDapp.installApp(spaceOwnerProvider.signer, foundAppAddress, SpaceAddressFromSpaceId(spaceId), ethers.utils.parseEther('0.02').toBigInt());
71
+ const installReceipt = await installTx.wait();
72
+ expect(installReceipt.status).toBe(1);
73
+ // Verify bot is installed
74
+ const space = spaceOwnerSpaceDapp.getSpace(spaceId);
75
+ const installedApps = await space.AppAccount.read.getInstalledApps();
76
+ expect(installedApps).toContain(foundAppAddress);
77
+ // Create a custom channel with user entitlements that disallows all users.
78
+ // The bot naturally doesn't satisfy the channel entitlements.
79
+ const { channelId: restrictedChannelId, error: channelError } = await createChannel(spaceOwnerSpaceDapp, spaceOwnerProvider, spaceId, 'restricted-channel', [], // No role IDs - no users qualify for admission to this channel.
80
+ spaceOwnerProvider.wallet);
81
+ expect(channelError).toBeUndefined();
82
+ expect(restrictedChannelId).toBeDefined();
83
+ const { streamId: returnedChannelId } = await spaceOwner.createChannel(spaceId, 'restricted-channel', '', restrictedChannelId);
84
+ expect(returnedChannelId).toEqual(restrictedChannelId);
85
+ // Verify that the bot does NOT satisfy space entitlements.
86
+ const botEntitledWallet = await spaceOwnerSpaceDapp.getEntitledWalletForJoiningSpace(spaceId, botWallet.address, getXchainConfigForTesting());
87
+ expect(botEntitledWallet).toBeUndefined(); // Bot should NOT be entitled
88
+ // Space owner CAN add bot to space despite bot not satisfying entitlements
89
+ await expect(spaceOwner.joinUser(spaceId, bot.userId)).resolves.toBeDefined();
90
+ // Validate bot is a space member
91
+ const botUserStreamView = bot.stream(bot.userStreamId).view;
92
+ await waitFor(() => {
93
+ expect(botUserStreamView.userContent.isMember(spaceId, MembershipOp.SO_JOIN)).toBe(true);
94
+ });
95
+ // Space owner CAN add bot to default channel despite bot not satisfying entitlements
96
+ await expect(spaceOwner.joinUser(defaultChannelId, bot.userId)).resolves.toBeDefined();
97
+ // Validate bot is a default channel member
98
+ await waitFor(() => {
99
+ expect(botUserStreamView.userContent.isMember(defaultChannelId, MembershipOp.SO_JOIN)).toBe(true);
100
+ });
101
+ // Space owner CAN add bot to restricted channel despite bot not satisfying channel entitlements
102
+ await expect(spaceOwner.joinUser(restrictedChannelId, bot.userId)).resolves.toBeDefined();
103
+ // Validate bot is a restricted channel member
104
+ await waitFor(() => {
105
+ expect(botUserStreamView.userContent.isMember(restrictedChannelId, MembershipOp.SO_JOIN)).toBe(true);
106
+ });
107
+ // Cleanup
108
+ await bot.stopSync();
109
+ await spaceOwner.stopSync();
110
+ });
111
+ test('an uninstalled bot cannot join a space or channel', async () => {
112
+ const { aliceProvider: ownerProvider, bob: bot, bobsWallet: botWallet, bobProvider: botProvider, carol: spaceOwner, carolProvider: spaceOwnerProvider, carolSpaceDapp: spaceOwnerSpaceDapp, } = await setupWalletsAndContexts();
113
+ const appRegistryDapp = new AppRegistryDapp(makeBaseChainConfig().chainConfig, ownerProvider);
114
+ // Create bot app contract
115
+ const tx = await appRegistryDapp.createApp(botProvider.signer, 'bob-bot', [Permission.Read, Permission.Write], botWallet.address, ethers.utils.parseEther('0.01').toBigInt(), 31536000n);
116
+ const receipt = await tx.wait();
117
+ const { app: foundAppAddress } = appRegistryDapp.getCreateAppEvent(receipt);
118
+ expect(foundAppAddress).toBeDefined();
119
+ // Create bot user streams
120
+ await expect(bot.initializeUser({ appAddress: foundAppAddress })).resolves.toBeDefined();
121
+ bot.startSync();
122
+ // Create a town with channels
123
+ const everyoneMembership = await everyoneMembershipStruct(spaceOwnerSpaceDapp, spaceOwner);
124
+ const { spaceId, defaultChannelId: channelId } = await createSpaceAndDefaultChannel(spaceOwner, spaceOwnerSpaceDapp, spaceOwnerProvider.wallet, "space owner's town", everyoneMembership);
125
+ // NOTE: We do NOT install the bot to the space (unlike the previous test)
126
+ // This is the key difference - the bot is registered but not installed
127
+ const space = spaceOwnerSpaceDapp.getSpace(spaceId);
128
+ expect(space).toBeDefined();
129
+ // Sanity check: the spaceDapp reports that the app is NOT installed
130
+ const installedApps = await space.AppAccount.read.getInstalledApps();
131
+ expect(installedApps).not.toContain(foundAppAddress);
132
+ // Space owner tries to add the uninstalled bot to the space - this should fail
133
+ await expect(spaceOwner.joinUser(spaceId, bot.userId)).rejects.toThrow();
134
+ // Space owner tries to add the uninstalled bot to the channel - this should also fail
135
+ await expect(spaceOwner.joinUser(channelId, bot.userId)).rejects.toThrow();
136
+ // Clean up
137
+ await bot.stopSync();
138
+ await spaceOwner.stopSync();
139
+ });
140
+ test('a non-owner member cannot add or remove a bot as a space or channel member', async () => {
141
+ const { alice: nonOwnerMember, aliceProvider: nonOwnerProvider, alicesWallet: nonOwnerWallet, bob: bot, bobsWallet: botWallet, bobProvider: botProvider, carol: spaceOwner, carolProvider: spaceOwnerProvider, carolSpaceDapp: spaceOwnerSpaceDapp, } = await setupWalletsAndContexts();
142
+ const appRegistryDapp = new AppRegistryDapp(makeBaseChainConfig().chainConfig, spaceOwnerProvider);
143
+ // Create bot app contract
144
+ const tx = await appRegistryDapp.createApp(botProvider.signer, 'bob-bot', [Permission.Read, Permission.Write], botWallet.address, ethers.utils.parseEther('0.01').toBigInt(), 31536000n);
145
+ const receipt = await tx.wait();
146
+ const { app: foundAppAddress } = appRegistryDapp.getCreateAppEvent(receipt);
147
+ expect(foundAppAddress).toBeDefined();
148
+ // Create bot user streams
149
+ await expect(bot.initializeUser({ appAddress: foundAppAddress })).resolves.toBeDefined();
150
+ bot.startSync();
151
+ // Create a town with channels (everyone can join)
152
+ const everyoneMembership = await everyoneMembershipStruct(spaceOwnerSpaceDapp, spaceOwner);
153
+ const { spaceId, defaultChannelId: channelId } = await createSpaceAndDefaultChannel(spaceOwner, spaceOwnerSpaceDapp, spaceOwnerProvider.wallet, "space owner's town", everyoneMembership);
154
+ // Install the bot to the space (as space owner)
155
+ const installTx = await appRegistryDapp.installApp(spaceOwnerProvider.signer, foundAppAddress, SpaceAddressFromSpaceId(spaceId), ethers.utils.parseEther('0.02').toBigInt());
156
+ const installReceipt = await installTx.wait();
157
+ expect(installReceipt.status).toBe(1);
158
+ // Verify bot is installed
159
+ const space = spaceOwnerSpaceDapp.getSpace(spaceId);
160
+ const installedApps = await space.AppAccount.read.getInstalledApps();
161
+ expect(installedApps).toContain(foundAppAddress);
162
+ // Create a spaceDapp for the non-owner member
163
+ const nonOwnerSpaceDapp = spaceOwnerSpaceDapp; // They can use the same spaceDapp instance
164
+ // Have non-owner member join the space and channel
165
+ const { issued } = await nonOwnerSpaceDapp.joinSpace(spaceId, nonOwnerWallet.address, nonOwnerProvider.wallet);
166
+ expect(issued).toBe(true);
167
+ await nonOwnerMember.initializeUser({ spaceId });
168
+ nonOwnerMember.startSync();
169
+ await expect(nonOwnerMember.joinStream(spaceId)).resolves.not.toThrow();
170
+ await expect(nonOwnerMember.joinStream(channelId)).resolves.not.toThrow();
171
+ // First test that non-owner member CANNOT add bot to space (even though bot is installed)
172
+ await expect(nonOwnerMember.joinUser(spaceId, bot.userId)).rejects.toThrow(/PERMISSION_DENIED/);
173
+ // Validate that bot is NOT a space member yet
174
+ const botUserStreamView = bot.stream(bot.userStreamId).view;
175
+ expect(botUserStreamView.userContent.isMember(spaceId, MembershipOp.SO_JOIN)).toBe(false);
176
+ // Have space owner add bot to space (so we can test channel membership)
177
+ await expect(spaceOwner.joinUser(spaceId, bot.userId)).resolves.toBeDefined();
178
+ // Validate bot is now a space member
179
+ await waitFor(() => {
180
+ expect(botUserStreamView.userContent.isMember(spaceId, MembershipOp.SO_JOIN)).toBe(true);
181
+ });
182
+ // Now test that non-owner member CANNOT add bot to channel (even though bot is installed and space member)
183
+ await expect(nonOwnerMember.joinUser(channelId, bot.userId)).rejects.toThrow(/PERMISSION_DENIED/);
184
+ // Validate that bot is still NOT a channel member
185
+ expect(botUserStreamView.userContent.isMember(channelId, MembershipOp.SO_JOIN)).toBe(false);
186
+ // Also test that non-owner member cannot remove bot from space
187
+ await expect(nonOwnerMember.removeUser(spaceId, bot.userId)).rejects.toThrow(/PERMISSION_DENIED/);
188
+ // Validate bot is still a space member
189
+ expect(botUserStreamView.userContent.isMember(spaceId, MembershipOp.SO_JOIN)).toBe(true);
190
+ // Now, let's confirm the non-owner member cannot boot the bot from the channel.
191
+ // Have space owner add bot to channel
192
+ await expect(spaceOwner.joinUser(channelId, bot.userId)).resolves.toBeDefined();
193
+ // Validate bot is now a channel member
194
+ await waitFor(() => {
195
+ expect(botUserStreamView.userContent.isMember(channelId, MembershipOp.SO_JOIN)).toBe(true);
196
+ });
197
+ // Test that non-owner member CANNOT remove bot from channel
198
+ await expect(nonOwnerMember.removeUser(channelId, bot.userId)).rejects.toThrow(/PERMISSION_DENIED/);
199
+ // Validate bot is still a channel member
200
+ expect(botUserStreamView.userContent.isMember(channelId, MembershipOp.SO_JOIN)).toBe(true);
201
+ // Cleanup
202
+ await bot.stopSync();
203
+ await spaceOwner.stopSync();
204
+ await nonOwnerMember.stopSync();
205
+ });
206
+ test('the bot itself cannot add itself to the space or to channels', async () => {
207
+ const { bob: bot, bobsWallet: botWallet, bobProvider: botProvider, carol: spaceOwner, carolProvider: spaceOwnerProvider, carolSpaceDapp: spaceOwnerSpaceDapp, } = await setupWalletsAndContexts();
208
+ const appRegistryDapp = new AppRegistryDapp(makeBaseChainConfig().chainConfig, spaceOwnerProvider);
209
+ // Create bot app contract
210
+ const tx = await appRegistryDapp.createApp(botProvider.signer, 'self-join-test-bot', [Permission.Read, Permission.Write], botWallet.address, ethers.utils.parseEther('0.01').toBigInt(), 31536000n);
211
+ const receipt = await tx.wait();
212
+ const { app: foundAppAddress } = appRegistryDapp.getCreateAppEvent(receipt);
213
+ expect(foundAppAddress).toBeDefined();
214
+ // Create bot user streams
215
+ await expect(bot.initializeUser({ appAddress: foundAppAddress })).resolves.toBeDefined();
216
+ bot.startSync();
217
+ // Create a town with channels (everyone can join)
218
+ const everyoneMembership = await everyoneMembershipStruct(spaceOwnerSpaceDapp, spaceOwner);
219
+ const { spaceId, defaultChannelId: channelId } = await createSpaceAndDefaultChannel(spaceOwner, spaceOwnerSpaceDapp, spaceOwnerProvider.wallet, "space owner's town", everyoneMembership);
220
+ // Install the bot to the space (as space owner)
221
+ const installTx = await appRegistryDapp.installApp(spaceOwnerProvider.signer, foundAppAddress, SpaceAddressFromSpaceId(spaceId), ethers.utils.parseEther('0.02').toBigInt());
222
+ const installReceipt = await installTx.wait();
223
+ expect(installReceipt.status).toBe(1);
224
+ // Verify bot is installed
225
+ const space = spaceOwnerSpaceDapp.getSpace(spaceId);
226
+ const installedApps = await space.AppAccount.read.getInstalledApps();
227
+ expect(installedApps).toContain(foundAppAddress);
228
+ // Test that bot CANNOT add itself to space (even though bot is installed)
229
+ await expect(bot.joinUser(spaceId, bot.userId)).rejects.toThrow(/PERMISSION_DENIED/);
230
+ // Validate that bot is NOT a space member
231
+ const botUserStreamView = bot.stream(bot.userStreamId).view;
232
+ expect(botUserStreamView.userContent.isMember(spaceId, MembershipOp.SO_JOIN)).toBe(false);
233
+ // Have space owner add bot to space (so we can test channel self-join)
234
+ await expect(spaceOwner.joinUser(spaceId, bot.userId)).resolves.toBeDefined();
235
+ // Validate bot is now a space member
236
+ await waitFor(() => {
237
+ expect(botUserStreamView.userContent.isMember(spaceId, MembershipOp.SO_JOIN)).toBe(true);
238
+ });
239
+ // Test that bot CANNOT add itself to channel (even though bot is installed and space member)
240
+ await expect(bot.joinUser(channelId, bot.userId)).rejects.toThrow(/PERMISSION_DENIED/);
241
+ // Validate that bot is still NOT a channel member
242
+ expect(botUserStreamView.userContent.isMember(channelId, MembershipOp.SO_JOIN)).toBe(false);
243
+ // Also test that bot cannot remove itself from space
244
+ await expect(bot.removeUser(spaceId, bot.userId)).rejects.toThrow(/PERMISSION_DENIED/);
245
+ // Validate bot is still a space member
246
+ expect(botUserStreamView.userContent.isMember(spaceId, MembershipOp.SO_JOIN)).toBe(true);
247
+ // Have space owner add bot to channel (so we can test channel self-removal)
248
+ await expect(spaceOwner.joinUser(channelId, bot.userId)).resolves.toBeDefined();
249
+ // Validate bot is now a channel member
250
+ await waitFor(() => {
251
+ expect(botUserStreamView.userContent.isMember(channelId, MembershipOp.SO_JOIN)).toBe(true);
252
+ });
253
+ // Test that bot CANNOT remove itself from channel
254
+ await expect(bot.removeUser(channelId, bot.userId)).rejects.toThrow(/PERMISSION_DENIED/);
255
+ // Validate bot is still a channel member
256
+ expect(botUserStreamView.userContent.isMember(channelId, MembershipOp.SO_JOIN)).toBe(true);
257
+ // Cleanup
258
+ await bot.stopSync();
259
+ await spaceOwner.stopSync();
260
+ });
261
+ test('bots cannot be added to DMs or GDMs', async () => {
262
+ const { aliceProvider: ownerProvider, bob: bot, bobsWallet: botWallet, bobProvider: botProvider, carol, } = await setupWalletsAndContexts();
263
+ const dave = await makeTestClient();
264
+ const appRegistryDapp = new AppRegistryDapp(makeBaseChainConfig().chainConfig, ownerProvider);
265
+ const tx = await appRegistryDapp.createApp(botProvider.signer, 'bob-bot', [Permission.Read, Permission.Write], botWallet.address, ethers.utils.parseEther('0.01').toBigInt(), 31536000n);
266
+ const receipt = await tx.wait();
267
+ const { app: foundAppAddress } = appRegistryDapp.getCreateAppEvent(receipt);
268
+ expect(foundAppAddress).toBeDefined();
269
+ expect(await bot.initializeUser({ appAddress: foundAppAddress })).toBeDefined();
270
+ // GDMs with bot creators are disallowed.
271
+ await expect(carol.createGDMChannel([bot.userId, dave.userId])).rejects.toThrow(/PERMISSION_DENIED/);
272
+ // DMs with bot creators are disallowed.
273
+ await expect(carol.createDMChannel(bot.userId)).rejects.toThrow(/PERMISSION_DENIED/);
274
+ });
275
+ });
276
+ //# sourceMappingURL=botMembership.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"botMembership.test.js","sourceRoot":"","sources":["../../../src/tests/multi/botMembership.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @group with-entitlements
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=botStreamCreation.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"botStreamCreation.test.d.ts","sourceRoot":"","sources":["../../../src/tests/multi/botStreamCreation.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * @group with-entitlements
3
+ */
4
+ import { AppRegistryDapp, Permission, SpaceAddressFromSpaceId } from '@towns-protocol/web3';
5
+ import { createSpaceAndDefaultChannel, everyoneMembershipStruct, setupWalletsAndContexts, expectUserCanJoin, } from '../testUtils';
6
+ import { makeBaseChainConfig } from '../../riverConfig';
7
+ import { makeDefaultChannelStreamId } from '../../id';
8
+ import { ethers } from 'ethers';
9
+ describe('bot stream creation tests', () => {
10
+ test('registered bots can only create app user streams with their registered app address', async () => {
11
+ const { aliceProvider: ownerProvider, bob: bot1, bobsWallet: bot1Wallet, bobProvider: bot1Provider, carol: bot2, carolsWallet: bot2Wallet, carolProvider: bot2Provider, } = await setupWalletsAndContexts();
12
+ const appRegistryDapp = new AppRegistryDapp(makeBaseChainConfig().chainConfig, ownerProvider);
13
+ // Create first bot app contract
14
+ const tx1 = await appRegistryDapp.createApp(bot1Provider.signer, 'bot1-app', [Permission.Read, Permission.Write], bot1Wallet.address, ethers.utils.parseEther('0.01').toBigInt(), 31536000n);
15
+ const receipt1 = await tx1.wait();
16
+ const { app: bot1AppAddress } = appRegistryDapp.getCreateAppEvent(receipt1);
17
+ expect(bot1AppAddress).toBeDefined();
18
+ // Create second bot app contract
19
+ const tx2 = await appRegistryDapp.createApp(bot2Provider.signer, 'bot2-app', [Permission.Read, Permission.Write], bot2Wallet.address, ethers.utils.parseEther('0.01').toBigInt(), 31536000n);
20
+ const receipt2 = await tx2.wait();
21
+ const { app: bot2AppAddress } = appRegistryDapp.getCreateAppEvent(receipt2);
22
+ expect(bot2AppAddress).toBeDefined();
23
+ // Attempt to create user streams for bot1 using bot2's app address (should fail)
24
+ await expect(bot1.initializeUser({ appAddress: bot2AppAddress })).rejects.toThrow(/7:PERMISSION_DENIED/);
25
+ // Create user streams for bot2 using its own app address (should succeed)
26
+ expect(await bot2.initializeUser({ appAddress: bot2AppAddress })).toBeDefined();
27
+ });
28
+ test('unregistered bots cannot create app user streams', async () => {
29
+ const { alicesWallet: wallet, bob: bot } = await setupWalletsAndContexts();
30
+ // Let's use the public key of the wallet as the bot's contract address for
31
+ // convenience here.
32
+ await expect(bot.initializeUser({ appAddress: wallet.address })).rejects.toThrow(/7:PERMISSION_DENIED/);
33
+ });
34
+ test('bots cannot create dms or gdms', async () => {
35
+ // DMs and GDMs are created by the bot posting messages to it's own user stream. This message type
36
+ // should be rejected as unpermitted for bots.
37
+ const { aliceProvider, alicesWallet, alice, aliceSpaceDapp, bob: bot, bobsWallet: botWallet, bobProvider: botProvider, carol, carolProvider, carolSpaceDapp, } = await setupWalletsAndContexts();
38
+ const appRegistryDapp = new AppRegistryDapp(makeBaseChainConfig().chainConfig, botProvider);
39
+ const tx = await appRegistryDapp.createApp(botProvider.signer, 'bob-bot', [Permission.Read, Permission.Write], botWallet.address, ethers.utils.parseEther('0.01').toBigInt(), 31536000n);
40
+ const receipt = await tx.wait();
41
+ const { app: foundAppAddress } = appRegistryDapp.getCreateAppEvent(receipt);
42
+ expect(foundAppAddress).toBeDefined();
43
+ expect(await bot.initializeUser({ appAddress: foundAppAddress })).toBeDefined();
44
+ // Have Carol create a space on the spaceDapp
45
+ const everyoneMembership = await everyoneMembershipStruct(carolSpaceDapp, carol);
46
+ const { spaceId } = await createSpaceAndDefaultChannel(carol, carolSpaceDapp, carolProvider.wallet, "carol's space", everyoneMembership);
47
+ // Add Dave as a member to Carol's space
48
+ await expectUserCanJoin(spaceId, makeDefaultChannelStreamId(SpaceAddressFromSpaceId(spaceId)), 'alice', alice, aliceSpaceDapp, alicesWallet.address, aliceProvider.wallet);
49
+ // GDMs with bot creators are disallowed.
50
+ await expect(bot.createGDMChannel([carol.userId, alice.userId])).rejects.toThrow(/PERMISSION_DENIED/);
51
+ // DMs with bot creators are disallowed.
52
+ await expect(bot.createDMChannel(alice.userId)).rejects.toThrow(/PERMISSION_DENIED/);
53
+ // Cleanup
54
+ await carol.stopSync();
55
+ await alice.stopSync();
56
+ });
57
+ });
58
+ //# sourceMappingURL=botStreamCreation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"botStreamCreation.test.js","sourceRoot":"","sources":["../../../src/tests/multi/botStreamCreation.test.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ import { ethers } from 'ethers';
6
6
  import { LocalhostWeb3Provider } from '@towns-protocol/web3';
7
7
  import { makeRiverConfig } from '../../riverConfig';
8
8
  import { Bot } from '../../sync-agent/utils/bot';
9
- import cloneDeep from 'lodash/cloneDeep';
9
+ import { cloneDeep } from 'lodash-es';
10
10
  import { deepCopy } from 'ethers/lib/utils';
11
11
  import { randomBytes } from '../../utils';
12
12
  const base_log = dlog('csb:test:transactions');
@@ -1 +1 @@
1
- {"version":3,"file":"transactions.test.js","sourceRoot":"","sources":["../../../src/tests/multi/transactions.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transactions.test.js","sourceRoot":"","sources":["../../../src/tests/multi/transactions.test.ts"],"names":[],"mappings":"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"}
@@ -10,7 +10,7 @@ import { waitFor, waitForValue } from '../testUtils';
10
10
  import { makeUniqueChannelStreamId } from '../../id';
11
11
  import { randomBytes } from '../../utils';
12
12
  import { deepCopy } from 'ethers/lib/utils';
13
- import { cloneDeep } from 'lodash';
13
+ import { cloneDeep } from 'lodash-es';
14
14
  import { RiverTimelineEvent } from '../../sync-agent/timeline/models/timeline-types';
15
15
  const base_log = dlog('csb:test:transactions_Tip');
16
16
  const logError = dlogError('csb:test:transactions_Tip_error');