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
- API: Multisig — full multisig endpoint reference
- SDK: Multisig — all SDK methods
- Governance — DAO-level governance with Governor + Timelock
- Roles — manage contract roles with multisig