The production-grade, all-in-one SDK for SUI blockchain development. Designed to solve common developer pain points: pagination, name resolution, argument wrapping, and complex standard interactions (Kiosk, Display).
npm install sui-easy-sdk @mysten/sui @mysten/bcsEvery method that accepts an address also accepts a .sui name.
const objects = await client.getAllOwnedObjects('demo.sui');Never write a while(hasNextPage) loop again.
const allCoins = await CoinUtils.selectCoins(client, 'demo.sui', 500n, '0x...::type', 'all');Auto-wraps number -> u64, string -> Pure or Object, performs async name resolution.
await builder.moveCallWithResolving(client, 'pkg::mod::fn', ['friend.sui', 100]);Extends SuiClient (official SDK).
constructor(options: SuiClientOptions): Standard initialization.async resolveAddress(addressOrName: string): Promise<string>:- Resolves
.suiname to 0x address. Returns input if already address.
- Resolves
async getAllOwnedObjects(addressOrName: string, typeFilter?: string):- Fetches ALL pages of owned objects.
- Auto-resolves owner name.
parseError(error: any): string:- Extracts Move Abort codes from RPC errors.
Wraps Transaction.
tx: Access the underlyingTransactionobject.moveCall(target, args, typeArgs):- Adds a MoveCall command.
- Auto-wraps JS types (
number->u64,boolean->bool). - Treats hex-strings (
0x...) as Objects by default.
async moveCallWithResolving(client, target, args, typeArgs):- Resolves any string args ending in
.suito addresses before adding the command.
- Resolves any string args ending in
transferObjects(objects, recipient):- Recipient can be a name or address (if resolved beforehand, otherwise use
moveCallvariants).
- Recipient can be a name or address (if resolved beforehand, otherwise use
splitCoins(coin, amounts): Wrapper fortx.splitCoins.mergeCoins(dest, sources): Wrapper fortx.mergeCoins.
static async selectCoins(client, ownerOrName, amount, coinType, strategy):strategy:'biggest-first'(gas opt),'exact-match'(payment), or'all'.- Returns
{ selectedCoins, totalAmount }.
static createCoinInput(tx, coins, amount, coinType):- Returns a coin object ready for use (merges inputs if needed, then splits).
createKiosk(tx): Returns[kiosk, kioskOwnerCap].place(tx, kiosk, cap, item, itemType): Places item.withdraw(tx, kiosk, cap, itemId, itemType): Withdraws item.
getDisplays(objectIds):- Returns map of
{ [id]: DisplayFields }. - Uses
multiGetObjectsfor efficiency.
- Returns map of
static resolveImageUrl(display):- Sanitizes IPFS URLs.
stringToVectorU8(str): Encodes string tovector<u8>.vectorU8ToString(bytes): Decodes bytes.toHex(bytes),fromHex(str): Hex utils.normalizeAddress(addr): 0x-padding.formatAddress(addr): Truncates for display (e.g.0x12...34).isValidStructTag(str): Validates struct format.
See examples/showcase.ts for the full code.
const { selectedCoins } = await CoinUtils.selectCoins(client, 'buyer.sui', price);
const [payment] = CoinUtils.createCoinInput(builder.tx, selectedCoins, price, SUI_TYPE);
await builder.moveCallWithResolving(client, 'mkt::buy', ['kiosk.sui', payment]);