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-queryPublic 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
| Contract | ABI | Address in the deployment record |
|---|---|---|
| AsseteraECS | yes | yes, per chain |
| AsseteraPrimarySales | yes | yes, per chain |
| Forwarder (ERC-2771) | yes | yes, per chain |
| AsseteraIssuanceVenue | yes | no, 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
| Contract | Address (integrate against this) |
|---|---|
| AsseteraECS | 0xf045d3FE81C14d8c13DbaB0b03a4Ea1505e499ad |
| AsseteraPrimarySales | 0xF62757dd232DC7582A5d46F62aAcDb6B739223Dc |
| Forwarder | 0x2244B33a97f91284D53d0A12d42F237927C3DBf7 |
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.
| Contract | Implementation (changes on every upgrade) |
|---|---|
| AsseteraECS | 0xF2f8Dfd9bbc1AD2A78447A0196deC84e3397737B |
| AsseteraPrimarySales | 0xB6De6C29f039ed53e993f916961A758D32C13c11 |
Chain ID 137 · CAIP-2 eip155:137 · deployed at block 92,344,157
| Contract | Address (integrate against this) |
|---|---|
| AsseteraECS | 0xf045d3FE81C14d8c13DbaB0b03a4Ea1505e499ad |
| AsseteraPrimarySales | 0xF62757dd232DC7582A5d46F62aAcDb6B739223Dc |
| Forwarder | 0x2244B33a97f91284D53d0A12d42F237927C3DBf7 |
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.
| Contract | Implementation (changes on every upgrade) |
|---|---|
| AsseteraECS | 0xB6De6C29f039ed53e993f916961A758D32C13c11 |
| AsseteraPrimarySales | 0xCb0ef38528fd695116B745722d7d03485584175F |
Chain ID 80002 · CAIP-2 eip155:80002 · deployed at block 45,229,125
| Contract | Address (integrate against this) |
|---|---|
| AsseteraECS | 0xf045d3FE81C14d8c13DbaB0b03a4Ea1505e499ad |
| AsseteraPrimarySales | 0xF62757dd232DC7582A5d46F62aAcDb6B739223Dc |
| Forwarder | 0x2244B33a97f91284D53d0A12d42F237927C3DBf7 |
| MockRWA | 0xECe9f75Eb6af58B7c70773BbC5922E49fD65F3E0 |
| MockUSDC | 0x85D7B2569b3d69320F05A4FFB140Ca4521989A15 |
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.
| Contract | Implementation (changes on every upgrade) |
|---|---|
| AsseteraECS | 0xB6De6C29f039ed53e993f916961A758D32C13c11 |
| AsseteraPrimarySales | 0xC0c7F32806a8C99287151B7F4886Ef2CDEFf2C7d |
Chain ID 11155111 · CAIP-2 eip155:11155111 · deployed at block 11,514,803
| Contract | Address (integrate against this) |
|---|---|
| AsseteraECS | 0xf045d3FE81C14d8c13DbaB0b03a4Ea1505e499ad |
| AsseteraPrimarySales | 0xF62757dd232DC7582A5d46F62aAcDb6B739223Dc |
| Forwarder | 0x2244B33a97f91284D53d0A12d42F237927C3DBf7 |
| MockRWA | 0xECe9f75Eb6af58B7c70773BbC5922E49fD65F3E0 |
| MockUSDC | 0x85D7B2569b3d69320F05A4FFB140Ca4521989A15 |
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.
| Contract | Implementation (changes on every upgrade) |
|---|---|
| AsseteraECS | 0xB6De6C29f039ed53e993f916961A758D32C13c11 |
| AsseteraPrimarySales | 0xC0c7F32806a8C99287151B7F4886Ef2CDEFf2C7d |
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 parseEventLogsThe 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>.jsonEach 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
| Import | For | Runtime deps |
|---|---|---|
@asseteragmbh/evm-contracts | services: ABIs, addresses, createExchangeClient | viem |
@asseteragmbh/evm-contracts/contracts | indexer / non-viem: ABIs plus address helpers | none |
@asseteragmbh/evm-contracts/react | front ends: wagmi hooks, address auto-resolved | wagmi, react |
Next
AsseteraECS
AsseteraECS (Execution, Clearing and Settlement): the escrow-based, UUPS-upgradeable, gasless, compliance-gated order and offer book behind Assetera trading.
Order lifecycle
The AsseteraECS order state machine, place, fill, cancel and expire, with what each step escrows, what it attests, and which event records it.