signTransaction
Sign one or more raw transactions using the wallet. This is a low-level API that gives you full control over transaction construction and signing.
Usage
ts
const { sigs } = await Turing.signTransaction({
txraws,
utxos_satoshis,
script_pubkeys,
});Parameters
ts
interface SignTransactionParams {
txraws: string[]; // Array of serialized transaction hex strings
utxos_satoshis: number[][]; // Satoshi values for each input of each transaction
script_pubkeys: string[][]; // Script pubkeys for each input of each transaction
}| Parameter | Type | Required | Description |
|---|---|---|---|
txraws | string[] | Yes | Array of unsigned transaction hex strings |
utxos_satoshis | number[][] | Yes | 2D array — satoshi values for each input, per transaction |
script_pubkeys | string[][] | Yes | 2D array — script pubkeys for each input, per transaction |
Returns
ts
interface SignTransactionResponse {
sigs: string[][]; // 2D array — signatures for each input, per transaction
}| Field | Type | Description |
|---|---|---|
sigs | string[][] | Signatures indexed as sigs[txIndex][inputIndex] |
Error Handling
ts
try {
const { sigs } = await Turing.signTransaction({
txraws,
utxos_satoshis,
script_pubkeys,
});
console.log("Signatures:", sigs);
} catch (error) {
console.error("Signing failed:", error);
}Example
Complete example: construct two transactions, sign them, and assemble the scripts.
ts
const utxosA: tbc.Transaction.IUnspentOutput[] = [];
const utxosB: tbc.Transaction.IUnspentOutput[] = [];
const utxos_satoshis: number[][] = [[], []];
const script_pubkeys: string[][] = [[], []];
const txraws: string[] = [];
const txs: tbc.Transaction[] = [];
const tx0 = new tbc.Transaction()
.from(utxosA)
.to(address, 100000)
.change(address)
.fee(80);
const tx1 = new tbc.Transaction()
.from(utxosB)
.to(address, 100000)
.change(address)
.fee(80);
txraws.push(tx0.uncheckedSerialize(), tx1.uncheckedSerialize());
for (let i = 0; i < utxosA.length; i++) {
utxos_satoshis[0].push(utxosA[i].satoshis);
script_pubkeys[0].push(utxosA[i].script);
}
for (let i = 0; i < utxosB.length; i++) {
utxos_satoshis[1].push(utxosB[i].satoshis);
script_pubkeys[1].push(utxosB[i].script);
}
const { sigs } = await Turing.signTransaction({
txraws,
utxos_satoshis,
script_pubkeys,
});
for (let i = 0; i < utxosA.length; i++) {
tx0.setInputScript({ inputIndex: i }, (tx) => {
const sig = sigs[0][i];
const sig_length = (sig.length / 2).toString(16);
const publicKey_length = (
publicKey.toBuffer().toString("hex").length / 2
).toString(16);
return new tbc.Script(
sig_length + sig + publicKey_length + publicKey.toString()
);
});
txs.push(tx0);
}
for (let i = 0; i < utxosB.length; i++) {
tx1.setInputScript({ inputIndex: i }, (tx) => {
const sig = sigs[1][i];
const sig_length = (sig.length / 2).toString(16);
const publicKey_length = (
publicKey.toBuffer().toString("hex").length / 2
).toString(16);
return new tbc.Script(
sig_length + sig + publicKey_length + publicKey.toString()
);
});
txs.push(tx1);
}
broadcastTXsraw(txs.map((tx) => ({ txraw: tx.uncheckedSerialize() })));Live Example
Live Example
Turing.signTransaction()
Unknown
Use the wallet control in the top navigation before running this example.
Includes an offline signing sample that references a synthetic UTXO, so it cannot be broadcast or spend assets.
Code Preview
const params = {
"txraws": [
"0a0000000111111111111111111111111111111111111111111111111111111111111111110000000000ffffffff02c0d40100000000001976a9141cfef3571aad5bf16174e9d39928ad1a5716769388ac08380100000000001976a914a3c6b1ee4a49d9f2af3b3802974744fba924164a88ac00000000"
],
"utxos_satoshis": [
[
200000
]
],
"script_pubkeys": [
[
"76a914a3c6b1ee4a49d9f2af3b3802974744fba924164a88ac"
]
]
};
const result = await Turing.signTransaction(params);
console.log(result);