Assetera Docs
Smart contracts

TypeScript SDK

Consume AsseteraECS with @asseteragmbh/evm-contracts: ABIs, per-chain addresses, a viem client, and wagmi hooks, all generated from the contract.

@asseteragmbh/evm-contracts is the one dependency you need to talk to AsseteraECS and to the primary-sale contracts. It ships the ABIs, the deployed addresses per chain, a viem client, and wagmi hooks, all generated from the Solidity source in the public Assetera-AG/AsseteraEvmContracts repo. Nothing is hand-copied, so it never drifts from what is on chain. The package source and its generator config live in packages/sdk.

npm i @asseteragmbh/evm-contracts viem
# for the React hooks also:
npm i wagmi @tanstack/react-query

Public package

The package is published public on npmjs: no auth token, no .npmrc entry, nothing to request. The source is public too, in the repo linked above.

Which contracts it carries

ContractABIAddress in the deployment record
AsseteraECSyesyes, per chain
AsseteraPrimarySalesyesyes, per chain
Forwarder (ERC-2771)yesyes, per chain
AsseteraIssuanceVenueyesno, and deliberately

An issuance venue is deployed one per offering, so it has no fixed address to publish. Its ABI ships so you can decode and read it; the address of a specific offering's venue reaches you through the catalog and through the signed settlement intent, never from the deployment record.

Check the package's own exports for symbol names

The generated symbol names follow the contract names, and the set grows with each release. Read them from the installed package rather than from this page, which lists the entry points but not every export.

Deployments

Every address here comes straight from the installed package, so it matches exactly what your app resolves. One tab per network the package carries; the SDK resolves all of them by chain id.

Addresses exactly as published in @asseteragmbh/evm-contracts, the version these docs are built against.

Chain ID 1 · CAIP-2 eip155:1 · deployed at block 25,795,740

ContractAddress (integrate against this)
AsseteraECS0xf045d3FE81C14d8c13DbaB0b03a4Ea1505e499ad
AsseteraPrimarySales0xF62757dd232DC7582A5d46F62aAcDb6B739223Dc
Forwarder0x2244B33a97f91284D53d0A12d42F237927C3DBf7

Behind the proxy. The addresses above are the stable ones. The UUPS implementation below is what the proxy currently delegates to. It is useful for verifying the deployed bytecode, but it changes on every upgrade, so never hardcode it.

ContractImplementation (changes on every upgrade)
AsseteraECS0xF2f8Dfd9bbc1AD2A78447A0196deC84e3397737B
AsseteraPrimarySales0xB6De6C29f039ed53e993f916961A758D32C13c11

Chain ID 137 · CAIP-2 eip155:137 · deployed at block 92,344,157

ContractAddress (integrate against this)
AsseteraECS0xf045d3FE81C14d8c13DbaB0b03a4Ea1505e499ad
AsseteraPrimarySales0xF62757dd232DC7582A5d46F62aAcDb6B739223Dc
Forwarder0x2244B33a97f91284D53d0A12d42F237927C3DBf7

Behind the proxy. The addresses above are the stable ones. The UUPS implementation below is what the proxy currently delegates to. It is useful for verifying the deployed bytecode, but it changes on every upgrade, so never hardcode it.

ContractImplementation (changes on every upgrade)
AsseteraECS0xB6De6C29f039ed53e993f916961A758D32C13c11
AsseteraPrimarySales0xCb0ef38528fd695116B745722d7d03485584175F

Chain ID 80002 · CAIP-2 eip155:80002 · deployed at block 45,229,125

ContractAddress (integrate against this)
AsseteraECS0xf045d3FE81C14d8c13DbaB0b03a4Ea1505e499ad
AsseteraPrimarySales0xF62757dd232DC7582A5d46F62aAcDb6B739223Dc
Forwarder0x2244B33a97f91284D53d0A12d42F237927C3DBf7
MockRWA0xECe9f75Eb6af58B7c70773BbC5922E49fD65F3E0
MockUSDC0x85D7B2569b3d69320F05A4FFB140Ca4521989A15

Behind the proxy. The addresses above are the stable ones. The UUPS implementation below is what the proxy currently delegates to. It is useful for verifying the deployed bytecode, but it changes on every upgrade, so never hardcode it.

ContractImplementation (changes on every upgrade)
AsseteraECS0xB6De6C29f039ed53e993f916961A758D32C13c11
AsseteraPrimarySales0xC0c7F32806a8C99287151B7F4886Ef2CDEFf2C7d

Chain ID 11155111 · CAIP-2 eip155:11155111 · deployed at block 11,514,803

ContractAddress (integrate against this)
AsseteraECS0xf045d3FE81C14d8c13DbaB0b03a4Ea1505e499ad
AsseteraPrimarySales0xF62757dd232DC7582A5d46F62aAcDb6B739223Dc
Forwarder0x2244B33a97f91284D53d0A12d42F237927C3DBf7
MockRWA0xECe9f75Eb6af58B7c70773BbC5922E49fD65F3E0
MockUSDC0x85D7B2569b3d69320F05A4FFB140Ca4521989A15

Behind the proxy. The addresses above are the stable ones. The UUPS implementation below is what the proxy currently delegates to. It is useful for verifying the deployed bytecode, but it changes on every upgrade, so never hardcode it.

ContractImplementation (changes on every upgrade)
AsseteraECS0xB6De6C29f039ed53e993f916961A758D32C13c11
AsseteraPrimarySales0xC0c7F32806a8C99287151B7F4886Ef2CDEFf2C7d

Quickstart

Pick the entry point for your app. The AsseteraECS address is resolved by chain id in every path, so you never hardcode it.

The generated hooks resolve the address from the connected chain, so you pass no address.

import { useReadAsseteraEcsTotalOrders } from '@asseteragmbh/evm-contracts/react';

function Orders() {
  const { data } = useReadAsseteraEcsTotalOrders(); // address auto-resolved per chain
  return <span>{data?.toString()}</span>;
}

Wrap the app in the usual wagmi WagmiProvider and QueryClientProvider, configured for the chain you deploy to.

createExchangeClient returns a viem contract bound to the right address for the chain.

import { createPublicClient, http } from 'viem';
import { polygonAmoy } from 'viem/chains';
import { createExchangeClient } from '@asseteragmbh/evm-contracts';

const publicClient = createPublicClient({ chain: polygonAmoy, transport: http() });
const exchange = createExchangeClient({ chainId: 80002, publicClient });

const version = await exchange.read.version();
const total = await exchange.read.totalOrders();

The /contracts entry is pure data (ABIs plus address helpers) with no viem or wagmi pulled in, so it is safe for a Subsquid processor.

import { asseteraEcsAbi, getContractAddress } from '@asseteragmbh/evm-contracts/contracts';

const address = getContractAddress(80002, 'AsseteraECS');
// feed asseteraEcsAbi to your log decoder / viem parseEventLogs

The raw deployment JSON ships inside the package, so a non-TypeScript service reads addresses without a code generator.

node_modules/@asseteragmbh/evm-contracts/dist/deployments/<chainId>.json

Each file carries chainId, caip2, namespace, the contracts addresses, and deploy metadata.

Live state

These docs read the Polygon Amoy deployment live, using the same ABI and address the SDK hands your app. Swap the chain id for any other deployed network above:

Reading AsseteraECS live…

Entry points

ImportForRuntime deps
@asseteragmbh/evm-contractsservices: ABIs, addresses, createExchangeClientviem
@asseteragmbh/evm-contracts/contractsindexer / non-viem: ABIs plus address helpersnone
@asseteragmbh/evm-contracts/reactfront ends: wagmi hooks, address auto-resolvedwagmi, react

Next

On this page