@towns-labs/sdk 2.0.5 → 2.0.6
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/dist/createApp.d.ts.map +1 -1
- package/dist/createApp.js +7 -1
- package/dist/createApp.js.map +1 -1
- package/dist/id.d.ts +1 -0
- package/dist/id.d.ts.map +1 -1
- package/dist/id.js +3 -0
- package/dist/id.js.map +1 -1
- package/dist/sync-agent/dms/models/dm.d.ts +2 -4
- package/dist/sync-agent/dms/models/dm.d.ts.map +1 -1
- package/dist/sync-agent/dms/models/dm.js +2 -30
- package/dist/sync-agent/dms/models/dm.js.map +1 -1
- package/dist/sync-agent/gdms/models/gdm.d.ts +2 -4
- package/dist/sync-agent/gdms/models/gdm.d.ts.map +1 -1
- package/dist/sync-agent/gdms/models/gdm.js +2 -30
- package/dist/sync-agent/gdms/models/gdm.js.map +1 -1
- package/dist/sync-agent/river-connection/riverConnection.d.ts +1 -3
- package/dist/sync-agent/river-connection/riverConnection.d.ts.map +1 -1
- package/dist/sync-agent/river-connection/riverConnection.js +5 -3
- package/dist/sync-agent/river-connection/riverConnection.js.map +1 -1
- package/dist/sync-agent/spaces/models/channel.d.ts +3 -6
- package/dist/sync-agent/spaces/models/channel.d.ts.map +1 -1
- package/dist/sync-agent/spaces/models/channel.js +4 -76
- package/dist/sync-agent/spaces/models/channel.js.map +1 -1
- package/dist/sync-agent/spaces/models/space.d.ts +6 -6
- package/dist/sync-agent/spaces/models/space.d.ts.map +1 -1
- package/dist/sync-agent/spaces/models/space.js +8 -30
- package/dist/sync-agent/spaces/models/space.js.map +1 -1
- package/dist/sync-agent/spaces/spaces.d.ts +3 -4
- package/dist/sync-agent/spaces/spaces.d.ts.map +1 -1
- package/dist/sync-agent/spaces/spaces.js +6 -25
- package/dist/sync-agent/spaces/spaces.js.map +1 -1
- package/dist/sync-agent/syncAgent.d.ts.map +1 -1
- package/dist/sync-agent/syncAgent.js +2 -7
- package/dist/sync-agent/syncAgent.js.map +1 -1
- package/dist/townsEnv.js +5 -5
- package/dist/townsEnv.js.map +1 -1
- package/package.json +10 -10
- package/dist/createBot.d.ts +0 -159
- package/dist/createBot.d.ts.map +0 -1
- package/dist/createBot.js +0 -206
- package/dist/createBot.js.map +0 -1
- package/dist/makeRiverRpcClient.d.ts +0 -6
- package/dist/makeRiverRpcClient.d.ts.map +0 -1
- package/dist/makeRiverRpcClient.js +0 -9
- package/dist/makeRiverRpcClient.js.map +0 -1
- package/dist/streamStateView_ChannelMetadata.d.ts +0 -22
- package/dist/streamStateView_ChannelMetadata.d.ts.map +0 -1
- package/dist/streamStateView_ChannelMetadata.js +0 -77
- package/dist/streamStateView_ChannelMetadata.js.map +0 -1
- package/dist/sync-agent/entitlements/entitlements.d.ts +0 -10
- package/dist/sync-agent/entitlements/entitlements.d.ts.map +0 -1
- package/dist/sync-agent/entitlements/entitlements.js +0 -20
- package/dist/sync-agent/entitlements/entitlements.js.map +0 -1
- package/dist/sync-agent/river-connection/models/riverChain.d.ts +0 -24
- package/dist/sync-agent/river-connection/models/riverChain.d.ts.map +0 -1
- package/dist/sync-agent/river-connection/models/riverChain.js +0 -66
- package/dist/sync-agent/river-connection/models/riverChain.js.map +0 -1
- package/dist/tests/multi/appRegistryService.test.d.ts +0 -2
- package/dist/tests/multi/appRegistryService.test.d.ts.map +0 -1
- package/dist/tests/multi/appRegistryService.test.js +0 -41
- package/dist/tests/multi/appRegistryService.test.js.map +0 -1
- package/dist/tests/multi/botEntitlements.test.d.ts +0 -5
- package/dist/tests/multi/botEntitlements.test.d.ts.map +0 -1
- package/dist/tests/multi/botEntitlements.test.js +0 -178
- package/dist/tests/multi/botEntitlements.test.js.map +0 -1
- package/dist/tests/multi/botMembership.test.d.ts +0 -5
- package/dist/tests/multi/botMembership.test.d.ts.map +0 -1
- package/dist/tests/multi/botMembership.test.js +0 -295
- package/dist/tests/multi/botMembership.test.js.map +0 -1
- package/dist/tests/multi/botStreamCreation.test.d.ts +0 -5
- package/dist/tests/multi/botStreamCreation.test.d.ts.map +0 -1
- package/dist/tests/multi/botStreamCreation.test.js +0 -60
- package/dist/tests/multi/botStreamCreation.test.js.map +0 -1
- package/dist/tests/multi/channelScrubbing.test.d.ts +0 -5
- package/dist/tests/multi/channelScrubbing.test.d.ts.map +0 -1
- package/dist/tests/multi/channelScrubbing.test.js +0 -102
- package/dist/tests/multi/channelScrubbing.test.js.map +0 -1
- package/dist/tests/multi_ne/nodeSelection.test.d.ts +0 -5
- package/dist/tests/multi_ne/nodeSelection.test.d.ts.map +0 -1
- package/dist/tests/multi_ne/nodeSelection.test.js +0 -41
- package/dist/tests/multi_ne/nodeSelection.test.js.map +0 -1
- package/dist/tests/multi_ne/trading.solana.test.d.ts +0 -2
- package/dist/tests/multi_ne/trading.solana.test.d.ts.map +0 -1
- package/dist/tests/multi_ne/trading.solana.test.js +0 -229
- package/dist/tests/multi_ne/trading.solana.test.js.map +0 -1
- package/dist/tests/multi_ne/trading.test.d.ts +0 -2
- package/dist/tests/multi_ne/trading.test.d.ts.map +0 -1
- package/dist/tests/multi_ne/trading.test.js +0 -243
- 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 +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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"}
|