Examples

Address-native client flows for common Makechain operations.

Protocol writes with @makechain/viem

import { createPublicClient, http } from "viem";
import { createEd25519Signer, makechainActions } from "@makechain/viem";

const signer = createEd25519Signer("0x<32-byte-ed25519-private-key>");

const client = createPublicClient({ transport: http() }).extend(
  makechainActions({
    gatewayUrl: "https://api.makechain.net",
    network: "testnet",
    ownerAddress: "0x0000000000000000000000000000000000000001",
    signer,
  }),
);

await client.projects.create({
  ownerAddress: "0x0000000000000000000000000000000000000001",
  signer,
  name: "my-project",
  visibility: "public",
});

Verification example

await client.verification.add({
  ownerAddress: "0x0000000000000000000000000000000000000001",
  signer,
  verificationType: "eth_address",
  address: "0x0000000000000000000000000000000000000001",
  claimSignature: "0x<claim-signature>",
});

Lifted registration flow

const rent = await client.identity.rentStorage({
  ownerAddress: "0x0000000000000000000000000000000000000001",
  walletClient,
  publicClient,
  units: 1,
});

console.log(rent.claimStatus); // "pending_relayer"

const registration = await client.identity.waitForStorageClaim({
  ownerAddress: "0x0000000000000000000000000000000000000001",
  timeoutMs: 120_000,
});

if (registration.stage === "ready_for_username") {
  await client.identity.usernameCreate({
    ownerAddress: "0x0000000000000000000000000000000000000001",
    signer,
    username: "alice",
  });
}

Commit and ref example

await client.commits.submitBundle({
  ownerAddress: "0x0000000000000000000000000000000000000001",
  signer,
  projectId: "<64-char-project-id-hex>",
  commits: [
    {
      hash: "<64-char-commit-hash>",
      treeRoot: "<64-char-tree-root>",
      authorAddress: "0x0000000000000000000000000000000000000001",
      authorTimestamp: Math.floor(Date.now() / 1000),
      title: "feat: first commit",
      messageHash: "<64-char-message-hash>",
    },
  ],
});

await client.commits.updateRef({
  ownerAddress: "0x0000000000000000000000000000000000000001",
  signer,
  projectId: "<64-char-project-id-hex>",
  refName: "refs/heads/main",
  newHash: "<64-char-commit-hash>",
  nonce: 1n,
});

Read-side note

Gateway read routes in the active stack are owner-address-native. Use RPC reference for the canonical request and response field names.

Merge request example

Merge request reads use the viem client (REST gateway), while writes use the SDK (message construction and signing).

Read merge requests with the viem client:

// List merge requests targeting a project
const mrs = await client.mergeRequests.list({
  projectId: "<64-char-project-id-hex>",
});

// Get a specific merge request
const mr = await client.mergeRequests.get({
  projectId: "<64-char-project-id-hex>",
  requestId: "<64-char-request-id-hex>",
});

// List merge requests opened by an account
const myMrs = await client.mergeRequests.listByRequester({
  ownerAddress: "0x0000000000000000000000000000000000000001",
});

Write merge requests with the SDK:

import { createClient } from "@makechain/sdk";

const client = createClient({
  endpoint: "https://api.makechain.net",
  network: "testnet",
});

// Open a merge request from a fork
await client.mergeRequestAdd(keypair, ownerAddress, {
  projectId: "<upstream-project-id>",
  sourceProjectId: "<fork-project-id>",
  sourceRef: "refs/heads/feature",
  sourceCommitHash: "<64-char-commit-hash>",
  targetRef: "refs/heads/main",
  title: "Add new feature",
});

// Close a merge request (requester withdrawal or maintainer closure)
await client.mergeRequestRemove(keypair, ownerAddress, {
  projectId: "<upstream-project-id>",
  requestId: "<64-char-request-id>",
});