Skip to main content

Multisig Wallets

Deploy Safe{Wallet} multisig wallets that require multiple owner confirmations before executing transactions.

When to Use

  • Treasury management — require 2-of-3 or 3-of-5 approval for fund transfers
  • Admin operations — multi-party approval for contract upgrades and role changes
  • Corporate governance — board-level approval for on-chain actions
  • Shared custody — distribute signing responsibility across team members

Deploy a Multisig

const multisig = await urblock.multisig.create({
name: "Treasury Multisig",
owners: ["0xAlice...", "0xBob...", "0xCharlie..."],
threshold: 2, // 2-of-3 required
network: "polygon_amoy",
idempotency_key: "multisig-001",
});

Submit a Transaction

const tx = await urblock.multisig.submitTransaction(multisig.id, {
to: "0xTokenContract...",
value: "0",
data: "0x40c10f19...", // encoded function call
idempotency_key: "mtx-001",
});

Confirm a Transaction

Each owner confirms independently:

// Alice confirms
await urblock.multisig.confirmTransaction(multisig.id, 0, {
signer_address: "0xAlice...",
idempotency_key: "confirm-alice-001",
});

// Bob confirms
await urblock.multisig.confirmTransaction(multisig.id, 0, {
signer_address: "0xBob...",
idempotency_key: "confirm-bob-001",
});

Execute a Transaction

Once the threshold is met:

await urblock.multisig.executeTransaction(multisig.id, 0, {
signatures: "0x...",
idempotency_key: "execute-001",
});

Manage Owners

Add an Owner

await urblock.multisig.addOwner(multisig.id, {
owner: "0xDave...",
signatures: "0x...",
idempotency_key: "add-dave-001",
});

Remove an Owner

await urblock.multisig.removeOwner(multisig.id, "0xCharlie...", {
prev_owner: "0xBob...",
signatures: "0x...",
threshold: 2,
idempotency_key: "remove-charlie-001",
});

Check Ownership

const isOwner = await urblock.multisig.isOwner(multisig.id, "0xAlice...");
console.log(isOwner.is_owner); // true

Change Threshold

await urblock.multisig.changeThreshold(multisig.id, {
threshold: 3,
signatures: "0x...",
idempotency_key: "threshold-001",
});

Query Transactions

List All Transactions

const txs = await urblock.multisig.listTransactions(multisig.id);

Get Transaction Details

const tx = await urblock.multisig.getTransaction(multisig.id, 0);
console.log(tx.tx_index);
console.log(tx.executed);

Check Confirmation

const confirmed = await urblock.multisig.isConfirmed(
multisig.id,
0,
"0xAlice...",
);
console.log(confirmed.is_confirmed); // true

Next Steps