42 Env env(*
this, features - featureMPTokensV1);
46 env.fund(XRP(1000), alice, bob);
57 Env env(*
this, features);
61 MPTTester mptAlice(env, alice, {.holders = {bob}});
62 mptAlice.create({.ownerCount = 1, .holderCount = 0});
63 mptAlice.authorize({.account = bob});
64 mptAlice.pay(alice, bob, 100);
71 Env env(*
this, features);
75 env.fund(XRP(1000), alice, bob);
81 env(claw(alice, mpt(5), bob), Txflags(0x00008000), Ter(
temINVALID_FLAG));
103 Env env(*
this, features);
107 MPTTester mptAlice(env, alice, {.holders = {bob}});
116 mptAlice.create({.ownerCount = 1, .holderCount = 0, .flags = tfMPTCanClawback});
121 mptAlice.authorize({.account = bob});
136 Env env(*
this, features);
141 MPTTester mptAlice(env, alice, MPTInit{});
142 mptAlice.create({.ownerCount = 1, .holderCount = 0, .flags = tfMPTCanClawback});
149 Env env(*
this, features);
154 MPTTester mptAlice(env, alice, {.holders = {bob}});
155 env.fund(XRP(1000), cindy);
158 mptAlice.create({.ownerCount = 1, .holderCount = 0, .flags = tfMPTCanClawback});
159 mptAlice.authorize({.account = bob});
160 mptAlice.pay(alice, bob, 1000);
174 Env env(*
this, features);
178 MPTTester mptAlice(env, alice, {.holders = {bob}});
179 mptAlice.create({.ownerCount = 1, .holderCount = 0, .flags = tfMPTCanClawback});
180 mptAlice.authorize({.account = bob});
181 mptAlice.pay(alice, bob, 1000);
183 BEAST_EXPECT(mptAlice.checkMPTokenAmount(bob, 1000));
186 mptAlice.claw(alice, bob, 200);
187 BEAST_EXPECT(mptAlice.checkMPTokenAmount(bob, 800));
190 mptAlice.claw(alice, bob, 800);
191 BEAST_EXPECT(mptAlice.checkMPTokenAmount(bob, 0));
203 Env env(*
this, features);
209 MPTTester mptAlice(env, alice, {.holders = {cindy}});
210 mptAlice.create({.ownerCount = 1, .holderCount = 0, .flags = tfMPTCanClawback});
211 mptAlice.authorize({.account = cindy});
212 mptAlice.pay(alice, cindy, 1000);
214 MPTTester mptBob(env, bob, MPTInit{});
215 mptBob.create({.ownerCount = 1, .flags = tfMPTCanClawback});
216 mptBob.authorize({.account = cindy});
217 mptBob.pay(bob, cindy, 1000);
219 BEAST_EXPECT(mptAlice.checkMPTokenAmount(cindy, 1000));
220 BEAST_EXPECT(mptBob.checkMPTokenAmount(cindy, 1000));
223 mptAlice.claw(alice, cindy, 200);
224 BEAST_EXPECT(mptAlice.checkMPTokenAmount(cindy, 800));
225 BEAST_EXPECT(mptBob.checkMPTokenAmount(cindy, 1000));
228 mptBob.claw(bob, cindy, 600);
229 BEAST_EXPECT(mptBob.checkMPTokenAmount(cindy, 400));
230 BEAST_EXPECT(mptAlice.checkMPTokenAmount(cindy, 800));
236 Env env(*
this, features);
242 MPTTester mptAlice(env, alice, {.holders = {bob, cindy}});
243 mptAlice.create({.ownerCount = 1, .holderCount = 0, .flags = tfMPTCanClawback});
244 mptAlice.authorize({.account = bob});
245 mptAlice.authorize({.account = cindy});
246 mptAlice.pay(alice, bob, 600);
247 mptAlice.pay(alice, cindy, 1000);
249 BEAST_EXPECT(mptAlice.checkMPTokenAmount(bob, 600));
250 BEAST_EXPECT(mptAlice.checkMPTokenAmount(cindy, 1000));
253 mptAlice.claw(alice, bob, 500);
254 BEAST_EXPECT(mptAlice.checkMPTokenAmount(bob, 100));
255 BEAST_EXPECT(mptAlice.checkMPTokenAmount(cindy, 1000));
258 mptAlice.claw(alice, cindy, 300);
259 BEAST_EXPECT(mptAlice.checkMPTokenAmount(cindy, 700));
260 BEAST_EXPECT(mptAlice.checkMPTokenAmount(bob, 100));
267 testcase(
"Zero balance after clawback");
272 Env env(*
this, features);
276 MPTTester mptAlice(env, alice, {.holders = {bob}});
277 mptAlice.create({.ownerCount = 1, .holderCount = 0, .flags = tfMPTCanClawback});
278 mptAlice.authorize({.account = bob});
279 mptAlice.pay(alice, bob, 1000);
281 BEAST_EXPECT(ownerCount(env, bob) == 1);
282 BEAST_EXPECT(mptAlice.checkMPTokenAmount(bob, 1000));
285 mptAlice.claw(alice, bob, 1000);
286 BEAST_EXPECT(mptAlice.checkMPTokenAmount(bob, 0));
289 BEAST_EXPECT(ownerCount(env, bob) == 1);
300 Env env(*
this, features);
304 MPTTester mptAlice(env, alice, {.holders = {bob}});
306 {.ownerCount = 1, .holderCount = 0, .flags = tfMPTCanLock | tfMPTCanClawback});
307 mptAlice.authorize({.account = bob});
308 mptAlice.pay(alice, bob, 1000);
311 mptAlice.set({.account = alice, .flags = tfMPTLock});
314 mptAlice.claw(alice, bob, 200);
315 BEAST_EXPECT(mptAlice.checkMPTokenAmount(bob, 800));
320 Env env(*
this, features);
324 MPTTester mptAlice(env, alice, {.holders = {bob}});
326 {.ownerCount = 1, .holderCount = 0, .flags = tfMPTCanLock | tfMPTCanClawback});
327 mptAlice.authorize({.account = bob});
328 mptAlice.pay(alice, bob, 1000);
331 mptAlice.set({.account = alice, .holder = bob, .flags = tfMPTLock});
334 mptAlice.claw(alice, bob, 200);
335 BEAST_EXPECT(mptAlice.checkMPTokenAmount(bob, 800));
342 testcase(
"Amount exceeds available");
347 Env env(*
this, features);
351 MPTTester mptAlice(env, alice, {.holders = {bob}});
352 mptAlice.create({.ownerCount = 1, .holderCount = 0, .flags = tfMPTCanClawback});
353 mptAlice.authorize({.account = bob});
354 mptAlice.pay(alice, bob, 1000);
356 BEAST_EXPECT(mptAlice.checkMPTokenAmount(bob, 1000));
359 mptAlice.claw(alice, bob, 2000);
360 BEAST_EXPECT(mptAlice.checkMPTokenAmount(bob, 0));
361 BEAST_EXPECT(mptAlice.checkMPTokenOutstandingAmount(0));
364 BEAST_EXPECT(ownerCount(env, bob) == 1);
374 Env env(*
this, features);
378 MPTTester mptAlice(env, alice, {.holders = {bob}});
379 mptAlice.create({.ownerCount = 1, .holderCount = 0, .flags = tfMPTCanClawback});
380 mptAlice.authorize({.account = bob});
381 mptAlice.pay(alice, bob, 100);
383 BEAST_EXPECT(mptAlice.checkMPTokenAmount(bob, 100));
388 env(ticket::create(alice, ticketCnt));
391 BEAST_EXPECT(
ticketCount(env, alice) == ticketCnt);
392 BEAST_EXPECT(ownerCount(env, alice) == ticketCnt + 1);
394 while (ticketCnt > 0)
397 env(claw(alice, mptAlice.mpt(5), bob), ticket::Use(aliceTicketSeq++));
401 BEAST_EXPECT(
ticketCount(env, alice) == ticketCnt);
405 BEAST_EXPECT(mptAlice.checkMPTokenAmount(bob, 50));
408 BEAST_EXPECT(env.seq(alice) == aliceSeq);