Transaction Workflow
ODATANO follows a strict Build → Sign → Submit flow.
The server never holds private keys.
\
- Build (server) returns
unsignedTxCbor, txBodyHash, fee, buildId.
- Sign (client / wallet / HSM) using the unsigned CBOR.
- Submit (server) via:
SubmitTransaction(buildId, signedTxCbor)
SubmitSignedTransaction(signedTxCbor, network).
There are two possible builder engines: csl and buildooor for transaction building available.
Make sure to use Buildooor for any Plutus / mint / ref-script / validity-bound work
Signing Methods
| Method | signerType | Key Location | Notes |
|---|
| Cardano CLI | cardano-cli | File system (.skey) | Backend automation |
| CIP-30 wallet | browser-wallet | Browser extension | Nami, Eternl, Lace, Yoroi, Flint |
| Hardware wallet | hardware-wallet | Ledger / Trezor | Via wallet adapter |
| HSM (PKCS#11) | - | HSM chip | Server-side, key never leaves chip |
External signing flow (4 actions):
1.BuildXXX → CreateSigningRequest → client signs → SubmitVerifiedTransaction.
2. HSM flow (2 actions): BuildXXX → SignAndSubmitWithHsm.
HSM details + setup: Security › HSM.
Build Action Parameters
Required = bold. Optional fields are tagged where they apply only to a specific builder or feature.
BuildSimpleAdaTransaction
| Param | Type | Notes |
|---|
senderAddress | String | Bech32 address with funds |
recipientAddress | String | Bech32 address ( overridden when lockOnScript=true ) |
lovelaceAmount | Integer | Amount to send / lock |
changeAddress | bech32 | Defaults to sender |
outputDatumJson | String | PlutusData JSON - required when sending to a script address |
assetsJson | String | Assets as Json String [{unit, quantity}] |
forceInputsJson | String | UTxOs that MUST be consumed |
validatorScript | String | Plutus validator hex (used to derive script address) |
scriptParamsJson | String | PlutusData params for parameterized validators |
lockOnScript | Boolean | Route output to derived script address |
referenceScriptHex | String | CIP-33 ref-script |
validityStartMs | String | Posix-ms (Buildooor only) |
validityEndMs | String | Posix-ms (Buildooor only) |
| Param | Type | Notes |
|---|
senderAddress | String | Bech32 address with funds |
recipientAddress | String | Bech32 recipient address |
lovelaceAmount | Integer | Amount to send |
metadataJson | String | Object keyed by numeric label |
changeAddress | String | Defaults to sender |
BuildMultiAssetTransaction
| Param | Type | Notes |
|---|
senderAddress | String | Bech32 address with funds |
recipientAddress | String | Bech32 address ( overridden when lockOnScript=true ) |
lovelaceAmount | Integer | Amount to send / lock |
assetsJson | String | [{unit, quantity}] |
changeAddress | String | Defaults to sender |
outputDatumJson | String | PlutusData JSON - required when sending to a script address |
referenceScriptHex | String | CIP-33 ref-script |
validityStartMs | String | Posix-ms (Buildooor only) |
validityEndMs | String | Posix-ms (Buildooor only) |
BuildMintTransaction
| Param | Type | Notes |
|---|
senderAddress | String | Bech32 address with funds |
recipientAddress | String | Bech32 address ( overridden when lockOnScript=true ) |
lovelaceAmount | Integer | Amount to send / lock |
mintActionsJson | String | [{assetUnit, quantity}] (negative = burn) |
mintingPolicyScript | String | CBOR hex |
requiredSignersJson | String | 28-byte hex key hashes for extra_signatories |
scriptParamsJson | String | PlutusData params for parameterized validators |
inlineDatumJson | String | Parameterized validators / state machines |
mintRedeemerJson | String | Parameterized validators / state machines |
lockOnScript | Boolean | Route output to derived script address |
forceInputsJson | String | One-shot mint seeds |
referenceInputsJson | String | CIP-31 ref inputs (Buildooor only) |
metadataJson | String | CIP-20 / label-674 |
referenceScriptHex | String | CIP-33 |
validityStartMs | String | Posix-ms (Buildooor only) |
validityEndMs | String | Posix-ms (Buildooor only) |
BuildPlutusSpendTransaction
| Param | Type | Notes |
|---|
senderAddress | String | Bech32 address with funds |
recipientAddress | String | Bech32 address ( overridden when lockOnScript=true ) |
lovelaceAmount | Integer | Amount to send / lock |
validatorScript | String | CBOR hex |
scriptTxHash | String | 64-char hex |
scriptOutputIndex | Integer | outputindex of script output index |
redeemerJson | String | Supports __INPUT_IDX:txHash#n__ (Buildooor only) |
datumJson | String | Only for hash-based datums |
requiredSignersJson | String | 28-byte hex key hashes for extra_signatories |
scriptParamsJson | String | PlutusData params for parameterized validators |
inlineDatumJson | String | Parameterized validators / state machines |
lockOnScript | Boolean | Route output to derived script address |
forceInputsJson | String | Besides the script UTxO |
extraOutputsJson | String | [{address, lovelaceAmount, assets?, inlineDatumJson?, referenceScriptHex?}] |
mintActionsJson | String | Combined spend+mint |
mintingPolicyScript | String | Combined spend+mint |
mintRedeemerJson | String | Combined spend+mint |
referenceInputsJson | String | CIP-31 ref inputs (Buildooor only) |
referenceScriptHex | String | CIP-33 |
validityStartMs | String | Posix-ms (Buildooor only) |
validityEndMs | String | Posix-ms (Buildooor only) |
SetCollateral
| Param | Type | Notes |
|---|
address | string | bech32 |
Submission
| Action | Params |
|---|
SubmitTransaction | buildId: UUID, signedTxCbor: String |
SubmitSignedTransaction | signedTxCbor: String, network: String(10) (mainnet / preview / preprod) |
CheckSubmissionStatus | bound on TransactionSubmissions(id) |
Utility actions (v1.7.5, no network call)
| Action | Params | Returns |
|---|
DeriveScriptAddress | validatorScript, scriptParamsJson?, network? | { scriptAddress, scriptHash } |
ExtractPaymentKeyHash | address | { paymentKeyHash } |
For Plutus Smart Contract details: Plutus & Smart Contracts.
Examples