Run our Testnet Demo in 5 minutes:

Tatyana Roberts
Oct 16 · 5 min read

Presenting an end-to-end test of the Agoric stack

We’ve created a functioning Agoric demo that you can work within, showcasing our electronic rights technology. The demo takes the form of buying and selling pixels, inspired by Reddit’s r/Place experiment. Yes, in our demo you’re just buying and selling pixels, but you can also easily imagine that each pixel is an abstract of some greater property, such as an electronic ticket, rights to digital art, or some other digital asset.

What you’re experiencing is very much a work-in-progress. We are inviting you to #buidl on our testnet as we build it. This requires a provisioning code. If you have it, proceed with the instructions below, and if you don’t, get in touch by signing up here. We’ll reply shortly.

Let’s get started

Requirements

You can run the Pixel Demo right from your browser. There are different scenarios of how you can run the Pixel Demo, but with docker, you will need to install:

Next, run:

git clone git@github.com:Agoric/cosmic-swingset.git

cd cosmic-swingset

SOLO_NAME=han ./docker/ag-setup-solo --pull

This command will prompt you for the testnet provisioning code. Enter it and then connect to http://localhost:8000

The 5 minute Demo: Part 1: Coloring the Pixel

1.1: Access Gallery

To access the gallery, type home.gallery in the REPL.

home.gallery is a remote object, we call a presence.

It actually lives in another environment, what we call a vat.

Instead of obj.foo(), you can talk asynchronously to local and remote objects in exactly the same way in two ways:

E(obj).foo()
obj~.foo() — new syntax — ‘wavy dot’ (syntactic sugar)

This syntax means:

“deliver the message foo() to the actual object asynchronously, in its own turn, wherever and whenever it is, even if it is local.”

1.2: Get a free pixel

Let’s use this to call tapFaucet()

px = home.gallery~.tapFaucet()

This returns a pixel and saves it under px. You will see unresolved Promise, until your pixel is returned from the testnet:

The pixel that you receive is actually in the form of an ERTP payment. ERTP (Electronic Rights Transfer Protocol) is our smart contract framework for handling transferable objects. Payments have a few functions.

1.3: Get pixel information

Call

px~.getBalance()

on our payment to see which pixel we received.

Here, we received pixel x:2 y:2 on the grid (3 across, 3 down).

1.4: Get use object

To color the pixel, we need to get the use object from the payment. Run:

use = px~.getUse()

(You can think of the use object as a regular JavaScript object that just happens to be associated with an ERTP payment)

Now we can use the use object to color our x:2, y:2 pixel:

1.5: Color our pixel

Let’s make it pink:

use~.changeColorAll('#FF69B4')

Success! Pretty in pink.

PART 2: Selling my pixel

2.1: Now I need to sell my pixel. Again, let’s get the pixel location, but this time, save to amt:

amt = px~.getBalance();

2.2: Now I need to get the exact price of this pixel (hopefully it’s worth more now it’s pink):

amt.then(a => home.gallery~.pricePixelAssetDesc(a));

2.3: 5 is the price. Let’s start the sales process. Here I tell the gallery that I have a pixel to sell:

hostInvite = home.gallery~.sellToGallery(amt);

2.4: I received the “invite”, which I can redeem for a seat. Think of it like showing your ID before being allowed to start selling.

seat = hostInvite~.host~.redeem(hostInvite~.inviteP);

2.5: From my seat, I now get the offer for this pixel.

offered = seat~.offer(px);

2.6: Get assays:

assays = home.gallery~.getAssays();

2.7: Get an empty pixel purse from the assay:

pxPurse = assays~.pixelAssay~.makeEmptyPurse();

2.8: Your home.purse is an empty purse for receiving dust. If you wanted to make another one, then run:

dustPurse = assays~.dustAssay~.makeEmptyPurse();

2.9: Setup the agreement and make the transaction:

collected = Promise.all([offered, dustPurse, pxPurse]).then(_ => home.gallery~.collectFromGallery(seat, dustPurse, pxPurse, 'my escrow'));

2.10: Show the final amount in the dustPurse once the transaction is complete:

collected.then(_ => dustPurse~.getBalance());

Your pixel is sold and the transaction is written to the chain. Voila! Yes, the testnet is still rough, but just think of all the things you’ll be able to build in it down the road.

The Agoric testnet material can be found on our GitHub. Remember, you will need a provisioning code during the setup process. If you don’t have one, you can reach out to me directly on Telegram at @tatyana_agoric.

Thanks for reading! You can join the Agoric community on Twitter, Telegram, LinkedIn, and catch us at these upcoming events.

Agoric

Secure smart contracts

Tatyana Roberts

Written by

Keeping chaos at the bay @agoric

Agoric

Agoric

Secure smart contracts

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade