Skip to content

Commit 9293dc0

Browse files
committed
Enforce funds on Paisley members for creating personal token
1 parent fc38590 commit 9293dc0

File tree

2 files changed

+65
-0
lines changed

2 files changed

+65
-0
lines changed

convex-core/src/main/cvx/app/paisley/members.cvx

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,20 @@
22
;; Deploy with
33
;; (deploy
44
;; '[(set-controller <governance-controller>
5+
;; (def operator <operator-backend-account>)
56
;; (def pt-actor <personal-token-actor>)
67
;; <insert code here>
78
;; ])
89
;;
910

11+
(import convex.trust :as trust)
1012

1113
;; Governance controller. Use controller if set, otherwise *caller* for testing purposes
1214
(def governor (or *controller* *caller*))
1315

16+
;; Members counter
17+
(def mcount 0)
18+
1419
;; State for membership list
1520
;; format: { ID -> metadata map}
1621
(def members {})
@@ -20,3 +25,39 @@
2025
;; format: { ID -> token}
2126
(def pts {})
2227

28+
29+
(defn get-metadata
30+
^{:callable true
31+
:doc {:description "GEts metadata for a member, or nil if does not exist."
32+
:signature [{:params []}]}}
33+
34+
([member-id]
35+
(get members member-id)))
36+
37+
(defn create-member
38+
^{:callable true
39+
:doc {:description "Creates a new member account. Must be caller by operator. Returns ID."
40+
:signature [{:params []}]}}
41+
([]
42+
(or (trust/trusted? operator *caller*) (fail :TRUST "Not a membership operator"))
43+
(let [id mcount]
44+
(set! mcount (inc id))
45+
(set! members (assoc members id {:created *timestamp*}))
46+
id)))
47+
48+
49+
;; Create members personal token
50+
;; Requires:
51+
;; 1. Member ID exists
52+
;; 2. Offer of at least 1 CVM
53+
;;
54+
;; Returns personal token asset ID (new or existing)
55+
;; Call with (call @app.paisley.members 1000000000 (create-pt id)
56+
(defn ^:callable create-pt [member-id]
57+
(accept 1000000000)
58+
(when-not (get members member-id) (fail :STATE (str "Member does not exist: " member-id)))
59+
(if-let [ptid (get pts member-id)] (return ptid)) ;; return token if already exists
60+
(let [id (call pt-actor (create))
61+
ptid [pt-actor id]]
62+
(set! pts (assoc pts member-id ptid))
63+
ptid))

convex-core/src/test/java/lab/PaisleyTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package lab;
22

33
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertNotNull;
45
import static org.junit.jupiter.api.Assertions.assertSame;
56

67
import java.io.IOException;
@@ -12,11 +13,13 @@
1213
import convex.core.data.AVector;
1314
import convex.core.data.Maps;
1415
import convex.core.data.Vectors;
16+
import convex.core.data.prim.AInteger;
1517
import convex.core.data.prim.CVMLong;
1618
import convex.core.lang.ACVMTest;
1719
import convex.core.lang.TestState;
1820
import convex.core.util.Utils;
1921
import convex.lib.AssetTester;
22+
import static convex.test.Assertions.*;
2023

2124
public class PaisleyTest extends ACVMTest {
2225

@@ -57,6 +60,8 @@ public class PaisleyTest extends ACVMTest {
5760

5861
// Execute member setup code in PAI account
5962
String memberscode=Utils.readResourceAsString("/app/paisley/members.cvx");
63+
ctx=exec(ctx,"(eval-as members '(def pt-actor "+PERSONAL+"))");
64+
ctx=exec(ctx,"(eval-as members '(def operator *caller*))"); // use HERO account as operator
6065
ctx=exec(ctx,"(eval-as members '(do "+memberscode+"))");
6166

6267

@@ -86,5 +91,24 @@ public class PaisleyTest extends ACVMTest {
8691
Context c=context();
8792
c=exec(c,"members/members");
8893
assertSame(Maps.empty(),c.getResult());
94+
95+
{
96+
// Bad token create (non-member)
97+
Context ce=step("(call members 1000000000 (create-pt -1))");
98+
assertStateError(ce);
99+
}
100+
101+
// Create a new member
102+
c=exec(c,"(def mid (call members (create-member)))");
103+
assertNotError(c);
104+
AInteger MID=c.getResult();
105+
assertNotNull(eval(c,"(call members (get-metadata "+MID+"))"));
106+
107+
{
108+
// Bad token create (insufficient offer)
109+
Context ce=step(c,"(call members 999999999 (create-pt "+MID+"))");
110+
assertStateError(ce);
111+
}
112+
89113
}
90114
}

0 commit comments

Comments
 (0)