safe-multisig-on-abstract
Safe Multisig on Abstract
Safe (formerly Gnosis Safe) is the standard multi-signature wallet on Abstract. Use it when multiple parties must approve transactions before execution — treasury management, team wallets, DAO operations, or any scenario requiring shared custody.
A Safe web interface is live at safe.abs.xyz.
Quick Start (Web UI)
For non-programmatic use, create and manage Safes directly at safe.abs.xyz. Connect a wallet, add owner addresses, set the confirmation threshold, and deploy.
Quick Start (SDK — Create a Safe)
npm install @safe-global/protocol-kit viem
import Safe, { SafeAccountConfig, PredictedSafeProps } from "@safe-global/protocol-kit";
import { abstract } from "viem/chains";
const safeAccountConfig: SafeAccountConfig = {
owners: [
"0xOwner1Address",
"0xOwner2Address",
"0xOwner3Address",
],
threshold: 2,
};
const predictedSafe: PredictedSafeProps = { safeAccountConfig };
const protocolKit = await Safe.init({
provider: abstract.rpcUrls.default.http[0],
signer: DEPLOYER_PRIVATE_KEY,
predictedSafe,
});
const safeAddress = await protocolKit.getAddress();
const deploymentTx = await protocolKit.createSafeDeploymentTransaction();
const client = await protocolKit.getSafeProvider().getExternalSigner();
const txHash = await client!.sendTransaction({
to: deploymentTx.to as `0x${string}`,
value: BigInt(deploymentTx.value),
data: deploymentTx.data as `0x${string}`,
chain: abstract,
});
After deployment, verify:
const kit = await protocolKit.connect({ safeAddress });
await kit.isSafeDeployed(); // true
await kit.getOwners(); // ["0xOwner1...", "0xOwner2...", "0xOwner3..."]
await kit.getThreshold(); // 2
Quick Start (SDK — Execute a Multi-sig Transaction)
import Safe from "@safe-global/protocol-kit";
import { MetaTransactionData, OperationType } from "@safe-global/types-kit";
const kitOwner1 = await Safe.init({
provider: "https://api.mainnet.abs.xyz",
signer: OWNER_1_PRIVATE_KEY,
safeAddress: SAFE_ADDRESS,
});
const txData: MetaTransactionData = {
to: "0xRecipientAddress",
value: "1000000000000000", // 0.001 ETH in wei
data: "0x",
operation: OperationType.Call,
};
const safeTx = await kitOwner1.createTransaction({ transactions: [txData] });
const signedTx = await kitOwner1.signTransaction(safeTx);
// Owner 2 signs
const kitOwner2 = await Safe.init({
provider: "https://api.mainnet.abs.xyz",
signer: OWNER_2_PRIVATE_KEY,
safeAddress: SAFE_ADDRESS,
});
const fullySignedTx = await kitOwner2.signTransaction(signedTx);
// Any owner executes once threshold is met
const executeTxResponse = await kitOwner1.executeTransaction(fullySignedTx);
Deployed Contracts
| Contract | Address (Mainnet & Testnet) |
|---|---|
| Safe | 0xC35F063962328aC65cED5D4c3fC5dEf8dec68dFa |
| SafeL2 | 0x610fcA2e0279Fa1F8C00c8c2F71dF522AD469380 |
| SafeProxyFactory | 0xc329D02fd8CB2fc13aa919005aF46320794a8629 |
| MultiSend | 0x309D0B190FeCCa8e1D5D8309a16F7e3CB133E885 |
For the full deployed contract list, see connecting-to-abstract skill → references/deployed-contracts.md.
Decision: UI vs SDK
| Scenario | Use |
|---|---|
| Manual treasury management | UI — safe.abs.xyz |
| Programmatic Safe creation | SDK — Protocol Kit |
| Automated multi-sig flows | SDK — Protocol Kit |
| Off-chain signature collection (proposal service) | UI — see Transaction Service caveat below |
| Batch transactions (multiple calls in one) | SDK — MultiSend via Protocol Kit |
Transaction Service Caveat
Abstract is not listed in Safe's official Transaction Service supported networks. The off-chain proposal flow (where owners sign asynchronously via the API Kit / SafeApiKit) may not work with the standard Safe infrastructure for Abstract.
Workarounds:
- Use safe.abs.xyz for off-chain signature collection (it runs its own backend)
- Use the Protocol Kit for fully onchain signing — pass the transaction object between signers in your own application
- For automated pipelines, coordinate signatures offchain (e.g., via a database or messaging) and submit the fully-signed transaction onchain
Gotchas
- Abstract is a ZK Stack chain — Safe contracts on Abstract are the same Safe codebase, but the underlying VM differs from standard EVM. The Protocol Kit handles this transparently.
- SafeL2 is the recommended singleton — on L2 chains, use the
SafeL2contract (notSafe) for lower gas costs via event-based indexing - Transaction Service ≠ Protocol Kit — the Protocol Kit works fully onchain and is chain-agnostic. The Transaction Service (API Kit) requires a supported backend endpoint.
- Gas sponsorship — Safe transactions on Abstract can be sponsored via a paymaster. See
abstract-global-walletskill for paymaster patterns. - Never store private keys in client code — use
cast wallet import, environment variables, or KMS for signer keys
Feature Reference
| Topic | Where to look |
|---|---|
| Protocol Kit detailed API | references/protocol-kit.md |
| Abstract network config (RPC, chain IDs) | connecting-to-abstract skill |
| All deployed contracts on Abstract | connecting-to-abstract skill → references/deployed-contracts.md |
| Safe official docs | docs.safe.global |
| Safe UI on Abstract | safe.abs.xyz |
More from abstract-foundation/abstract-skills
using-agw-mcp
Give AI agents wallet capabilities on Abstract via the Abstract Global Wallet MCP server — read chain data, check balances, and (coming soon) send transactions on behalf of users. This skill should be used when setting up agw-mcp, giving AI agents wallet access on Abstract, or building MCP-powered agent workflows that interact with Abstract chain data.
3erc8004-on-abstract
Register AI agents, track reputation, and discover agents on Abstract using ERC-8004 — the onchain identity and reputation protocol for trustless agent economies. This skill should be used when registering an agent onchain, querying agent reputation, giving feedback to an agent, working with IdentityRegistry or ReputationRegistry on Abstract, ERC-8004, agent discovery, or onchain agent identity.
3abstract-global-wallet
Integrate Abstract Global Wallet (AGW) into React applications — email/social/passkey login, smart contract wallet, session keys, gas sponsorship, and wallet provider integrations for the Abstract Ethereum L2. This skill should be used when working with AGW, AbstractWalletProvider, useLoginWithAbstract, useAbstractClient, useWriteContractSponsored, agw-react, agw-client, create-abstract-app, session keys on Abstract, or gas-sponsored transactions on Abstract.
3myriad-on-abstract
Integrate Myriad Protocol prediction markets on Abstract — REST API for market data, polkamarkets-js SDK for trading outcome shares, builder revenue sharing via referralBuy, and contract addresses. This skill should be used when working with Myriad API, prediction markets on Abstract, polkamarkets-js SDK, trading or buying/selling prediction shares, builder codes, referralBuy, claiming winnings, Myriad contract addresses, or Myriad Protocol integration.
3connecting-to-abstract
Abstract network configuration — chain IDs, RPC endpoints, WebSocket URLs, block explorers, and wallet setup for the Abstract Ethereum L2. This skill should be used when configuring clients, wallets, or dev environments for Abstract, including questions about Abstract RPC URLs, chain IDs (2741/11124), testnet config, Abscan explorer, connecting to the Abstract network, or importing abstract/abstractTestnet from viem/chains.
3deploying-contracts-on-abstract
Deploy smart contracts on Abstract using Foundry (default) or Hardhat. Covers zksolc compilation, deployment, Abscan verification, and testnet faucets for the Abstract Ethereum L2. This skill should be used when deploying or compiling contracts on Abstract, using forge/foundry-zksync, forge build --zksync, forge create --zksync, anvil-zksync, verifying on Abscan, or working with the zkSync compiler on Abstract.
3