Gully Safe
On this page
Live
Live on testnet. safe.gullychain.xyz runs the Safe{Wallet} app, Gully's own Safe backend and the Safe 1.4.1 contracts on GullyChain Testnet (chain 485590). Test funds only.
Gully Safe is a Safe multisig for teams, treasuries and DAOs on GullyChain: several owners, a confirmation threshold, batched transactions and an on-chain record of every confirmation. It is the Safe product you know, branded for GullyChain.
#What runs where
| Piece | What |
|---|---|
| App | safe.gullychain.xyz: a fork of the Safe{Wallet} web app with GullyChain as its network |
| Backend | Gully's own Safe transaction service, config service and client gateway, indexing chain 485590 |
| Contracts | Safe 1.4.1 and the Safe passkey modules, unmodified code and salts, at Gully's own addresses (below) |
| Sponsored gas | Safe accounts can run as ERC-4337 accounts through the Safe 4337 module, the Alto bundler and the Gully paymaster (Accounts and passkeys) |
#Why the addresses differ
Safe's canonical addresses come from Safe's signed singleton factory, which the Safe team deploys per chain on request. It is not on GullyChain yet (Not deployed yet). So Gully Labs replayed the exact canonical deployments (same creation code, same salts) through the Arachnid CREATE2 factory. The code is byte-for-byte Safe's audited code; only the deployer, and therefore the address, differs.
Heads up
Pass the Gully addresses to Safe tooling explicitly. Libraries that look up Safe's canonical addresses for a chain ID will not find GullyChain, and calls to the canonical 1.4.1 addresses on chain 485590 hit empty accounts.
#Contracts
| Contract | Address |
|---|---|
| Safe 1.4.1 (singleton) | 0x639245e8476E03e789a244f279b5843b9633b2E7 |
| SafeL2 1.4.1 (singleton used by every Gully Safe) | 0x76667330c237Fb40f28d74563cdAAae4b06C23Ec |
| SafeProxyFactory 1.4.1 | 0xd9d2Ba03a7754250FDD71333F444636471CACBC4 |
| CompatibilityFallbackHandler 1.4.1 | 0xcB4a8d3609A7CCa2D9c063a742f75c899BF2f7b5 |
| MultiSend 1.4.1 | 0x7B21BBDBdE8D01Df591fdc2dc0bE9956Dde1e16C |
| MultiSendCallOnly 1.4.1 | 0x32228dDEA8b9A2bd7f2d71A958fF241D79ca5eEC |
| SignMessageLib 1.4.1 | 0x309C7b0A0D2f250Be322739753386911E1187C4E |
| CreateCall 1.4.1 | 0x8BbCaE989A0Bdf15c8E783357a0E5848e36233d0 |
| SafeWebAuthnSharedSigner 0.2.1 (passkey owners) | 0xB3a6Aa3eDDD715dbD84aD465Ab0f98919eBB6d5C |
| SafeWebAuthnSignerFactory 0.2.1 | 0xfF25690FC38De1572c2C8075966Bb813f60a095F |
| Safe4337Module 0.3.0 (canonical address) | 0x75cf11467937ce3F2f357CE24ffc3DBF8fD5c226 |
| SafeModuleSetup 0.3.0 (canonical address) | 0x2dd68b007B46fBe91B9A7c3EDa5A7a1063cB5b47 |
The rest of the suite (SimulateTxAccessor, SafeToL2Setup, SafeToL2Migration, TokenCallbackHandler) is on Contract addresses.
#Passkey owners
The Safe passkey modules are deployed, so a passkey can be a Safe owner: SafeWebAuthnSignerFactory creates a signer contract for a passkey's public key, and SafeWebAuthnSharedSigner lets a new Safe use a passkey owner from its first transaction. P-256 signatures verify through the RIP-7212 precompile (0x…0100, GullyChain runs ArbOS 51) with the Daimo verifier at 0xc2b78104907F722DABAc4C69f826a522B2754De4 as the fallback.
#Use Gully Safe from code
With permissionless.js on viem, pass the Gully addresses:
import { toSafeSmartAccount } from "permissionless/accounts";
const safe = await toSafeSmartAccount({
client: publicClient, // a viem client on chain 485590
owners: [owner],
version: "1.4.1",
entryPoint: { address: "0x0000000071727De22E5E9d8BAf0edAc6f37da032", version: "0.7" },
safeSingletonAddress: "0x76667330c237Fb40f28d74563cdAAae4b06C23Ec", // SafeL2 1.4.1
safeProxyFactoryAddress: "0xd9d2Ba03a7754250FDD71333F444636471CACBC4",
multiSendAddress: "0x7B21BBDBdE8D01Df591fdc2dc0bE9956Dde1e16C",
multiSendCallOnlyAddress: "0x32228dDEA8b9A2bd7f2d71A958fF241D79ca5eEC",
safe4337ModuleAddress: "0x75cf11467937ce3F2f357CE24ffc3DBF8fD5c226",
safeModuleSetupAddress: "0x2dd68b007B46fBe91B9A7c3EDa5A7a1063cB5b47",
});Then use it with a smart account client on the bundler and paymaster, exactly like a Kernel account. Check the option names against the permissionless.js version you install.
#Not available yet
- Spending limits. The Safe AllowanceModule is not deployed, so the spending-limit feature is off in the app.
- Canonical addresses. If the Safe team deploys its singleton factory on GullyChain, the canonical addresses can be deployed next to these. Existing Gully Safes keep working at their addresses.