Skip to content

Commit 21d5717

Browse files
committed
chore: release version 1.1.1 with documentation updates, ESM-only consumption note, and fixed Signing API references
1 parent c838992 commit 21d5717

3 files changed

Lines changed: 231 additions & 32 deletions

File tree

CHANGELOG.md

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,20 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [1.1.1] - 2026-05-09
9+
10+
### Documentation
11+
12+
- README updated to reflect 1.1.0 features (`contract.view`, `chain.getByFilter`,
13+
`chain.getKpi`, `proof.getContractStateProof`, `submitAndWait { finalized }`,
14+
NFT support).
15+
- ESM-only consumption note added to installation section.
16+
- Fixed broken Signing API reference (previously listed `signTx`/`signOOB` which
17+
do not exist; replaced with the actual signing primitives).
18+
- Added Mnemonics (BIP39), Contract ABIs, and Proof API sections.
19+
20+
No code or runtime changes — `dist/` is identical to 1.1.0.
21+
822
## [1.1.0] - 2026-05-09
923

1024
### Fixed
@@ -61,7 +75,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6175
keypairs from human-readable seed phrases:
6276
- `generateMnemonic()`
6377
- `validateMnemonic(mnemonic)`
64-
- `mnemonicToSeedBase58(mnemonic, passphrase?)`
78+
- `mnemonicToSeedBase58(mnemonic)`
6579
- `encodeVaultSecret`, `decodeVaultSecret`, `detectInputType`
6680
- New `@scure/bip39` runtime dependency.
6781

README.md

Lines changed: 215 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,19 @@ pnpm add @amadeus-protocol/sdk
2020
bun add @amadeus-protocol/sdk
2121
```
2222

23+
> **ESM-only**: this package is published as pure ESM (`"type": "module"`). Use Node.js 20+ with `"type": "module"` in your `package.json`, or any modern bundler (Vite, webpack, esbuild, Metro). For CommonJS consumers, run via [`tsx`](https://github.com/privatenumber/tsx). See [Troubleshooting](https://docs.ama.one/sdk/9.-troubleshooting.md) for the `1.0.x` `ERR_MODULE_NOT_FOUND` issue and upgrade path.
24+
25+
## What's New in 1.1.0
26+
27+
- **`contract.view()`** — read-only contract execution
28+
- **`chain.getByFilter()`** / **`chain.getKpi()`** — filtered tx queries + protocol KPIs
29+
- **`proof.getContractStateProof()`** — merkle proofs for contract state
30+
- **`submitAndWait(txPacked, { finalized: true })`** — wait for finality instead of confirmation
31+
- **NFT contract**`NFT_ABI`, `buildNftTransfer/Mint/CreateCollection`, `TransactionBuilder.nftTransfer/nftMint/nftCreateCollection`
32+
- **ESM fix** — published `dist/*.js` now resolves correctly under raw `node` (the `1.0.x` `ERR_MODULE_NOT_FOUND` bug)
33+
34+
See the [CHANGELOG](./CHANGELOG.md) for full release history.
35+
2336
## Features
2437

2538
- **Canonical Serialization (VecPack)**: Deterministic encoding/decoding for cryptographic operations
@@ -72,19 +85,27 @@ const sdk = new AmadeusSDK({
7285
const stats = await sdk.chain.getStats()
7386
const tip = await sdk.chain.getTip()
7487
const entry = await sdk.chain.getByHash('5Kd3N...')
88+
const { txs, cursor } = await sdk.chain.getByFilter({ contract: 'Coin', function: 'transfer' })
89+
const { kpi } = await sdk.chain.getKpi()
7590

7691
// Wallet API
7792
const balance = await sdk.wallet.getBalance('5Kd3N...', 'AMA')
7893
const allBalances = await sdk.wallet.getAllBalances('5Kd3N...')
7994

8095
// Transaction API
8196
const result = await sdk.transaction.submit(txPacked)
82-
const resultWithWait = await sdk.transaction.submitAndWait(txPacked)
97+
const confirmed = await sdk.transaction.submitAndWait(txPacked)
98+
const finalized = await sdk.transaction.submitAndWait(txPacked, { finalized: true })
8399
const tx = await sdk.transaction.get('5Kd3N...')
84100

85101
// Contract API
86102
const contractData = await sdk.contract.get(key)
87103
const richlist = await sdk.contract.getRichlist()
104+
const { success, result } = await sdk.contract.view({
105+
contract: 'LockupPrime',
106+
function: 'view_balance',
107+
args: ['my_vault']
108+
})
88109

89110
// Epoch API
90111
const scores = await sdk.epoch.getScore()
@@ -93,6 +114,10 @@ const emission = await sdk.epoch.getEmissionAddress('5Kd3N...')
93114
// Peer API
94115
const nodes = await sdk.peer.getNodes()
95116
const trainers = await sdk.peer.getTrainers()
117+
118+
// Proof API
119+
const validatorProof = await sdk.proof.getValidators(entryHash)
120+
const stateProof = await sdk.proof.getContractStateProof(stateKey)
96121
```
97122

98123
### Key Generation
@@ -151,6 +176,137 @@ const { txHash, txPacked } = builder.buildAndSign('Coin', 'transfer', [
151176
])
152177
```
153178

179+
#### ABI-Driven (Lockup, LockupPrime, etc.)
180+
181+
The recommended pattern for built-in contracts. Pass any ABI to `builder.contract(abi)` and get fully-typed function calls:
182+
183+
```typescript
184+
import {
185+
TransactionBuilder,
186+
LOCKUP_PRIME_ABI,
187+
LOCKUP_ABI,
188+
toAtomicAma
189+
} from '@amadeus-protocol/sdk'
190+
191+
const builder = new TransactionBuilder('5Kd3N...')
192+
193+
// LockupPrime — auto-typed methods derived from the ABI
194+
builder.contract(LOCKUP_PRIME_ABI).lock({ amount: toAtomicAma(100).toString(), tier: '30d' })
195+
builder.contract(LOCKUP_PRIME_ABI).unlock({ vaultIndex: '3' })
196+
builder.contract(LOCKUP_PRIME_ABI).daily_checkin({ vaultIndex: '7' })
197+
198+
// Lockup
199+
builder.contract(LOCKUP_ABI).unlock({ vaultIndex: '5' })
200+
```
201+
202+
#### NFT (transfer, mint, create_collection)
203+
204+
The `Nft` built-in contract has dedicated builder methods. NFT amounts are integer counts, **not** AMA atomic units.
205+
206+
```typescript
207+
const builder = new TransactionBuilder(privateKey)
208+
209+
// Create a collection (caller becomes owner)
210+
builder.nftCreateCollection({ collection: 'AGENTIC', soulbound: false })
211+
212+
// Mint tokens (collection owner only)
213+
builder.nftMint({ recipient: '5Kd3N...', amount: 10, collection: 'AGENTIC', token: '1' })
214+
215+
// Transfer
216+
builder.nftTransfer({ recipient: '5Kd3N...', amount: 1, collection: 'AGENTIC', token: '1' })
217+
```
218+
219+
Static variants: `TransactionBuilder.buildSignedNftTransfer/Mint/CreateCollection(input)` — each takes the same params plus `senderPrivkey`.
220+
221+
### Signing Transactions
222+
223+
The SDK supports two patterns. Pick whichever fits your workflow.
224+
225+
#### Pattern 1 — Auto-signed (high-level, recommended)
226+
227+
The `TransactionBuilder` instance methods build **and** sign in one call. Best for app code where you have the private key in hand.
228+
229+
```typescript
230+
import { TransactionBuilder, LOCKUP_PRIME_ABI, toAtomicAma } from '@amadeus-protocol/sdk'
231+
232+
const builder = new TransactionBuilder('5Kd3N...') // Base58 seed
233+
234+
// Coin transfer
235+
const a = builder.transfer({ recipient: '5Kd3N...', amount: 10.5, symbol: 'AMA' })
236+
237+
// ABI-driven (any contract)
238+
const b = builder.contract(LOCKUP_PRIME_ABI).lock({
239+
amount: toAtomicAma(100).toString(),
240+
tier: '30d'
241+
})
242+
243+
// NFT
244+
const c = builder.nftTransfer({
245+
recipient: '5Kd3N...',
246+
amount: 1,
247+
collection: 'AGENTIC',
248+
token: '1'
249+
})
250+
251+
// All return { txHash, txPacked } ready for sdk.transaction.submit(txPacked)
252+
```
253+
254+
#### Pattern 2 — Manual: build a `ContractCall`, sign separately
255+
256+
Build a `ContractCall` with a standalone helper or `createContract(ABI)`, then sign it independently with `TransactionBuilder.signCall(privkey, call)`. Useful when:
257+
258+
- You want to inspect or log the call before signing
259+
- The signing key lives somewhere else (HSM, separate process, separate machine)
260+
- You want to batch-build and sign at the end
261+
262+
```typescript
263+
import {
264+
TransactionBuilder,
265+
createContract,
266+
LOCKUP_PRIME_ABI,
267+
buildCoinTransfer,
268+
buildNftTransfer,
269+
toAtomicAma
270+
} from '@amadeus-protocol/sdk'
271+
272+
// Build a ContractCall — three ways:
273+
274+
// A. Standalone helper (Coin)
275+
const callA = buildCoinTransfer({ recipient: '5Kd3N...', amount: 10.5, symbol: 'AMA' })
276+
277+
// B. Standalone helper (NFT)
278+
const callB = buildNftTransfer({
279+
recipient: '5Kd3N...',
280+
amount: 1,
281+
collection: 'AGENTIC',
282+
token: '1'
283+
})
284+
285+
// C. ABI-driven, any contract
286+
const lockupPrime = createContract(LOCKUP_PRIME_ABI)
287+
const callC = lockupPrime.lock({ amount: toAtomicAma(100).toString(), tier: '30d' })
288+
289+
// Inspect if you want
290+
console.log('Will call:', callC.contract, callC.method, callC.args)
291+
292+
// Sign with any private key (no builder instance needed)
293+
const { txHash, txPacked } = TransactionBuilder.signCall('5Kd3N...', callC)
294+
```
295+
296+
#### Build-unsigned-then-sign (debugging)
297+
298+
If you need to inspect the full unsigned transaction (nonce, signer, action) before signing:
299+
300+
```typescript
301+
const builder = new TransactionBuilder('5Kd3N...')
302+
303+
const unsigned = builder.buildTransfer({ recipient: '5Kd3N...', amount: 10.5, symbol: 'AMA' })
304+
console.log('Nonce:', unsigned.tx.nonce)
305+
console.log('Action:', unsigned.tx.action)
306+
307+
const { txHash, txPacked } = builder.sign(unsigned)
308+
```
309+
154310
#### Using Static Methods
155311

156312
```typescript
@@ -229,22 +385,19 @@ const atomic = toAtomicAma(1.5) // Returns 1500000000
229385
const ama = fromAtomicAma(1500000000) // Returns 1.5
230386
```
231387

232-
### Signing Transactions
388+
### Mnemonics (BIP39)
233389

234390
```typescript
235-
import { TransactionBuilder } from '@amadeus-protocol/sdk'
391+
import { generateMnemonic, validateMnemonic, mnemonicToSeedBase58 } from '@amadeus-protocol/sdk'
236392

237-
// Using TransactionBuilder instance
238-
const builder = new TransactionBuilder('5Kd3N...')
239-
240-
// Build unsigned transaction
241-
const unsignedTx = builder.build('Coin', 'transfer', args)
393+
// Generate a 12-word mnemonic
394+
const mnemonic = generateMnemonic()
242395

243-
// Sign the transaction
244-
const { txHash, txPacked } = builder.sign(unsignedTx)
245-
246-
// Or build and sign in one step
247-
const { txHash, txPacked } = builder.buildAndSign('Coin', 'transfer', args)
396+
// Validate a mnemonic
397+
if (validateMnemonic(mnemonic)) {
398+
// Derive a Base58 seed (compatible with TransactionBuilder)
399+
const seedBase58 = mnemonicToSeedBase58(mnemonic)
400+
}
248401
```
249402

250403
### Encoding Utilities
@@ -300,6 +453,13 @@ const decrypted = await decryptWithPassword(encrypted, 'my-password')
300453
- `derivePublicKeyFromSeedBase58(base58Seed: string): string` - Derive public key from Base58 seed
301454
- `deriveSkAndSeed64FromBase58Seed(base58Seed64: string)` - Derive secret key and seed
302455

456+
### Mnemonics (BIP39)
457+
458+
- `generateMnemonic(): string` - Generate a 12-word BIP39 mnemonic
459+
- `validateMnemonic(mnemonic: string): boolean` - Validate a BIP39 mnemonic
460+
- `mnemonicToSeedBase58(mnemonic: string): string` - Derive a Base58 seed from a mnemonic
461+
- `encodeVaultSecret`, `decodeVaultSecret`, `detectInputType` - Vault helpers
462+
303463
### Encoding
304464

305465
- `toBase58(buf: Uint8Array): string` - Encode bytes to Base58
@@ -311,11 +471,6 @@ const decrypted = await decryptWithPassword(encrypted, 'my-password')
311471
- `uint8ArrayToArrayBuffer(bytes: Uint8Array): ArrayBuffer` - Convert Uint8Array to ArrayBuffer
312472
- `arrayBufferToUint8Array(buffer: ArrayBuffer): Uint8Array` - Convert ArrayBuffer to Uint8Array
313473

314-
### Signing
315-
316-
- `signTx(hash: Uint8Array, sk: PrivKey): Uint8Array` - Sign a transaction hash
317-
- `signOOB(sk: string, msg: Uint8Array): Uint8Array` - Sign an out-of-band message
318-
319474
### Conversion
320475

321476
- `toAtomicAma(ama: number): number` - Convert AMA to atomic units
@@ -333,18 +488,48 @@ const decrypted = await decryptWithPassword(encrypted, 'my-password')
333488

334489
- `TransactionBuilder` - Class for building and signing transactions
335490
- **Constructor:** `new TransactionBuilder(privateKey?: string)` - Create a new builder instance
336-
- **Instance Methods:**
337-
- `build(contract, method, args, signerPk?): UnsignedTransactionWithHash` - Build an unsigned transaction
338-
- `sign(unsignedTx, signerSk?): BuildTxResult` - Sign an unsigned transaction
339-
- `buildAndSign(contract, method, args, signerPk?, signerSk?): BuildTxResult` - Build and sign in one step
340-
- `buildTransfer(input, signerPk?): UnsignedTransactionWithHash` - Build an unsigned transfer
341-
- `transfer(input): BuildTxResult` - Build and sign a transfer (convenience)
342-
- **Static Methods:**
343-
- `build(signerPk, contract, method, args): UnsignedTransactionWithHash` - Build unsigned transaction
344-
- `sign(unsignedTx, signerSk): BuildTxResult` - Sign an unsigned transaction
345-
- `buildAndSign(signerPk, signerSk, contract, method, args): BuildTxResult` - Build and sign in one step
346-
- `buildTransfer(input, signerPk): UnsignedTransactionWithHash` - Build unsigned transfer
347-
- `buildSignedTransfer(input): BuildTxResult` - Build and sign transfer (convenience)
491+
- **ABI-driven (recommended):**
492+
- `contract(abi)` - Returns a typed, signer-bound contract interface; each ABI function becomes a method that builds and signs in one step
493+
- **Generic instance methods:**
494+
- `build(contract, method, args, signerPk?): UnsignedTransactionWithHash`
495+
- `sign(unsignedTx, signerSk?): BuildTransactionResult`
496+
- `buildAndSign(contract, method, args, signerPk?, signerSk?): BuildTransactionResult`
497+
- `buildFromCall(call): UnsignedTransactionWithHash`
498+
- `buildAndSignCall(call): BuildTransactionResult`
499+
- **Coin transfer:**
500+
- `buildTransfer(input, signerPk?): UnsignedTransactionWithHash`
501+
- `transfer(input): BuildTransactionResult`
502+
- **NFT (Nft contract):**
503+
- `nftTransfer({ recipient, amount, collection, token }): BuildTransactionResult`
504+
- `nftMint({ recipient, amount, collection, token }): BuildTransactionResult`
505+
- `nftCreateCollection({ collection, soulbound? }): BuildTransactionResult`
506+
- **Lockup / LockupPrime convenience methods:**
507+
- `lockupUnlock({ vaultIndex }): BuildTransactionResult`
508+
- `lockupPrimeLock({ amount, tier }): BuildTransactionResult`
509+
- `lockupPrimeUnlock({ vaultIndex }): BuildTransactionResult`
510+
- `lockupPrimeDailyCheckin({ vaultIndex }): BuildTransactionResult`
511+
- **Static methods:** `signCall`, `buildFromCall`, `buildAndSignCall`, `buildSignedTransfer`, `buildSignedNft{Transfer,Mint,CreateCollection}`, `buildSignedLockup{Unlock}`, `buildSignedLockupPrime{Lock,Unlock,DailyCheckin}`
512+
513+
### Contract ABIs
514+
515+
`as const` ABI definitions for built-in contracts. Pass any ABI to `createContract(abi)` or `builder.contract(abi)` for fully-typed function calls.
516+
517+
- `LOCKUP_ABI` - `Lockup` (vesting) — `unlock(vaultIndex)`
518+
- `LOCKUP_PRIME_ABI` - `LockupPrime``lock(amount, tier)`, `unlock(vaultIndex)`, `daily_checkin(vaultIndex)`
519+
- `NFT_ABI` - `Nft``transfer`, `mint`, `create_collection`
520+
521+
Standalone builders that return a `ContractCall`:
522+
523+
- `buildCoinTransfer({ recipient, amount, symbol })`
524+
- `buildNftTransfer({ recipient, amount, collection, token })`
525+
- `buildNftMint({ recipient, amount, collection, token })`
526+
- `buildNftCreateCollection({ collection, soulbound? })`
527+
- `createContract(abi).fn(params)` - generic ABI-driven builder
528+
- `buildContractCall(abi, fn, params)` - lower-level ABI-driven builder
529+
530+
### Full API Reference
531+
532+
For complete documentation including request/response types, error handling, and end-to-end examples, see [docs.ama.one/sdk](https://docs.ama.one/sdk/1.-introduction.md).
348533

349534
## Examples
350535

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@amadeus-protocol/sdk",
3-
"version": "1.1.0",
3+
"version": "1.1.1",
44
"description": "Official TypeScript/JavaScript SDK for Amadeus Protocol - Core utilities for serialization, cryptography, transaction building, and API client",
55
"repository": {
66
"type": "git",

0 commit comments

Comments
 (0)