Skip to content

Understanding the Agoric Postal Service Contract

This contract is implemented using the Zoe Contract Facet (ZCF) and demonstrates how to create and manage a basic postal service. Let's break down the main components and functionalities of this contract.

Contract Structure and Components

1. Contract Setup:

The contract starts with a setup that includes the terms of the service, typically the price of joining the postal service. This setup is done through the start function, which is a standard entry point for Agoric contracts. The function initializes the service and sets up any required assets or parameters.

javascript
export const start = async (zcf) => {
    const { joinPrice } = zcf.getTerms();
    const { zcfSeat: postalSeat } = zcf.makeEmptySeatKit();
    const mint = await zcf.makeZCFMint('PostalToken', AssetKind.NAT);
    
    // Other initialization logic
};

2. Minting and Managing Assets:

The contract utilizes the ZCFMint object to mint new tokens or assets. In this example, tokens are created to represent the postal services or stamps.

javascript
const mint = await zcf.makeZCFMint('PostalToken', AssetKind.COPY_BAG);

3. Handling User Requests:

User interactions with the contract are managed through invitations. These invitations allow users to perform specific actions, such as joining the postal service or sending a package.

javascript
const joinHandler = userSeat => {
    const { give, want } = userSeat.getProposal();
    
    // Ensure the payment is sufficient
    assert(give.Price.value >= joinPrice.value, 'Insufficient payment');
    
    // Process the request and update the contract state
    userSeat.exit();
    return 'Welcome to the postal service';
};

const publicFacet = Far('API', {
    makeJoinInvitation: () => zcf.makeInvitation(joinHandler, 'Join Postal Service'),
});

4. Public Facet:

The public facet of the contract exposes the functionality that external users can interact with. In this contract, users can create invitations to join the postal service.

javascript
return { publicFacet };

Deploying and Interacting with the Contract

To deploy this contract, developers use the Agoric CLI tools. The process typically involves bundling the contract code, deploying it to the blockchain, and setting up any necessary client-side interfaces to interact with the contract.

1. Deployment Script:

The deployment script automates the process of installing the contract on the blockchain.

javascript
const deploy = async (homeP) => {
    const { zoe } = homeP;
    const bundle = await bundleSource('./src/contract.js');
    const installation = await E(zoe).install(bundle);
    console.log('Contract installed:', installation);
};

2. Client Interaction:

Users interact with the deployed contract through a web interface or directly using CLI commands. They can create and use invitations to join the service, make payments, and manage their assets.