Skip to content

Commit f7d2e03

Browse files
committed
Paisley members list actor and tests / examples
1 parent 9293dc0 commit f7d2e03

File tree

3 files changed

+60
-15
lines changed

3 files changed

+60
-15
lines changed

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

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
'app.paisley.members
2-
;; Deploy with
2+
;; Deploy with something like:
33
;; (deploy
44
;; '[(set-controller <governance-controller>
55
;; (def operator <operator-backend-account>)
@@ -10,7 +10,7 @@
1010

1111
(import convex.trust :as trust)
1212

13-
;; Governance controller. Use controller if set, otherwise *caller* for testing purposes
13+
;; Governance controller. Use controller if set, otherwise default to *caller* for testing purposes
1414
(def governor (or *controller* *caller*))
1515

1616
;; Members counter
@@ -28,36 +28,64 @@
2828

2929
(defn get-metadata
3030
^{:callable true
31-
:doc {:description "GEts metadata for a member, or nil if does not exist."
31+
:doc {:description "Gets metadata for a member, or nil if does not exist."
3232
:signature [{:params []}]}}
3333

3434
([member-id]
3535
(get members member-id)))
3636

3737
(defn create-member
3838
^{:callable true
39-
:doc {:description "Creates a new member account. Must be caller by operator. Returns ID."
40-
:signature [{:params []}]}}
41-
([]
39+
:doc {:description "Creates a new member account. Must be caller by operator, providing member Convex account. Returns ID."
40+
:signature [{:params [account]}]}}
41+
([acct]
4242
(or (trust/trusted? operator *caller*) (fail :TRUST "Not a membership operator"))
4343
(let [id mcount]
4444
(set! mcount (inc id))
45-
(set! members (assoc members id {:created *timestamp*}))
45+
(set! members (assoc members id {:created *timestamp*
46+
:updated *timestamp*
47+
:accounts #{acct}}))
4648
id)))
49+
50+
(defn update-member
51+
^{:callable true
52+
:doc {:description "Updates a new member account. Must be caller by operator, providing member Convex account. Returns updated metadata."
53+
:signature [{:params [id data]}]}}
54+
([id data]
55+
(or (trust/trusted? operator *caller*) (fail :TRUST "Not a membership operator"))
56+
(let [md (or (get members id) (fail :STATE "Member ID does not exist"))
57+
new-data (merge md data)
58+
new-data (assoc new-data :updated *timestamp*)]
59+
(set! members (assoc members id new-data)))))
4760

4861

49-
;; Create members personal token
62+
;; Create personal token for a member
5063
;; Requires:
5164
;; 1. Member ID exists
5265
;; 2. Offer of at least 1 CVM
5366
;;
5467
;; Returns personal token asset ID (new or existing)
5568
;; Call with (call @app.paisley.members 1000000000 (create-pt id)
56-
(defn ^:callable create-pt [member-id]
69+
(defn create-pt
70+
^{:callable true
71+
:doc {:description "Creates a new personal token for a member. Returns CAD29 Token ID."
72+
:signature [{:params [member-id]}]}}
73+
[member-id]
5774
(accept 1000000000)
5875
(when-not (get members member-id) (fail :STATE (str "Member does not exist: " member-id)))
5976
(if-let [ptid (get pts member-id)] (return ptid)) ;; return token if already exists
60-
(let [id (call pt-actor (create))
77+
(let [id (call pt-actor (create [*address* member id]))
6178
ptid [pt-actor id]]
6279
(set! pts (assoc pts member-id ptid))
63-
ptid))
80+
ptid))
81+
82+
83+
;; Member trust monitor implementation
84+
(defn ^:callable check-trusted? [subject action object]
85+
(let [md (get-metadata *scope*)
86+
accts (get md :accounts)]
87+
(cond
88+
(not md) false
89+
(contains-key? accts subject))))
90+
91+

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,15 @@
5050

5151
(defn create
5252
^{:callable true
53-
:doc {:description "Creates a new token and returns its id. Caller will be controller of token. Returns ID."
53+
:doc {:description "Creates a new token and returns its id. Caller will be as specified, or caller if not provided. Returns ID."
5454
:signature [{:params []}
55-
{:params [actor]}]}}
55+
{:params [controller]}]}}
5656
([]
57+
(recur *caller*))
58+
([controller]
5759
(let [id counter]
5860
(set! counter (inc id))
59-
(set! tokens (assoc tokens id [*caller* 0]))
61+
(set! tokens (assoc tokens id [controller 0]))
6062
id)))
6163

6264
;;; Trust / control SPI

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

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,13 @@
1010

1111
import convex.core.cvm.Address;
1212
import convex.core.cvm.Context;
13+
import convex.core.cvm.Keywords;
14+
import convex.core.data.AMap;
1315
import convex.core.data.AVector;
1416
import convex.core.data.Maps;
1517
import convex.core.data.Vectors;
1618
import convex.core.data.prim.AInteger;
19+
import convex.core.data.prim.CVMBool;
1720
import convex.core.data.prim.CVMLong;
1821
import convex.core.lang.ACVMTest;
1922
import convex.core.lang.TestState;
@@ -89,8 +92,12 @@ public class PaisleyTest extends ACVMTest {
8992

9093
@Test public void testMembersList() {
9194
Context c=context();
95+
96+
// Check members database is initially empty
9297
c=exec(c,"members/members");
9398
assertSame(Maps.empty(),c.getResult());
99+
assertCVMEquals(0,eval(c,"members/mcount"));
100+
94101

95102
{
96103
// Bad token create (non-member)
@@ -99,7 +106,7 @@ public class PaisleyTest extends ACVMTest {
99106
}
100107

101108
// Create a new member
102-
c=exec(c,"(def mid (call members (create-member)))");
109+
c=exec(c,"(def mid (call members (create-member *address*)))");
103110
assertNotError(c);
104111
AInteger MID=c.getResult();
105112
assertNotNull(eval(c,"(call members (get-metadata "+MID+"))"));
@@ -110,5 +117,13 @@ public class PaisleyTest extends ACVMTest {
110117
assertStateError(ce);
111118
}
112119

120+
// Example using [members-actor id] as a trust monitor
121+
assertEquals(CVMBool.TRUE,eval(c,"(trust/trusted? [members mid] *address*)"));
122+
123+
124+
// Example setting and reading metadata
125+
c=exec(c,"(call members (update-member mid {:foo 34}))");
126+
AMap<?,?> rmd=eval(c,"(call members (get-metadata mid))");
127+
assertCVMEquals(34,rmd.get(Keywords.FOO));
113128
}
114129
}

0 commit comments

Comments
 (0)