Skip to content
LogoLogo

Go SDK

The mpp-go library

Overview

The mpp-go library provides a typed interface over the Machine Payments Protocol, from high-level abstractions to low-level primitives and building blocks.

Install

install.sh
$ go get github.com/tempoxyz/mpp-go

Requirements

  • Go 1.21+
  • go-ethereum for Tempo signing

Quick start

Server

server.go
package main
 
import (
	"encoding/json"
	"log"
	"net/http"
	"os"
 
	"github.com/tempoxyz/mpp-go/pkg/server"
	charge "github.com/tempoxyz/mpp-go/pkg/tempo/server"
)
 
func main() {
	intent, _ := charge.NewIntent(charge.IntentConfig{
		RPCURL: "https://rpc.tempo.xyz",
	})
	method := charge.NewMethod(charge.MethodConfig{
		Intent:    intent,
		Recipient: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
	})
	payment := server.New(method, "api.example.com", os.Getenv("MPP_SECRET_KEY"))
 
	mux := http.NewServeMux()
	mux.Handle("/resource", server.ChargeMiddleware(payment, server.ChargeParams{
		Amount:      "0.50",
		Description: "Paid resource",
	})(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		credential := server.CredentialFromContext(r.Context())
		json.NewEncoder(w).Encode(map[string]any{
			"data":  "paid content",
			"payer": credential.Source,
		})
	})))
 
	log.Fatal(http.ListenAndServe(":3000", mux))
}

Client

client.go
package main
 
import (
	"context"
	"fmt"
	"log"
	"os"
 
	"github.com/tempoxyz/mpp-go/pkg/client"
	charge "github.com/tempoxyz/mpp-go/pkg/tempo/client"
)
 
func main() {
	method, err := charge.New(charge.Config{
		PrivateKey: os.Getenv("MPP_PRIVATE_KEY"),
		RPCURL:     "https://rpc.tempo.xyz",
	})
	if err != nil {
		log.Fatal(err)
	}
	c := client.New([]client.Method{method})
 
	resp, err := c.Get(context.Background(), "https://api.example.com/resource")
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	fmt.Println("Status:", resp.StatusCode)
}

Package layout

PackageDescription
pkg/clientHTTP client with automatic 402 handling
pkg/mppCore protocol primitives (Challenge, Credential, Receipt)
pkg/serverServer-side payment handler and middleware
pkg/server/echoEcho framework middleware
pkg/server/ginGin framework middleware
pkg/tempo/clientTempo charge client method
pkg/tempo/serverTempo charge server method

Next steps