> ## 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

## 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:

```bash theme={null}
goldsky compose start --fork-chains
```

This creates in-memory forks of all chains you interact with, powered by [TEVM](https://tevm.sh). 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](./environments#forking-for-local-compose-development) for more details.

### Testing individual tasks

You can trigger any task on your locally-running app by name with a JSON payload:

```bash theme={null}
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](./deploy-monitor#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

```typescript highlight={23-27} theme={null}
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

<CardGroup cols={2}>
  <Card title="Deploying your App" icon="file-code" href="./deploy-monitor">
    Learn about deploying your app to the cloud for production use cases.
  </Card>

  <Card title="Full CLI Reference" icon="parentheses" href="./cli-reference">
    View the full CLI command reference
  </Card>
</CardGroup>
