• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

safe-global / safe-modules / 7193202254
85%

Build:
DEFAULT BRANCH: master
Ran 13 Dec 2023 09:27AM UTC
Jobs 1
Files 3
Run time 1s
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

13 Dec 2023 09:26AM UTC coverage: 100.0%. Remained the same
7193202254

push

github

web-flow
Safe 4337 Signer Launchpad (#184)

Related to #149, follow-up to #182

This PR provides another approach to Safe initialization to accommodate
for custom signers that are deployed along with the Safe. See #182 for
more context.

This launchpad implementation is very specific to custom signers and
introduces a new `IUniqueSignerFactory` interface that must be
implemented to work with it. The name “unique” signer is not great, but
named this way since for a given factory and some “signer data”, a
`ISignatureVerifier` implementation will correspond to a **unique**
address. In the example of P-256 and WebAuthn signers, this means a
P-256 public key will correspond to a unique on-chain address with an
`ISignatureVerifier` implementation.

This implementation works by tying the Safe address to the
`signerFactory`, `signerData` and Safe `setup` parameters. This means a
couple of things:
1. The Safe address is unique for a specific initial configuration
(owner, singleton, fallback, modules, etc.); the same property holds for
the existing `SafeProxyFactory`
2. Unlike #182, the Safe address **is not** tied to the first user
operation (in fact, the user operation is signed with the same owner as
the Safe will use!)

```mermaid
sequenceDiagram
    actor B as Bundler
    participant E as EntryPoint
    participant F as SafeProxyFactory
    participant P as SafeProxy (Account)
    participant L as SafeSignerLaunchpad
    participant S as Safe (Singleton)
    participant M as Safe4337Module
    participant U as IUniqueSignerFactory
    participant A as Signer
    actor T as Target

    B  ->> +E: handleOps([userOp])
    E  ->> +F: CALL(userOp.initCode[:20])
    F  ->>  P: CREATE2
    F  ->>  P: setup(initHash)
    P  ->>  L: setup(initHash)
    note over L: SSTORE(initHash)
    F -->> -E: ok

    E  ->> +P: validateUserOp(userOp)
    P  ->> +L: validateUserOp(userOp)
    note over L: require(getInitHash(userOp) == init... (continued)

22 of 22 branches covered (100.0%)

Branch coverage included in aggregate %.

33 of 33 relevant lines covered (100.0%)

25.0 hits per line

Jobs
ID Job ID Ran Files Coverage
1 7193202254.1 13 Dec 2023 09:27AM UTC 0
100.0
GitHub Action Run
Source Files on build 7193202254
Detailed source file information is not available for this build.
  • Back to Repo
  • 7c725e42 on github
  • Prev Build on master (#7180707836)
  • Next Build on master (#7207149151)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc