Transactions

multisig-approve

Register approval for a multisig call (non-final approvals).

View as Markdown

Records the signer's approval for a pending multisig operation without dispatching anything. The opening approval (omit timepoint; reserves a deposit from the signer) embeds the full call in the extrinsic, so every co-signer can recover the call — and a ready-to-run command — straight from multisig pending, with no out-of-band call data. Intermediate approvals (pass the opening timepoint) go up hash-only, which stays cheap even for huge calls like a runtime-upgrade blob. It never executes — once threshold - 1 approvals exist, the last signatory must send multisig_execute with the full call. Approving twice from the same signer, or with a mismatched timepoint, threshold, or signatory set, fails.

SignerPalletWraps
coldkeyMultisigMultisig.as_multi, Multisig.approve_as_multi

Parameters

ParameterTypeRequiredDescription
thresholdintegeryesNumber of approvals required to execute, counting the signer. Together with the full signatory set it identifies the multisig account, so it must match on every approval.
other_signatoriesarrayyesThe other members of the multisig (every signatory except the signer), as a JSON list of addresses. The same set must be given on every approval; order does not matter (sorted automatically).
callobjectyesThe inner call to dispatch from the multisig account, as a JSON object {"op": <intent name>, ...args}. All approvals must describe the identical call — it is matched by hash. Its arguments must be fully explicit, since it runs as the multisig account, not the signer's wallet.
timepointobjectnoBlock height and extrinsic index of the approval that opened the operation, as a JSON object {"height": ..., "index": ...}. Omit on the first approval; required on every later one (read it with the multisig query).

Address parameters (--hotkey, --coldkey, --dest, ...) accept a raw ss58 address, an address-book or proxy-book name, or a local wallet/hotkey name.

CLI

Preview with --dry-run (shows fee, effects, and policy result without submitting), then submit:

btcli tx multisig-approve \
  --threshold <int> \
  --other-signatories <a,b,c> \
  --call '<json>' --dry-run
btcli tx multisig-approve \
  --threshold <int> \
  --other-signatories <a,b,c> \
  --call '<json>' -w my_coldkey

Python

import bittensor as sub
from bittensor.wallet import Wallet

wallet = Wallet(name="my_coldkey", hotkey="my_hotkey")
intent = sub.MultisigApprove(threshold=0, other_signatories=[...], call={...})

async with sub.Client("finney") as client:
    plan = await client.plan(intent, wallet)   # fee, effects, policy — no submission
    result = await client.execute(intent, wallet)
    if not result.success:
        print(result.error.code, result.error.remediation)

Or build it by op name, as an agent would:

await client.execute_tool("multisig_approve", {...}, wallet)