@towns-labs/sdk 2.0.5 → 2.0.7

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 (153) hide show
  1. package/dist/createApp.d.ts.map +1 -1
  2. package/dist/createApp.js +7 -1
  3. package/dist/createApp.js.map +1 -1
  4. package/dist/id.d.ts +1 -0
  5. package/dist/id.d.ts.map +1 -1
  6. package/dist/id.js +3 -0
  7. package/dist/id.js.map +1 -1
  8. package/dist/streamStateView_Members.d.ts +7 -0
  9. package/dist/streamStateView_Members.d.ts.map +1 -1
  10. package/dist/streamStateView_Members.js +19 -0
  11. package/dist/streamStateView_Members.js.map +1 -1
  12. package/dist/sync-agent/dms/models/dm.d.ts +2 -4
  13. package/dist/sync-agent/dms/models/dm.d.ts.map +1 -1
  14. package/dist/sync-agent/dms/models/dm.js +2 -30
  15. package/dist/sync-agent/dms/models/dm.js.map +1 -1
  16. package/dist/sync-agent/gdms/models/gdm.d.ts +2 -4
  17. package/dist/sync-agent/gdms/models/gdm.d.ts.map +1 -1
  18. package/dist/sync-agent/gdms/models/gdm.js +2 -30
  19. package/dist/sync-agent/gdms/models/gdm.js.map +1 -1
  20. package/dist/sync-agent/river-connection/riverConnection.d.ts +1 -3
  21. package/dist/sync-agent/river-connection/riverConnection.d.ts.map +1 -1
  22. package/dist/sync-agent/river-connection/riverConnection.js +5 -3
  23. package/dist/sync-agent/river-connection/riverConnection.js.map +1 -1
  24. package/dist/sync-agent/spaces/models/channel.d.ts +3 -6
  25. package/dist/sync-agent/spaces/models/channel.d.ts.map +1 -1
  26. package/dist/sync-agent/spaces/models/channel.js +4 -76
  27. package/dist/sync-agent/spaces/models/channel.js.map +1 -1
  28. package/dist/sync-agent/spaces/models/space.d.ts +6 -6
  29. package/dist/sync-agent/spaces/models/space.d.ts.map +1 -1
  30. package/dist/sync-agent/spaces/models/space.js +8 -30
  31. package/dist/sync-agent/spaces/models/space.js.map +1 -1
  32. package/dist/sync-agent/spaces/spaces.d.ts +3 -4
  33. package/dist/sync-agent/spaces/spaces.d.ts.map +1 -1
  34. package/dist/sync-agent/spaces/spaces.js +6 -25
  35. package/dist/sync-agent/spaces/spaces.js.map +1 -1
  36. package/dist/sync-agent/syncAgent.d.ts.map +1 -1
  37. package/dist/sync-agent/syncAgent.js +2 -7
  38. package/dist/sync-agent/syncAgent.js.map +1 -1
  39. package/dist/tests/multi_ne/gdms.test.js +50 -3
  40. package/dist/tests/multi_ne/gdms.test.js.map +1 -1
  41. package/dist/tests/multi_ne/userInboxMessage.test.js +3 -3
  42. package/dist/tests/multi_ne/userInboxMessage.test.js.map +1 -1
  43. package/dist/townsEnv.js +5 -5
  44. package/dist/townsEnv.js.map +1 -1
  45. package/package.json +10 -10
  46. package/dist/createBot.d.ts +0 -159
  47. package/dist/createBot.d.ts.map +0 -1
  48. package/dist/createBot.js +0 -206
  49. package/dist/createBot.js.map +0 -1
  50. package/dist/makeRiverRpcClient.d.ts +0 -6
  51. package/dist/makeRiverRpcClient.d.ts.map +0 -1
  52. package/dist/makeRiverRpcClient.js +0 -9
  53. package/dist/makeRiverRpcClient.js.map +0 -1
  54. package/dist/streamStateView_ChannelMetadata.d.ts +0 -22
  55. package/dist/streamStateView_ChannelMetadata.d.ts.map +0 -1
  56. package/dist/streamStateView_ChannelMetadata.js +0 -77
  57. package/dist/streamStateView_ChannelMetadata.js.map +0 -1
  58. package/dist/sync-agent/entitlements/entitlements.d.ts +0 -10
  59. package/dist/sync-agent/entitlements/entitlements.d.ts.map +0 -1
  60. package/dist/sync-agent/entitlements/entitlements.js +0 -20
  61. package/dist/sync-agent/entitlements/entitlements.js.map +0 -1
  62. package/dist/sync-agent/river-connection/models/riverChain.d.ts +0 -24
  63. package/dist/sync-agent/river-connection/models/riverChain.d.ts.map +0 -1
  64. package/dist/sync-agent/river-connection/models/riverChain.js +0 -66
  65. package/dist/sync-agent/river-connection/models/riverChain.js.map +0 -1
  66. package/dist/tests/multi/appRegistryService.test.d.ts +0 -2
  67. package/dist/tests/multi/appRegistryService.test.d.ts.map +0 -1
  68. package/dist/tests/multi/appRegistryService.test.js +0 -41
  69. package/dist/tests/multi/appRegistryService.test.js.map +0 -1
  70. package/dist/tests/multi/botEntitlements.test.d.ts +0 -5
  71. package/dist/tests/multi/botEntitlements.test.d.ts.map +0 -1
  72. package/dist/tests/multi/botEntitlements.test.js +0 -178
  73. package/dist/tests/multi/botEntitlements.test.js.map +0 -1
  74. package/dist/tests/multi/botMembership.test.d.ts +0 -5
  75. package/dist/tests/multi/botMembership.test.d.ts.map +0 -1
  76. package/dist/tests/multi/botMembership.test.js +0 -295
  77. package/dist/tests/multi/botMembership.test.js.map +0 -1
  78. package/dist/tests/multi/botStreamCreation.test.d.ts +0 -5
  79. package/dist/tests/multi/botStreamCreation.test.d.ts.map +0 -1
  80. package/dist/tests/multi/botStreamCreation.test.js +0 -60
  81. package/dist/tests/multi/botStreamCreation.test.js.map +0 -1
  82. package/dist/tests/multi/channelScrubbing.test.d.ts +0 -5
  83. package/dist/tests/multi/channelScrubbing.test.d.ts.map +0 -1
  84. package/dist/tests/multi/channelScrubbing.test.js +0 -102
  85. package/dist/tests/multi/channelScrubbing.test.js.map +0 -1
  86. package/dist/tests/multi/notificationService.test.d.ts +0 -2
  87. package/dist/tests/multi/notificationService.test.d.ts.map +0 -1
  88. package/dist/tests/multi/notificationService.test.js +0 -51
  89. package/dist/tests/multi/notificationService.test.js.map +0 -1
  90. package/dist/tests/multi/sync-agent/member-queue.test.d.ts +0 -2
  91. package/dist/tests/multi/sync-agent/member-queue.test.d.ts.map +0 -1
  92. package/dist/tests/multi/sync-agent/member-queue.test.js +0 -54
  93. package/dist/tests/multi/sync-agent/member-queue.test.js.map +0 -1
  94. package/dist/tests/multi/sync-agent/member.test.d.ts +0 -2
  95. package/dist/tests/multi/sync-agent/member.test.d.ts.map +0 -1
  96. package/dist/tests/multi/sync-agent/member.test.js +0 -45
  97. package/dist/tests/multi/sync-agent/member.test.js.map +0 -1
  98. package/dist/tests/multi/sync-agent/members.test.d.ts +0 -2
  99. package/dist/tests/multi/sync-agent/members.test.d.ts.map +0 -1
  100. package/dist/tests/multi/sync-agent/members.test.js +0 -35
  101. package/dist/tests/multi/sync-agent/members.test.js.map +0 -1
  102. package/dist/tests/multi/sync-agent/riverConnection.test.d.ts +0 -5
  103. package/dist/tests/multi/sync-agent/riverConnection.test.d.ts.map +0 -1
  104. package/dist/tests/multi/sync-agent/riverConnection.test.js +0 -39
  105. package/dist/tests/multi/sync-agent/riverConnection.test.js.map +0 -1
  106. package/dist/tests/multi/sync-agent/spaces.test.d.ts +0 -2
  107. package/dist/tests/multi/sync-agent/spaces.test.d.ts.map +0 -1
  108. package/dist/tests/multi/sync-agent/spaces.test.js +0 -33
  109. package/dist/tests/multi/sync-agent/spaces.test.js.map +0 -1
  110. package/dist/tests/multi/sync-agent/streams.test.d.ts +0 -2
  111. package/dist/tests/multi/sync-agent/streams.test.d.ts.map +0 -1
  112. package/dist/tests/multi/sync-agent/streams.test.js +0 -27
  113. package/dist/tests/multi/sync-agent/streams.test.js.map +0 -1
  114. package/dist/tests/multi/sync-agent/syncAgent.test.d.ts +0 -2
  115. package/dist/tests/multi/sync-agent/syncAgent.test.d.ts.map +0 -1
  116. package/dist/tests/multi/sync-agent/syncAgent.test.js +0 -68
  117. package/dist/tests/multi/sync-agent/syncAgent.test.js.map +0 -1
  118. package/dist/tests/multi/sync-agent/syncAgents.test.d.ts +0 -2
  119. package/dist/tests/multi/sync-agent/syncAgents.test.d.ts.map +0 -1
  120. package/dist/tests/multi/sync-agent/syncAgents.test.js +0 -163
  121. package/dist/tests/multi/sync-agent/syncAgents.test.js.map +0 -1
  122. package/dist/tests/multi/sync-agent/timeline.test.d.ts +0 -2
  123. package/dist/tests/multi/sync-agent/timeline.test.d.ts.map +0 -1
  124. package/dist/tests/multi/sync-agent/timeline.test.js +0 -232
  125. package/dist/tests/multi/sync-agent/timeline.test.js.map +0 -1
  126. package/dist/tests/multi/sync-agent/user.test.d.ts +0 -5
  127. package/dist/tests/multi/sync-agent/user.test.d.ts.map +0 -1
  128. package/dist/tests/multi/sync-agent/user.test.js +0 -55
  129. package/dist/tests/multi/sync-agent/user.test.js.map +0 -1
  130. package/dist/tests/multi/transactions.test.d.ts +0 -5
  131. package/dist/tests/multi/transactions.test.d.ts.map +0 -1
  132. package/dist/tests/multi/transactions.test.js +0 -153
  133. package/dist/tests/multi/transactions.test.js.map +0 -1
  134. package/dist/tests/multi/transactions_SpaceReview.test.d.ts +0 -2
  135. package/dist/tests/multi/transactions_SpaceReview.test.d.ts.map +0 -1
  136. package/dist/tests/multi/transactions_SpaceReview.test.js +0 -278
  137. package/dist/tests/multi/transactions_SpaceReview.test.js.map +0 -1
  138. package/dist/tests/multi/transactions_Tip.test.d.ts +0 -5
  139. package/dist/tests/multi/transactions_Tip.test.d.ts.map +0 -1
  140. package/dist/tests/multi/transactions_Tip.test.js +0 -379
  141. package/dist/tests/multi/transactions_Tip.test.js.map +0 -1
  142. package/dist/tests/multi_ne/nodeSelection.test.d.ts +0 -5
  143. package/dist/tests/multi_ne/nodeSelection.test.d.ts.map +0 -1
  144. package/dist/tests/multi_ne/nodeSelection.test.js +0 -41
  145. package/dist/tests/multi_ne/nodeSelection.test.js.map +0 -1
  146. package/dist/tests/multi_ne/trading.solana.test.d.ts +0 -2
  147. package/dist/tests/multi_ne/trading.solana.test.d.ts.map +0 -1
  148. package/dist/tests/multi_ne/trading.solana.test.js +0 -229
  149. package/dist/tests/multi_ne/trading.solana.test.js.map +0 -1
  150. package/dist/tests/multi_ne/trading.test.d.ts +0 -2
  151. package/dist/tests/multi_ne/trading.test.d.ts.map +0 -1
  152. package/dist/tests/multi_ne/trading.test.js +0 -243
  153. package/dist/tests/multi_ne/trading.test.js.map +0 -1
@@ -1,229 +0,0 @@
1
- import { extractMemberBlockchainTransactions, makeDonePromise, makeTestClient, makeUniqueSpaceStreamId, waitFor, } from '../testUtils';
2
- import { makeUniqueChannelStreamId } from '../../id';
3
- import { bin_fromHexString, bin_fromString, bin_toString } from '@towns-labs/utils';
4
- describe('Trading Solana', () => {
5
- let bobClient;
6
- const mintAddress = '2HQXvda5sUjGLRKLG6LEqSctARYJboufSfG2Qciqmoon';
7
- const bobSolanaWalletAddress = '3cfwgyZY7uLNEv72etBQArWSoTzmXEm7aUmW3xE5xG4P';
8
- let spaceId;
9
- let channelId;
10
- let threadParentId;
11
- const eventEmittedPromise = makeDonePromise();
12
- const validSellReceipt = {
13
- transaction: {
14
- signatures: [
15
- '4uPV4YciNkRoRqaN5bsDw4HzPTCuavM94sbdaZPkaVVEXkyaNNT4KLpuvwBsyJUkzzzjLXpVx88dRswJ6tRp41VG',
16
- ],
17
- },
18
- meta: {
19
- preTokenBalances: [
20
- {
21
- amount: { amount: '4804294168682', decimals: 9 },
22
- mint: mintAddress,
23
- owner: bobSolanaWalletAddress,
24
- },
25
- ],
26
- postTokenBalances: [
27
- {
28
- amount: { amount: '0', decimals: 9 },
29
- mint: mintAddress,
30
- owner: bobSolanaWalletAddress,
31
- },
32
- ],
33
- },
34
- slot: 320403856n,
35
- };
36
- const validBuyReceipt = {
37
- transaction: {
38
- signatures: [
39
- '3jFRj6BYWEcwHxPkF7N2x7xNggvuNkfEPwcwnQRPzY5urC9oQ1Fh9rR8MG76Vosf7xWg4CWB4RSpBhkuHvHX9qDj',
40
- ],
41
- },
42
- meta: {
43
- preTokenBalances: [
44
- {
45
- amount: { amount: '0', decimals: 9 },
46
- mint: mintAddress,
47
- owner: bobSolanaWalletAddress,
48
- },
49
- ],
50
- postTokenBalances: [
51
- {
52
- amount: { amount: '4804294168682', decimals: 9 },
53
- mint: mintAddress,
54
- owner: bobSolanaWalletAddress,
55
- },
56
- ],
57
- },
58
- slot: 320403856n,
59
- };
60
- const validBuyReceiptWithoutPreTokenBalance = {
61
- transaction: {
62
- signatures: [
63
- '1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678',
64
- ],
65
- },
66
- meta: {
67
- preTokenBalances: [],
68
- postTokenBalances: [
69
- {
70
- amount: { amount: '1234567890', decimals: 9 },
71
- mint: mintAddress,
72
- owner: bobSolanaWalletAddress,
73
- },
74
- ],
75
- },
76
- slot: 320403856n,
77
- };
78
- beforeAll(async () => {
79
- bobClient = await makeTestClient();
80
- await bobClient.initializeUser();
81
- bobClient.startSync();
82
- spaceId = makeUniqueSpaceStreamId();
83
- await bobClient.createSpace(spaceId);
84
- channelId = makeUniqueChannelStreamId(spaceId);
85
- await bobClient.createChannel(spaceId, 'Channel', 'Topic', channelId);
86
- const result = await bobClient.sendMessage(channelId, 'try out this token: $yo!');
87
- threadParentId = result.eventId;
88
- bobClient.once('streamTokenTransfer', (streamId, data) => {
89
- expect(streamId).toBe(channelId);
90
- expect(data.createdAtEpochMs > 0n).toBe(true);
91
- expect(data.chainId).toBe('solana-mainnet');
92
- expect(data.amount).toBe(4804294168682n);
93
- expect(data.messageId).toBe(threadParentId);
94
- expect(data.isBuy).toBe(false);
95
- eventEmittedPromise.done();
96
- });
97
- });
98
- test('Solana transactions are rejected if the amount is invalid', async () => {
99
- const transferEvent = {
100
- amount: 5804294168682n.toString(), // invalid amount
101
- address: bin_fromString(mintAddress),
102
- sender: bin_fromString(bobSolanaWalletAddress),
103
- messageId: bin_fromHexString(threadParentId),
104
- channelId: bin_fromHexString(channelId),
105
- isBuy: false,
106
- };
107
- await expect(bobClient.addTransaction_Transfer(1151111081099710, validSellReceipt, transferEvent)).rejects.toThrow('transaction amount not equal to balance diff');
108
- });
109
- test('Token amounts for buy transactions need to be increasing', async () => {
110
- const transferEvent = {
111
- amount: 4804294168682n.toString(),
112
- address: bin_fromString(mintAddress),
113
- sender: bin_fromString(bobSolanaWalletAddress),
114
- messageId: bin_fromHexString(threadParentId),
115
- channelId: bin_fromHexString(channelId),
116
- isBuy: true, // wrong: this is not a buy, this is a sell
117
- };
118
- await expect(bobClient.addTransaction_Transfer(1151111081099710, validSellReceipt, transferEvent)).rejects.toThrow('transfer transaction is buy but balance decreased');
119
- });
120
- test('Token amounts for sell transactions needs to be decreasing', async () => {
121
- const transferEvent = {
122
- amount: 4804294168682n.toString(),
123
- address: bin_fromString(mintAddress),
124
- sender: bin_fromString(bobSolanaWalletAddress),
125
- messageId: bin_fromHexString(threadParentId),
126
- channelId: bin_fromHexString(channelId),
127
- isBuy: false, // wrong: this is not a sell, this is a buy
128
- };
129
- await expect(bobClient.addTransaction_Transfer(1151111081099710, validBuyReceipt, transferEvent)).rejects.toThrow('transfer transaction is sell but balance increased');
130
- });
131
- test('Solana transactions are rejected if the mint doesnt match the address', async () => {
132
- const transferEvent = {
133
- amount: 4804294168682n.toString(),
134
- address: bin_fromString(mintAddress).toReversed(), // invalid address
135
- sender: bin_fromString(bobSolanaWalletAddress),
136
- messageId: bin_fromHexString(threadParentId),
137
- channelId: bin_fromHexString(channelId),
138
- isBuy: false,
139
- };
140
- await expect(bobClient.addTransaction_Transfer(1151111081099710, validSellReceipt, transferEvent)).rejects.toThrow('transaction mint not found');
141
- });
142
- test('Solana transactions are rejected if the sender is invalid', async () => {
143
- const transferEvent = {
144
- amount: 4804294168682n.toString(),
145
- address: bin_fromString(mintAddress),
146
- sender: bin_fromString(bobSolanaWalletAddress).toReversed(), // invalid sender
147
- messageId: bin_fromHexString(threadParentId),
148
- channelId: bin_fromHexString(channelId),
149
- isBuy: false,
150
- };
151
- await expect(bobClient.addTransaction_Transfer(1151111081099710, validSellReceipt, transferEvent)).rejects.toThrow('solana transfer transaction mint not found');
152
- });
153
- test('Solana transactions are accepted if the amount, mint and owner are valid (sell)', async () => {
154
- const transferEvent = {
155
- amount: 4804294168682n.toString(),
156
- address: bin_fromString(mintAddress),
157
- sender: bin_fromString(bobSolanaWalletAddress),
158
- messageId: bin_fromHexString(threadParentId),
159
- channelId: bin_fromHexString(channelId),
160
- isBuy: false,
161
- };
162
- await expect(bobClient.addTransaction_Transfer(1151111081099710, validSellReceipt, transferEvent)).resolves.not.toThrow();
163
- });
164
- test('Duplicate solana transactions are not accepted', async () => {
165
- // this tx is the same as the one above
166
- const transferEvent = {
167
- amount: 4804294168682n.toString(),
168
- address: bin_fromString(mintAddress),
169
- sender: bin_fromString(bobSolanaWalletAddress),
170
- messageId: bin_fromHexString(threadParentId),
171
- channelId: bin_fromHexString(channelId),
172
- isBuy: false,
173
- };
174
- await expect(bobClient.addTransaction_Transfer(1151111081099710, validSellReceipt, transferEvent)).rejects.toThrow();
175
- });
176
- test('Solana transactions are accepted if the amount, mint and owner are valid (buy)', async () => {
177
- const transferEvent = {
178
- amount: 4804294168682n.toString(),
179
- address: bin_fromString(mintAddress),
180
- sender: bin_fromString(bobSolanaWalletAddress),
181
- messageId: bin_fromHexString(threadParentId),
182
- channelId: bin_fromHexString(channelId),
183
- isBuy: true,
184
- };
185
- await expect(bobClient.addTransaction_Transfer(1151111081099710, validBuyReceipt, transferEvent)).resolves.not.toThrow();
186
- });
187
- test('Solana transactions are accepted if the amount, mint and owner are valid (buy) and there is no pre token balance', async () => {
188
- const transferEvent = {
189
- amount: 1234567890n.toString(),
190
- address: bin_fromString(mintAddress),
191
- sender: bin_fromString(bobSolanaWalletAddress),
192
- messageId: bin_fromHexString(threadParentId),
193
- channelId: bin_fromHexString(channelId),
194
- isBuy: true,
195
- };
196
- await expect(bobClient.addTransaction_Transfer(1151111081099710, validBuyReceiptWithoutPreTokenBalance, transferEvent)).resolves.not.toThrow();
197
- });
198
- test('tokentransfer events are emitted', async () => {
199
- await eventEmittedPromise.expectToSucceed();
200
- });
201
- test('the token transfer is represented in the membership content', async () => {
202
- const stream = bobClient.streams.get(channelId);
203
- expect(stream).toBeDefined();
204
- const transfer = stream.view.membershipContent.tokenTransfers[0];
205
- expect(transfer.userId).toBe(bobClient.userId);
206
- expect(transfer.createdAtEpochMs > 0n).toBe(true);
207
- expect(transfer.chainId).toBe('solana-mainnet');
208
- expect(transfer.amount).toBe(4804294168682n);
209
- expect(transfer.messageId).toBe(threadParentId);
210
- expect(transfer.isBuy).toBe(false);
211
- });
212
- test('bob sees the transfer event in the channel stream', async () => {
213
- await waitFor(() => {
214
- const transferEvents = extractMemberBlockchainTransactions(bobClient, channelId);
215
- expect(transferEvents.length).toBe(3);
216
- const [event0, event1, event2] = transferEvents;
217
- expect(BigInt(event0.amount)).toBe(4804294168682n);
218
- expect(BigInt(event1.amount)).toBe(4804294168682n);
219
- expect(BigInt(event2.amount)).toBe(1234567890n);
220
- expect(bin_toString(event0.sender)).toBe(bobSolanaWalletAddress);
221
- expect(bin_toString(event1.sender)).toBe(bobSolanaWalletAddress);
222
- expect(bin_toString(event2.sender)).toBe(bobSolanaWalletAddress);
223
- expect(event0.isBuy).toBe(false);
224
- expect(event1.isBuy).toBe(true);
225
- expect(event2.isBuy).toBe(true);
226
- });
227
- });
228
- });
229
- //# sourceMappingURL=trading.solana.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"trading.solana.test.js","sourceRoot":"","sources":["../../../src/tests/multi_ne/trading.solana.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=trading.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"trading.test.d.ts","sourceRoot":"","sources":["../../../src/tests/multi_ne/trading.test.ts"],"names":[],"mappings":""}
@@ -1,243 +0,0 @@
1
- import { makeUniqueChannelStreamId } from '../../id';
2
- import { extractMemberBlockchainTransactions, getXchainConfigForTesting, makeDonePromise, makeTestClient, makeUniqueSpaceStreamId, makeUserContextFromWallet, waitFor, } from '../testUtils';
3
- import { bin_fromHexString } from '@towns-labs/utils';
4
- import { ethers } from 'ethers';
5
- import { TestERC20 } from '@towns-labs/web3';
6
- describe('Trading', () => {
7
- const tokenName = 'Erc20 token test';
8
- let bobClient;
9
- const bobWallet = ethers.Wallet.createRandom();
10
- let aliceClient;
11
- const aliceWallet = ethers.Wallet.createRandom();
12
- let charlieClient;
13
- let spaceId;
14
- let channelId;
15
- let threadParentId;
16
- let tokenAddress;
17
- let buyReceipt;
18
- let sellReceipt;
19
- const amountToTransfer = 10n;
20
- const eventEmittedPromise = makeDonePromise();
21
- const provider = new ethers.providers.StaticJsonRpcProvider(getXchainConfigForTesting().supportedRpcUrls[31337]);
22
- beforeAll(async () => {
23
- // boilerplate — create clients, join streams, etc.
24
- const bobContext = await makeUserContextFromWallet(bobWallet);
25
- bobClient = await makeTestClient({ context: bobContext });
26
- await bobClient.initializeUser();
27
- bobClient.startSync();
28
- const aliceContext = await makeUserContextFromWallet(aliceWallet);
29
- aliceClient = await makeTestClient({ context: aliceContext });
30
- await aliceClient.initializeUser();
31
- aliceClient.startSync();
32
- spaceId = makeUniqueSpaceStreamId();
33
- await bobClient.createSpace(spaceId);
34
- channelId = makeUniqueChannelStreamId(spaceId);
35
- await bobClient.createChannel(spaceId, 'Channel', 'Topic', channelId);
36
- await aliceClient.joinStream(spaceId);
37
- await aliceClient.joinStream(channelId);
38
- charlieClient = await makeTestClient();
39
- await charlieClient.initializeUser();
40
- charlieClient.startSync();
41
- await charlieClient.joinStream(spaceId);
42
- await charlieClient.joinStream(channelId);
43
- const result = await bobClient.sendMessage(channelId, 'try out this token: $yo!');
44
- threadParentId = result.eventId;
45
- /* Time to perform an on-chain transaction! We utilize the fact that transfers emit
46
- a Transfer event, Transfer(address,address,amount) to be precise. Regardless of how
47
- the tx was made (dex, transfer etc), an event will be available in the tx logs!
48
- here we go, Bob transfers an amount of tokens to Alice.
49
- */
50
- tokenAddress = await TestERC20.getContractAddress(tokenName);
51
- await TestERC20.publicMint(tokenName, bobClient.userId, 100);
52
- const { transactionHash: sellTransactionHash } = await TestERC20.transfer(tokenName, aliceClient.userId, bobWallet.privateKey, amountToTransfer);
53
- const sellTransaction = await provider.getTransaction(sellTransactionHash);
54
- const sellTransactionReceipt = await provider.getTransactionReceipt(sellTransactionHash);
55
- sellReceipt = {
56
- from: sellTransaction.from,
57
- to: sellTransaction.to,
58
- transactionHash: sellTransaction.hash,
59
- blockNumber: sellTransaction.blockNumber,
60
- logs: sellTransactionReceipt.logs,
61
- };
62
- const { transactionHash: buyTransactionHash } = await TestERC20.transfer(tokenName, aliceClient.userId, bobWallet.privateKey, amountToTransfer);
63
- const buyTransaction = await provider.getTransaction(buyTransactionHash);
64
- const buyTransactionReceipt = await provider.getTransactionReceipt(buyTransactionHash);
65
- buyReceipt = {
66
- from: buyTransaction.from,
67
- to: buyTransaction.to,
68
- transactionHash: buyTransaction.hash,
69
- blockNumber: buyTransaction.blockNumber,
70
- logs: buyTransactionReceipt.logs,
71
- };
72
- bobClient.once('streamTokenTransfer', (streamId, data) => {
73
- expect(streamId).toBe(channelId);
74
- expect(data.userId).toBe(bobClient.userId);
75
- expect(data.createdAtEpochMs > 0n).toBe(true);
76
- expect(data.chainId).toBe('31337');
77
- expect(data.amount).toBe(10n);
78
- expect(data.messageId).toBe(threadParentId);
79
- expect(data.isBuy).toBe(false);
80
- eventEmittedPromise.done();
81
- });
82
- });
83
- afterAll(async () => {
84
- await bobClient.stop();
85
- await aliceClient.stop();
86
- await charlieClient.stop();
87
- });
88
- test('should reject token transfers where the amount doesnt match the transferred amount', async () => {
89
- // this is a transfer event with an amount that doesn't match the amount transferred
90
- const transferEvent = {
91
- amount: 9n.toString(),
92
- address: bin_fromHexString(tokenAddress),
93
- sender: bin_fromHexString(bobClient.userId),
94
- messageId: bin_fromHexString(threadParentId),
95
- channelId: bin_fromHexString(channelId),
96
- isBuy: false,
97
- };
98
- await expect(bobClient.addTransaction_Transfer(31337, sellReceipt, transferEvent)).rejects.toThrow('matching transfer event not found in receipt logs');
99
- });
100
- test('should reject token transfers where the user is neither the sender nor the recipient', async () => {
101
- // this is a transfer event from charlie, he's barely a member of the channel
102
- // and he's not the sender nor the recipient
103
- const transferEvent = {
104
- amount: amountToTransfer.toString(),
105
- address: bin_fromHexString(tokenAddress),
106
- sender: bin_fromHexString(charlieClient.userId),
107
- messageId: bin_fromHexString(threadParentId),
108
- channelId: bin_fromHexString(channelId),
109
- isBuy: true,
110
- };
111
- await expect(charlieClient.addTransaction_Transfer(31337, buyReceipt, transferEvent)).rejects.toThrow('matching transfer event not found in receipt logs');
112
- });
113
- test('should reject token transfers where the user claims to be the buyer but is the seller', async () => {
114
- // this is a transfer event from charlie, he's barely a member of the channel
115
- // and he's not the sender nor the recipient
116
- const transferEvent = {
117
- amount: amountToTransfer.toString(),
118
- address: bin_fromHexString(tokenAddress),
119
- sender: bin_fromHexString(bobClient.userId),
120
- messageId: bin_fromHexString(threadParentId),
121
- channelId: bin_fromHexString(channelId),
122
- isBuy: true,
123
- };
124
- await expect(bobClient.addTransaction_Transfer(31337, buyReceipt, transferEvent)).rejects.toThrow('matching transfer event not found in receipt logs');
125
- });
126
- test('should reject token transfers where the user claims to be the seller but is the seller', async () => {
127
- // this is a transfer event from charlie, he's barely a member of the channel
128
- // and he's not the sender nor the recipient
129
- const transferEvent = {
130
- amount: amountToTransfer.toString(),
131
- address: bin_fromHexString(tokenAddress),
132
- sender: bin_fromHexString(aliceClient.userId),
133
- messageId: bin_fromHexString(threadParentId),
134
- channelId: bin_fromHexString(channelId),
135
- isBuy: false,
136
- };
137
- await expect(aliceClient.addTransaction_Transfer(31337, sellReceipt, transferEvent)).rejects.toThrow('matching transfer event not found in receipt logs');
138
- });
139
- test('should reject token transfers where the token address doesnt match', async () => {
140
- const transferEvent = {
141
- amount: amountToTransfer.toString(),
142
- address: bin_fromHexString(tokenAddress).toReversed(), // mess up the token address
143
- sender: bin_fromHexString(bobClient.userId),
144
- messageId: bin_fromHexString(threadParentId),
145
- channelId: bin_fromHexString(channelId),
146
- isBuy: false,
147
- };
148
- await expect(aliceClient.addTransaction_Transfer(31337, sellReceipt, transferEvent)).rejects.toThrow('matching transfer event not found in receipt logs');
149
- });
150
- test('should accept token transfers where the user == from and isBuy == false', async () => {
151
- // this is a transfer event from bob, he's the sender (from)
152
- const transferEvent = {
153
- amount: amountToTransfer.toString(),
154
- address: bin_fromHexString(tokenAddress),
155
- sender: bin_fromHexString(bobClient.userId),
156
- messageId: bin_fromHexString(threadParentId),
157
- channelId: bin_fromHexString(channelId),
158
- isBuy: false,
159
- };
160
- const { eventId } = await bobClient.addTransaction_Transfer(31337, sellReceipt, transferEvent);
161
- expect(eventId).toBeDefined();
162
- await waitFor(() => expect(extractMemberBlockchainTransactions(bobClient, channelId).length).toBe(1));
163
- });
164
- test('should accept token transfers where the user == to and isBuy == true', async () => {
165
- // this is a transfer event to alice, she's the recipient (to)
166
- const transferEvent = {
167
- amount: amountToTransfer.toString(),
168
- address: bin_fromHexString(tokenAddress),
169
- sender: bin_fromHexString(aliceClient.userId),
170
- messageId: bin_fromHexString(threadParentId),
171
- channelId: bin_fromHexString(channelId),
172
- isBuy: true,
173
- };
174
- const { eventId } = await aliceClient.addTransaction_Transfer(31337, buyReceipt, transferEvent);
175
- expect(eventId).toBeDefined();
176
- await waitFor(() => expect(extractMemberBlockchainTransactions(aliceClient, channelId).length).toBe(2));
177
- });
178
- test('tokentransfer events are emitted', async () => {
179
- await eventEmittedPromise.expectToSucceed();
180
- });
181
- test('the token transfer is represented in the membership content', async () => {
182
- const stream = bobClient.streams.get(channelId);
183
- expect(stream).toBeDefined();
184
- const transfer = stream.view.membershipContent.tokenTransfers[0];
185
- expect(transfer.userId).toBe(bobClient.userId);
186
- expect(transfer.createdAtEpochMs > 0n).toBe(true);
187
- expect(transfer.chainId).toBe('31337');
188
- expect(transfer.amount).toBe(10n);
189
- expect(transfer.messageId).toBe(threadParentId);
190
- expect(transfer.isBuy).toBe(false);
191
- });
192
- test('should reject duplicate transfers', async () => {
193
- // alice can't add the same transfer event twice
194
- const transferEvent = {
195
- amount: amountToTransfer.toString(),
196
- address: bin_fromHexString(tokenAddress),
197
- sender: bin_fromHexString(aliceClient.userId),
198
- messageId: bin_fromHexString(threadParentId),
199
- channelId: bin_fromHexString(channelId),
200
- isBuy: true,
201
- };
202
- await expect(aliceClient.addTransaction_Transfer(31337, buyReceipt, transferEvent)).rejects.toThrow('duplicate transaction');
203
- });
204
- test('alice sees transfer event in her user stream', async () => {
205
- await waitFor(() => {
206
- const streamId = aliceClient.userStreamId;
207
- const stream = aliceClient.streams.get(streamId);
208
- if (!stream)
209
- throw new Error('no stream found');
210
- const transferEvents = stream.view.userContent.tokenTransfers;
211
- expect(transferEvents.length).toBe(1);
212
- const event0 = transferEvents[0];
213
- expect(BigInt(event0.amount)).toBe(amountToTransfer);
214
- });
215
- });
216
- test('bob sees transfer event in his user stream', async () => {
217
- await waitFor(() => {
218
- const streamId = bobClient.userStreamId;
219
- const stream = bobClient.streams.get(streamId);
220
- if (!stream)
221
- throw new Error('no stream found');
222
- const transferEvents = stream.view.userContent.tokenTransfers;
223
- expect(transferEvents.length).toBe(1);
224
- const event0 = transferEvents[0];
225
- expect(BigInt(event0.amount)).toBe(amountToTransfer);
226
- expect(new Uint8Array(event0.sender)).toEqual(bin_fromHexString(bobClient.userId));
227
- });
228
- });
229
- test('bob sees both transfer events in the channel stream', async () => {
230
- await waitFor(() => {
231
- const transferEvents = extractMemberBlockchainTransactions(aliceClient, channelId);
232
- expect(transferEvents.length).toBe(2);
233
- const [event0, event1] = [transferEvents[0], transferEvents[1]];
234
- expect(BigInt(event0.amount)).toBe(amountToTransfer);
235
- expect(event0.userId).toEqual(bobClient.userId);
236
- expect(event0.isBuy).toBe(false);
237
- expect(BigInt(event1.amount)).toBe(amountToTransfer);
238
- expect(event1.userId).toEqual(aliceClient.userId);
239
- expect(event1.isBuy).toBe(true);
240
- });
241
- });
242
- });
243
- //# sourceMappingURL=trading.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"trading.test.js","sourceRoot":"","sources":["../../../src/tests/multi_ne/trading.test.ts"],"names":[],"mappings":"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"}