Skip to content

Commit

Permalink
Merge pull request #163 from kadena-io/feat/improve-cp-example
Browse files Browse the repository at this point in the history
Improve cp example and provide load scripts
  • Loading branch information
Stuart Popejoy committed Jul 21, 2018
2 parents 7e3f329 + 646192b commit ed62cc0
Show file tree
Hide file tree
Showing 13 changed files with 155 additions and 53 deletions.
30 changes: 29 additions & 1 deletion examples/cp/auth.pact
Original file line number Diff line number Diff line change
@@ -1,2 +1,30 @@
(define-keyset 'cp-module-admin
(define-keyset 'module-admin
(read-keyset "module-admin-keyset"))
(define-keyset 'operate-admin
(read-keyset "module-operate-keyset"))

(module mpid 'module-admin

(defschema mpid
keyset:keyset
)
(deftable mpids:{mpid})


(defun create-mpid (id keyset)
(enforce-keyset 'operate-admin)
(insert mpids id {
"keyset": keyset
})
)

(defun enforce-mpid-auth (id)
"Enforce keyset for market participant ID, and return keyset"
(with-read mpids id { "keyset":= k }
(enforce-keyset k)
k)
)

)

(create-table mpids)
14 changes: 9 additions & 5 deletions examples/cp/cash.pact
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
(module cash 'cp-module-admin
(module cash 'module-admin

(defschema entry
ccy:string
balance:decimal
change:decimal
date:time)
date:time
keyset:keyset)

(deftable cash:{entry})

(defun debit (id amount date)
"Debit ID for AMOUNT, checking balance for available funds"
(with-read cash id { "balance":= balance }
(with-read cash id { "balance":= balance, "keyset" := ks}
(enforce-keyset ks)
(enforce (>= balance amount) "Insufficient funds")
(update cash id {
"balance": (- balance amount),
Expand All @@ -35,13 +37,15 @@
(debit payor amount date)
(credit payee amount date))

(defun create-account (id ccy amount date)
(defun create-account (id ccy amount date ks)
"Create account ID for CCY and fund with AMOUNT"
(enforce-keyset 'operate-admin)
(insert cash id {
"ccy": ccy,
"balance": amount,
"change": amount,
"date": date })
"date": date,
"keyset": ks })
)

(defun read-account (id) (read cash id))
Expand Down
58 changes: 33 additions & 25 deletions examples/cp/cp.pact
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@

(module cp 'cp-module-admin
(module cp 'module-admin

"Commercial paper demonstration smart contract."

(use cash
"b9d80d448ae26b966098cdf41b82fac26f8b4575312de2aa7a181cc31bd75399bed5b37c7062a0c4a39d1654501f32e636b4d699ce17e6e1a856fc0e5cd675c5")
(use orders
"00e031d8abcab35ff3dc9f5e17d1bc55a3af1e7bcd235b88295390a6771fcae70e29f5fc0582b723d8ffa6673d05587aab9864de5443ffcc55c300db5524f3f5")
(use mpid)
(use cash)
(use orders)


(defschema cp-asset
ticker:string
Expand All @@ -29,10 +28,13 @@

(deftable cp-inventory:{inventory})


(defun issue (issuer cusip ticker future-value discount-rate
days-to-maturity par date)

"ISSUER issues CUSIP, computing discount, cost, settlement date"
"ISSUER issues CUSIP, computing discount, cost, settlement date."

(enforce-mpid-auth issuer)

(enforce (> future-value 0.0) "Valid future-value")

Expand Down Expand Up @@ -69,6 +71,10 @@
)


(defun calculate-discount (future-value discount-rate days-to-maturity)
(* future-value
(* (/ discount-rate 100.0)
(/ days-to-maturity 360.0))))

(defun inventory-key (owner:string cusip:string)
"Make composite key from OWNER and CUSIP"
Expand All @@ -77,12 +83,13 @@

(defun issue-inventory (owner cusip qty price date)
"Issue inventory for CUSIP recording QTY and PRICE held by OWNER"
(insert cp-inventory (inventory-key owner cusip)
{
"qty": qty,
"price": price,
"date": date
})
(let ((k (enforce-mpid-auth owner)))
(insert cp-inventory (inventory-key owner cusip)
{
"qty": qty,
"price": price,
"date": date
}))
)


Expand All @@ -98,6 +105,8 @@
"price" := owner-price
}

(enforce-mpid-auth owner)

(enforce (>= owner-owned qty) "Owner has inventory")
(enforce (= owner-price price) "Price matches inventory")

Expand All @@ -117,11 +126,6 @@
)


(defun calculate-discount (future-value discount-rate days-to-maturity)
(* future-value
(* (/ discount-rate 100.0)
(/ days-to-maturity 360.0))))


(defun fill-order-transfer (order-id seller date)
"Fill new order ORDER-ID"
Expand All @@ -137,7 +141,7 @@
(update-order-status order-id ORDER_FILLED date))
)

(defun settle-order (order-id cusip buyer seller date)
(defun settle-order (order-id buyer seller date)
"Open settlement, with payment and status update"
(bind (with-order-status order-id ORDER_FILLED) {
"price" := price
Expand Down Expand Up @@ -172,36 +176,40 @@
(read cp-inventory (inventory-key owner cusip)))

;; scenario1
(defpact issue-order-fill-settle (agent-entity trader-entity
(defpact issue-order-fill-settle (
agent trader cusip ticker future-value discount-rate
days-to-maturity par order-id date)
;; 0: issuance
(step agent-entity
(step
(issue agent cusip ticker future-value discount-rate
days-to-maturity par date))
;; 1: new order
(step-with-rollback trader-entity
(step-with-rollback
(new-order order-id cusip trader agent 1
(at "cost" (read-cp-master cusip)) "USD" date)
;;rollback
(cancel-order order-id date))

;; 2: fill
(step agent-entity
(step
(fill-order-transfer order-id agent date))

;; 3: pay
(step-with-rollback trader-entity
(step-with-rollback
(settle-order-buyer order-id trader date)
;;rollback
(refund-order order-id trader date))

;; 4: settle
(step agent-entity
(step
(settle-order-seller order-id agent date))

)

(defun read-cp-master (ticker) (read cp-master ticker))

(defun read-cp-inventory (inv-key) (read cp-inventory inv-key))

)

(create-table cp-master)
Expand Down
57 changes: 36 additions & 21 deletions examples/cp/cp.repl
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
(env-data { "module-admin-keyset": { "keys": ["admin"], "pred": "keys-all"}})
(env-data
{ "module-admin-keyset": { "keys": ["admin"], "pred": "keys-all"},
"module-operate-keyset": ["operate"],
"agent-keyset": ["agent-key"],
"trader-keyset": ["trader-key"]
})
(env-keys ["admin"])
(begin-tx)
(load "auth.pact")
(commit-tx)
(begin-tx)
(load "cash.pact")
(load "orders.pact")
(commit-tx)
Expand All @@ -10,39 +17,47 @@
(commit-tx)
(typecheck 'cp)
(begin-tx)
(use 'cp)
(use 'cash)
(module cp-test 'cp-module-admin
(use cp)
(use cash)
(use mpid)
(module cp-test 'module-admin
(defconst t1 (time "2016-09-01T11:00:00Z"))
(defconst t2 (add-time t1 30))
(defconst t3 (add-time t2 30))
(defun runpact-scenario-1 (order-id cusip)
(issue-order-fill-settle
"AGENT" "TRADER" "agent" "trader" cusip "GE CP"
"agent" "trader" cusip "GE CP"
100000.0 7.35 30 1000.0 order-id t1)
)
)

(create-account "agent" "USD" 0.0 t1)
(create-account "trader" "USD" 100000.0 t1)
(env-keys ["operate"])
(create-account "agent" "USD" 0.0 t1 (read-keyset "agent-keyset"))
(create-account "trader" "USD" 100000.0 t1 (read-keyset "trader-keyset"))
(create-mpid "agent" (read-keyset "agent-keyset"))
(create-mpid "trader" (read-keyset "trader-keyset"))

(commit-tx)
(expect "check discount compute" 612.5 (cp.calculate-discount 100000.0 7.35 30))
(begin-tx)
(use 'cp)
(use 'cash)
(use 'orders)
(use 'cp-test)
(use cp)
(use cash)
(use orders)
(use cp-test)

; Issue new CUSIP
(env-keys ["agent-key"])
(issue "agent" "cusip1" "GE CP" 100000.0 7.35 30 1000.0 t1)

; Verify inventory
(expect "agent has inventory" 1 (at "qty" (cp.read-inventory "agent" "cusip1")))

; trader sends order, agent fills
; trader sends order
(env-keys ["trader-key"])
(new-order "order1" "cusip1" "trader" "agent" 1 99387.5 "USD" t1)

; agent fills
(env-keys ["agent-key"])
(fill-order-transfer "order1" "agent" t2)

; verify order state
Expand All @@ -62,7 +77,8 @@
(expect "trader inventory" 1 (at "qty" (read-inventory "trader" "cusip1")))

; trader settles
(settle-order "order1" "cusip1" "trader" "agent" t3)
(env-keys ["trader-key"])
(settle-order "order1" "trader" "agent" t3)

; verify cash
(expect "trader balance" 612.5 (at "balance" (read-account "trader")))
Expand All @@ -77,28 +93,27 @@
;;
(rollback-tx)

(use 'cp)
(use 'cp-test)
(use 'orders)
(use cp)
(use cp-test)
(use orders)

(env-entity "AGENT")
(env-keys ["agent-key"])
(runpact-scenario-1 "order2" "cusip2")
(expect "agent has inventory" 1 (at "qty" (cp.read-inventory "agent" "cusip2")))

(env-step 1)
(env-entity "TRADER")
(env-keys ["trader-key"])
(runpact-scenario-1 "order2" "cusip2")
(expect "order NEW" ORDER_NEW (at "status" (read-order "order2")))

(env-step 2)
(env-entity "AGENT")
(env-keys ["agent-key"])
(runpact-scenario-1 "order2" "cusip2")
(expect "trader inventory" 1 (at "qty" (read-inventory "trader" "cusip2")))

(env-step 3)
(env-entity "TRADER")
(env-keys ["trader-key"])
(runpact-scenario-1 "order2" "cusip2")
(env-step 4)
(env-entity "AGENT")
(runpact-scenario-1 "order2" "cusip2")
(expect "order paid" ORDER_PAID (at "status" (read-order "order2")))
5 changes: 4 additions & 1 deletion examples/cp/orders.pact
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
(module orders 'cp-module-admin
(module orders 'module-admin

(use mpid)

(defschema order
cusip:string
Expand All @@ -20,6 +22,7 @@

(defun new-order (order-id cusip buyer seller qty price ccy date)
"Create new order ORDER-ID"
(enforce-mpid-auth buyer)
(insert orders order-id {
"cusip": cusip,
"buyer": buyer,
Expand Down
9 changes: 9 additions & 0 deletions examples/cp/scripts/01-auth.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
data:
module-admin-keyset: ["06c9c56daa8a068e1f19f5578cdf1797b047252e1ef0eb4a1809aa3c2226f61e"]
module-operate-keyset: ["acda99515bb9a27e054898e1632626db92a5379d3e62867a60eaba783e017fe0"]
codeFile: auth.pact
keyPairs:
- public: 06c9c56daa8a068e1f19f5578cdf1797b047252e1ef0eb4a1809aa3c2226f61e
secret: 7ce4bae38fccfe33b6344b8c260bffa21df085cf033b3dc99b4781b550e1e922
- public: acda99515bb9a27e054898e1632626db92a5379d3e62867a60eaba783e017fe0
secret: f894d9adb39cdb525ac1707ebedf2a1f401c21f2f2709e4ebafc4af72a18094e
4 changes: 4 additions & 0 deletions examples/cp/scripts/02-cash.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
codeFile: cash.pact
keyPairs:
- public: 06c9c56daa8a068e1f19f5578cdf1797b047252e1ef0eb4a1809aa3c2226f61e
secret: 7ce4bae38fccfe33b6344b8c260bffa21df085cf033b3dc99b4781b550e1e922
4 changes: 4 additions & 0 deletions examples/cp/scripts/03-orders.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
codeFile: orders.pact
keyPairs:
- public: 06c9c56daa8a068e1f19f5578cdf1797b047252e1ef0eb4a1809aa3c2226f61e
secret: 7ce4bae38fccfe33b6344b8c260bffa21df085cf033b3dc99b4781b550e1e922
4 changes: 4 additions & 0 deletions examples/cp/scripts/04-cp.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
codeFile: cp.pact
keyPairs:
- public: 06c9c56daa8a068e1f19f5578cdf1797b047252e1ef0eb4a1809aa3c2226f61e
secret: 7ce4bae38fccfe33b6344b8c260bffa21df085cf033b3dc99b4781b550e1e922
12 changes: 12 additions & 0 deletions examples/cp/scripts/05-create.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
data:
"agent-keyset": ["f880a433d6e2a13a32b6169030f56245efdd8c1b8a5027e9ce98a88e886bef27"]
"trader-keyset": ["b4abc21dc4545e4edab0be77945b814ed4e6707e7546bee925a4ed0630caa463"]
code: |-
(let ((t1 (time "2016-09-01T11:00:00Z")))
(cash.create-account "agent" "USD" 0.0 t1 (read-keyset "agent-keyset"))
(cash.create-account "trader" "USD" 100000.0 t1 (read-keyset "trader-keyset"))
(cp.create-mpid "agent" (read-keyset "agent-keyset"))
(cp.create-mpid "trader" (read-keyset "trader-keyset")))
keyPairs:
- public: acda99515bb9a27e054898e1632626db92a5379d3e62867a60eaba783e017fe0
secret: f894d9adb39cdb525ac1707ebedf2a1f401c21f2f2709e4ebafc4af72a18094e
3 changes: 3 additions & 0 deletions examples/cp/scripts/agent-keyset.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
keyPairs:
- public: f880a433d6e2a13a32b6169030f56245efdd8c1b8a5027e9ce98a88e886bef27
secret: 784fba9e74dfcb3ea27319ff564605cd91ee48ae554cf6bc6f56db58d7df2edd
5 changes: 5 additions & 0 deletions examples/cp/scripts/load.cmds
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
load demo/cp/01-auth.yaml
load demo/cp/02-cash.yaml
load demo/cp/03-orders.yaml
load demo/cp/04-cp.yaml
load demo/cp/05-create.yaml
Loading

0 comments on commit ed62cc0

Please sign in to comment.