Skip to content

Instantly share code, notes, and snippets.

@shmish111
Last active January 6, 2021 17:08
Show Gist options
  • Save shmish111/1b18b71ed5a96d00607ce8a8e3fd297b to your computer and use it in GitHub Desktop.
Save shmish111/1b18b71ed5a96d00607ce8a8e3fd297b to your computer and use it in GitHub Desktop.
Untitled Project
<xml xmlns="https://developers.google.com/blockly/xml"><block type="BaseContractType" id="root_contract" deletable="false" x="13" y="187"><statement name="BaseContractType"><block type="WhenContractType" id="2/:WL!kni#xVO[JD@vYM"><field name="timeout">10</field><statement name="case"><block type="DepositActionType" id="}ED~T~;u.8sa]%?l|yz5"><value name="from_party"><block type="RolePartyType" id="tZ(F#.1`y)u6qjWdD@$O"><field name="role">alice</field></block></value><value name="value"><block type="ConstantValueType" id="9I1oM~84DSlVN5owEMYV"><field name="constant">450</field></block></value><value name="token"><block type="AdaTokenType" id="%oBM{`+9SDMAUPWW7$Gj"/></value><value name="party"><block type="RolePartyType" id=":s+2]]MoEKdl)vd?-DfX"><field name="role">alice</field></block></value><statement name="contract"><block type="WhenContractType" id="FPtb*=MyYhiV=xF[m9F|"><field name="timeout">40</field><statement name="case"><block type="ChoiceActionType" id="D^*~|m+)t)-!E;?ERyz,"><field name="choice_name">choice</field><value name="party"><block type="RolePartyType" id="[`,CRkz*|n6j_lWV1YYj"><field name="role">alice</field></block></value><statement name="bounds"><block type="BoundsType" id="jk6llN(7,lQ0QxjgLND0"><field name="from">0</field><field name="to">1</field></block></statement><statement name="contract"><block type="WhenContractType" id="_2hydu6k*V4f/KPvvtxZ"><field name="timeout">60</field><statement name="case"><block type="ChoiceActionType" id="/Ye-y3e;oljX.i(r+NfD"><field name="choice_name">choice</field><value name="party"><block type="RolePartyType" id="%9|ETLmwO3gAbfP)2op?"><field name="role">bob</field></block></value><statement name="bounds"><block type="BoundsType" id="JVMUmWmV$5NM}$|lg+}/"><field name="from">0</field><field name="to">1</field></block></statement><statement name="contract"><block type="IfContractType" id="Hpx5~n/CWP*ynyE_Sxj]"><value name="observation"><block type="ValueEQObservationType" id=";?mV/3xG;Uy|RlbgF|!2"><value name="value1"><block type="ChoiceValueValueType" id="dj#g;UI_LS|.rX,m$;H9"><field name="choice_name">choice</field><value name="party"><block type="RolePartyType" id=")y+qkwYuRL)PY8Fct}V0"><field name="role">alice</field></block></value></block></value><value name="value2"><block type="ChoiceValueValueType" id="8@G2^tE23PM8fe/|}vfx"><field name="choice_name">choice</field><value name="party"><block type="RolePartyType" id="$)hCjOQB{Ge3Ym/Es$(K"><field name="role">bob</field></block></value></block></value></block></value><statement name="contract1"><block type="IfContractType" id="t+Q0|QZ4aM|0hRR6o}Ww"><value name="observation"><block type="ValueEQObservationType" id="52tKS2da9~2]@Dv,XhWv"><value name="value1"><block type="ChoiceValueValueType" id="vtf.xtN1uaGt{9@Rb2UB"><field name="choice_name">choice</field><value name="party"><block type="RolePartyType" id="4*C9E6(}:$X*f^:..t,s"><field name="role">alice</field></block></value></block></value><value name="value2"><block type="ConstantValueType" id="{MZSaLWss=hDFz@a`qo["><field name="constant">0</field></block></value></block></value><statement name="contract1"><block type="PayContractType" id="p+74K8N|2~Riv1Iz3Nv)"><value name="payee"><block type="PartyPayeeType" id="9akz)Hq_Fg#3!#h$uF2w"><value name="party"><block type="RolePartyType" id="Viif:n~{kdyw8Y+]p~1U"><field name="role">bob</field></block></value></block></value><value name="value"><block type="ConstantValueType" id="m^wh?=8lBATzpKAb`SWQ"><field name="constant">450</field></block></value><value name="token"><block type="AdaTokenType" id="9-)55Z77QnoT,!Z~1rCk"/></value><value name="party"><block type="RolePartyType" id="8d_KE/@|v)Yub?2}GY,*"><field name="role">alice</field></block></value><statement name="contract"><block type="CloseContractType" id="lf:/t!XQ`xx?8`BL3AU_"/></statement></block></statement><statement name="contract2"><block type="CloseContractType" id="]@ewhi,jXMCJt^IZ65Vc"/></statement></block></statement><statement name="contract2"><block type="WhenContractType" id="z!6?pF:wpIAa:XNEXQ$@"><field name="timeout">100</field><statement name="case"><block type="ChoiceActionType" id="gg25^w#R7bV3d$T$MiO0"><field name="choice_name">choice</field><value name="party"><block type="RolePartyType" id="GA;_-[.cW5-xN(A}bLz7"><field name="role">carol</field></block></value><statement name="bounds"><block type="BoundsType" id="BIB$Oa}{@)kj3I(N2I;1"><field name="from">1</field><field name="to">1</field></block></statement><statement name="contract"><block type="CloseContractType" id="a[Rd[LnOZ}zX3/)b!l[T"/></statement><next><block type="ChoiceActionType" id="cjpx14|n1-_zW#QE+V,q"><field name="choice_name">choice</field><value name="party"><block type="RolePartyType" id="Y25kN-}T;{o2iG?L-g5e"><field name="role">carol</field></block></value><statement name="bounds"><block type="BoundsType" id="T8=PR9{4V=@x4Z+.#;HT"><field name="from">0</field><field name="to">0</field></block></statement><statement name="contract"><block type="PayContractType" id="UR7v-|#l$iN4,MiV#-E."><value name="payee"><block type="PartyPayeeType" id="m{Hge;J)isla3C1WQw]5"><value name="party"><block type="RolePartyType" id="I4)}YATI]ht~HJ-qj45d"><field name="role">bob</field></block></value></block></value><value name="value"><block type="ConstantValueType" id="@-Y]I#$2+$F|,;g8_kdI"><field name="constant">450</field></block></value><value name="token"><block type="AdaTokenType" id="(}gO2RFtQ19Y(YLc1PHV"/></value><value name="party"><block type="RolePartyType" id="F6Bbb1.JPw/4=^(;;Fa3"><field name="role">alice</field></block></value><statement name="contract"><block type="CloseContractType" id="#9G)0J0$tk(CxDf5HuMA"/></statement></block></statement></block></next></block></statement><statement name="contract"><block type="CloseContractType" id="$YZbKW3JvbtrVL],$D5q"/></statement></block></statement></block></statement></block></statement><statement name="contract"><block type="WhenContractType" id="^YR{WR*7=JC~5hX0.27#"><field name="timeout">100</field><statement name="case"><block type="ChoiceActionType" id="*zbKV|No{UnZK2cf?9C6"><field name="choice_name">choice</field><value name="party"><block type="RolePartyType" id="4K-Gv^Qp,qAvj)GKz~;%"><field name="role">carol</field></block></value><statement name="bounds"><block type="BoundsType" id=")Y]HBbM68w$%kV$]kati"><field name="from">1</field><field name="to">1</field></block></statement><statement name="contract"><block type="CloseContractType" id="C9N%6FY%e6UxX9Ffo}PX"/></statement><next><block type="ChoiceActionType" id="UD0Dc=F`L@DFEM1R.Zcs"><field name="choice_name">choice</field><value name="party"><block type="RolePartyType" id="eccpPMtRf9|cRgGxD[6E"><field name="role">carol</field></block></value><statement name="bounds"><block type="BoundsType" id="H}{T/:^C#+zvY[h_U6)p"><field name="from">0</field><field name="to">0</field></block></statement><statement name="contract"><block type="PayContractType" id="b13?n2;@7coC9SwQ?]Qe"><value name="payee"><block type="PartyPayeeType" id="3LVolSJZcqkw]RXQ|%;G"><value name="party"><block type="RolePartyType" id=":SFvMAqk.PaN9Rf;qi!B"><field name="role">bob</field></block></value></block></value><value name="value"><block type="ConstantValueType" id="0(b}N#SY(3KwNX1Fzlz:"><field name="constant">450</field></block></value><value name="token"><block type="AdaTokenType" id="a(#$1SOdM2[#GSTiC`lr"/></value><value name="party"><block type="RolePartyType" id="]?yB)={IAbBLxe${P*.B"><field name="role">alice</field></block></value><statement name="contract"><block type="CloseContractType" id="S]i5D)$q%CN!s=anVrt4"/></statement></block></statement></block></next></block></statement><statement name="contract"><block type="CloseContractType" id="^~q-Z7N*xtG^;sxZvk$7"/></statement></block></statement></block></statement></block></statement><statement name="contract"><block type="WhenContractType" id="WGf#Pa79.cFhmFDlL5UM"><field name="timeout">100</field><statement name="case"><block type="ChoiceActionType" id="Sbq@)!Ugl*+D703n*w=r"><field name="choice_name">choice</field><value name="party"><block type="RolePartyType" id="QSVTJZw/_3TjyMZZ?H!H"><field name="role">carol</field></block></value><statement name="bounds"><block type="BoundsType" id="|]O8K~grs+I8vX4H-ckA"><field name="from">1</field><field name="to">1</field></block></statement><statement name="contract"><block type="CloseContractType" id="KllO,ru{MmQ(M.@m]jvt"/></statement><next><block type="ChoiceActionType" id="[_uyMPY1;)2nL=@[9wtS"><field name="choice_name">choice</field><value name="party"><block type="RolePartyType" id="V+h}%5dE^~H=8zK;U%S~"><field name="role">carol</field></block></value><statement name="bounds"><block type="BoundsType" id="?wg}z$7*YM;i#4NgY:^?"><field name="from">0</field><field name="to">0</field></block></statement><statement name="contract"><block type="PayContractType" id="Ag8488py$gC=c!D7Ohvz"><value name="payee"><block type="PartyPayeeType" id="%#s~]-/wJg#/?uGZ{4||"><value name="party"><block type="RolePartyType" id="U.Ik|@BFSWQIJ+PwQiRP"><field name="role">bob</field></block></value></block></value><value name="value"><block type="ConstantValueType" id="TV:6]||apZ4}KbWA!2R+"><field name="constant">450</field></block></value><value name="token"><block type="AdaTokenType" id="Ikc0H*Ai3ZJa%+Q6awB@"/></value><value name="party"><block type="RolePartyType" id="f.(4RD]j-T7fL*`#~90{"><field name="role">alice</field></block></value><statement name="contract"><block type="CloseContractType" id="8UC^8OPKt@gP+wACiav="/></statement></block></statement></block></next></block></statement><statement name="contract"><block type="CloseContractType" id="$j=Jz*/=.X_a;0vGc(S2"/></statement></block></statement></block></statement></block></statement><statement name="contract"><block type="CloseContractType" id="+!|C!994KqRmh3+,.Z3e"/></statement></block></statement></block></xml>
{-# LANGUAGE OverloadedStrings #-}
module Escrow where
import Language.Marlowe
main :: IO ()
main = print . pretty $ contract
{- What does the vanilla contract look like?
- if Alice and Bob choose
- and agree: do it
- and disagree: Carol decides
- Carol also decides if timeout after one choice has been made;
- refund if no choices are made.
-}
contract :: Contract
contract = When [Case (Deposit "alice" "alice" ada price) inner]
10
Close
inner :: Contract
inner =
When [ Case aliceChoice
(When [ Case bobChoice
(If (aliceChosen `ValueEQ` bobChosen)
agreement
arbitrate) ]
60
arbitrate)
]
40
arbitrate
-- The contract to follow when Alice and Bob have made the same choice.
agreement :: Contract
agreement =
If
(aliceChosen `ValueEQ` Constant 0)
(Pay "alice" (Party "bob") ada price Close)
Close
-- The contract to follow when Alice and Bob disagree, or if
-- Carol has to intervene after a single choice from Alice or Bob.
arbitrate :: Contract
arbitrate =
When [ Case carolRefund Close,
Case carolPay (Pay "alice" (Party "bob") ada price Close) ]
100
Close
-- Names for choices
pay,refund,both :: [Bound]
pay = [Bound 0 0]
refund = [Bound 1 1]
both = [Bound 0 1]
-- helper function to build Actions
choiceName :: ChoiceName
choiceName = "choice"
choice :: Party -> [Bound] -> Action
choice party = Choice (ChoiceId choiceName party)
-- Name choices according to person making choice and choice made
alicePay, aliceRefund, aliceChoice, bobPay, bobRefund, bobChoice, carolPay, carolRefund, carolChoice :: Action
alicePay = choice "alice" pay
aliceRefund = choice "alice" refund
aliceChoice = choice "alice" both
bobPay = choice "bob" pay
bobRefund = choice "bob" refund
bobChoice = choice "bob" both
carolPay = choice "carol" pay
carolRefund = choice "carol" refund
carolChoice = choice "carol" both
-- the values chosen in choices
aliceChosen, bobChosen :: (Value Observation)
aliceChosen = ChoiceValue (ChoiceId choiceName "alice")
bobChosen = ChoiceValue (ChoiceId choiceName "bob")
defValue :: (Value Observation)
defValue = Constant 42
-- Value under escrow
price :: (Value Observation)
price = Constant 450
/* Parties */
const alice : Party = Role("alice");
const bob : Party = Role("bob");
const carol : Party = Role("carol");
/* Value under escrow */
const price : SomeNumber = 450n;
/* helper function to build Actions */
const choiceName : string = "choice";
const choiceIdBy = function (party : Party) : ChoiceId {
return ChoiceId(choiceName, party);
}
const choiceBy = function(party : Party, bounds : [Bound]) : Action {
return Choice(choiceIdBy(party), bounds);
};
const choiceValueBy = function(party : Party) : Value {
return ChoiceValue(choiceIdBy(party));
};
/* Names for choices */
const pay : [Bound] = [Bound(0n, 0n)];
const refund : [Bound] = [Bound(1n, 1n)];
const both : [Bound] = [Bound(0n, 1n)];
/* Name choices according to person making choice and choice made */
const alicePay : Action = choiceBy(alice, pay);
const aliceRefund : Action = choiceBy(alice, refund);
const aliceChoice : Action = choiceBy(alice, both);
const bobPay : Action = choiceBy(bob, pay);
const bobRefund : Action = choiceBy(bob, refund);
const bobChoice : Action = choiceBy(bob, both);
const carolPay : Action = choiceBy(carol, pay);
const carolRefund : Action = choiceBy(carol, refund);
const carolChoice : Action = choiceBy(carol, both);
/* the values chosen in choices */
const aliceChosen : Value = choiceValueBy(alice);
const bobChosen : Value = choiceValueBy(bob);
/* The contract to follow when Alice and Bob disagree, or if
Carol has to intervene after a single choice from Alice or Bob. */
const arbitrate : Contract = When([Case(carolRefund, Close),
Case(carolPay, Pay(alice, Party(bob), ada, price, Close))],
100n, Close);
/* The contract to follow when Alice and Bob have made the same choice. */
const agreement : Contract = If(ValueEQ(aliceChosen, 0n),
Pay(alice, Party(bob), ada, price, Close),
Close);
/* Inner part of contract */
const inner : Contract = When([Case(aliceChoice,
When([Case(bobChoice,
If(ValueEQ(aliceChosen, bobChosen),
agreement,
arbitrate))],
60n, arbitrate))],
40n, Close);
/* What does the vanilla contract look like?
- if Alice and Bob choose
- and agree: do it
- and disagree: Carol decides
- Carol also decides if timeout after one choice has been made;
- refund if no choices are made. */
const contract : Contract = When([Case(Deposit(alice, alice, ada, price), inner)],
10n,
Close)
return contract;
When
[Case
(Deposit
(Role "alice")
(Role "alice")
(Token "" "")
(Constant 450)
)
(When
[Case
(Choice
(ChoiceId
"choice"
(Role "alice")
)
[Bound 0 1]
)
(When
[Case
(Choice
(ChoiceId
"choice"
(Role "bob")
)
[Bound 0 1]
)
(If
(ValueEQ
(ChoiceValue
(ChoiceId
"choice"
(Role "alice")
))
(ChoiceValue
(ChoiceId
"choice"
(Role "bob")
))
)
(If
(ValueEQ
(ChoiceValue
(ChoiceId
"choice"
(Role "alice")
))
(Constant 0)
)
(Pay
(Role "alice")
(Party (Role "bob"))
(Token "" "")
(Constant 450)
Close
)
Close
)
(When
[Case
(Choice
(ChoiceId
"choice"
(Role "carol")
)
[Bound 1 1]
)
Close , Case
(Choice
(ChoiceId
"choice"
(Role "carol")
)
[Bound 0 0]
)
(Pay
(Role "alice")
(Party (Role "bob"))
(Token "" "")
(Constant 450)
Close
)]
100 Close
)
)]
60
(When
[Case
(Choice
(ChoiceId
"choice"
(Role "carol")
)
[Bound 1 1]
)
Close , Case
(Choice
(ChoiceId
"choice"
(Role "carol")
)
[Bound 0 0]
)
(Pay
(Role "alice")
(Party (Role "bob"))
(Token "" "")
(Constant 450)
Close
)]
100 Close
)
)]
40 Close
)]
10 Close
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment