{-- A two-party exchange
In this scenario there are ;Resource; types Dolphin, A and B.
There are three participants, Alice, Bob and a Solver.
Alice has:
* 1 A and 2 B
Bob has:
* 1 Dolphin
Alice is willing to exchange either 2 B or 1 A for 1 Dolphin.
Bob is willing to exchange 1 A for 1 Dolphin.
How to express this in Anoma using the Anoma abstract resource machine model?
Alice publishes a ;PartialTx; (1) to the gossip network that consumes two
resources:
1.1 An A ;Resource; with quantity 1
1.2 A B ;Resource; with quantity 2
and creates:
1.3 A ;Resource; with quantity 1 containing a logic function which encodes
her intent. i.e she wants to participate in a transaction that contains a
partial transaction in which she receives either 1 Dolphin and 2 B or 1
Dolphin and 1 A.
Bob publishes a ;PartialTx; (2) to the gossip network that encodes his intent.
It consumes:
2.2 A Dolphin ;Resource; with quantity 1.
and creates:
2.1 An A ;Resource; with quantity 1
The Solver finds both Alice's and Bob's partial transactions on the gossip
network and publishes a new parital transaction (3) such that all the tial
transactions logic are satisfied and the resources are balanced.
The Solver's partial transaction consumes:
3.1 Alice's logic ;Resource; created in 1.3.
and creates:
3.2 A Dolphin ;Resource; with quantity 1
3.3 A B ;Resource; with quantity 2
For a partial transaction to be valid, all of the logic functions associated
with its resources must be valid. In our case, Alice's logic function is
valid when applied to partial transaction 3.
A transaction is formed from a collection of valid partial transaction that
balance. i.e the quantities of created and consumed resources, for each
resource type in the transaction must balance.
This is true for the transaction containing the partial transactions 1,2,3 above.
In particular:
3.3 (create 2 B) balances with 1.2 (consume 2 B)
3.2 (create 1 Dolphin) balances with 2.2 (consume 1 Dolphin)
3.1 (consume Alice's intent) balances with 1.3 (create Alice's intent)
2.1 (creates 1 A) balances with 1.1 (consume 1 A). --}
module Apps.TwoPartyExchange;
import Anoma open;
import Anoma.Resource open using {mkResource as mkResource'};
import Apps.TwoPartyExchange.Asset open;
import Data.Map as Map open using {Map};
import Anoma.Prelude open;
open PartialTx;
--- Definitions related to Alice's intent
module AliceIntent;
logicFunction (kind : ResourceKind) (tx : PartialTx) : Bool :=
let
createdRs : List Resource := createdResources tx;
in isCreated kind
|| (quantityOfKind Dolphin.kind createdRs == 1
&& quantityOfKind A.kind createdRs == 1)
|| quantityOfKind Dolphin.kind createdRs == 1
&& quantityOfKind B.kind createdRs == 2;
--- This will be computed from the logic function
logicHash : LogicHash := 1;
label : ByteString := [3];
kind : Kind := 1 :: label;
mkResource (n : Int) : Resource :=
mkResource'
(logicHash := logicHash; label := label; data := nil; quantity := n);
end;
--- Definitions related to Alice
module Alice;
partialTransaction : PartialTx :=
mkPartialTx
(consumedResources := [A.mkResource 1; B.mkResource 2];
createdResources := [AliceIntent.mkResource 1]);
end;
--- Definitions related to Bob
module Bob;
partialTransaction : PartialTx :=
mkPartialTx
(consumedResources := [Dolphin.mkResource 1];
createdResources := [A.mkResource 1]);
end;
--- Definitions related to the Solver
module Solver;
partialTransaction : PartialTx :=
mkPartialTx
(consumedResources := [AliceIntent.mkResource 1];
createdResources := [Dolphin.mkResource 1; B.mkResource 2]);
end;
logicFunctions : Map LogicHash LogicFunction :=
mkLogicFunctionMap [AliceIntent.logicHash, AliceIntent.logicFunction];
Last modified on 2023-12-07 10:36 UTC