Skip to main content
Version: 6.11.0

Automatic TypeScript parsing of Cairo ABI-s

Starknet.js has integrated Abi-Wan-Kanabi, the standalone TypeScript parser for Cairo smart contracts.

It enables on-the-fly typechecking and autocompletion for contract calls directly in TypeScript. Developers can now catch typing mistakes early, prior to executing a call on-chain, thus enhancing the overall DAPP development experience.

Supported Cairo ABI-s

Please take a look on the Abi-Wan documentation for a list of supported Cairo ABI-s.

Usage

First, you need to wrap your ABI in a array and export it as a const.

Example:

export const ABI = [
{
type: 'function',
name: 'increase_balance',
inputs: [
{
name: 'amount',
type: 'core::felt252',
},
],
outputs: [],
state_mutability: 'external',
},
] as const;

Later on, to use it in our code:

import { Contract, RpcProvider, constants } from 'starknet';

const address = 'YOUR_ADDRESS_HERE';
const provider = new RpcProvider({ nodeUrl: `${yourNodeUrl}` });
const contract = new Contract(ABI, address, provider).typedv2(ABI);

// Notice the autocompletion and typechecking in your editor
const result = await contract.increase_balance(100);

After that, you can use contract in your code as you would before, but with autocompletion and typechecking!

Generate abi.ts from the contract class

If you have your contract class in a Json file, you can use the abiwan CLI to generate the abi.ts typescript file

npx abi-wan-kanabi --input /path/to/contract_class.json --output /path/to/abi.ts

Usage for deployed contracts

Let's say you want to interact with the Ekubo: Core contract

You need to first get the ABI of the contract and export it in a typescript file, you can do so using one command combining both starkli (tested with version 0.2.3) and npx abi-wan-kanabi:

starkli class-at "0x00000005dd3d2f4429af886cd1a3b08289dbcea99a294197e9eb43b0e0325b4b" --network mainnet | npx abi-wan-kanabi --input /dev/stdin --output abi.ts
import { Contract, RpcProvider, constants } from 'starknet';
import { ABI } from './abi';

const address = '0x00000005dd3d2f4429af886cd1a3b08289dbcea99a294197e9eb43b0e0325b4b';
const provider = new RpcProvider({ nodeUrl: constants.NetworkName.SN_MAIN });
const contract = new Contract(ABI, address, provider).typedv2(ABI);

// Notice the types inferred for the parameter and the returned value
const primary_inteface_id = contract.get_primary_interface_id();
const protocol_fees_collected = contract.get_protocol_fees_collected('0x1');