2

I started off wanting to set and identity for a multisig I created on Polkadot, but cannot execute any transactions from the multisig.

Accounts

I have an account, currently with ~6 DOT and a newly created multisig, funded with 60 DOT. Attempting to set the identity from the multisig fails, as does any attempt to create a transaction, or transfer funds (even 1 DOT fails).

enter image description here

Checking the TX hash revels that it fails due to Failed (SignatoriesOutOfOrder) (The multisig was just created, so I fail to see how the signatories are out of order.

[
  {
    name: "threshold",
    type: "U16",
    type_name: "u16",
    value: 2
  },
  {
    name: "other_signatories",
    type: "Vec<[U8; 32]>",
    type_name: "Vec<AccountId>",
    value: [
      "0xbe5039c1ea1010712c27c0c771960de253a540e859124213d9e12d9444fdc93b",
      "0x18930b3ba985e076d3b466e08e1caf1a1b1358733c7ec74c7cea066e5a16ff64"
    ]
  },
  {
    name: "maybe_timepoint",
    type: "option<pallet_multisig:Timepoint>",
    type_name: "Option<Timepoint<BlockNumber>>",
    value: null
  },
  {
    name: "call",
    type: "Call",
    type_name: "Box<<T as Config>::RuntimeCall>",
    value: {
      call_index: "1c01",
      call_module: "Identity",
      call_name: "set_identity",
      params: [
        {
          name: "info",
          type: "pallet_identity:types:IdentityInfo",
          value: {
            additional: null,
            display: {
              Raw13: "Exiled Racers"
            },
            email: {
              Raw21: "[email protected]"
            },
            image: {
              None: "NULL"
            },
            legal: {
              None: "NULL"
            },
            pgp_fingerprint: null,
            riot: {
              None: "NULL"
            },
            twitter: {
              Raw13: "@exiledracers"
            },
            web: {
              Raw24: "https://exiledracers.com"
            }
          }
        }
      ]
    }
  },
  {
    name: "max_weight",
    type: "sp_weights:weight_v2:Weight",
    type_name: "Weight",
    value: {
      proof_size: 0,
      ref_time: 0
    }
  }
]

Or it fails with Failed (InsufficientBalance) (attempting to transfer 1 DOT).

enter image description here

I have no idea why this is failing, or how to debug it.

enter image description here

4 Answers 4

3

One question I have is if you are executing the multisig transaction from polkadot-js apps or from your own script/code ?

Without knowing the answer to the above question, here are some thoughts/concerns based on the info you shared :

Last, in the README of the multisig example, we also added some key parts/concepts to pay attention when preparing a multisig transaction that you might find useful in your debugging process.

2
  • Thank you for your response and the context you've provided. Some additional thoughts: - All three accounts you listed are now funded with >= 2 DOT, attempting to transfer 1 DOT out of the multisig still fails with insufficientBalance: polkadot.subscan.io/extrinsic/… - Thank you for the context on approveAsMulti and asMulti. Even using approveAsMulti fails every time. - I'm attempting to create the multisig TX directly from PollkadotJS app, could it be incorrectly ordering the sigantories?
    – user4574
    Commented Aug 22, 2023 at 15:18
  • Is there really no easier way to handle multisig TXs than via a complex script? How will my non-technical signers manage with this?
    – user4574
    Commented Aug 22, 2023 at 15:20
2

I believe this is due to the ordering of the signatories in the extrinsic you are creating. If you are manually generating the extrinsic, you need to ensure that you put the signatories in ascending order of all the other signatories beside yourself (Polkadot-JS app does this for you "behind the scenes" if you use its multisig UI).

From https://wiki.polkadot.network/docs/learn-account-multisig#multisig-accounts-with-the-polkadot-js-ui -

ADDRESSES THAT ARE PROVIDED TO THE MULTISIG WALLET ARE SORTED

Public keys of signers' wallets are compared byte-for-byte and sorted ascending before being used to generate the multisig address. For example, consider the scenario with three addresses, A, B, and C, starting with 5FUGT, 5HMfS, and 5GhKJ. If we build the ABC multisig with the accounts in that specific order (i.e. first A, then B, and C), the real order of the accounts in the multisig will be ACB. If, in the Extrinsic tab, we initiate a multisig call with C, the order of the other signatories will be first A, then B. If we put first B, then A, the transaction will fail.

1
  • Hi Bill, thanks for the response,. I was not creating the extrinsic manually, I was simply using the setIdentity util provided by polkadotJS, so is it possible that polkadotJS is incorrectly ordering the signatories? Can you confirm it's possible to set an identity for a multisig?
    – user4574
    Commented Aug 22, 2023 at 15:20
1

The solution was the fact that the account submitting the multisig transaction , ie the approveAsMulti, did not have a balance of at least 20.135 DOT, which apparently is required. Credit to Polkasafe for actually surfacing a human-readable error:

enter image description here

0

Multix has been created exactly to avoid these kind of issues. https://multix.chainsafe.io. Multix will order the signatories the way they should. It will also tell you if the signer doesn't have the required funds ahead of submitting a transaction. Indeed, any transaction requires a deposit of 20 DOTs that will be returned once the transaction is approved/rejected.

Finally, if you want to do complex extrinsics, you can always craft the extrinsic in pjs/apps, without having to care about the multisig, and then paste the call data into Multix. You will get the multisig extrinsic built for you, and you can submit it.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.