mainnet-js 3.0.0-next.0 → 3.0.0-next.2
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/index.html +1 -1
- package/dist/{mainnet-3.0.0-next.0.js → mainnet-3.0.0-next.2.js} +21 -41
- package/dist/module/cache/walletCache.d.ts +10 -4
- package/dist/module/cache/walletCache.d.ts.map +1 -1
- package/dist/module/cache/walletCache.js +12 -13
- package/dist/module/cache/walletCache.js.map +1 -1
- package/dist/module/chain.d.ts +1 -1
- package/dist/module/chain.js +1 -1
- package/dist/module/chain.js.map +1 -1
- package/dist/module/constant.d.ts +1 -1
- package/dist/module/constant.d.ts.map +1 -1
- package/dist/module/constant.js +1 -1
- package/dist/module/constant.js.map +1 -1
- package/dist/module/enum.d.ts +1 -7
- package/dist/module/enum.d.ts.map +1 -1
- package/dist/module/enum.js +0 -6
- package/dist/module/enum.js.map +1 -1
- package/dist/module/history/getHistory.d.ts.map +1 -1
- package/dist/module/history/getHistory.js +17 -47
- package/dist/module/history/getHistory.js.map +1 -1
- package/dist/module/history/interface.d.ts +1 -1
- package/dist/module/history/interface.d.ts.map +1 -1
- package/dist/module/interface.d.ts +6 -5
- package/dist/module/interface.d.ts.map +1 -1
- package/dist/module/interface.js.map +1 -1
- package/dist/module/network/ElectrumNetworkProvider.d.ts.map +1 -1
- package/dist/module/network/ElectrumNetworkProvider.js +2 -4
- package/dist/module/network/ElectrumNetworkProvider.js.map +1 -1
- package/dist/module/network/getRelayFeeCache.js +2 -2
- package/dist/module/network/getRelayFeeCache.js.map +1 -1
- package/dist/module/network/interface.d.ts +2 -2
- package/dist/module/network/interface.d.ts.map +1 -1
- package/dist/module/rate/ExchangeRate.d.ts +2 -1
- package/dist/module/rate/ExchangeRate.d.ts.map +1 -1
- package/dist/module/rate/ExchangeRate.js +4 -1
- package/dist/module/rate/ExchangeRate.js.map +1 -1
- package/dist/module/transaction/Wif.d.ts +9 -9
- package/dist/module/transaction/Wif.d.ts.map +1 -1
- package/dist/module/transaction/Wif.js +35 -35
- package/dist/module/transaction/Wif.js.map +1 -1
- package/dist/module/transaction/allocateFee.d.ts +3 -3
- package/dist/module/transaction/allocateFee.d.ts.map +1 -1
- package/dist/module/transaction/allocateFee.js +5 -6
- package/dist/module/transaction/allocateFee.js.map +1 -1
- package/dist/module/util/amountInSatoshi.d.ts +1 -1
- package/dist/module/util/amountInSatoshi.d.ts.map +1 -1
- package/dist/module/util/amountInSatoshi.js +3 -9
- package/dist/module/util/amountInSatoshi.js.map +1 -1
- package/dist/module/util/asSendRequestObject.d.ts.map +1 -1
- package/dist/module/util/asSendRequestObject.js +10 -7
- package/dist/module/util/asSendRequestObject.js.map +1 -1
- package/dist/module/util/convert.d.ts +3 -0
- package/dist/module/util/convert.d.ts.map +1 -1
- package/dist/module/util/convert.js +12 -0
- package/dist/module/util/convert.js.map +1 -1
- package/dist/module/util/index.d.ts +2 -3
- package/dist/module/util/index.d.ts.map +1 -1
- package/dist/module/util/index.js +2 -3
- package/dist/module/util/index.js.map +1 -1
- package/dist/module/util/satoshiToAmount.d.ts +1 -1
- package/dist/module/util/satoshiToAmount.d.ts.map +1 -1
- package/dist/module/util/satoshiToAmount.js +3 -9
- package/dist/module/util/satoshiToAmount.js.map +1 -1
- package/dist/module/util/sumSendRequestAmounts.d.ts.map +1 -1
- package/dist/module/util/sumSendRequestAmounts.js +3 -4
- package/dist/module/util/sumSendRequestAmounts.js.map +1 -1
- package/dist/module/util/sumUtxoValue.d.ts +1 -1
- package/dist/module/util/sumUtxoValue.js +3 -3
- package/dist/module/util/sumUtxoValue.js.map +1 -1
- package/dist/module/wallet/Base.d.ts +28 -30
- package/dist/module/wallet/Base.d.ts.map +1 -1
- package/dist/module/wallet/Base.js +82 -119
- package/dist/module/wallet/Base.js.map +1 -1
- package/dist/module/wallet/HDWallet.d.ts +1 -1
- package/dist/module/wallet/Util.js +1 -1
- package/dist/module/wallet/Util.js.map +1 -1
- package/dist/module/wallet/Wif.d.ts +1 -1
- package/dist/module/wallet/interface.d.ts +2 -3
- package/dist/module/wallet/interface.d.ts.map +1 -1
- package/dist/module/wallet/model.d.ts +53 -41
- package/dist/module/wallet/model.d.ts.map +1 -1
- package/dist/module/wallet/model.js +14 -22
- package/dist/module/wallet/model.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/cache/walletCache.ts +23 -36
- package/src/chain.ts +1 -1
- package/src/constant.ts +1 -1
- package/src/enum.ts +0 -6
- package/src/history/getHistory.test.ts +20 -34
- package/src/history/getHistory.ts +17 -49
- package/src/history/interface.ts +1 -1
- package/src/interface.ts +6 -5
- package/src/network/Connection.test.ts +3 -3
- package/src/network/ElectrumNetworkProvider.ts +2 -4
- package/src/network/Rpc.test.ts +2 -3
- package/src/network/getRelayFeeCache.ts +2 -2
- package/src/network/interface.ts +2 -2
- package/src/rate/ExchangeRate.test.ts +2 -44
- package/src/rate/ExchangeRate.ts +5 -2
- package/src/transaction/Wif.ts +50 -45
- package/src/transaction/allocateFee.test.ts +110 -131
- package/src/transaction/allocateFee.ts +14 -15
- package/src/util/amountInSatoshi.test.ts +1 -9
- package/src/util/amountInSatoshi.ts +6 -10
- package/src/util/asSendRequestObject.ts +12 -7
- package/src/util/convert.ts +18 -0
- package/src/util/index.ts +2 -7
- package/src/util/satoshiToAmount.test.ts +1 -1
- package/src/util/satoshiToAmount.ts +4 -10
- package/src/util/sumSendRequestAmounts.ts +3 -4
- package/src/util/sumUtxoValue.ts +4 -4
- package/src/wallet/Base.ts +95 -164
- package/src/wallet/Cashtokens.test.headless.js +228 -173
- package/src/wallet/Cashtokens.test.ts +506 -406
- package/src/wallet/HDWallet.test.ts +223 -68
- package/src/wallet/Util.ts +1 -1
- package/src/wallet/Wif.test.ts +108 -133
- package/src/wallet/interface.ts +2 -3
- package/src/wallet/model.test.ts +2 -5
- package/src/wallet/model.ts +64 -71
- package/dist/module/util/balanceObjectFromSatoshi.d.ts +0 -8
- package/dist/module/util/balanceObjectFromSatoshi.d.ts.map +0 -1
- package/dist/module/util/balanceObjectFromSatoshi.js +0 -35
- package/dist/module/util/balanceObjectFromSatoshi.js.map +0 -1
- package/src/util/balanceObjectFromSatoshi.test.ts +0 -58
- package/src/util/balanceObjectFromSatoshi.ts +0 -52
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
hexToBin,
|
|
15
15
|
utf8ToBin,
|
|
16
16
|
} from "@bitauth/libauth";
|
|
17
|
-
import { delay } from "../util";
|
|
17
|
+
import { convert, delay } from "../util";
|
|
18
18
|
import { Config } from "../config";
|
|
19
19
|
import json from "../test/json.test";
|
|
20
20
|
|
|
@@ -31,20 +31,22 @@ describe(`Test cashtokens`, () => {
|
|
|
31
31
|
"bchtest:pzszr88euuuy87uarx9krcuh5psy4zzghsm2033xk4"
|
|
32
32
|
);
|
|
33
33
|
const utxos = await wallet.getTokenUtxos();
|
|
34
|
-
expect(utxos[0].token?.
|
|
34
|
+
expect(utxos[0].token?.category).toBeDefined();
|
|
35
35
|
});
|
|
36
36
|
|
|
37
37
|
test("Test token genesis and max amount to send", async () => {
|
|
38
38
|
const alice = await RegTestWallet.fromId(process.env.ALICE_ID!);
|
|
39
39
|
const bob = await RegTestWallet.newRandom();
|
|
40
|
-
await alice.send([
|
|
40
|
+
await alice.send([
|
|
41
|
+
[bob.cashaddr!, BigInt(await convert(0.101, "bch", "sat"))],
|
|
42
|
+
]);
|
|
41
43
|
const genesisResponse = await bob.tokenGenesis({
|
|
42
44
|
amount: 100n,
|
|
43
45
|
});
|
|
44
46
|
|
|
45
47
|
const maxAmountToSend = await bob.getMaxAmountToSend();
|
|
46
|
-
await bob.send([[alice.cashaddr!, maxAmountToSend
|
|
47
|
-
expect(await bob.getBalance(
|
|
48
|
+
await bob.send([[alice.cashaddr!, maxAmountToSend]]);
|
|
49
|
+
expect(await bob.getBalance()).toBe(0n);
|
|
48
50
|
});
|
|
49
51
|
|
|
50
52
|
test("Test tokens will not be burned when sending bch value", async () => {
|
|
@@ -54,39 +56,37 @@ describe(`Test cashtokens`, () => {
|
|
|
54
56
|
amount: 100n,
|
|
55
57
|
});
|
|
56
58
|
|
|
57
|
-
const
|
|
58
|
-
const tokenBalance = await alice.getTokenBalance(
|
|
59
|
+
const category = genesisResponse.categories![0];
|
|
60
|
+
const tokenBalance = await alice.getTokenBalance(category);
|
|
59
61
|
expect(tokenBalance).toBe(100n);
|
|
60
|
-
const tokenUtxos = await alice.getTokenUtxos(
|
|
62
|
+
const tokenUtxos = await alice.getTokenUtxos(category);
|
|
61
63
|
expect(tokenUtxos.length).toBe(1);
|
|
62
64
|
await alice.send([
|
|
63
65
|
new SendRequest({
|
|
64
66
|
cashaddr: bob.cashaddr!,
|
|
65
|
-
value:
|
|
66
|
-
unit: "sat",
|
|
67
|
+
value: 5000n,
|
|
67
68
|
}),
|
|
68
69
|
new TokenSendRequest({
|
|
69
70
|
cashaddr: bob.cashaddr!,
|
|
70
71
|
amount: 25n,
|
|
71
|
-
|
|
72
|
+
category: category,
|
|
72
73
|
}),
|
|
73
74
|
]);
|
|
74
|
-
expect(await bob.getTokenBalance(
|
|
75
|
-
expect(await bob.getBalance(
|
|
75
|
+
expect(await bob.getTokenBalance(category)).toBe(25n);
|
|
76
|
+
expect(await bob.getBalance()).toBe(5000n);
|
|
76
77
|
|
|
77
78
|
await bob.send(
|
|
78
79
|
new SendRequest({
|
|
79
80
|
cashaddr: alice.cashaddr!,
|
|
80
|
-
value:
|
|
81
|
-
unit: "sat",
|
|
81
|
+
value: 1000n,
|
|
82
82
|
})
|
|
83
83
|
);
|
|
84
|
-
expect(await bob.getTokenBalance(
|
|
85
|
-
expect(await bob.getBalance(
|
|
84
|
+
expect(await bob.getTokenBalance(category)).toBe(25n);
|
|
85
|
+
expect(await bob.getBalance()).toBe(3780n);
|
|
86
86
|
|
|
87
87
|
await bob.sendMax(alice.cashaddr!);
|
|
88
|
-
expect(await bob.getTokenBalance(
|
|
89
|
-
expect(await bob.getBalance(
|
|
88
|
+
expect(await bob.getTokenBalance(category)).toBe(25n);
|
|
89
|
+
expect(await bob.getBalance()).toBe(0n);
|
|
90
90
|
});
|
|
91
91
|
|
|
92
92
|
test("Test fungible cashtoken genesis and sending", async () => {
|
|
@@ -96,76 +96,75 @@ describe(`Test cashtokens`, () => {
|
|
|
96
96
|
amount: 300n,
|
|
97
97
|
});
|
|
98
98
|
|
|
99
|
-
const
|
|
100
|
-
const tokenBalance = await alice.getTokenBalance(
|
|
99
|
+
const category = genesisResponse.categories![0];
|
|
100
|
+
const tokenBalance = await alice.getTokenBalance(category);
|
|
101
101
|
expect(tokenBalance).toBe(300n);
|
|
102
|
-
const tokenUtxos = await alice.getTokenUtxos(
|
|
102
|
+
const tokenUtxos = await alice.getTokenUtxos(category);
|
|
103
103
|
expect(tokenUtxos.length).toBe(1);
|
|
104
104
|
const response = await alice.send([
|
|
105
105
|
new TokenSendRequest({
|
|
106
106
|
cashaddr: bob.cashaddr!,
|
|
107
107
|
amount: 25n,
|
|
108
|
-
|
|
108
|
+
category: category,
|
|
109
109
|
}),
|
|
110
110
|
new TokenSendRequest({
|
|
111
111
|
cashaddr: alice.cashaddr!,
|
|
112
112
|
amount: 25n,
|
|
113
|
-
|
|
113
|
+
category: category,
|
|
114
114
|
}),
|
|
115
115
|
new SendRequest({
|
|
116
116
|
cashaddr: bob.cashaddr!,
|
|
117
|
-
value:
|
|
118
|
-
unit: "sat",
|
|
117
|
+
value: 20000n,
|
|
119
118
|
}),
|
|
120
119
|
]);
|
|
121
|
-
const newTokenUtxos = await alice.getTokenUtxos(
|
|
120
|
+
const newTokenUtxos = await alice.getTokenUtxos(category);
|
|
122
121
|
expect(newTokenUtxos.length).toBe(2);
|
|
123
|
-
expect(await alice.getTokenBalance(
|
|
124
|
-
expect(await bob.getTokenBalance(
|
|
125
|
-
expect(await bob.getNftTokenBalance(
|
|
126
|
-
expect((await bob.getAllNftTokenBalances())[
|
|
122
|
+
expect(await alice.getTokenBalance(category)).toBe(275n);
|
|
123
|
+
expect(await bob.getTokenBalance(category)).toBe(25n);
|
|
124
|
+
expect(await bob.getNftTokenBalance(category)).toBe(0);
|
|
125
|
+
expect((await bob.getAllNftTokenBalances())[category] || 0).toBe(0);
|
|
127
126
|
|
|
128
127
|
await alice.send([
|
|
129
128
|
new TokenSendRequest({
|
|
130
129
|
cashaddr: bob.cashaddr!,
|
|
131
130
|
amount: 75n,
|
|
132
|
-
|
|
131
|
+
category: category,
|
|
133
132
|
}),
|
|
134
133
|
new TokenSendRequest({
|
|
135
134
|
cashaddr: bob.cashaddr!,
|
|
136
135
|
amount: 100n,
|
|
137
|
-
|
|
136
|
+
category: category,
|
|
138
137
|
}),
|
|
139
138
|
new TokenSendRequest({
|
|
140
139
|
cashaddr: bob.cashaddr!,
|
|
141
140
|
amount: 100n,
|
|
142
|
-
|
|
141
|
+
category: category,
|
|
143
142
|
}),
|
|
144
143
|
]);
|
|
145
144
|
|
|
146
|
-
expect(await alice.getTokenBalance(
|
|
147
|
-
expect(await bob.getTokenBalance(
|
|
145
|
+
expect(await alice.getTokenBalance(category)).toBe(0n);
|
|
146
|
+
expect(await bob.getTokenBalance(category)).toBe(300n);
|
|
148
147
|
|
|
149
148
|
await bob.tokenBurn({
|
|
150
|
-
|
|
149
|
+
category: category,
|
|
151
150
|
amount: 99n,
|
|
152
151
|
});
|
|
153
152
|
|
|
154
|
-
expect(await alice.getTokenBalance(
|
|
155
|
-
expect(await bob.getTokenBalance(
|
|
153
|
+
expect(await alice.getTokenBalance(category)).toBe(0n);
|
|
154
|
+
expect(await bob.getTokenBalance(category)).toBe(201n);
|
|
156
155
|
|
|
157
156
|
await bob.tokenBurn({
|
|
158
|
-
|
|
157
|
+
category: category,
|
|
159
158
|
amount: 200n,
|
|
160
159
|
});
|
|
161
160
|
|
|
162
|
-
expect(await bob.getTokenBalance(
|
|
161
|
+
expect(await bob.getTokenBalance(category)).toBe(1n);
|
|
163
162
|
|
|
164
163
|
await bob.tokenBurn({
|
|
165
|
-
|
|
164
|
+
category: category,
|
|
166
165
|
amount: 1n,
|
|
167
166
|
});
|
|
168
|
-
expect(await bob.getTokenBalance(
|
|
167
|
+
expect(await bob.getTokenBalance(category)).toBe(0n);
|
|
169
168
|
});
|
|
170
169
|
|
|
171
170
|
test("Test NFT cashtoken genesis and sending", async () => {
|
|
@@ -173,56 +172,65 @@ describe(`Test cashtokens`, () => {
|
|
|
173
172
|
const bob = await RegTestWallet.newRandom();
|
|
174
173
|
const genesisResponse = await alice.tokenGenesis({
|
|
175
174
|
cashaddr: alice.cashaddr!,
|
|
176
|
-
|
|
177
|
-
|
|
175
|
+
nft: {
|
|
176
|
+
capability: NFTCapability.mutable,
|
|
177
|
+
commitment: "abcd",
|
|
178
|
+
},
|
|
178
179
|
});
|
|
179
180
|
|
|
180
|
-
const
|
|
181
|
-
const tokenBalance = await alice.getTokenBalance(
|
|
181
|
+
const category = genesisResponse.categories![0];
|
|
182
|
+
const tokenBalance = await alice.getTokenBalance(category);
|
|
182
183
|
expect(tokenBalance).toBe(0n);
|
|
183
|
-
const nftTokenBalance = await alice.getNftTokenBalance(
|
|
184
|
+
const nftTokenBalance = await alice.getNftTokenBalance(category);
|
|
184
185
|
expect(nftTokenBalance).toBe(1);
|
|
185
|
-
const tokenUtxos = await alice.getTokenUtxos(
|
|
186
|
+
const tokenUtxos = await alice.getTokenUtxos(category);
|
|
186
187
|
expect(tokenUtxos.length).toBe(1);
|
|
187
188
|
const response = await alice.send([
|
|
188
|
-
{
|
|
189
|
+
new TokenSendRequest({
|
|
189
190
|
cashaddr: bob.cashaddr!,
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
191
|
+
category: category,
|
|
192
|
+
nft: {
|
|
193
|
+
capability: NFTCapability.mutable,
|
|
194
|
+
commitment: "abcd",
|
|
195
|
+
},
|
|
196
|
+
}),
|
|
194
197
|
]);
|
|
195
|
-
expect(await alice.getTokenBalance(
|
|
196
|
-
expect(await alice.getNftTokenBalance(
|
|
197
|
-
const newTokenUtxos = await alice.getTokenUtxos(
|
|
198
|
+
expect(await alice.getTokenBalance(category)).toBe(0n);
|
|
199
|
+
expect(await alice.getNftTokenBalance(category)).toBe(0);
|
|
200
|
+
const newTokenUtxos = await alice.getTokenUtxos(category);
|
|
198
201
|
expect(newTokenUtxos.length).toBe(0);
|
|
199
202
|
|
|
200
|
-
expect(await bob.getTokenBalance(
|
|
201
|
-
const bobTokenUtxos = await bob.getTokenUtxos(
|
|
203
|
+
expect(await bob.getTokenBalance(category)).toBe(0n);
|
|
204
|
+
const bobTokenUtxos = await bob.getTokenUtxos(category);
|
|
202
205
|
expect(bobTokenUtxos.length).toBe(1);
|
|
203
|
-
expect(
|
|
204
|
-
expect(bobTokenUtxos[0].token?.commitment).toEqual("abcd");
|
|
206
|
+
expect(category).toEqual(response.categories![0]);
|
|
207
|
+
expect(bobTokenUtxos[0].token?.nft?.commitment).toEqual("abcd");
|
|
205
208
|
});
|
|
206
209
|
|
|
207
210
|
test("Test immutable NFT cashtoken genesis and sending, error on mutation", async () => {
|
|
208
211
|
const alice = await RegTestWallet.fromId(process.env.ALICE_ID!);
|
|
209
212
|
const genesisResponse = await alice.tokenGenesis({
|
|
210
213
|
cashaddr: alice.cashaddr!,
|
|
211
|
-
|
|
212
|
-
|
|
214
|
+
nft: {
|
|
215
|
+
capability: NFTCapability.none,
|
|
216
|
+
commitment: "abcd",
|
|
217
|
+
},
|
|
213
218
|
});
|
|
214
219
|
|
|
215
|
-
const
|
|
216
|
-
const tokenBalance = await alice.getTokenBalance(
|
|
220
|
+
const category = genesisResponse.categories![0];
|
|
221
|
+
const tokenBalance = await alice.getTokenBalance(category);
|
|
217
222
|
expect(tokenBalance).toBe(0n);
|
|
218
|
-
const tokenUtxos = await alice.getTokenUtxos(
|
|
223
|
+
const tokenUtxos = await alice.getTokenUtxos(category);
|
|
219
224
|
expect(tokenUtxos.length).toBe(1);
|
|
220
225
|
await expect(
|
|
221
226
|
alice.send([
|
|
222
227
|
new TokenSendRequest({
|
|
223
228
|
cashaddr: alice.cashaddr!,
|
|
224
|
-
|
|
225
|
-
|
|
229
|
+
category: category,
|
|
230
|
+
nft: {
|
|
231
|
+
capability: NFTCapability.none,
|
|
232
|
+
commitment: "abcd02",
|
|
233
|
+
},
|
|
226
234
|
}),
|
|
227
235
|
])
|
|
228
236
|
).rejects.toThrow("No suitable token utxos available to send token");
|
|
@@ -232,108 +240,128 @@ describe(`Test cashtokens`, () => {
|
|
|
232
240
|
const alice = await RegTestWallet.fromId(process.env.ALICE_ID!);
|
|
233
241
|
const genesisResponse = await alice.tokenGenesis({
|
|
234
242
|
cashaddr: alice.cashaddr!,
|
|
235
|
-
|
|
236
|
-
|
|
243
|
+
nft: {
|
|
244
|
+
capability: NFTCapability.mutable,
|
|
245
|
+
commitment: "abcd",
|
|
246
|
+
},
|
|
237
247
|
});
|
|
238
248
|
|
|
239
|
-
const
|
|
240
|
-
const tokenBalance = await alice.getTokenBalance(
|
|
249
|
+
const category = genesisResponse.categories![0];
|
|
250
|
+
const tokenBalance = await alice.getTokenBalance(category);
|
|
241
251
|
expect(tokenBalance).toBe(0n);
|
|
242
|
-
const tokenUtxos = await alice.getTokenUtxos(
|
|
252
|
+
const tokenUtxos = await alice.getTokenUtxos(category);
|
|
243
253
|
expect(tokenUtxos.length).toBe(1);
|
|
244
254
|
const response = await alice.send([
|
|
245
255
|
new TokenSendRequest({
|
|
246
256
|
cashaddr: alice.cashaddr!,
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
257
|
+
category: category,
|
|
258
|
+
nft: {
|
|
259
|
+
capability: NFTCapability.mutable,
|
|
260
|
+
commitment: "abcd02",
|
|
261
|
+
},
|
|
250
262
|
}),
|
|
251
263
|
]);
|
|
252
|
-
expect(await alice.getTokenBalance(
|
|
253
|
-
const newTokenUtxos = await alice.getTokenUtxos(
|
|
264
|
+
expect(await alice.getTokenBalance(category)).toBe(0n);
|
|
265
|
+
const newTokenUtxos = await alice.getTokenUtxos(category);
|
|
254
266
|
expect(newTokenUtxos.length).toBe(1);
|
|
255
|
-
expect(
|
|
256
|
-
expect(newTokenUtxos[0].token?.commitment).toEqual("abcd02");
|
|
267
|
+
expect(category).toEqual(response.categories![0]);
|
|
268
|
+
expect(newTokenUtxos[0].token?.nft?.commitment).toEqual("abcd02");
|
|
257
269
|
});
|
|
258
270
|
|
|
259
271
|
test("Test minting NFT cashtoken genesis and minting", async () => {
|
|
260
272
|
const alice = await RegTestWallet.fromId(process.env.ALICE_ID!);
|
|
261
273
|
const genesisResponse = await alice.tokenGenesis({
|
|
262
274
|
cashaddr: alice.cashaddr!,
|
|
263
|
-
|
|
264
|
-
|
|
275
|
+
nft: {
|
|
276
|
+
capability: NFTCapability.minting,
|
|
277
|
+
commitment: "abcd",
|
|
278
|
+
},
|
|
265
279
|
});
|
|
266
280
|
|
|
267
|
-
const
|
|
268
|
-
const tokenBalance = await alice.getTokenBalance(
|
|
281
|
+
const category = genesisResponse.categories![0];
|
|
282
|
+
const tokenBalance = await alice.getTokenBalance(category);
|
|
269
283
|
expect(tokenBalance).toBe(0n);
|
|
270
|
-
const tokenUtxos = await alice.getTokenUtxos(
|
|
284
|
+
const tokenUtxos = await alice.getTokenUtxos(category);
|
|
271
285
|
expect(tokenUtxos.length).toBe(1);
|
|
272
|
-
const response = await alice.tokenMint(
|
|
286
|
+
const response = await alice.tokenMint(category, [
|
|
273
287
|
new TokenMintRequest({
|
|
274
288
|
cashaddr: alice.cashaddr!,
|
|
275
|
-
|
|
276
|
-
|
|
289
|
+
nft: {
|
|
290
|
+
commitment: "test",
|
|
291
|
+
capability: NFTCapability.none,
|
|
292
|
+
},
|
|
277
293
|
}),
|
|
278
294
|
new TokenMintRequest({
|
|
279
295
|
cashaddr: alice.cashaddr!,
|
|
280
|
-
|
|
281
|
-
|
|
296
|
+
nft: {
|
|
297
|
+
commitment: "test2",
|
|
298
|
+
capability: NFTCapability.none,
|
|
299
|
+
},
|
|
282
300
|
}),
|
|
283
301
|
]);
|
|
284
|
-
expect(await alice.getTokenBalance(
|
|
285
|
-
const newTokenUtxos = await alice.getTokenUtxos(
|
|
302
|
+
expect(await alice.getTokenBalance(category)).toBe(0n);
|
|
303
|
+
const newTokenUtxos = await alice.getTokenUtxos(category);
|
|
286
304
|
expect(newTokenUtxos.length).toBe(3);
|
|
287
|
-
expect(
|
|
305
|
+
expect(category).toEqual(response.categories![0]);
|
|
288
306
|
});
|
|
289
307
|
|
|
290
308
|
test("Test minting semifungible tokens and sending them", async () => {
|
|
291
309
|
const alice = await RegTestWallet.fromId(process.env.ALICE_ID!);
|
|
292
310
|
const genesisResponse = await alice.tokenGenesis({
|
|
293
311
|
cashaddr: alice.cashaddr!,
|
|
294
|
-
|
|
295
|
-
|
|
312
|
+
nft: {
|
|
313
|
+
capability: NFTCapability.minting,
|
|
314
|
+
commitment: "abcd",
|
|
315
|
+
},
|
|
296
316
|
});
|
|
297
317
|
|
|
298
|
-
const
|
|
318
|
+
const category = genesisResponse.categories![0];
|
|
299
319
|
|
|
300
320
|
// mint 2 NFTs, amount reducing
|
|
301
|
-
const response = await alice.tokenMint(
|
|
321
|
+
const response = await alice.tokenMint(category, [
|
|
302
322
|
new TokenMintRequest({
|
|
303
323
|
cashaddr: alice.cashaddr!,
|
|
304
|
-
|
|
305
|
-
|
|
324
|
+
nft: {
|
|
325
|
+
capability: NFTCapability.none,
|
|
326
|
+
commitment: "0a",
|
|
327
|
+
},
|
|
306
328
|
}),
|
|
307
329
|
new TokenMintRequest({
|
|
308
330
|
cashaddr: alice.cashaddr!,
|
|
309
|
-
|
|
310
|
-
|
|
331
|
+
nft: {
|
|
332
|
+
capability: NFTCapability.none,
|
|
333
|
+
commitment: "0a",
|
|
334
|
+
},
|
|
311
335
|
}),
|
|
312
336
|
]);
|
|
313
|
-
const newTokenUtxos = await alice.getTokenUtxos(
|
|
337
|
+
const newTokenUtxos = await alice.getTokenUtxos(category);
|
|
314
338
|
expect(newTokenUtxos.length).toBe(3);
|
|
315
|
-
expect(
|
|
339
|
+
expect(category).toEqual(response.categories![0]);
|
|
316
340
|
|
|
317
341
|
const bob = await RegTestWallet.newRandom();
|
|
318
342
|
await alice.send([
|
|
319
343
|
new TokenSendRequest({
|
|
320
344
|
cashaddr: bob.cashaddr!,
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
345
|
+
category: category,
|
|
346
|
+
nft: {
|
|
347
|
+
capability: NFTCapability.none,
|
|
348
|
+
commitment: "0a",
|
|
349
|
+
},
|
|
324
350
|
}),
|
|
325
351
|
new TokenSendRequest({
|
|
326
352
|
cashaddr: bob.cashaddr!,
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
353
|
+
category: category,
|
|
354
|
+
nft: {
|
|
355
|
+
capability: NFTCapability.none,
|
|
356
|
+
commitment: "0a",
|
|
357
|
+
},
|
|
330
358
|
}),
|
|
331
359
|
]);
|
|
332
360
|
|
|
333
|
-
expect((await alice.getTokenUtxos(
|
|
334
|
-
const bobTokenUtxos = await bob.getTokenUtxos(
|
|
361
|
+
expect((await alice.getTokenUtxos(category)).length).toBe(1);
|
|
362
|
+
const bobTokenUtxos = await bob.getTokenUtxos(category);
|
|
335
363
|
expect(bobTokenUtxos.length).toBe(2);
|
|
336
|
-
expect(
|
|
364
|
+
expect(category).toEqual(response.categories![0]);
|
|
337
365
|
});
|
|
338
366
|
|
|
339
367
|
test("Test minting NFT and optionally burning FT cashtoken", async () => {
|
|
@@ -341,87 +369,103 @@ describe(`Test cashtokens`, () => {
|
|
|
341
369
|
const genesisResponse = await alice.tokenGenesis({
|
|
342
370
|
cashaddr: alice.cashaddr!,
|
|
343
371
|
amount: 4n,
|
|
344
|
-
|
|
345
|
-
|
|
372
|
+
nft: {
|
|
373
|
+
capability: NFTCapability.minting,
|
|
374
|
+
commitment: "abcd",
|
|
375
|
+
},
|
|
346
376
|
});
|
|
347
377
|
|
|
348
|
-
const
|
|
349
|
-
const tokenBalance = await alice.getTokenBalance(
|
|
378
|
+
const category = genesisResponse.categories![0];
|
|
379
|
+
const tokenBalance = await alice.getTokenBalance(category);
|
|
350
380
|
expect(tokenBalance).toBe(4n);
|
|
351
|
-
const tokenUtxos = await alice.getTokenUtxos(
|
|
381
|
+
const tokenUtxos = await alice.getTokenUtxos(category);
|
|
352
382
|
expect(tokenUtxos.length).toBe(1);
|
|
353
383
|
|
|
354
384
|
// mint 2 NFTs, amount reducing
|
|
355
385
|
const response = await alice.tokenMint(
|
|
356
|
-
|
|
386
|
+
category,
|
|
357
387
|
[
|
|
358
388
|
new TokenMintRequest({
|
|
359
389
|
cashaddr: alice.cashaddr!,
|
|
360
|
-
|
|
361
|
-
|
|
390
|
+
nft: {
|
|
391
|
+
capability: NFTCapability.none,
|
|
392
|
+
commitment: "0a",
|
|
393
|
+
},
|
|
362
394
|
}),
|
|
363
395
|
new TokenMintRequest({
|
|
364
396
|
cashaddr: alice.cashaddr!,
|
|
365
|
-
|
|
366
|
-
|
|
397
|
+
nft: {
|
|
398
|
+
capability: NFTCapability.none,
|
|
399
|
+
commitment: "0b",
|
|
400
|
+
},
|
|
367
401
|
}),
|
|
368
402
|
],
|
|
369
403
|
true
|
|
370
404
|
);
|
|
371
|
-
expect(await alice.getTokenBalance(
|
|
372
|
-
const newTokenUtxos = await alice.getTokenUtxos(
|
|
405
|
+
expect(await alice.getTokenBalance(category)).toBe(2n);
|
|
406
|
+
const newTokenUtxos = await alice.getTokenUtxos(category);
|
|
373
407
|
expect(newTokenUtxos.length).toBe(3);
|
|
374
|
-
expect(
|
|
408
|
+
expect(category).toEqual(response.categories![0]);
|
|
375
409
|
|
|
376
410
|
// mint 2 more NFTs without amount reducing
|
|
377
411
|
const ftResponse = await alice.tokenMint(
|
|
378
|
-
|
|
412
|
+
category,
|
|
379
413
|
[
|
|
380
414
|
new TokenMintRequest({
|
|
381
415
|
cashaddr: alice.cashaddr!,
|
|
382
|
-
|
|
383
|
-
|
|
416
|
+
nft: {
|
|
417
|
+
capability: NFTCapability.none,
|
|
418
|
+
commitment: "0c",
|
|
419
|
+
},
|
|
384
420
|
}),
|
|
385
421
|
new TokenMintRequest({
|
|
386
422
|
cashaddr: alice.cashaddr!,
|
|
387
|
-
|
|
388
|
-
|
|
423
|
+
nft: {
|
|
424
|
+
capability: NFTCapability.none,
|
|
425
|
+
commitment: "0d",
|
|
426
|
+
},
|
|
389
427
|
}),
|
|
390
428
|
],
|
|
391
429
|
false
|
|
392
430
|
);
|
|
393
|
-
expect(await alice.getTokenBalance(
|
|
394
|
-
const ftTokenUtxos = await alice.getTokenUtxos(
|
|
431
|
+
expect(await alice.getTokenBalance(category)).toBe(2n);
|
|
432
|
+
const ftTokenUtxos = await alice.getTokenUtxos(category);
|
|
395
433
|
expect(ftTokenUtxos.length).toBe(5);
|
|
396
|
-
expect(
|
|
434
|
+
expect(category).toEqual(ftResponse.categories![0]);
|
|
397
435
|
|
|
398
436
|
// we are going to hit amount -1, when minting 3 more NFTs
|
|
399
437
|
// check that it will stop at 0
|
|
400
438
|
const ft2Response = await alice.tokenMint(
|
|
401
|
-
|
|
439
|
+
category,
|
|
402
440
|
[
|
|
403
441
|
new TokenMintRequest({
|
|
404
442
|
cashaddr: alice.cashaddr!,
|
|
405
|
-
|
|
406
|
-
|
|
443
|
+
nft: {
|
|
444
|
+
capability: NFTCapability.none,
|
|
445
|
+
commitment: "0a",
|
|
446
|
+
},
|
|
407
447
|
}),
|
|
408
448
|
new TokenMintRequest({
|
|
409
449
|
cashaddr: alice.cashaddr!,
|
|
410
|
-
|
|
411
|
-
|
|
450
|
+
nft: {
|
|
451
|
+
capability: NFTCapability.none,
|
|
452
|
+
commitment: "0a",
|
|
453
|
+
},
|
|
412
454
|
}),
|
|
413
455
|
new TokenMintRequest({
|
|
414
456
|
cashaddr: alice.cashaddr!,
|
|
415
|
-
|
|
416
|
-
|
|
457
|
+
nft: {
|
|
458
|
+
capability: NFTCapability.none,
|
|
459
|
+
commitment: "0a",
|
|
460
|
+
},
|
|
417
461
|
}),
|
|
418
462
|
],
|
|
419
463
|
true
|
|
420
464
|
);
|
|
421
|
-
expect(await alice.getTokenBalance(
|
|
422
|
-
const ft2TokenUtxos = await alice.getTokenUtxos(
|
|
465
|
+
expect(await alice.getTokenBalance(category)).toBe(0n);
|
|
466
|
+
const ft2TokenUtxos = await alice.getTokenUtxos(category);
|
|
423
467
|
expect(ft2TokenUtxos.length).toBe(8);
|
|
424
|
-
expect(
|
|
468
|
+
expect(category).toEqual(ft2Response.categories![0]);
|
|
425
469
|
});
|
|
426
470
|
|
|
427
471
|
test("Test explicit burning of FT", async () => {
|
|
@@ -431,16 +475,16 @@ describe(`Test cashtokens`, () => {
|
|
|
431
475
|
amount: 4n,
|
|
432
476
|
});
|
|
433
477
|
|
|
434
|
-
const
|
|
435
|
-
const tokenBalance = await alice.getTokenBalance(
|
|
478
|
+
const category = genesisResponse.categories![0];
|
|
479
|
+
const tokenBalance = await alice.getTokenBalance(category);
|
|
436
480
|
expect(tokenBalance).toBe(4n);
|
|
437
|
-
const tokenUtxos = await alice.getTokenUtxos(
|
|
481
|
+
const tokenUtxos = await alice.getTokenUtxos(category);
|
|
438
482
|
expect(tokenUtxos.length).toBe(1);
|
|
439
483
|
|
|
440
484
|
// burn 5 FT
|
|
441
485
|
const response = await alice.tokenBurn(
|
|
442
486
|
{
|
|
443
|
-
|
|
487
|
+
category: category,
|
|
444
488
|
amount: 5n,
|
|
445
489
|
},
|
|
446
490
|
"burn"
|
|
@@ -452,10 +496,10 @@ describe(`Test cashtokens`, () => {
|
|
|
452
496
|
expect(rawTx!.vout[0].scriptPubKey.hex).toContain(
|
|
453
497
|
binToHex(utf8ToBin("burn"))
|
|
454
498
|
);
|
|
455
|
-
expect(await alice.getTokenBalance(
|
|
456
|
-
const newTokenUtxos = await alice.getTokenUtxos(
|
|
499
|
+
expect(await alice.getTokenBalance(category)).toBe(0n);
|
|
500
|
+
const newTokenUtxos = await alice.getTokenUtxos(category);
|
|
457
501
|
expect(newTokenUtxos.length).toBe(0);
|
|
458
|
-
expect(
|
|
502
|
+
expect(category).toEqual(response.categories![0]);
|
|
459
503
|
});
|
|
460
504
|
|
|
461
505
|
test("Test explicit burning of FT and NFT", async () => {
|
|
@@ -463,23 +507,27 @@ describe(`Test cashtokens`, () => {
|
|
|
463
507
|
const genesisResponse = await alice.tokenGenesis({
|
|
464
508
|
cashaddr: alice.cashaddr!,
|
|
465
509
|
amount: 4n,
|
|
466
|
-
|
|
467
|
-
|
|
510
|
+
nft: {
|
|
511
|
+
capability: NFTCapability.minting,
|
|
512
|
+
commitment: "abcd",
|
|
513
|
+
},
|
|
468
514
|
});
|
|
469
515
|
|
|
470
|
-
const
|
|
471
|
-
const tokenBalance = await alice.getTokenBalance(
|
|
516
|
+
const category = genesisResponse.categories![0];
|
|
517
|
+
const tokenBalance = await alice.getTokenBalance(category);
|
|
472
518
|
expect(tokenBalance).toBe(4n);
|
|
473
|
-
const tokenUtxos = await alice.getTokenUtxos(
|
|
519
|
+
const tokenUtxos = await alice.getTokenUtxos(category);
|
|
474
520
|
expect(tokenUtxos.length).toBe(1);
|
|
475
521
|
|
|
476
522
|
// burn 1 FT
|
|
477
523
|
const response = await alice.tokenBurn(
|
|
478
524
|
{
|
|
479
|
-
|
|
525
|
+
category: category,
|
|
480
526
|
amount: 1n,
|
|
481
|
-
|
|
482
|
-
|
|
527
|
+
nft: {
|
|
528
|
+
capability: NFTCapability.minting,
|
|
529
|
+
commitment: "abcd",
|
|
530
|
+
},
|
|
483
531
|
},
|
|
484
532
|
"burn"
|
|
485
533
|
);
|
|
@@ -490,45 +538,49 @@ describe(`Test cashtokens`, () => {
|
|
|
490
538
|
expect(rawTx!.vout[0].scriptPubKey.hex).toContain(
|
|
491
539
|
binToHex(utf8ToBin("burn"))
|
|
492
540
|
);
|
|
493
|
-
expect(await alice.getTokenBalance(
|
|
494
|
-
expect((await alice.getAllTokenBalances())[
|
|
495
|
-
const newTokenUtxos = await alice.getTokenUtxos(
|
|
541
|
+
expect(await alice.getTokenBalance(category)).toBe(3n);
|
|
542
|
+
expect((await alice.getAllTokenBalances())[category]).toBe(3n);
|
|
543
|
+
const newTokenUtxos = await alice.getTokenUtxos(category);
|
|
496
544
|
expect(newTokenUtxos.length).toBe(1);
|
|
497
|
-
expect(await alice.getNftTokenBalance(
|
|
498
|
-
expect((await alice.getAllNftTokenBalances())[
|
|
499
|
-
expect(
|
|
545
|
+
expect(await alice.getNftTokenBalance(category)).toBe(1);
|
|
546
|
+
expect((await alice.getAllNftTokenBalances())[category || 0]).toBe(1);
|
|
547
|
+
expect(category).toEqual(response.categories![0]);
|
|
500
548
|
|
|
501
549
|
// burn the rest FTs
|
|
502
550
|
const ftResponse = await alice.tokenBurn(
|
|
503
551
|
{
|
|
504
|
-
|
|
552
|
+
category: category,
|
|
505
553
|
amount: 5n,
|
|
506
|
-
|
|
507
|
-
|
|
554
|
+
nft: {
|
|
555
|
+
capability: NFTCapability.minting,
|
|
556
|
+
commitment: "abcd",
|
|
557
|
+
},
|
|
508
558
|
},
|
|
509
559
|
"burn"
|
|
510
560
|
);
|
|
511
|
-
expect(await alice.getTokenBalance(
|
|
512
|
-
const ftTokenUtxos = await alice.getTokenUtxos(
|
|
561
|
+
expect(await alice.getTokenBalance(category)).toBe(0n);
|
|
562
|
+
const ftTokenUtxos = await alice.getTokenUtxos(category);
|
|
513
563
|
expect(ftTokenUtxos.length).toBe(1);
|
|
514
|
-
expect(
|
|
564
|
+
expect(category).toEqual(ftResponse.categories![0]);
|
|
515
565
|
|
|
516
566
|
// burn the NFT too
|
|
517
567
|
const nftResponse = await alice.tokenBurn(
|
|
518
568
|
{
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
569
|
+
category: category,
|
|
570
|
+
nft: {
|
|
571
|
+
capability: NFTCapability.minting,
|
|
572
|
+
commitment: "abcd",
|
|
573
|
+
},
|
|
522
574
|
},
|
|
523
575
|
"burn"
|
|
524
576
|
);
|
|
525
|
-
expect(await alice.getTokenBalance(
|
|
526
|
-
expect((await alice.getAllTokenBalances())[
|
|
527
|
-
const nftTokenUtxos = await alice.getTokenUtxos(
|
|
577
|
+
expect(await alice.getTokenBalance(category)).toBe(0n);
|
|
578
|
+
expect((await alice.getAllTokenBalances())[category] || 0n).toBe(0n);
|
|
579
|
+
const nftTokenUtxos = await alice.getTokenUtxos(category);
|
|
528
580
|
expect(nftTokenUtxos.length).toBe(0);
|
|
529
|
-
expect(
|
|
530
|
-
expect(await alice.getNftTokenBalance(
|
|
531
|
-
expect((await alice.getAllNftTokenBalances())[
|
|
581
|
+
expect(category).toEqual(nftResponse.categories![0]);
|
|
582
|
+
expect(await alice.getNftTokenBalance(category)).toBe(0);
|
|
583
|
+
expect((await alice.getAllNftTokenBalances())[category] || 0).toBe(0);
|
|
532
584
|
});
|
|
533
585
|
|
|
534
586
|
test("Test cashtoken satoshi values and fee calculations", async () => {
|
|
@@ -536,52 +588,52 @@ describe(`Test cashtokens`, () => {
|
|
|
536
588
|
const bob = await RegTestWallet.newRandom();
|
|
537
589
|
const genesisResponse = await alice.tokenGenesis({
|
|
538
590
|
amount: 100n,
|
|
539
|
-
value:
|
|
591
|
+
value: 7000n,
|
|
540
592
|
cashaddr: bob.cashaddr!,
|
|
541
593
|
});
|
|
542
594
|
|
|
543
|
-
const
|
|
544
|
-
const tokenBalance = await bob.getTokenBalance(
|
|
595
|
+
const category = genesisResponse.categories![0];
|
|
596
|
+
const tokenBalance = await bob.getTokenBalance(category);
|
|
545
597
|
expect(tokenBalance).toBe(100n);
|
|
546
|
-
const tokenUtxos = await bob.getTokenUtxos(
|
|
598
|
+
const tokenUtxos = await bob.getTokenUtxos(category);
|
|
547
599
|
expect(tokenUtxos.length).toBe(1);
|
|
548
|
-
expect(tokenUtxos[0].satoshis).toBe(
|
|
600
|
+
expect(tokenUtxos[0].satoshis).toBe(7000n);
|
|
549
601
|
|
|
550
602
|
// lower the token satoshi value
|
|
551
603
|
const response = await bob.send([
|
|
552
604
|
new TokenSendRequest({
|
|
553
605
|
cashaddr: bob.cashaddr!,
|
|
554
606
|
amount: 100n,
|
|
555
|
-
|
|
556
|
-
value:
|
|
607
|
+
category: category,
|
|
608
|
+
value: 1500n,
|
|
557
609
|
}),
|
|
558
610
|
]);
|
|
559
|
-
let newTokenUtxos = await bob.getTokenUtxos(
|
|
611
|
+
let newTokenUtxos = await bob.getTokenUtxos(category);
|
|
560
612
|
expect(newTokenUtxos.length).toBe(1);
|
|
561
|
-
expect(await bob.getTokenBalance(
|
|
613
|
+
expect(await bob.getTokenBalance(category)).toBe(100n);
|
|
562
614
|
|
|
563
615
|
let bobUtxos = await bob.getAddressUtxos(bob.cashaddr!);
|
|
564
616
|
expect(bobUtxos.length).toBe(2);
|
|
565
|
-
expect(bobUtxos[0].satoshis).toBe(
|
|
566
|
-
expect(bobUtxos[1].satoshis).toBe(
|
|
617
|
+
expect(bobUtxos[0].satoshis).toBe(1500n);
|
|
618
|
+
expect(bobUtxos[1].satoshis).toBe(5245n);
|
|
567
619
|
|
|
568
620
|
// raise the token satoshi value
|
|
569
621
|
await bob.send([
|
|
570
622
|
new TokenSendRequest({
|
|
571
623
|
cashaddr: bob.cashaddr!,
|
|
572
624
|
amount: 100n,
|
|
573
|
-
|
|
574
|
-
value:
|
|
625
|
+
category: category,
|
|
626
|
+
value: 3000n,
|
|
575
627
|
}),
|
|
576
628
|
]);
|
|
577
|
-
newTokenUtxos = await bob.getTokenUtxos(
|
|
629
|
+
newTokenUtxos = await bob.getTokenUtxos(category);
|
|
578
630
|
expect(newTokenUtxos.length).toBe(1);
|
|
579
|
-
expect(await bob.getTokenBalance(
|
|
631
|
+
expect(await bob.getTokenBalance(category)).toBe(100n);
|
|
580
632
|
|
|
581
633
|
bobUtxos = await bob.getAddressUtxos(bob.cashaddr!);
|
|
582
634
|
expect(bobUtxos.length).toBe(2);
|
|
583
|
-
expect(bobUtxos[0].satoshis).toBe(
|
|
584
|
-
expect(bobUtxos[1].satoshis).toBe(
|
|
635
|
+
expect(bobUtxos[0].satoshis).toBe(3000n);
|
|
636
|
+
expect(bobUtxos[1].satoshis).toBe(3349n);
|
|
585
637
|
});
|
|
586
638
|
|
|
587
639
|
test("Test cashtoken waiting and watching", async () => {
|
|
@@ -590,18 +642,20 @@ describe(`Test cashtokens`, () => {
|
|
|
590
642
|
|
|
591
643
|
const genesisResponse = await alice.tokenGenesis({
|
|
592
644
|
amount: 100n,
|
|
593
|
-
value:
|
|
594
|
-
|
|
595
|
-
|
|
645
|
+
value: 5000n,
|
|
646
|
+
nft: {
|
|
647
|
+
capability: NFTCapability.minting,
|
|
648
|
+
commitment: "test",
|
|
649
|
+
},
|
|
596
650
|
cashaddr: alice.cashaddr!,
|
|
597
651
|
});
|
|
598
652
|
|
|
599
|
-
const
|
|
600
|
-
const tokenBalance = await alice.getTokenBalance(
|
|
653
|
+
const category = genesisResponse.categories![0];
|
|
654
|
+
const tokenBalance = await alice.getTokenBalance(category);
|
|
601
655
|
expect(tokenBalance).toBe(100n);
|
|
602
|
-
const tokenUtxos = await alice.getTokenUtxos(
|
|
656
|
+
const tokenUtxos = await alice.getTokenUtxos(category);
|
|
603
657
|
expect(tokenUtxos.length).toBe(1);
|
|
604
|
-
expect(tokenUtxos[0].satoshis).toBe(
|
|
658
|
+
expect(tokenUtxos[0].satoshis).toBe(5000n);
|
|
605
659
|
|
|
606
660
|
let seenBalance = 0n;
|
|
607
661
|
let sendResponse: SendResponse = {};
|
|
@@ -611,16 +665,18 @@ describe(`Test cashtokens`, () => {
|
|
|
611
665
|
new TokenSendRequest({
|
|
612
666
|
cashaddr: bob.cashaddr!,
|
|
613
667
|
amount: 100n,
|
|
614
|
-
|
|
615
|
-
value:
|
|
616
|
-
|
|
617
|
-
|
|
668
|
+
category: category,
|
|
669
|
+
value: 1500n,
|
|
670
|
+
nft: {
|
|
671
|
+
capability: NFTCapability.minting,
|
|
672
|
+
commitment: "test",
|
|
673
|
+
},
|
|
618
674
|
}),
|
|
619
675
|
])),
|
|
620
676
|
0
|
|
621
677
|
);
|
|
622
678
|
|
|
623
|
-
const cancel = await bob.watchTokenBalance(
|
|
679
|
+
const cancel = await bob.watchTokenBalance(category, (balance) => {
|
|
624
680
|
seenBalance = balance;
|
|
625
681
|
});
|
|
626
682
|
|
|
@@ -629,7 +685,7 @@ describe(`Test cashtokens`, () => {
|
|
|
629
685
|
bobTxId = tx.txid;
|
|
630
686
|
});
|
|
631
687
|
|
|
632
|
-
const balance = await bob.waitForTokenBalance(
|
|
688
|
+
const balance = await bob.waitForTokenBalance(category, 100n);
|
|
633
689
|
await delay(500);
|
|
634
690
|
expect(balance).toBe(100n);
|
|
635
691
|
expect(seenBalance).toBe(100n);
|
|
@@ -644,28 +700,28 @@ describe(`Test cashtokens`, () => {
|
|
|
644
700
|
const bob = await RegTestWallet.newRandom();
|
|
645
701
|
|
|
646
702
|
// prepare inputs for two token geneses
|
|
647
|
-
await alice.send({ cashaddr: bob.cashaddr!, value:
|
|
648
|
-
await alice.send({ cashaddr: bob.cashaddr!, value:
|
|
703
|
+
await alice.send({ cashaddr: bob.cashaddr!, value: 10000n });
|
|
704
|
+
await alice.send({ cashaddr: bob.cashaddr!, value: 10000n });
|
|
649
705
|
|
|
650
706
|
const genesisResponse = await bob.tokenGenesis({
|
|
651
707
|
amount: 100n,
|
|
652
708
|
});
|
|
653
709
|
|
|
654
|
-
const
|
|
655
|
-
const tokenBalance = await bob.getTokenBalance(
|
|
710
|
+
const category = genesisResponse.categories![0];
|
|
711
|
+
const tokenBalance = await bob.getTokenBalance(category);
|
|
656
712
|
|
|
657
713
|
expect(tokenBalance).toBe(100n);
|
|
658
|
-
const tokenUtxos = await bob.getTokenUtxos(
|
|
714
|
+
const tokenUtxos = await bob.getTokenUtxos(category);
|
|
659
715
|
expect(tokenUtxos.length).toBe(1);
|
|
660
716
|
|
|
661
717
|
const genesis2Response = await bob.tokenGenesis({
|
|
662
718
|
amount: 200n,
|
|
663
719
|
});
|
|
664
720
|
|
|
665
|
-
const
|
|
666
|
-
const tokenBalance2 = await bob.getTokenBalance(
|
|
721
|
+
const category2 = genesis2Response.categories![0];
|
|
722
|
+
const tokenBalance2 = await bob.getTokenBalance(category2);
|
|
667
723
|
expect(tokenBalance2).toBe(200n);
|
|
668
|
-
const tokenUtxos2 = await bob.getTokenUtxos(
|
|
724
|
+
const tokenUtxos2 = await bob.getTokenUtxos(category2);
|
|
669
725
|
expect(tokenUtxos2.length).toBe(1);
|
|
670
726
|
|
|
671
727
|
expect((await bob.getTokenUtxos()).length).toBe(2);
|
|
@@ -676,28 +732,28 @@ describe(`Test cashtokens`, () => {
|
|
|
676
732
|
const bob = await RegTestWallet.newRandom();
|
|
677
733
|
|
|
678
734
|
// prepare inputs for two token geneses
|
|
679
|
-
await alice.send({ cashaddr: bob.cashaddr!, value:
|
|
680
|
-
await alice.send({ cashaddr: bob.cashaddr!, value:
|
|
735
|
+
await alice.send({ cashaddr: bob.cashaddr!, value: 10000n });
|
|
736
|
+
await alice.send({ cashaddr: bob.cashaddr!, value: 10000n });
|
|
681
737
|
|
|
682
738
|
const genesisResponse = await bob.tokenGenesis({
|
|
683
739
|
amount: 100n,
|
|
684
740
|
});
|
|
685
741
|
|
|
686
|
-
const
|
|
687
|
-
const tokenBalance = await bob.getTokenBalance(
|
|
742
|
+
const category = genesisResponse.categories![0];
|
|
743
|
+
const tokenBalance = await bob.getTokenBalance(category);
|
|
688
744
|
|
|
689
745
|
expect(tokenBalance).toBe(100n);
|
|
690
|
-
const tokenUtxos = await bob.getTokenUtxos(
|
|
746
|
+
const tokenUtxos = await bob.getTokenUtxos(category);
|
|
691
747
|
expect(tokenUtxos.length).toBe(1);
|
|
692
748
|
|
|
693
749
|
const genesis2Response = await bob.tokenGenesis({
|
|
694
750
|
amount: 200n,
|
|
695
751
|
});
|
|
696
752
|
|
|
697
|
-
const
|
|
698
|
-
const tokenBalance2 = await bob.getTokenBalance(
|
|
753
|
+
const category2 = genesis2Response.categories![0];
|
|
754
|
+
const tokenBalance2 = await bob.getTokenBalance(category2);
|
|
699
755
|
expect(tokenBalance2).toBe(200n);
|
|
700
|
-
const tokenUtxos2 = await bob.getTokenUtxos(
|
|
756
|
+
const tokenUtxos2 = await bob.getTokenUtxos(category2);
|
|
701
757
|
expect(tokenUtxos2.length).toBe(1);
|
|
702
758
|
|
|
703
759
|
expect((await bob.getTokenUtxos()).length).toBe(2);
|
|
@@ -705,13 +761,13 @@ describe(`Test cashtokens`, () => {
|
|
|
705
761
|
const charlie = await RegTestWallet.newRandom();
|
|
706
762
|
await bob.send({
|
|
707
763
|
cashaddr: charlie.cashaddr!,
|
|
708
|
-
|
|
764
|
+
category: category,
|
|
709
765
|
amount: 50n,
|
|
710
766
|
});
|
|
711
767
|
expect((await bob.getTokenUtxos()).length).toBe(2);
|
|
712
768
|
expect((await charlie.getTokenUtxos()).length).toBe(1);
|
|
713
|
-
expect(await bob.getTokenBalance(
|
|
714
|
-
expect(await charlie.getTokenBalance(
|
|
769
|
+
expect(await bob.getTokenBalance(category)).toBe(50n);
|
|
770
|
+
expect(await charlie.getTokenBalance(category)).toBe(50n);
|
|
715
771
|
});
|
|
716
772
|
|
|
717
773
|
test("Test sending bch should not burn tokens", async () => {
|
|
@@ -719,24 +775,24 @@ describe(`Test cashtokens`, () => {
|
|
|
719
775
|
const bob = await RegTestWallet.newRandom();
|
|
720
776
|
|
|
721
777
|
// prepare inputs for two token geneses
|
|
722
|
-
await alice.send({ cashaddr: bob.cashaddr!, value:
|
|
778
|
+
await alice.send({ cashaddr: bob.cashaddr!, value: 10000n });
|
|
723
779
|
|
|
724
780
|
const genesisResponse = await bob.tokenGenesis({
|
|
725
781
|
amount: 100n,
|
|
726
782
|
});
|
|
727
783
|
|
|
728
|
-
const
|
|
729
|
-
const tokenBalance = await bob.getTokenBalance(
|
|
784
|
+
const category = genesisResponse.categories![0];
|
|
785
|
+
const tokenBalance = await bob.getTokenBalance(category);
|
|
730
786
|
|
|
731
787
|
expect(tokenBalance).toBe(100n);
|
|
732
|
-
const tokenUtxos = await bob.getTokenUtxos(
|
|
788
|
+
const tokenUtxos = await bob.getTokenUtxos(category);
|
|
733
789
|
expect(tokenUtxos.length).toBe(1);
|
|
734
790
|
|
|
735
|
-
await bob.send({ cashaddr: alice.cashaddr!, value:
|
|
791
|
+
await bob.send({ cashaddr: alice.cashaddr!, value: 1000n });
|
|
736
792
|
|
|
737
|
-
const tokenBalance2 = await bob.getTokenBalance(
|
|
793
|
+
const tokenBalance2 = await bob.getTokenBalance(category);
|
|
738
794
|
expect(tokenBalance2).toBe(100n);
|
|
739
|
-
const tokenUtxos2 = await bob.getTokenUtxos(
|
|
795
|
+
const tokenUtxos2 = await bob.getTokenUtxos(category);
|
|
740
796
|
expect(tokenUtxos2.length).toBe(1);
|
|
741
797
|
});
|
|
742
798
|
|
|
@@ -746,77 +802,77 @@ describe(`Test cashtokens`, () => {
|
|
|
746
802
|
const charlie = await RegTestWallet.newRandom();
|
|
747
803
|
// prepare inputs for two token geneses
|
|
748
804
|
await alice.send([
|
|
749
|
-
{ cashaddr: bob.cashaddr!, value:
|
|
750
|
-
{ cashaddr: charlie.cashaddr!, value:
|
|
805
|
+
{ cashaddr: bob.cashaddr!, value: 10000n },
|
|
806
|
+
{ cashaddr: charlie.cashaddr!, value: 10000n },
|
|
751
807
|
]);
|
|
752
808
|
|
|
753
809
|
const genesisResponse = await bob.tokenGenesis({
|
|
754
810
|
amount: 1001n,
|
|
755
811
|
});
|
|
756
812
|
|
|
757
|
-
const
|
|
813
|
+
const category = genesisResponse.categories![0];
|
|
758
814
|
|
|
759
|
-
const tokenBalance = await bob.getTokenBalance(
|
|
815
|
+
const tokenBalance = await bob.getTokenBalance(category);
|
|
760
816
|
expect(tokenBalance).toBe(1001n);
|
|
761
|
-
const tokenUtxos = await bob.getTokenUtxos(
|
|
817
|
+
const tokenUtxos = await bob.getTokenUtxos(category);
|
|
762
818
|
expect(tokenUtxos.length).toBe(1);
|
|
763
819
|
|
|
764
|
-
await bob.send({ cashaddr: alice.cashaddr!, value:
|
|
820
|
+
await bob.send({ cashaddr: alice.cashaddr!, value: 1000n });
|
|
765
821
|
|
|
766
822
|
await bob.send([
|
|
767
823
|
{
|
|
768
824
|
cashaddr: charlie.cashaddr!,
|
|
769
|
-
|
|
825
|
+
category: category,
|
|
770
826
|
amount: 5n,
|
|
771
827
|
},
|
|
772
828
|
{
|
|
773
829
|
cashaddr: charlie.cashaddr!,
|
|
774
|
-
|
|
830
|
+
category: category,
|
|
775
831
|
amount: 501n,
|
|
776
832
|
},
|
|
777
833
|
{
|
|
778
834
|
cashaddr: charlie.cashaddr!,
|
|
779
|
-
|
|
835
|
+
category: category,
|
|
780
836
|
amount: 95n,
|
|
781
837
|
},
|
|
782
838
|
{
|
|
783
839
|
cashaddr: charlie.cashaddr!,
|
|
784
|
-
|
|
840
|
+
category: category,
|
|
785
841
|
amount: 100n,
|
|
786
842
|
},
|
|
787
843
|
{
|
|
788
844
|
cashaddr: charlie.cashaddr!,
|
|
789
|
-
|
|
845
|
+
category: category,
|
|
790
846
|
amount: 300n,
|
|
791
847
|
},
|
|
792
848
|
]);
|
|
793
849
|
|
|
794
|
-
const tokenBalance2 = await bob.getTokenBalance(
|
|
850
|
+
const tokenBalance2 = await bob.getTokenBalance(category);
|
|
795
851
|
expect(tokenBalance2).toBe(0n);
|
|
796
|
-
const tokenUtxos2 = await bob.getTokenUtxos(
|
|
852
|
+
const tokenUtxos2 = await bob.getTokenUtxos(category);
|
|
797
853
|
expect(tokenUtxos2.length).toBe(0);
|
|
798
854
|
|
|
799
|
-
const tokenBalance3 = await charlie.getTokenBalance(
|
|
855
|
+
const tokenBalance3 = await charlie.getTokenBalance(category);
|
|
800
856
|
expect(tokenBalance3).toBe(1001n);
|
|
801
|
-
const tokenUtxos3 = await charlie.getTokenUtxos(
|
|
857
|
+
const tokenUtxos3 = await charlie.getTokenUtxos(category);
|
|
802
858
|
expect(tokenUtxos3.length).toBe(5);
|
|
803
859
|
|
|
804
860
|
// charlie sends some from one of this utxos
|
|
805
861
|
await charlie.send([
|
|
806
862
|
{
|
|
807
863
|
cashaddr: bob.cashaddr!,
|
|
808
|
-
|
|
864
|
+
category: category,
|
|
809
865
|
amount: 50n,
|
|
810
866
|
},
|
|
811
867
|
]);
|
|
812
|
-
const tokenBalance4 = await charlie.getTokenBalance(
|
|
868
|
+
const tokenBalance4 = await charlie.getTokenBalance(category);
|
|
813
869
|
expect(tokenBalance4).toBe(951n);
|
|
814
|
-
const tokenUtxos4 = await charlie.getTokenUtxos(
|
|
870
|
+
const tokenUtxos4 = await charlie.getTokenUtxos(category);
|
|
815
871
|
expect(tokenUtxos4.length).toBe(1);
|
|
816
872
|
|
|
817
|
-
const tokenBalance5 = await bob.getTokenBalance(
|
|
873
|
+
const tokenBalance5 = await bob.getTokenBalance(category);
|
|
818
874
|
expect(tokenBalance5).toBe(50n);
|
|
819
|
-
const tokenUtxos5 = await bob.getTokenUtxos(
|
|
875
|
+
const tokenUtxos5 = await bob.getTokenUtxos(category);
|
|
820
876
|
expect(tokenUtxos5.length).toBe(1);
|
|
821
877
|
});
|
|
822
878
|
|
|
@@ -826,43 +882,49 @@ describe(`Test cashtokens`, () => {
|
|
|
826
882
|
const charlie = await RegTestWallet.newRandom();
|
|
827
883
|
|
|
828
884
|
// prepare inputs for two token geneses
|
|
829
|
-
await alice.send({ cashaddr: bob.cashaddr!, value:
|
|
885
|
+
await alice.send({ cashaddr: bob.cashaddr!, value: 10000n });
|
|
830
886
|
|
|
831
887
|
const genesisResponse = await bob.tokenGenesis({
|
|
832
|
-
|
|
833
|
-
|
|
888
|
+
nft: {
|
|
889
|
+
capability: "minting",
|
|
890
|
+
commitment: "",
|
|
891
|
+
},
|
|
834
892
|
});
|
|
835
893
|
|
|
836
|
-
const
|
|
894
|
+
const category = genesisResponse.categories![0];
|
|
837
895
|
|
|
838
|
-
expect(await bob.getTokenBalance(
|
|
839
|
-
expect(await bob.getNftTokenBalance(
|
|
840
|
-
expect((await bob.getTokenUtxos(
|
|
896
|
+
expect(await bob.getTokenBalance(category)).toBe(0n);
|
|
897
|
+
expect(await bob.getNftTokenBalance(category)).toBe(1);
|
|
898
|
+
expect((await bob.getTokenUtxos(category)).length).toBe(1);
|
|
841
899
|
|
|
842
|
-
await bob.tokenMint(
|
|
843
|
-
|
|
844
|
-
|
|
900
|
+
await bob.tokenMint(category, {
|
|
901
|
+
nft: {
|
|
902
|
+
capability: "none",
|
|
903
|
+
commitment: "0a",
|
|
904
|
+
},
|
|
845
905
|
});
|
|
846
906
|
|
|
847
|
-
expect(await bob.getTokenBalance(
|
|
848
|
-
expect(await bob.getNftTokenBalance(
|
|
849
|
-
expect((await bob.getTokenUtxos(
|
|
907
|
+
expect(await bob.getTokenBalance(category)).toBe(0n);
|
|
908
|
+
expect(await bob.getNftTokenBalance(category)).toBe(2);
|
|
909
|
+
expect((await bob.getTokenUtxos(category)).length).toBe(2);
|
|
850
910
|
|
|
851
911
|
await bob.send(
|
|
852
912
|
new TokenSendRequest({
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
913
|
+
category: category,
|
|
914
|
+
nft: {
|
|
915
|
+
capability: "none",
|
|
916
|
+
commitment: "0a",
|
|
917
|
+
},
|
|
856
918
|
cashaddr: charlie.cashaddr!,
|
|
857
919
|
})
|
|
858
920
|
);
|
|
859
|
-
expect(await bob.getTokenBalance(
|
|
860
|
-
expect(await bob.getNftTokenBalance(
|
|
861
|
-
expect((await bob.getTokenUtxos(
|
|
921
|
+
expect(await bob.getTokenBalance(category)).toBe(0n);
|
|
922
|
+
expect(await bob.getNftTokenBalance(category)).toBe(1);
|
|
923
|
+
expect((await bob.getTokenUtxos(category)).length).toBe(1);
|
|
862
924
|
|
|
863
|
-
expect(await charlie.getTokenBalance(
|
|
864
|
-
expect(await charlie.getNftTokenBalance(
|
|
865
|
-
expect((await charlie.getTokenUtxos(
|
|
925
|
+
expect(await charlie.getTokenBalance(category)).toBe(0n);
|
|
926
|
+
expect(await charlie.getNftTokenBalance(category)).toBe(1);
|
|
927
|
+
expect((await charlie.getTokenUtxos(category)).length).toBe(1);
|
|
866
928
|
});
|
|
867
929
|
|
|
868
930
|
test("Test sending NFTs after burning minting token", async () => {
|
|
@@ -871,78 +933,90 @@ describe(`Test cashtokens`, () => {
|
|
|
871
933
|
const charlie = await RegTestWallet.newRandom();
|
|
872
934
|
|
|
873
935
|
// prepare inputs for two token geneses
|
|
874
|
-
await alice.send({ cashaddr: bob.cashaddr!, value:
|
|
936
|
+
await alice.send({ cashaddr: bob.cashaddr!, value: 10000n });
|
|
875
937
|
|
|
876
938
|
const genesisResponse = await bob.tokenGenesis({
|
|
877
|
-
|
|
878
|
-
|
|
939
|
+
nft: {
|
|
940
|
+
capability: "minting",
|
|
941
|
+
commitment: "",
|
|
942
|
+
},
|
|
879
943
|
});
|
|
880
944
|
|
|
881
|
-
const
|
|
945
|
+
const category = genesisResponse.categories![0];
|
|
882
946
|
|
|
883
|
-
expect(await bob.getTokenBalance(
|
|
884
|
-
expect(await bob.getNftTokenBalance(
|
|
885
|
-
expect((await bob.getTokenUtxos(
|
|
947
|
+
expect(await bob.getTokenBalance(category)).toBe(0n);
|
|
948
|
+
expect(await bob.getNftTokenBalance(category)).toBe(1);
|
|
949
|
+
expect((await bob.getTokenUtxos(category)).length).toBe(1);
|
|
886
950
|
|
|
887
|
-
await bob.tokenMint(
|
|
888
|
-
|
|
889
|
-
|
|
951
|
+
await bob.tokenMint(category, {
|
|
952
|
+
nft: {
|
|
953
|
+
capability: "none",
|
|
954
|
+
commitment: "0a",
|
|
955
|
+
},
|
|
890
956
|
});
|
|
891
957
|
|
|
892
|
-
expect(await bob.getTokenBalance(
|
|
893
|
-
expect(await bob.getNftTokenBalance(
|
|
894
|
-
expect((await bob.getTokenUtxos(
|
|
958
|
+
expect(await bob.getTokenBalance(category)).toBe(0n);
|
|
959
|
+
expect(await bob.getNftTokenBalance(category)).toBe(2);
|
|
960
|
+
expect((await bob.getTokenUtxos(category)).length).toBe(2);
|
|
895
961
|
|
|
896
|
-
await bob.tokenMint(
|
|
897
|
-
|
|
898
|
-
|
|
962
|
+
await bob.tokenMint(category, {
|
|
963
|
+
nft: {
|
|
964
|
+
capability: "none",
|
|
965
|
+
commitment: "0b",
|
|
966
|
+
},
|
|
899
967
|
});
|
|
900
968
|
|
|
901
|
-
expect(await bob.getTokenBalance(
|
|
902
|
-
expect(await bob.getNftTokenBalance(
|
|
903
|
-
expect((await bob.getTokenUtxos(
|
|
969
|
+
expect(await bob.getTokenBalance(category)).toBe(0n);
|
|
970
|
+
expect(await bob.getNftTokenBalance(category)).toBe(3);
|
|
971
|
+
expect((await bob.getTokenUtxos(category)).length).toBe(3);
|
|
904
972
|
|
|
905
973
|
await bob.tokenBurn({
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
974
|
+
category: category,
|
|
975
|
+
nft: {
|
|
976
|
+
capability: "minting",
|
|
977
|
+
commitment: "",
|
|
978
|
+
},
|
|
909
979
|
});
|
|
910
980
|
|
|
911
|
-
expect(await bob.getTokenBalance(
|
|
912
|
-
expect(await bob.getNftTokenBalance(
|
|
913
|
-
expect((await bob.getTokenUtxos(
|
|
981
|
+
expect(await bob.getTokenBalance(category)).toBe(0n);
|
|
982
|
+
expect(await bob.getNftTokenBalance(category)).toBe(2);
|
|
983
|
+
expect((await bob.getTokenUtxos(category)).length).toBe(2);
|
|
914
984
|
|
|
915
985
|
await bob.send(
|
|
916
986
|
new TokenSendRequest({
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
987
|
+
category: category,
|
|
988
|
+
nft: {
|
|
989
|
+
capability: "none",
|
|
990
|
+
commitment: "0a",
|
|
991
|
+
},
|
|
920
992
|
cashaddr: charlie.cashaddr!,
|
|
921
993
|
})
|
|
922
994
|
);
|
|
923
|
-
expect(await bob.getTokenBalance(
|
|
924
|
-
expect(await bob.getNftTokenBalance(
|
|
925
|
-
expect((await bob.getTokenUtxos(
|
|
995
|
+
expect(await bob.getTokenBalance(category)).toBe(0n);
|
|
996
|
+
expect(await bob.getNftTokenBalance(category)).toBe(1);
|
|
997
|
+
expect((await bob.getTokenUtxos(category)).length).toBe(1);
|
|
926
998
|
|
|
927
|
-
expect(await charlie.getTokenBalance(
|
|
928
|
-
expect(await charlie.getNftTokenBalance(
|
|
929
|
-
expect((await charlie.getTokenUtxos(
|
|
999
|
+
expect(await charlie.getTokenBalance(category)).toBe(0n);
|
|
1000
|
+
expect(await charlie.getNftTokenBalance(category)).toBe(1);
|
|
1001
|
+
expect((await charlie.getTokenUtxos(category)).length).toBe(1);
|
|
930
1002
|
|
|
931
1003
|
await bob.send(
|
|
932
1004
|
new TokenSendRequest({
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
1005
|
+
category: category,
|
|
1006
|
+
nft: {
|
|
1007
|
+
capability: "none",
|
|
1008
|
+
commitment: "0b",
|
|
1009
|
+
},
|
|
936
1010
|
cashaddr: charlie.cashaddr!,
|
|
937
1011
|
})
|
|
938
1012
|
);
|
|
939
|
-
expect(await bob.getTokenBalance(
|
|
940
|
-
expect(await bob.getNftTokenBalance(
|
|
941
|
-
expect((await bob.getTokenUtxos(
|
|
1013
|
+
expect(await bob.getTokenBalance(category)).toBe(0n);
|
|
1014
|
+
expect(await bob.getNftTokenBalance(category)).toBe(0);
|
|
1015
|
+
expect((await bob.getTokenUtxos(category)).length).toBe(0);
|
|
942
1016
|
|
|
943
|
-
expect(await charlie.getTokenBalance(
|
|
944
|
-
expect(await charlie.getNftTokenBalance(
|
|
945
|
-
expect((await charlie.getTokenUtxos(
|
|
1017
|
+
expect(await charlie.getTokenBalance(category)).toBe(0n);
|
|
1018
|
+
expect(await charlie.getNftTokenBalance(category)).toBe(2);
|
|
1019
|
+
expect((await charlie.getTokenUtxos(category)).length).toBe(2);
|
|
946
1020
|
});
|
|
947
1021
|
|
|
948
1022
|
test("Test sending NFTs with empty commitment", async () => {
|
|
@@ -951,53 +1025,63 @@ describe(`Test cashtokens`, () => {
|
|
|
951
1025
|
const charlie = await RegTestWallet.newRandom();
|
|
952
1026
|
|
|
953
1027
|
// prepare inputs for two token geneses
|
|
954
|
-
await alice.send({ cashaddr: bob.cashaddr!, value:
|
|
1028
|
+
await alice.send({ cashaddr: bob.cashaddr!, value: 10000n });
|
|
955
1029
|
|
|
956
1030
|
const genesisResponse = await bob.tokenGenesis({
|
|
957
|
-
|
|
958
|
-
|
|
1031
|
+
nft: {
|
|
1032
|
+
capability: "minting",
|
|
1033
|
+
commitment: "00",
|
|
1034
|
+
},
|
|
959
1035
|
});
|
|
960
1036
|
|
|
961
|
-
const
|
|
1037
|
+
const category = genesisResponse.categories![0];
|
|
962
1038
|
|
|
963
|
-
expect(await bob.getTokenBalance(
|
|
964
|
-
expect(await bob.getNftTokenBalance(
|
|
965
|
-
expect((await bob.getTokenUtxos(
|
|
1039
|
+
expect(await bob.getTokenBalance(category)).toBe(0n);
|
|
1040
|
+
expect(await bob.getNftTokenBalance(category)).toBe(1);
|
|
1041
|
+
expect((await bob.getTokenUtxos(category)).length).toBe(1);
|
|
966
1042
|
|
|
967
|
-
await bob.tokenMint(
|
|
968
|
-
|
|
969
|
-
|
|
1043
|
+
await bob.tokenMint(category, {
|
|
1044
|
+
nft: {
|
|
1045
|
+
capability: "none",
|
|
1046
|
+
commitment: "0a",
|
|
1047
|
+
},
|
|
970
1048
|
});
|
|
971
1049
|
|
|
972
|
-
expect(await bob.getTokenBalance(
|
|
973
|
-
expect(await bob.getNftTokenBalance(
|
|
974
|
-
expect((await bob.getTokenUtxos(
|
|
1050
|
+
expect(await bob.getTokenBalance(category)).toBe(0n);
|
|
1051
|
+
expect(await bob.getNftTokenBalance(category)).toBe(2);
|
|
1052
|
+
expect((await bob.getTokenUtxos(category)).length).toBe(2);
|
|
975
1053
|
|
|
976
|
-
await bob.tokenMint(
|
|
977
|
-
|
|
978
|
-
|
|
1054
|
+
await bob.tokenMint(category, {
|
|
1055
|
+
nft: {
|
|
1056
|
+
capability: "none",
|
|
1057
|
+
commitment: "0b",
|
|
1058
|
+
},
|
|
979
1059
|
});
|
|
980
1060
|
|
|
981
|
-
expect(await bob.getTokenBalance(
|
|
982
|
-
expect(await bob.getNftTokenBalance(
|
|
983
|
-
expect((await bob.getTokenUtxos(
|
|
1061
|
+
expect(await bob.getTokenBalance(category)).toBe(0n);
|
|
1062
|
+
expect(await bob.getNftTokenBalance(category)).toBe(3);
|
|
1063
|
+
expect((await bob.getTokenUtxos(category)).length).toBe(3);
|
|
984
1064
|
|
|
985
1065
|
await bob.tokenBurn({
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
1066
|
+
category: category,
|
|
1067
|
+
nft: {
|
|
1068
|
+
capability: "minting",
|
|
1069
|
+
commitment: "00",
|
|
1070
|
+
},
|
|
989
1071
|
});
|
|
990
1072
|
|
|
991
|
-
expect(await bob.getTokenBalance(
|
|
992
|
-
expect(await bob.getNftTokenBalance(
|
|
993
|
-
expect((await bob.getTokenUtxos(
|
|
1073
|
+
expect(await bob.getTokenBalance(category)).toBe(0n);
|
|
1074
|
+
expect(await bob.getNftTokenBalance(category)).toBe(2);
|
|
1075
|
+
expect((await bob.getTokenUtxos(category)).length).toBe(2);
|
|
994
1076
|
|
|
995
1077
|
await expect(
|
|
996
1078
|
bob.send(
|
|
997
1079
|
new TokenSendRequest({
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1080
|
+
category: category,
|
|
1081
|
+
nft: {
|
|
1082
|
+
capability: "none",
|
|
1083
|
+
commitment: "",
|
|
1084
|
+
},
|
|
1001
1085
|
cashaddr: charlie.cashaddr!,
|
|
1002
1086
|
})
|
|
1003
1087
|
)
|
|
@@ -1014,59 +1098,65 @@ describe(`Test cashtokens`, () => {
|
|
|
1014
1098
|
const alice = await RegTestWallet.fromId(process.env.ALICE_ID!);
|
|
1015
1099
|
const bob = await RegTestWallet.newRandom();
|
|
1016
1100
|
|
|
1017
|
-
await alice.send({ cashaddr: bob.cashaddr!, value:
|
|
1101
|
+
await alice.send({ cashaddr: bob.cashaddr!, value: 10000n });
|
|
1018
1102
|
|
|
1019
1103
|
const genesisResponse = await bob.tokenGenesis({
|
|
1020
|
-
|
|
1021
|
-
|
|
1104
|
+
nft: {
|
|
1105
|
+
capability: "none",
|
|
1106
|
+
commitment: "0000000e",
|
|
1107
|
+
},
|
|
1022
1108
|
amount: 10000n,
|
|
1023
1109
|
});
|
|
1024
1110
|
|
|
1025
|
-
const
|
|
1111
|
+
const category = genesisResponse.categories![0];
|
|
1026
1112
|
|
|
1027
|
-
expect(await bob.getTokenBalance(
|
|
1028
|
-
expect(await bob.getNftTokenBalance(
|
|
1029
|
-
expect((await bob.getTokenUtxos(
|
|
1113
|
+
expect(await bob.getTokenBalance(category)).toBe(10000n);
|
|
1114
|
+
expect(await bob.getNftTokenBalance(category)).toBe(1);
|
|
1115
|
+
expect((await bob.getTokenUtxos(category)).length).toBe(1);
|
|
1030
1116
|
|
|
1031
1117
|
// explicitly split FT amounts from NFT
|
|
1032
1118
|
await bob.send([
|
|
1033
1119
|
new TokenSendRequest({
|
|
1034
1120
|
cashaddr: bob.cashaddr!,
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1121
|
+
category: category,
|
|
1122
|
+
nft: {
|
|
1123
|
+
capability: "none",
|
|
1124
|
+
commitment: "0000000e",
|
|
1125
|
+
},
|
|
1038
1126
|
}),
|
|
1039
1127
|
new TokenSendRequest({
|
|
1040
1128
|
cashaddr: bob.cashaddr!,
|
|
1041
|
-
|
|
1129
|
+
category: category,
|
|
1042
1130
|
amount: 10000n,
|
|
1043
1131
|
}),
|
|
1044
1132
|
]);
|
|
1045
1133
|
|
|
1046
|
-
expect(await bob.getTokenBalance(
|
|
1047
|
-
expect(await bob.getNftTokenBalance(
|
|
1048
|
-
expect((await bob.getTokenUtxos(
|
|
1134
|
+
expect(await bob.getTokenBalance(category)).toBe(10000n);
|
|
1135
|
+
expect(await bob.getNftTokenBalance(category)).toBe(1);
|
|
1136
|
+
expect((await bob.getTokenUtxos(category)).length).toBe(2);
|
|
1049
1137
|
|
|
1050
1138
|
// add FT amount to an NFT
|
|
1051
1139
|
await bob.send([
|
|
1052
1140
|
new TokenSendRequest({
|
|
1053
1141
|
cashaddr: bob.cashaddr!,
|
|
1054
|
-
|
|
1142
|
+
category: category,
|
|
1055
1143
|
amount: 9000n,
|
|
1056
1144
|
}),
|
|
1057
1145
|
new TokenSendRequest({
|
|
1058
1146
|
cashaddr: bob.cashaddr!,
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1147
|
+
category: category,
|
|
1148
|
+
nft: {
|
|
1149
|
+
capability: "none",
|
|
1150
|
+
commitment: "0000000e",
|
|
1151
|
+
},
|
|
1062
1152
|
amount: 1000n,
|
|
1063
1153
|
}),
|
|
1064
1154
|
]);
|
|
1065
1155
|
|
|
1066
|
-
expect(await bob.getTokenBalance(
|
|
1067
|
-
expect(await bob.getNftTokenBalance(
|
|
1068
|
-
expect((await bob.getTokenUtxos(
|
|
1069
|
-
const tokenUtxos = await bob.getTokenUtxos(
|
|
1156
|
+
expect(await bob.getTokenBalance(category)).toBe(10000n);
|
|
1157
|
+
expect(await bob.getNftTokenBalance(category)).toBe(1);
|
|
1158
|
+
expect((await bob.getTokenUtxos(category)).length).toBe(2);
|
|
1159
|
+
const tokenUtxos = await bob.getTokenUtxos(category);
|
|
1070
1160
|
expect(tokenUtxos[0].token?.amount).toBe(9000n);
|
|
1071
1161
|
expect(tokenUtxos[1].token?.amount).toBe(1000n);
|
|
1072
1162
|
|
|
@@ -1074,16 +1164,18 @@ describe(`Test cashtokens`, () => {
|
|
|
1074
1164
|
await bob.send([
|
|
1075
1165
|
new TokenSendRequest({
|
|
1076
1166
|
cashaddr: bob.cashaddr!,
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1167
|
+
category: category,
|
|
1168
|
+
nft: {
|
|
1169
|
+
capability: "none",
|
|
1170
|
+
commitment: "0000000e",
|
|
1171
|
+
},
|
|
1080
1172
|
amount: 10000n,
|
|
1081
1173
|
}),
|
|
1082
1174
|
]);
|
|
1083
1175
|
|
|
1084
|
-
expect(await bob.getTokenBalance(
|
|
1085
|
-
expect(await bob.getNftTokenBalance(
|
|
1086
|
-
expect((await bob.getTokenUtxos(
|
|
1176
|
+
expect(await bob.getTokenBalance(category)).toBe(10000n);
|
|
1177
|
+
expect(await bob.getNftTokenBalance(category)).toBe(1);
|
|
1178
|
+
expect((await bob.getTokenUtxos(category)).length).toBe(1);
|
|
1087
1179
|
});
|
|
1088
1180
|
|
|
1089
1181
|
test("Should encode unsigned transactions", async () => {
|
|
@@ -1093,15 +1185,17 @@ describe(`Test cashtokens`, () => {
|
|
|
1093
1185
|
aliceWallet.cashaddr!
|
|
1094
1186
|
);
|
|
1095
1187
|
|
|
1096
|
-
let
|
|
1188
|
+
let category;
|
|
1097
1189
|
{
|
|
1098
1190
|
const aliceUtxos = await aliceWallet.getAddressUtxos();
|
|
1099
1191
|
|
|
1100
|
-
const { unsignedTransaction, sourceOutputs,
|
|
1192
|
+
const { unsignedTransaction, sourceOutputs, categories } =
|
|
1101
1193
|
await aliceWatchWallet.tokenGenesis(
|
|
1102
1194
|
{
|
|
1103
|
-
|
|
1104
|
-
|
|
1195
|
+
nft: {
|
|
1196
|
+
capability: "minting",
|
|
1197
|
+
commitment: "00",
|
|
1198
|
+
},
|
|
1105
1199
|
},
|
|
1106
1200
|
undefined,
|
|
1107
1201
|
{ buildUnsigned: true }
|
|
@@ -1129,12 +1223,12 @@ describe(`Test cashtokens`, () => {
|
|
|
1129
1223
|
);
|
|
1130
1224
|
await aliceWallet.submitTransaction(signed);
|
|
1131
1225
|
|
|
1132
|
-
|
|
1226
|
+
category = categories![0];
|
|
1133
1227
|
|
|
1134
|
-
expect(await aliceWallet.getNftTokenBalance(
|
|
1135
|
-
const tokenUtxos = await aliceWallet.getTokenUtxos(
|
|
1228
|
+
expect(await aliceWallet.getNftTokenBalance(category)).toBe(1);
|
|
1229
|
+
const tokenUtxos = await aliceWallet.getTokenUtxos(category);
|
|
1136
1230
|
expect(tokenUtxos.length).toBe(1);
|
|
1137
|
-
expect(tokenUtxos[0].token?.capability).toBe(NFTCapability.minting);
|
|
1231
|
+
expect(tokenUtxos[0].token?.nft?.capability).toBe(NFTCapability.minting);
|
|
1138
1232
|
}
|
|
1139
1233
|
|
|
1140
1234
|
{
|
|
@@ -1142,10 +1236,12 @@ describe(`Test cashtokens`, () => {
|
|
|
1142
1236
|
|
|
1143
1237
|
const { unsignedTransaction, sourceOutputs } =
|
|
1144
1238
|
await aliceWatchWallet.tokenMint(
|
|
1145
|
-
|
|
1239
|
+
category,
|
|
1146
1240
|
{
|
|
1147
|
-
|
|
1148
|
-
|
|
1241
|
+
nft: {
|
|
1242
|
+
capability: "none",
|
|
1243
|
+
commitment: "0a",
|
|
1244
|
+
},
|
|
1149
1245
|
},
|
|
1150
1246
|
undefined,
|
|
1151
1247
|
{ buildUnsigned: true }
|
|
@@ -1175,17 +1271,18 @@ describe(`Test cashtokens`, () => {
|
|
|
1175
1271
|
);
|
|
1176
1272
|
await aliceWallet.submitTransaction(signed);
|
|
1177
1273
|
|
|
1178
|
-
expect(await aliceWallet.getNftTokenBalance(
|
|
1179
|
-
const tokenUtxos = await aliceWallet.getTokenUtxos(
|
|
1274
|
+
expect(await aliceWallet.getNftTokenBalance(category)).toBe(2);
|
|
1275
|
+
const tokenUtxos = await aliceWallet.getTokenUtxos(category);
|
|
1180
1276
|
expect(tokenUtxos.length).toBe(2);
|
|
1181
1277
|
expect(
|
|
1182
1278
|
tokenUtxos.filter(
|
|
1183
|
-
(val) => val.token?.capability === NFTCapability.minting
|
|
1279
|
+
(val) => val.token?.nft?.capability === NFTCapability.minting
|
|
1184
1280
|
).length
|
|
1185
1281
|
).toBe(1);
|
|
1186
1282
|
expect(
|
|
1187
|
-
tokenUtxos.filter(
|
|
1188
|
-
.
|
|
1283
|
+
tokenUtxos.filter(
|
|
1284
|
+
(val) => val.token?.nft?.capability === NFTCapability.none
|
|
1285
|
+
).length
|
|
1189
1286
|
).toBe(1);
|
|
1190
1287
|
}
|
|
1191
1288
|
|
|
@@ -1196,9 +1293,11 @@ describe(`Test cashtokens`, () => {
|
|
|
1196
1293
|
await aliceWatchWallet.send(
|
|
1197
1294
|
[
|
|
1198
1295
|
new TokenSendRequest({
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1296
|
+
category: category,
|
|
1297
|
+
nft: {
|
|
1298
|
+
capability: "none",
|
|
1299
|
+
commitment: "0a",
|
|
1300
|
+
},
|
|
1202
1301
|
cashaddr: aliceWallet.cashaddr!,
|
|
1203
1302
|
}),
|
|
1204
1303
|
],
|
|
@@ -1227,17 +1326,18 @@ describe(`Test cashtokens`, () => {
|
|
|
1227
1326
|
sourceOutputs!
|
|
1228
1327
|
);
|
|
1229
1328
|
await aliceWallet.submitTransaction(signed);
|
|
1230
|
-
expect(await aliceWallet.getNftTokenBalance(
|
|
1231
|
-
const tokenUtxos = await aliceWallet.getTokenUtxos(
|
|
1329
|
+
expect(await aliceWallet.getNftTokenBalance(category)).toBe(2);
|
|
1330
|
+
const tokenUtxos = await aliceWallet.getTokenUtxos(category);
|
|
1232
1331
|
expect(tokenUtxos.length).toBe(2);
|
|
1233
1332
|
expect(
|
|
1234
1333
|
tokenUtxos.filter(
|
|
1235
|
-
(val) => val.token?.capability === NFTCapability.minting
|
|
1334
|
+
(val) => val.token?.nft?.capability === NFTCapability.minting
|
|
1236
1335
|
).length
|
|
1237
1336
|
).toBe(1);
|
|
1238
1337
|
expect(
|
|
1239
|
-
tokenUtxos.filter(
|
|
1240
|
-
.
|
|
1338
|
+
tokenUtxos.filter(
|
|
1339
|
+
(val) => val.token?.nft?.capability === NFTCapability.none
|
|
1340
|
+
).length
|
|
1241
1341
|
).toBe(1);
|
|
1242
1342
|
}
|
|
1243
1343
|
});
|
|
@@ -1247,13 +1347,13 @@ describe(`Test cashtokens`, () => {
|
|
|
1247
1347
|
const genesisResponse = await alice.tokenGenesis({
|
|
1248
1348
|
amount: 100n,
|
|
1249
1349
|
});
|
|
1250
|
-
const
|
|
1350
|
+
const category = genesisResponse.categories![0];
|
|
1251
1351
|
|
|
1252
1352
|
const previousValue = Config.EnforceCashTokenReceiptAddresses;
|
|
1253
1353
|
|
|
1254
1354
|
const wrap = (addr) => {
|
|
1255
1355
|
return new Promise((resolve) => {
|
|
1256
|
-
resolve(new TokenSendRequest({ cashaddr: addr,
|
|
1356
|
+
resolve(new TokenSendRequest({ cashaddr: addr, category: "" }));
|
|
1257
1357
|
});
|
|
1258
1358
|
};
|
|
1259
1359
|
|
|
@@ -1265,7 +1365,7 @@ describe(`Test cashtokens`, () => {
|
|
|
1265
1365
|
alice.send(
|
|
1266
1366
|
new TokenSendRequest({
|
|
1267
1367
|
cashaddr: alice.cashaddr!,
|
|
1268
|
-
|
|
1368
|
+
category: category,
|
|
1269
1369
|
amount: 1n,
|
|
1270
1370
|
})
|
|
1271
1371
|
)
|
|
@@ -1275,7 +1375,7 @@ describe(`Test cashtokens`, () => {
|
|
|
1275
1375
|
alice.send(
|
|
1276
1376
|
new TokenSendRequest({
|
|
1277
1377
|
cashaddr: alice.tokenaddr!,
|
|
1278
|
-
|
|
1378
|
+
category: category,
|
|
1279
1379
|
amount: 2n,
|
|
1280
1380
|
})
|
|
1281
1381
|
)
|
|
@@ -1290,7 +1390,7 @@ describe(`Test cashtokens`, () => {
|
|
|
1290
1390
|
await alice.send(
|
|
1291
1391
|
new TokenSendRequest({
|
|
1292
1392
|
cashaddr: alice.cashaddr!,
|
|
1293
|
-
|
|
1393
|
+
category: category,
|
|
1294
1394
|
amount: 1n,
|
|
1295
1395
|
})
|
|
1296
1396
|
))()
|
|
@@ -1300,7 +1400,7 @@ describe(`Test cashtokens`, () => {
|
|
|
1300
1400
|
alice.send(
|
|
1301
1401
|
new TokenSendRequest({
|
|
1302
1402
|
cashaddr: alice.tokenaddr!,
|
|
1303
|
-
|
|
1403
|
+
category: category,
|
|
1304
1404
|
amount: 2n,
|
|
1305
1405
|
})
|
|
1306
1406
|
)
|