From 8f2dfd1508add6ab9a012a228da4817a59bfcf9c Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sat, 7 Dec 2024 13:25:47 -0600 Subject: [PATCH 1/6] test(ertp): Alice buys a ticket from Bob --- snippets/ertp/guide/test-readme.js | 117 ++++++++++++++++++++++++++++- 1 file changed, 116 insertions(+), 1 deletion(-) diff --git a/snippets/ertp/guide/test-readme.js b/snippets/ertp/guide/test-readme.js index ae68e04b1..19c088fc2 100644 --- a/snippets/ertp/guide/test-readme.js +++ b/snippets/ertp/guide/test-readme.js @@ -1,5 +1,6 @@ /* eslint-disable import/order -- https://github.com/endojs/endo/issues/1235 */ import { test } from '../../prepare-test-env-ava.js'; +// @ts-check import { E } from '@endo/eventual-send'; @@ -8,7 +9,9 @@ import { E } from '@endo/eventual-send'; // eslint-disable-next-line import/no-extraneous-dependencies import { makeFakeBoard } from '@agoric/vats/tools/board-utils.js'; -import { AmountMath, makeIssuerKit, AssetKind } from '@agoric/ertp'; +// #region importErtp +import { makeIssuerKit, AmountMath, AssetKind } from '@agoric/ertp'; +// #endregion importErtp test('ertp guide readme', async t => { // #region makeIssuerKit @@ -100,3 +103,115 @@ test('ertp guide readme', async t => { t.truthy(allLive.every(a => a)); }); + +test('MarkM 2024-10 talk', t => { + /** @type {Record} */ + + // #region amountMathProps + const { make, isGTE } = AmountMath; + // #endregion amountMathProps + + // #region declareShared + const shared = {}; + // #endregion declareShared + + // #region aliceBuyer1 + /** @param {{ bucks: Payment, vendor: any }} some */ + const makeBuyer = some => { + const { bucks, tickets } = shared; + const my = { + bucks: bucks.issuer.makeEmptyPurse(), + tickets: tickets.issuer.makeEmptyPurse(), + }; + my.bucks.deposit(some.bucks); + // #endregion aliceBuyer1 + + // #region aliceBuyer2 + return harden({ + buyTicket() { + const pmt = my.bucks.withdraw(make(bucks.brand, 10n)); + const allegedTicket = some.vendor.buy(pmt); + // #endregion aliceBuyer2 + // #region aliceBuyer3 + const got = my.tickets.deposit(allegedTicket); + t.log('Alice got', got); + isGTE(got, make(tickets.brand, 1n)) || assert.fail(); + return got; + }, + getBalances: () => ({ + bucks: my.bucks.getCurrentAmount(), + tickets: my.tickets.getCurrentAmount(), + }), + }); + }; + // #endregion aliceBuyer3 + + // #region bobSeller + /** @param {{ bucks: Payment, tickets: Payment}} some */ + const makeSeller = some => { + const { bucks, tickets } = shared; + const my = { + bucks: bucks.issuer.makeEmptyPurse(), + tickets: tickets.issuer.makeEmptyPurse(), + }; + my.bucks.deposit(some.bucks); + my.tickets.deposit(some.tickets); + + return harden({ + /** @param {Payment} allegedPayment */ + buy(allegedPayment) { + const amt = my.bucks.deposit(allegedPayment); + isGTE(amt, make(bucks.brand, 10n)) || assert.fail(); + t.log('Bob got', amt); + return my.tickets.withdraw(make(tickets.brand, 1n)); + }, + getBalances: () => ({ + bucks: my.bucks.getCurrentAmount(), + tickets: my.tickets.getCurrentAmount(), + }), + }); + }; + // #endregion bobSeller + + // #region makeBucks + const bucksKit = makeIssuerKit('Bucks'); + const { mint: bucksMint, ...bucks } = bucksKit; + Object.assign(shared, { bucks }); + // #endregion makeBucks + + // #region bucksAmount + const bucks100 = AmountMath.make(bucks.brand, 100n); + // #endregion bucksAmount + + // #region bucksPayment100 + const paymentA = bucksMint.mintPayment(bucks100); + // #endregion bucksPayment100 + + // #region bobPayments + const { mint: ticketsMint, ...tickets } = makeIssuerKit('Tickets'); + Object.assign(shared, { tickets }); + + const paymentsB = { + bucks: bucksMint.mintPayment(make(bucks.brand, 200n)), + tickets: ticketsMint.mintPayment(make(tickets.brand, 50n)), + }; + // #endregion bobPayments + + // #region aliceBuysFromBob + const bob = makeSeller(paymentsB); + const alice = makeBuyer({ bucks: paymentA, vendor: bob }); + + const howMuch = (bv, tv) => ({ + bucks: make(bucks.brand, bv), + tickets: make(tickets.brand, tv), + }); + + t.deepEqual(alice.getBalances(), howMuch(100n, 0n)); + t.deepEqual(bob.getBalances(), howMuch(200n, 50n)); + + alice.buyTicket(); + + t.deepEqual(alice.getBalances(), howMuch(90n, 1n)); + t.deepEqual(bob.getBalances(), howMuch(210n, 49n)); + // #endregion aliceBuysFromBob +}); From 53ff2d2d9f0f366c8ec56e893d4d27f16ca42c4b Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sat, 7 Dec 2024 13:27:54 -0600 Subject: [PATCH 2/6] docs(ertp): ERTP walk-thru: Alice buys a ticket from Bob --- main/guides/ertp/index.md | 99 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 97 insertions(+), 2 deletions(-) diff --git a/main/guides/ertp/index.md b/main/guides/ertp/index.md index b53abf4a5..7567de8b4 100644 --- a/main/guides/ertp/index.md +++ b/main/guides/ertp/index.md @@ -1,7 +1,102 @@ # ERTP Overview -ERTP (_Electronic Rights Transfer Protocol_) -is Agoric's token standard for transferring tokens and other digital assets in +ERTP (_Electronic Rights Transfer Protocol_) is Agoric's digital asset standard. + +ERTP is a uniform way of transferring tokens and other digital assets in JavaScript. All kinds of digital assets can be easily created, but importantly, they can be transferred in exactly the same ways, with exactly the same security properties. + +For example, let's suppose Alice wants to buy a concert ticket from Bob for 10 bucks. + +::: tip Watch: erights -- credibly transferable ownership (Oct 2024) +_25 minutes on ERTP at a conceptual level._ +
+ +[diagram of Alice, Bob, Ticket objects](https://www.youtube.com/watch?v=O8Bx_Abj9Qc&list=PLzDw4TTug5O1A-tkPJe4HVq0VBPcNOMHm) + +::: + +## Issuer, Brand, and Mint + +We start by using `makeIssuerKit` to make a `Mint`, `Brand`, and `Issuer` for **Bucks**. + +<<< @/../snippets/ertp/guide/test-readme.js#importErtp +<<< @/../snippets/ertp/guide/test-readme.js#declareShared +<<< @/../snippets/ertp/guide/test-readme.js#makeBucks + +The `bucks.brand` and `bucks.issuer` don't let anyone mint new assets, so sharing +them widely is normal. We must be careful to guard the`bucksMint`, so we keep it separate. + +![ERTP makeIssuerKit API](./assets/ertp-interfaces-1.svg){ width=200 height=200 } + +## Amount: Asset Descriptions + +Next we combine the Bucks brand with a value to make an `Amount`: + +<<< @/../snippets/ertp/guide/test-readme.js#bucksAmount + +Amounts let us _describe_ assets without _using_ them; for example, +to display a price without giving away money. + +:::tip More on Asset Use versus Mention +_See also [The Settlers of Blockchain](https://agoric.com/blog/technology/the-settlers-of-blockchain) by Chris Hibbert, Jun 2021_ +::: + +![Amount class diagram](./assets/ertp-interfaces-2a.svg){ width=200 height=200 } + +## Minting Payments + +Next we use the mint to make a `Payment` of 100 bucks for Alice: + +<<< @/../snippets/ertp/guide/test-readme.js#bucksPayment100 + +Likewise, we make a **Tickets** issuer kit make payments of 10 **Tickets** and 100 **Bucks** +for Bob. + +<<< @/../snippets/ertp/guide/test-readme.js#amountMathProps +<<< @/../snippets/ertp/guide/test-readme.js#bobPayments + +Where Amounts only describe assets, Payments actually convey digital assets/rights. +Sending Payments must be done very carefully. + +## Making Purses + +Alice is acting as a buyer. +She can make her own empty purses using the shared issuers, which she relies on. +She depsits some **Bucks** that she is given into her Bucks purse. + +<<< @/../snippets/ertp/guide/test-readme.js#aliceBuyer1 + +Purses also hold digital assets/rights. +**Purses are normally not sent betwen parties.** + +## Credible Asset Transfer + +To buy a ticket, she withdraws a payment of 10 bucks and make a `buy` request +to some vendor she was given. + +<<< @/../snippets/ertp/guide/test-readme.js#aliceBuyer2 + +The seller has likewise created purses for **Bucks** and **Tickets** and made deposits. +When they get a `buy` request, the argument may be anything, so it's called `allegedPayment`. +But once they deposit it into their Bucks purse, they know it was +a valid Bucks payment, and they know the amount. +Provided the amount is sufficient, they withdraw a ticket (payment) and return it. + +<<< @/../snippets/ertp/guide/test-readme.js#bobSeller + +Now our buyer has an `allegedTicket`. +Once she deposits it in her **Tickets** purse, she knows it was +a valid payment and she knows its value. She can check that she +got at least 1 ticket. + +<<< @/../snippets/ertp/guide/test-readme.js#aliceBuyer3 + +To put it all together: + +<<< @/../snippets/ertp/guide/test-readme.js#aliceBuysFromBob + +--- + +token standard for transferring tokens and other digital assets in JavaScript. Using the [ERTP API](/reference/ertp-api/), you can easily create and use digital assets, all of which are transferred exactly the same way and with exactly the same security properties. From 448982dd411ac5f80fcb2aaafa715a99308f4a2c Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sat, 7 Dec 2024 15:36:48 -0600 Subject: [PATCH 3/6] docs: show fields of IssuerKit --- main/guides/ertp/assets/ertp-interfaces-1.mmd | 6 ++++++ main/guides/ertp/assets/ertp-interfaces-1.svg | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/main/guides/ertp/assets/ertp-interfaces-1.mmd b/main/guides/ertp/assets/ertp-interfaces-1.mmd index 2ffcdbcd2..466e61f38 100644 --- a/main/guides/ertp/assets/ertp-interfaces-1.mmd +++ b/main/guides/ertp/assets/ertp-interfaces-1.mmd @@ -13,6 +13,12 @@ classDiagram } ertp --> IssuerKit : makeIssuerKit + class IssuerKit { + mint: Mint + issuer: Issuer + brand: Brand + } + class Mint { getIssuer() } diff --git a/main/guides/ertp/assets/ertp-interfaces-1.svg b/main/guides/ertp/assets/ertp-interfaces-1.svg index 2c916b5df..7c7f4c4a8 100644 --- a/main/guides/ertp/assets/ertp-interfaces-1.svg +++ b/main/guides/ertp/assets/ertp-interfaces-1.svg @@ -1 +1 @@ -ERTP: Mint, Issuer, Brand
1
1
1
1
1
1
makeIssuerKit
getIssuer
getBrand
IssuerKit
Mint
getIssuer()
Issuer
getBrand()
Brand
@agoric/ertp
...
makeIssuerKit() : IssuerKit
ERTP: Mint, Issuer, Brand
\ No newline at end of file +ERTP: Mint, Issuer, Brand
1
1
1
1
1
1
makeIssuerKit
getIssuer
getBrand
IssuerKit
mint: Mint
issuer: Issuer
brand: Brand
Mint
getIssuer()
Issuer
getBrand()
Brand
@agoric/ertp
...
makeIssuerKit() : IssuerKit
ERTP: Mint, Issuer, Brand
\ No newline at end of file From a4ed4efad1998e94277394dc00fa9c510dce838f Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sat, 7 Dec 2024 15:37:13 -0600 Subject: [PATCH 4/6] docs: screenshot from ERTP talk about buying a ticket --- main/guides/ertp/assets/alice-bob-ticket.png | Bin 0 -> 55788 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 main/guides/ertp/assets/alice-bob-ticket.png diff --git a/main/guides/ertp/assets/alice-bob-ticket.png b/main/guides/ertp/assets/alice-bob-ticket.png new file mode 100644 index 0000000000000000000000000000000000000000..8fbf1aaa34d34852ec25ffa9088e28333cd61854 GIT binary patch literal 55788 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� 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 WOO^V;P{W%50000 Date: Sat, 7 Dec 2024 16:02:40 -0600 Subject: [PATCH 5/6] fixup! docs(ertp): ERTP walk-thru: Alice buys a ticket from Bob --- main/guides/ertp/index.md | 46 ++++++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/main/guides/ertp/index.md b/main/guides/ertp/index.md index 7567de8b4..db2607f82 100644 --- a/main/guides/ertp/index.md +++ b/main/guides/ertp/index.md @@ -25,7 +25,11 @@ We start by using `makeIssuerKit` to make a `Mint`, `Brand`, and `Issuer` for ** The `bucks.brand` and `bucks.issuer` don't let anyone mint new assets, so sharing them widely is normal. We must be careful to guard the`bucksMint`, so we keep it separate. -![ERTP makeIssuerKit API](./assets/ertp-interfaces-1.svg){ width=200 height=200 } +::: tip see also ZCFMint (TODO) + +... + +::: ## Amount: Asset Descriptions @@ -33,15 +37,16 @@ Next we combine the Bucks brand with a value to make an `Amount`: <<< @/../snippets/ertp/guide/test-readme.js#bucksAmount -Amounts let us _describe_ assets without _using_ them; for example, -to display a price without giving away money. +An Amount is a value labeled with a brand. +Amounts are descriptions of digital assets, +answering the questions "how much" and "of what kind". + +Amounts have no economic scarcity or intrinsic value. :::tip More on Asset Use versus Mention _See also [The Settlers of Blockchain](https://agoric.com/blog/technology/the-settlers-of-blockchain) by Chris Hibbert, Jun 2021_ ::: -![Amount class diagram](./assets/ertp-interfaces-2a.svg){ width=200 height=200 } - ## Minting Payments Next we use the mint to make a `Payment` of 100 bucks for Alice: @@ -94,7 +99,34 @@ To put it all together: <<< @/../snippets/ertp/guide/test-readme.js#aliceBuysFromBob ---- +## Non-Fungible and Semi-Fungible Assets + +::: tip: TODO: Non-Fungible and Semi-Fungible Assets + +... + +::: + +## ERTP Concepts Overview + +Each digital asset has Mint, Issuer, and Brand facets: + +![ERTP Interfaces 1](./assets/ertp-interfaces-1.svg){ width=200 height=200 } + +Use brands to make amounts. + +Use a Mint to create Payments. Use an Issuer to make Purses. +Deposit payments into purses and withdraw them back out. + +![ERTP makeIssuerKit API](./assets/ertp-interfaces-2.svg) + +Fungible and non-fungible kinds of assets are handled uniformly. + +![ERTP object relationships](./assets/ertp-interfaces-3.svg) + +# Obsolete material + +_aside from TODOs above_ token standard for transferring tokens and other digital assets in JavaScript. Using the [ERTP API](/reference/ertp-api/), @@ -107,8 +139,6 @@ object, it can call methods on that object. If it doesn't have a reference, it can't. For more on object capabilities, see [Chip Morningstar's post](http://habitatchronicles.com/2017/05/what-are-capabilities/). -## ERTP Concepts Overview - ### Asset There are three kinds of assets: From c55d3c61dc96a6c5950c517395fb9089972e8077 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 11 Dec 2024 15:30:37 -0600 Subject: [PATCH 6/6] docs(glossary): DebugName, with Alleged / AllegedName as aliases --- main/glossary/index.md | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/main/glossary/index.md b/main/glossary/index.md index 946922bb9..b8be06b4d 100644 --- a/main/glossary/index.md +++ b/main/glossary/index.md @@ -14,13 +14,11 @@ A short form of [agoric-3-proposals](https://github.com/Agoric/agoric-3-proposal A command line interface for initializing, deploying, and starting Agoric projects, as well as installing dependencies. See the [Agoric CLI documentation](/guides/agoric-cli/) for more information. -## AllegedName +## Alleged -Human-readable name of a type of assets. The alleged name should -not be trusted as an accurate depiction, since it is provided by -the maker of the mint and could be deceptive, but is useful for debugging and double-checking. + -The AllegedName must be a string. +See [DebugName](#debugname). ## Allocation @@ -210,6 +208,20 @@ An [invitation](#invitation) optionally returned by [`E(zoe).startInstance(...)` creator can use. It is usually used in contracts where the creator immediately sells something (auctions, swaps, etc.). +## DebugName + +A label for debugging / diagnostic purposes. aka Alleged name. +Since debug names may be misleading, +**no code should rely on an Alleged / DebugName for correctness.** + +See: + +- [Exo tags](/guides/zoe/contract-details#tag-naming-kinds-of-objects), + which are used as debug names. +- [ERTP](/guides/ertp/) where Brand objects, not string names, + are used to reliably identify digital assets. +- [Remotable in @endo/pass-style](https://endojs.github.io/endo/functions/_endo_pass_style.Remotable.html), where labels are bound to objects. + ## Deposit Facet A [facet](#facet) of a [purse](#purse). Anyone with a reference to its deposit facet object can add