@aromedia/contracts-sdk
v1.0.4
Published
TypeScript SDK for the Aro Media on-chain ecosystem (SBT identity, nomination, RWA, registry, multisig, forced transfer).
Readme
@aromedia/contracts-sdk
TypeScript SDK for the Aro Media on-chain ecosystem. Wraps every contract in aromedia-blockchain-contracts (SBT identity, nomination workflow, RWA security token, assets registry, access manager, multisig, forced-transfer manager) behind a single typed API.
Designed for both server-side use (deploy helpers, indexers, jobs) and the Next.js dapp. React-specific code is gated behind a sub-path so consumers that don't need wagmi don't pull React in.
npm install @aromedia/contracts-sdkQuick start
Core (server, scripts, anything non-React)
import { createAroSdk, sepolia } from "@aromedia/contracts-sdk";
const sdk = createAroSdk({ chain: sepolia });
const isMember = await sdk.sbt.read.hasSBT([userAddress]);React / wagmi
import { useMembership } from "@aromedia/contracts-sdk/hooks";
const { data, isLoading } = useMembership(account);
// data.step ∈ "needs-wallet" | "needs-nomination" | "needs-vouches"
// | "needs-kyc" | "needs-admin-mint" | "member"Onboarding (aligned with the ARO KYC/AML/CFT Policy)
import {
describeOnboardingState,
nominateCandidate,
vouchForCandidate,
mintSBTForApproved,
hashKycResult,
AroTier,
} from "@aromedia/contracts-sdk";
await nominateCandidate(sdk, candidateAddress);
await vouchForCandidate(sdk, candidateAddress);
const kycHash = hashKycResult({
provider: "didit",
sessionId,
status: "verified",
verifiedAt,
walletAddress: candidateAddress,
});
await mintSBTForApproved(sdk, {
to: candidateAddress,
kycHash,
metadataURI: "ipfs://...",
tier: AroTier.STANDARD,
});Entry points
| Import path | What it gives you |
| :------------------------------------ | :------------------------------------------------ |
| @aromedia/contracts-sdk | Clients, workflows, utils, types — no React |
| @aromedia/contracts-sdk/hooks | wagmi React hooks (peer dep on wagmi + react) |
| @aromedia/contracts-sdk/abis | Raw ABIs only (tree-shake friendly, zero runtime) |
| @aromedia/contracts-sdk/addresses | Per-chain deployed-address registry |
| @aromedia/contracts-sdk/chains | Chain configs the SDK supports |
| @aromedia/contracts-sdk/workflows | High-level domain helpers |
Development
Repository layout
aromediainc/
├── sdks/contracts-sdk/ ← this repo
└── aromedia-blockchain-contracts/ ← sibling; source of ABIs + deployment addressesThe SDK ships generated ABIs and addresses under src/generated/, so installing the published package does NOT require Hardhat. The generator is only needed when contracts change.
Regenerating from the contracts repo
# in aromedia-blockchain-contracts/
npm run compile # rebuild Hardhat artifacts
# in this repo
npm run generate # reads sibling contracts repo, writes src/generated/
npm run build # bundle dist/
npm run typecheckYou can override the contracts repo location with CONTRACTS_REPO_PATH:
CONTRACTS_REPO_PATH=/path/to/aromedia-blockchain-contracts npm run generateReleasing
This repo uses Changesets for semver-driven releases.
- After your change, run
npm run changesetand describe the change (patch/minor/major). - Commit the resulting file under
.changeset/alongside your code. - When the PR merges to
main, thereleaseworkflow opens (or updates) a "Version Packages" PR that consumes pending changesets and bumps the version + CHANGELOG. - Merging the Version Packages PR triggers the publish step, which builds and runs
changeset publishagainst npm.
CI
ci.yml— typecheck + build on every PR.release.yml— Version PR + npm publish onmain.sync-abis.yml— nightly job that clones the contracts repo, regenerates ABIs/addresses, and opens a PR if anything changed.
License
MIT © Aro Media Inc.
