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.

SignerOriginPalletWraps
coldkeysigned account (pallet role may apply)MultisigMultisig.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 bt
from bittensor.wallet import Wallet

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

sub = bt.Subtensor()
plan = sub.plan(intent, wallet)   # fee, effects, policy — no submission
result = sub.execute(intent, wallet)
if not result.success:
    print(result.error.code, result.error.remediation)

(bt.Subtensor is also the async client — async with bt.Subtensor() as client: — see The client.) Or build the intent by op name, as an agent would:

result = sub.execute_tool("multisig_approve", {...}, wallet)

On-chain implementation

Multisig.as_multi is implemented by Substrate's pallet_multisig, outside this repository's pallets.

Multisig.approve_as_multi is implemented by Substrate's pallet_multisig, outside this repository's pallets.

Every file is browsable under /code exactly as built into the runtime, or as plain text under /code/raw/<path> (index: /code/index.json).