stacksdapp-codegen 0.2.0

TypeScript code generation engine for Stacks dApps, using Tera templates to create type-safe contract hooks.
Documentation
// AUTO-GENERATED by scaffold-stacks. DO NOT EDIT.
// Re-run `stacksdapp generate` to update.

import { request } from '@stacks/connect';
import { fetchCallReadOnlyFunction, cvToValue, ClarityValue } from '@stacks/transactions';
import { getReadOnlyNetwork, scaffoldConfig } from '../scaffold.config';
import { callDevnetContract, getDevnetSenderAddress } from '../lib/devnet';

let _deployments: Record<string, any> = { contracts: {} };
try { _deployments = require('./deployments.json'); } catch {}

function getContractId(name: string): { address: string; contractName: string } {
  const contractId: string = _deployments?.contracts?.[name]?.contract_id ?? '';
  if (!contractId) {
    console.warn(`[scaffold-stacks] "${name}" not deployed. Run stacksdapp deploy.`);
    return { address: '', contractName: name };
  }
  const dot = contractId.lastIndexOf('.');
  return { address: contractId.slice(0, dot), contractName: contractId.slice(dot + 1) };
}

{% for contract in contracts %}
// ── {{ contract.contract_name }} ──────────────────────

{% for fn in contract.functions %}
{% if fn.access == "public" %}
export async function {{ contract.contract_name | camel }}_{{ fn.name | camel }}(
  functionArgs: ClarityValue[] = [],
  postConditions: any[] = [],
): Promise<any> {
  const { address, contractName } = getContractId('{{ contract.contract_name }}');
  if (!address) return undefined;
  if (scaffoldConfig.isDevnet) {
    return callDevnetContract({
      contract: `${address}.${contractName}`,
      functionName: '{{ fn.name }}',
      functionArgs,
      postConditions,
    });
  }
  // v8: request() accepts ClarityValue[] directly — no serialization needed
  return request('stx_callContract', {
    contract: `${address}.${contractName}`,
    functionName: '{{ fn.name }}',
    functionArgs,
    postConditions,
    postConditionMode : 'allow',
    network: scaffoldConfig.targetNetwork,
  });
}
{% endif %}
{% if fn.access == "read_only" %}
export async function {{ contract.contract_name | camel }}_{{ fn.name | camel }}(
  functionArgs: ClarityValue[] = [],
  senderAddress?: string
): Promise<unknown> {
  const { address, contractName } = getContractId('{{ contract.contract_name }}');
  if (!address) return null;
  const result = await fetchCallReadOnlyFunction({
    contractAddress: address,
    contractName,
    functionName: '{{ fn.name }}',
    functionArgs,
    network: getReadOnlyNetwork(),
    senderAddress: senderAddress ?? getDevnetSenderAddress() ?? address,
  });
  return cvToValue(result);
}
{% endif %}
{% endfor %}
{% endfor %}