Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.goldsky.com/llms.txt

Use this file to discover all available pages before exploring further.

Debugging locally

Logs and run events stream to the terminal where you run goldsky compose start. Output is formatted and colored so it’s easy to scan.

Chain forking

For testing against live on-chain state without spending gas, start your app with the --fork-chains flag:
goldsky compose start --fork-chains
This creates in-memory forks of all chains you interact with, powered by TEVM. All wallets are automatically funded with test ETH, so you can freely test contract interactions. Your task code stays exactly the same as in production — no special dev code needed. See Environments for more details.

Testing individual tasks

You can trigger any task on your locally-running app by name with a JSON payload:
goldsky compose callTask my_task '{"key": "value"}'
The payload must be valid JSON — callTask posts it to the local server at http://localhost:4000/tasks/<name> and prints the response.

Debugging a Deployed Compose App

Once your app is running in the cloud, debug it from its details page in the web app at https://app.goldsky.com/dashboard/compose/{appName}. From there you can view logs and inspect task run records. See Monitoring your app via the webapp for a walkthrough. Every context function call (for example evm.wallet(), evm.writeContract(...), ctx.db.collection(...)) is automatically captured as a run event and shown in the task run view. You can add your own logs and errors with the standard TypeScript console — they show up alongside the run events.

Examples

import { TaskContext } from "compose";

export async function main(
  { evm }: TaskContext,
  params: { payouts: bigint[]; resultId: string }
) {
  try {
    const { payouts, resultId } = params;

    console.log("Reporting payouts", payouts, resultId);

    const wallet = await evm.wallet();
    const { hash } = await wallet.writeContract(
      evm.chains.polygon,
      "0x1234567890abcdef1234567890abcdef12345678" as `0x${string}`,
      "reportPayouts(bytes32,uint256[])",
      [resultId, payouts]
    );

    return { hash };
  } catch (error) {
    if (error instanceof Error && error.message.includes("payout denominator already set")) {
      console.log("Payout denominator already set, marking as resolved");
    } else {
      console.error("Error reporting payout", error);
      throw error;
    }
  }
}

Next Steps

Deploying your App

Learn about deploying your app to the cloud for production use cases.

Full CLI Reference

View the full CLI command reference