@dev.sail.money/sailor 0.0.2 → 0.1.0-local
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +140 -111
- package/LICENSE +21 -21
- package/README.md +430 -337
- package/docs/PERMISSION_MODEL.md +93 -93
- package/examples/permissions/BoundedApproveAndCallBatch.sol +179 -0
- package/examples/permissions/BoundedBet_Limitless_Base.sol +97 -96
- package/examples/permissions/BoundedBorrow_AaveV3_Arbitrum.sol +94 -94
- package/examples/permissions/BoundedPerp_GMXv2_Arbitrum.sol +154 -143
- package/examples/permissions/BoundedStake_Venice_Base.sol +85 -0
- package/examples/permissions/BoundedSupply_AaveV3_Arbitrum.sol +82 -0
- package/examples/permissions/BoundedSwap_UniswapV3_Base.sol +116 -113
- package/examples/permissions/BoundedSwap_UniswapV4_Unichain.sol +150 -144
- package/examples/permissions/BoundedTransfer_ERC20_Ethereum.sol +73 -73
- package/examples/permissions/BoundedVault_ERC4626_Base.sol +97 -0
- package/examples/permissions/README.md +79 -52
- package/examples/permissions/SailCalldata.sol +118 -0
- package/examples/permissions/foundry.toml +10 -10
- package/examples/permissions/interfaces/IBatchPermission.sol +38 -0
- package/examples/permissions/interfaces/IPermission.sol +18 -18
- package/package.json +45 -39
- package/packages/cli/README.md +34 -34
- package/packages/cli/dist/index.cjs +4571 -2944
- package/packages/cli/dist/server.cjs +1252 -2010
- package/packages/sdk/README.md +65 -65
- package/packages/sdk/dist/chains.d.ts +12 -0
- package/packages/sdk/dist/chains.d.ts.map +1 -0
- package/packages/sdk/dist/chains.js +94 -0
- package/packages/sdk/dist/chains.js.map +1 -0
- package/packages/sdk/dist/deployments.d.ts +14 -7
- package/packages/sdk/dist/deployments.d.ts.map +1 -1
- package/packages/sdk/dist/deployments.js +132 -141
- package/packages/sdk/dist/deployments.js.map +1 -1
- package/packages/sdk/dist/index.d.ts +3 -2
- package/packages/sdk/dist/index.d.ts.map +1 -1
- package/packages/sdk/dist/index.js +3 -2
- package/packages/sdk/dist/index.js.map +1 -1
- package/packages/sdk/dist/intelligence.d.ts +1 -1
- package/packages/sdk/dist/intelligence.js +1 -1
- package/packages/sdk/dist/lifi.d.ts +17 -0
- package/packages/sdk/dist/lifi.d.ts.map +1 -1
- package/packages/sdk/dist/lifi.js +24 -0
- package/packages/sdk/dist/lifi.js.map +1 -1
- package/packages/sdk/dist/safe.d.ts +83 -0
- package/packages/sdk/dist/safe.d.ts.map +1 -1
- package/packages/sdk/dist/safe.js +92 -1
- package/packages/sdk/dist/safe.js.map +1 -1
- package/packages/sdk/dist/templates/ammLiquidity.d.ts +24 -11
- package/packages/sdk/dist/templates/ammLiquidity.d.ts.map +1 -1
- package/packages/sdk/dist/templates/ammLiquidity.js +39 -31
- package/packages/sdk/dist/templates/ammLiquidity.js.map +1 -1
- package/packages/sdk/dist/templates/approveAndCallBatch.d.ts +24 -10
- package/packages/sdk/dist/templates/approveAndCallBatch.d.ts.map +1 -1
- package/packages/sdk/dist/templates/approveAndCallBatch.js +36 -23
- package/packages/sdk/dist/templates/approveAndCallBatch.js.map +1 -1
- package/packages/sdk/dist/templates/boundedBorrow.d.ts +19 -9
- package/packages/sdk/dist/templates/boundedBorrow.d.ts.map +1 -1
- package/packages/sdk/dist/templates/boundedBorrow.js +28 -19
- package/packages/sdk/dist/templates/boundedBorrow.js.map +1 -1
- package/packages/sdk/dist/templates/boundedSwap.d.ts +19 -9
- package/packages/sdk/dist/templates/boundedSwap.d.ts.map +1 -1
- package/packages/sdk/dist/templates/boundedSwap.js +30 -20
- package/packages/sdk/dist/templates/boundedSwap.js.map +1 -1
- package/packages/sdk/dist/templates/defiBundle.d.ts +35 -9
- package/packages/sdk/dist/templates/defiBundle.d.ts.map +1 -1
- package/packages/sdk/dist/templates/defiBundle.js +84 -22
- package/packages/sdk/dist/templates/defiBundle.js.map +1 -1
- package/packages/sdk/dist/templates/pendle.d.ts +23 -8
- package/packages/sdk/dist/templates/pendle.d.ts.map +1 -1
- package/packages/sdk/dist/templates/pendle.js +34 -14
- package/packages/sdk/dist/templates/pendle.js.map +1 -1
- package/packages/sdk/dist/templates/transferTarget.d.ts +11 -3
- package/packages/sdk/dist/templates/transferTarget.d.ts.map +1 -1
- package/packages/sdk/dist/templates/transferTarget.js +14 -7
- package/packages/sdk/dist/templates/transferTarget.js.map +1 -1
- package/packages/sdk/dist/types.d.ts +19 -1
- package/packages/sdk/dist/types.d.ts.map +1 -1
- package/packages/sdk/package.json +80 -52
- package/packages/ui/dist/assets/{add-DaJhwIBV.js → add-BxpXfVWe.js} +1 -1
- package/packages/ui/dist/assets/{all-wallets-BUxsqWXi.js → all-wallets-BKTn_sWK.js} +1 -1
- package/packages/ui/dist/assets/{app-store-DkltwTqE.js → app-store-CfuKbwxR.js} +1 -1
- package/packages/ui/dist/assets/{apple-owVOeaIT.js → apple-BKSBbNYg.js} +1 -1
- package/packages/ui/dist/assets/{arrow-bottom-D2mmNJve.js → arrow-bottom-D4bG6gZi.js} +1 -1
- package/packages/ui/dist/assets/{arrow-bottom-circle-CbNYijx-.js → arrow-bottom-circle-BNTs1p0T.js} +1 -1
- package/packages/ui/dist/assets/{arrow-left-DJB61s4C.js → arrow-left-2uee3vYv.js} +1 -1
- package/packages/ui/dist/assets/{arrow-right-BBrsQ9R4.js → arrow-right-BktjMV6h.js} +1 -1
- package/packages/ui/dist/assets/{arrow-top-Cil6bOc8.js → arrow-top-Izu28fX4.js} +1 -1
- package/packages/ui/dist/assets/{bank-CbwEmRo3.js → bank-USBaAyFM.js} +1 -1
- package/packages/ui/dist/assets/{basic-CLNfjw3m.js → basic-C_9KjTEH.js} +1 -1
- package/packages/ui/dist/assets/{browser-B5TtF4Pb.js → browser-DAEMAKV7.js} +1 -1
- package/packages/ui/dist/assets/{card-CO7BVB-C.js → card-DT8yDkKN.js} +1 -1
- package/packages/ui/dist/assets/{ccip-2W7K3_J3.js → ccip-CkqfGSxX.js} +1 -1
- package/packages/ui/dist/assets/{checkmark-BEtSHq9m.js → checkmark-CsgdEXFj.js} +1 -1
- package/packages/ui/dist/assets/{checkmark-bold-D9xGHzPE.js → checkmark-bold-D2gjOQo2.js} +1 -1
- package/packages/ui/dist/assets/{chevron-bottom-BDztht6i.js → chevron-bottom-tprFynYV.js} +1 -1
- package/packages/ui/dist/assets/{chevron-left-EV4GFNbc.js → chevron-left-D2Zj1gNB.js} +1 -1
- package/packages/ui/dist/assets/{chevron-right-B4_bB9oR.js → chevron-right-D1rRuAVe.js} +1 -1
- package/packages/ui/dist/assets/{chevron-top-D54xPNzF.js → chevron-top-24dL1mbL.js} +1 -1
- package/packages/ui/dist/assets/{chrome-store-DYUpAJJq.js → chrome-store-Vy-5niYX.js} +1 -1
- package/packages/ui/dist/assets/{clock-Ca1T1Soz.js → clock-qBjLnVdJ.js} +1 -1
- package/packages/ui/dist/assets/{close-BZqWjurK.js → close-DARDwgcu.js} +1 -1
- package/packages/ui/dist/assets/{coinPlaceholder-e6fl2XDo.js → coinPlaceholder-BvpIbPlD.js} +1 -1
- package/packages/ui/dist/assets/{compass-DCLC7zIh.js → compass-BMTO0ayt.js} +1 -1
- package/packages/ui/dist/assets/{copy-Th2AaD-O.js → copy-PaXeRHza.js} +1 -1
- package/packages/ui/dist/assets/{core-Ckx_cyuH.js → core-BFnStQd-.js} +3 -3
- package/packages/ui/dist/assets/cursor-BDvw-B17.js +3 -0
- package/packages/ui/dist/assets/{cursor-transparent-BKHeABKB.js → cursor-transparent-BEMdi-8q.js} +1 -1
- package/packages/ui/dist/assets/{desktop-CBjY8t6F.js → desktop-CfuLLThw.js} +1 -1
- package/packages/ui/dist/assets/{disconnect-DbSs2cli.js → disconnect-DhwgJMiR.js} +1 -1
- package/packages/ui/dist/assets/{discord-ZlLOAUkM.js → discord-po8qoN1s.js} +1 -1
- package/packages/ui/dist/assets/{etherscan-CKUrqWYN.js → etherscan-BEsz0_yx.js} +1 -1
- package/packages/ui/dist/assets/{events-CiKP71cK.js → events-Bz33Unzu.js} +1 -1
- package/packages/ui/dist/assets/{exclamation-triangle-DA1QzFiO.js → exclamation-triangle-7CjTAGOQ.js} +1 -1
- package/packages/ui/dist/assets/{extension-BVJkmvpJ.js → extension-CmxjEWEt.js} +1 -1
- package/packages/ui/dist/assets/{external-link-D_bsR7B2.js → external-link-CmQ--bNS.js} +1 -1
- package/packages/ui/dist/assets/{facebook-CmFmhojx.js → facebook-CIBn9b65.js} +1 -1
- package/packages/ui/dist/assets/{fallback-Ofl6uSnB.js → fallback-DATyrQlb.js} +1 -1
- package/packages/ui/dist/assets/{farcaster-Co-M3Ss8.js → farcaster-OJ3Jasxg.js} +1 -1
- package/packages/ui/dist/assets/{filters-B1WwNaFU.js → filters-D4x09zeL.js} +1 -1
- package/packages/ui/dist/assets/{github-CP4fP6gn.js → github-ZlIuMArp.js} +1 -1
- package/packages/ui/dist/assets/{google-CsOIXJ6V.js → google-Gwg85sfv.js} +1 -1
- package/packages/ui/dist/assets/{help-circle-DiMkomdF.js → help-circle-D1uOWYcX.js} +1 -1
- package/packages/ui/dist/assets/{id-lmscL5LX.js → id-C0-5UdYk.js} +1 -1
- package/packages/ui/dist/assets/{image-B-ubJrY5.js → image-D_DUsv8-.js} +1 -1
- package/packages/ui/dist/assets/{index-CZR1Qjhs.js → index-BCzex_R6.js} +1 -1
- package/packages/ui/dist/assets/index-BUhrHLpY.js +1775 -0
- package/packages/ui/dist/assets/index-Cq02kQmy.css +1 -0
- package/packages/ui/dist/assets/{index-BaukYv-x.js → index-CrYzBWfD.js} +1 -1
- package/packages/ui/dist/assets/{index-CF0KMmke.js → index-DdbJhIdl.js} +3 -3
- package/packages/ui/dist/assets/{index-DVgfCzCo.js → index-DiojfeVM.js} +1 -1
- package/packages/ui/dist/assets/{index-Dbh5V1Z0.js → index-izd7vu_r.js} +1 -1
- package/packages/ui/dist/assets/{index.es-C78cE5SI.js → index.es-DdkHhQAj.js} +4 -4
- package/packages/ui/dist/assets/{info-Cqg57EVo.js → info-CiRd_kEG.js} +1 -1
- package/packages/ui/dist/assets/{info-circle-DkeSWNKV.js → info-circle-ypxjqarK.js} +1 -1
- package/packages/ui/dist/assets/{lightbulb-DNlO4qKh.js → lightbulb-B-pxLxd8.js} +1 -1
- package/packages/ui/dist/assets/{mail-kVQ8Jb9Y.js → mail-BYmicuVZ.js} +1 -1
- package/packages/ui/dist/assets/{metamask-sdk-CBalSvz7.js → metamask-sdk-Ccl6DG7Q.js} +1 -1
- package/packages/ui/dist/assets/{mobile-BEteuhF7.js → mobile-CtP5PqVT.js} +1 -1
- package/packages/ui/dist/assets/{more-DBWmXQli.js → more-6C2733we.js} +1 -1
- package/packages/ui/dist/assets/{network-placeholder-Dg1uUHiL.js → network-placeholder-CdhxMzqd.js} +1 -1
- package/packages/ui/dist/assets/{nftPlaceholder-i3AHSiD9.js → nftPlaceholder-DVmTWEAY.js} +1 -1
- package/packages/ui/dist/assets/{off-BtMm0fi2.js → off-DNYLughs.js} +1 -1
- package/packages/ui/dist/assets/{parseSignature-Cb5FlWWg.js → parseSignature-Dq2B5Bu3.js} +1 -1
- package/packages/ui/dist/assets/{play-store-iKKkXa6a.js → play-store-D7Qut5ta.js} +1 -1
- package/packages/ui/dist/assets/{plus-CA5NaRtb.js → plus-kqMyjt3q.js} +1 -1
- package/packages/ui/dist/assets/{qr-code-D2kiqR7h.js → qr-code-DiUCWRbz.js} +1 -1
- package/packages/ui/dist/assets/{recycle-horizontal-Dcme7R03.js → recycle-horizontal-Boe3XiS-.js} +1 -1
- package/packages/ui/dist/assets/{refresh-Dega3sDp.js → refresh-CrBgBQYO.js} +1 -1
- package/packages/ui/dist/assets/{reown-logo-xNkksyWJ.js → reown-logo-CFZCCHSx.js} +1 -1
- package/packages/ui/dist/assets/{search-HYl7NO8x.js → search-ChTDrghU.js} +1 -1
- package/packages/ui/dist/assets/{secp256k1-Cxd6_SiH.js → secp256k1-DAV5Q_FR.js} +1 -1
- package/packages/ui/dist/assets/{send-CJU8CUAo.js → send-DLFbBFe1.js} +1 -1
- package/packages/ui/dist/assets/{swapHorizontal-IMUKiUre.js → swapHorizontal-BEs3emfG.js} +1 -1
- package/packages/ui/dist/assets/{swapHorizontalBold-CNYnNJ9-.js → swapHorizontalBold-CC-Hfa7W.js} +1 -1
- package/packages/ui/dist/assets/{swapHorizontalMedium-B9VxEYsT.js → swapHorizontalMedium-BmR0H8DC.js} +1 -1
- package/packages/ui/dist/assets/{swapHorizontalRoundedBold-Dz33l_Jh.js → swapHorizontalRoundedBold-BdP5NGIH.js} +1 -1
- package/packages/ui/dist/assets/{swapVertical-CHUmjVJ0.js → swapVertical-CPrGEJPY.js} +1 -1
- package/packages/ui/dist/assets/{telegram-kl9S2mbU.js → telegram-CxNoZ80Q.js} +1 -1
- package/packages/ui/dist/assets/{three-dots-U5lhA1Am.js → three-dots-BRa6SBpL.js} +1 -1
- package/packages/ui/dist/assets/{twitch-KTEUWXEp.js → twitch-BC338bG5.js} +1 -1
- package/packages/ui/dist/assets/{twitterIcon-BHiq8mRg.js → twitterIcon-BGZmt2i9.js} +1 -1
- package/packages/ui/dist/assets/{verify-CfN-BXNd.js → verify-CEstW0zw.js} +1 -1
- package/packages/ui/dist/assets/{verify-filled-DwZccetj.js → verify-filled-OkZb0weU.js} +1 -1
- package/packages/ui/dist/assets/{w3m-modal-CS-PFqPE.js → w3m-modal-pS09ECwE.js} +1 -1
- package/packages/ui/dist/assets/{wallet-DVlGkhOY.js → wallet-BXVKCgC9.js} +1 -1
- package/packages/ui/dist/assets/{wallet-placeholder-CvR_iEWX.js → wallet-placeholder-C_kNhB1c.js} +1 -1
- package/packages/ui/dist/assets/{walletconnect-8pZBDvVI.js → walletconnect-CRKIuUHH.js} +1 -1
- package/packages/ui/dist/assets/{warning-circle-ylLEE0Yp.js → warning-circle-DB2NnwlJ.js} +1 -1
- package/packages/ui/dist/assets/{x-C_TBsTMj.js → x-DT4RmwL5.js} +1 -1
- package/packages/ui/dist/index.html +14 -14
- package/scripts/check-docs.mjs +262 -262
- package/scripts/check-init.mjs +108 -109
- package/scripts/postinstall.js +81 -366
- package/templates/custom-mandate/.sail/contracts/interfaces/IPermission.sol +18 -18
- package/templates/custom-mandate/README.md +116 -85
- package/templates/custom-mandate/foundry.toml +8 -8
- package/templates/custom-mandate/mandates/BoundedCallPermission.sol +41 -35
- package/templates/custom-mandate/mandates/README.md +16 -16
- package/templates/custom-mandate/mandates/SailCalldata.sol +118 -0
- package/templates/{dca-rebalancer → default}/.cursor/rules +25 -25
- package/templates/default/.env.example +20 -0
- package/templates/{dca-rebalancer → default}/.github/workflows/agent-tick.yml +33 -32
- package/templates/{dca-rebalancer → default}/.sail/README.md +13 -13
- package/templates/{dca-rebalancer → default}/.sail/config.json +10 -10
- package/templates/default/AGENTS.md +171 -0
- package/templates/{dca-rebalancer → default}/CLAUDE.md +2 -2
- package/templates/default/README.md +16 -0
- package/templates/{dca-rebalancer → default}/_gitignore +13 -13
- package/templates/{dca-rebalancer → default}/docs/PERMISSION_MODEL.md +93 -93
- package/templates/default/examples/dca/README.md +16 -0
- package/templates/default/examples/dca/agent.ts +174 -0
- package/templates/{dca-rebalancer/src → default/examples/dca}/mandate.ts +45 -67
- package/templates/{dca-rebalancer → default}/package.json +17 -17
- package/templates/default/src/agent.ts +37 -0
- package/templates/default/src/config.ts +24 -0
- package/templates/default/src/mandate.ts +22 -0
- package/templates/default/tsconfig.json +17 -0
- package/templates/{dca-rebalancer → default}/ui/README.md +3 -3
- package/templates/lifi-permissions/LifiBoundedApprovePermissionCloneable.sol +84 -84
- package/templates/lifi-permissions/LifiDiamondSwapPermissionCloneable.sol +97 -97
- package/templates/lifi-permissions/README.md +53 -53
- package/packages/ui/dist/assets/cursor-DV7rOqbJ.js +0 -3
- package/packages/ui/dist/assets/index-CKxgNxS9.css +0 -1
- package/packages/ui/dist/assets/index-Q2Yai4Fe.js +0 -2103
- package/templates/dca-rebalancer/.env.example +0 -6
- package/templates/dca-rebalancer/AGENTS.md +0 -246
- package/templates/dca-rebalancer/AGENT_PLAYBOOK.md +0 -110
- package/templates/dca-rebalancer/README.md +0 -16
- package/templates/dca-rebalancer/src/agent.ts +0 -253
- package/templates/dca-rebalancer/src/config.ts +0 -27
- package/templates/dca-rebalancer/tsconfig.json +0 -8
- /package/templates/{dca-rebalancer → default}/.sail/.gitkeep +0 -0
package/packages/sdk/README.md
CHANGED
|
@@ -1,65 +1,65 @@
|
|
|
1
|
-
# @sail.money/sdk
|
|
2
|
-
|
|
3
|
-
> **Pre-1.0 — unstable.** The Sail Protocol trusted core is under an ongoing
|
|
4
|
-
> external audit by [Octane Security](https://octane.security). The API may
|
|
5
|
-
> change between releases while the protocol is in audit. Do not use staging
|
|
6
|
-
> deployments with funds you are not prepared to lose.
|
|
7
|
-
|
|
8
|
-
TypeScript SDK for Sail Protocol — the on-chain SMA (Separately Managed
|
|
9
|
-
Account) infrastructure. Peer-depends on `viem ^2`.
|
|
10
|
-
|
|
11
|
-
## Install
|
|
12
|
-
|
|
13
|
-
```sh
|
|
14
|
-
npm install @sail.money/sdk viem
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
## Key exports
|
|
18
|
-
|
|
19
|
-
| Export | What it does |
|
|
20
|
-
|---|---|
|
|
21
|
-
| `SailorClient` | Full client: account, mandate, dispatch, session, fees |
|
|
22
|
-
| `buildDispatchSignature` | Self-detecting EIP-712 Dispatch signer (reads on-chain model; no footguns) |
|
|
23
|
-
| `detectKernelCapabilities` | Reads `DISPATCH_TYPEHASH` on-chain; identifies conjunctive vs selective kernel |
|
|
24
|
-
| `sailKernelDomain` | EIP-712 domain for any SailKernel |
|
|
25
|
-
| `DISPATCH_EIP712_FIELDS` | Typed struct field lists keyed by dispatch model |
|
|
26
|
-
| `LocalKeyring` | Encrypted manager key (geth keystore v3) |
|
|
27
|
-
| `sailDeployments` | Live staging addresses (Base, Base Sepolia, Arbitrum, Unichain) |
|
|
28
|
-
| `SailIntelligence` | Typed client for the Sail Intelligence API |
|
|
29
|
-
|
|
30
|
-
## Dispatch signing
|
|
31
|
-
|
|
32
|
-
```ts
|
|
33
|
-
import { buildDispatchSignature, LocalKeyring } from "@sail.money/sdk";
|
|
34
|
-
import { createPublicClient, http } from "viem";
|
|
35
|
-
|
|
36
|
-
const publicClient = createPublicClient({ chain: base, transport: http(rpcUrl) });
|
|
37
|
-
const manager = await LocalKeyring.load("path/to/manager.json", passphrase);
|
|
38
|
-
|
|
39
|
-
const { signature, nonce, deadline, dispatchModel } = await buildDispatchSignature({
|
|
40
|
-
publicClient,
|
|
41
|
-
kernel: "0x6319d3dfDDe3804ba93D65752b00c52bFb05a1ab", // Base
|
|
42
|
-
chainId: 8453,
|
|
43
|
-
account: mySafe,
|
|
44
|
-
permission: myPermission,
|
|
45
|
-
call: { target: router, value: 0n, data: swapCalldata },
|
|
46
|
-
manager,
|
|
47
|
-
});
|
|
48
|
-
// Submit: kernel.dispatch(account, permission, target, value, data, signature, deadline)
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
`buildDispatchSignature` reads the kernel's on-chain `DISPATCH_TYPEHASH` to
|
|
52
|
-
select the correct struct automatically — you cannot pass the wrong model.
|
|
53
|
-
|
|
54
|
-
## Full client
|
|
55
|
-
|
|
56
|
-
```ts
|
|
57
|
-
import { SailorClient } from "@sail.money/sdk";
|
|
58
|
-
|
|
59
|
-
const client = new SailorClient({ rpcUrl: "https://...", chainId: 8453 });
|
|
60
|
-
// Read-only operations (no signer required):
|
|
61
|
-
const caps = await client.capabilities();
|
|
62
|
-
// State-changing operations require a signer:
|
|
63
|
-
const exec = client.withSigner(walletClient);
|
|
64
|
-
await exec.dispatch.single(safe, permission, call, manager);
|
|
65
|
-
```
|
|
1
|
+
# @sail.money/sdk
|
|
2
|
+
|
|
3
|
+
> **Pre-1.0 — unstable.** The Sail Protocol trusted core is under an ongoing
|
|
4
|
+
> external audit by [Octane Security](https://octane.security). The API may
|
|
5
|
+
> change between releases while the protocol is in audit. Do not use staging
|
|
6
|
+
> deployments with funds you are not prepared to lose.
|
|
7
|
+
|
|
8
|
+
TypeScript SDK for Sail Protocol — the on-chain SMA (Separately Managed
|
|
9
|
+
Account) infrastructure. Peer-depends on `viem ^2`.
|
|
10
|
+
|
|
11
|
+
## Install
|
|
12
|
+
|
|
13
|
+
```sh
|
|
14
|
+
npm install @sail.money/sdk viem
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Key exports
|
|
18
|
+
|
|
19
|
+
| Export | What it does |
|
|
20
|
+
|---|---|
|
|
21
|
+
| `SailorClient` | Full client: account, mandate, dispatch, session, fees |
|
|
22
|
+
| `buildDispatchSignature` | Self-detecting EIP-712 Dispatch signer (reads on-chain model; no footguns) |
|
|
23
|
+
| `detectKernelCapabilities` | Reads `DISPATCH_TYPEHASH` on-chain; identifies conjunctive vs selective kernel |
|
|
24
|
+
| `sailKernelDomain` | EIP-712 domain for any SailKernel |
|
|
25
|
+
| `DISPATCH_EIP712_FIELDS` | Typed struct field lists keyed by dispatch model |
|
|
26
|
+
| `LocalKeyring` | Encrypted manager key (geth keystore v3) |
|
|
27
|
+
| `sailDeployments` | Live staging addresses (Base, Base Sepolia, Arbitrum, Unichain) |
|
|
28
|
+
| `SailIntelligence` | Typed client for the Sail Intelligence API |
|
|
29
|
+
|
|
30
|
+
## Dispatch signing
|
|
31
|
+
|
|
32
|
+
```ts
|
|
33
|
+
import { buildDispatchSignature, LocalKeyring } from "@sail.money/sdk";
|
|
34
|
+
import { createPublicClient, http } from "viem";
|
|
35
|
+
|
|
36
|
+
const publicClient = createPublicClient({ chain: base, transport: http(rpcUrl) });
|
|
37
|
+
const manager = await LocalKeyring.load("path/to/manager.json", passphrase);
|
|
38
|
+
|
|
39
|
+
const { signature, nonce, deadline, dispatchModel } = await buildDispatchSignature({
|
|
40
|
+
publicClient,
|
|
41
|
+
kernel: "0x6319d3dfDDe3804ba93D65752b00c52bFb05a1ab", // Base
|
|
42
|
+
chainId: 8453,
|
|
43
|
+
account: mySafe,
|
|
44
|
+
permission: myPermission,
|
|
45
|
+
call: { target: router, value: 0n, data: swapCalldata },
|
|
46
|
+
manager,
|
|
47
|
+
});
|
|
48
|
+
// Submit: kernel.dispatch(account, permission, target, value, data, signature, deadline)
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
`buildDispatchSignature` reads the kernel's on-chain `DISPATCH_TYPEHASH` to
|
|
52
|
+
select the correct struct automatically — you cannot pass the wrong model.
|
|
53
|
+
|
|
54
|
+
## Full client
|
|
55
|
+
|
|
56
|
+
```ts
|
|
57
|
+
import { SailorClient } from "@sail.money/sdk";
|
|
58
|
+
|
|
59
|
+
const client = new SailorClient({ rpcUrl: "https://...", chainId: 8453 });
|
|
60
|
+
// Read-only operations (no signer required):
|
|
61
|
+
const caps = await client.capabilities();
|
|
62
|
+
// State-changing operations require a signer:
|
|
63
|
+
const exec = client.withSigner(walletClient);
|
|
64
|
+
await exec.dispatch.single(safe, permission, call, manager);
|
|
65
|
+
```
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ChainConfig } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Registry of live SailKernel deployments, keyed by EVM chainId.
|
|
4
|
+
*
|
|
5
|
+
* All entries were updated to the CREATE2-deterministic deployment (gitCommit
|
|
6
|
+
* 1199b33) in which every core contract lands at the same address on every chain.
|
|
7
|
+
* Add new chains here as SailKernel is deployed on additional networks.
|
|
8
|
+
*/
|
|
9
|
+
export declare const chains: Record<number, ChainConfig>;
|
|
10
|
+
/** Returns the ChainConfig for a given chainId, or throws if unsupported. */
|
|
11
|
+
export declare function getChain(chainId: number): ChainConfig;
|
|
12
|
+
//# sourceMappingURL=chains.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chains.d.ts","sourceRoot":"","sources":["../src/chains.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;;GAMG;AACH,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CA6E9C,CAAC;AAEF,6EAA6E;AAC7E,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAQrD"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry of live SailKernel deployments, keyed by EVM chainId.
|
|
3
|
+
*
|
|
4
|
+
* All entries were updated to the CREATE2-deterministic deployment (gitCommit
|
|
5
|
+
* 1199b33) in which every core contract lands at the same address on every chain.
|
|
6
|
+
* Add new chains here as SailKernel is deployed on additional networks.
|
|
7
|
+
*/
|
|
8
|
+
export const chains = {
|
|
9
|
+
// Ethereum mainnet
|
|
10
|
+
1: {
|
|
11
|
+
chainId: 1,
|
|
12
|
+
name: "Ethereum",
|
|
13
|
+
rpcEnvVar: "ETH_MAINNET_RPC_URL",
|
|
14
|
+
// CREATE2 deterministic deploy (2026-06-09, gitCommit 1199b33).
|
|
15
|
+
kernel: "0x02ABC18B65A328de2e749F56ba79ACF2718a6659",
|
|
16
|
+
mandateFactory: "0x14EDd6c2a56EfC0d71E215ab13094B9AF90543d2",
|
|
17
|
+
governance: "0x7A478118715791728BDE3bc7A4D7ECfdEB89C6EC",
|
|
18
|
+
dispatchModel: "selective",
|
|
19
|
+
protocols: {},
|
|
20
|
+
},
|
|
21
|
+
// Base mainnet
|
|
22
|
+
8453: {
|
|
23
|
+
chainId: 8453,
|
|
24
|
+
name: "Base",
|
|
25
|
+
rpcEnvVar: "BASE_RPC_URL",
|
|
26
|
+
// CREATE2 deterministic deploy (2026-06-09, gitCommit 1199b33).
|
|
27
|
+
// Supersedes 0x6319d3dfDDe3804ba93D65752b00c52bFb05a1ab (SAIL-405).
|
|
28
|
+
kernel: "0x02ABC18B65A328de2e749F56ba79ACF2718a6659",
|
|
29
|
+
mandateFactory: "0x14EDd6c2a56EfC0d71E215ab13094B9AF90543d2",
|
|
30
|
+
governance: "0x7A478118715791728BDE3bc7A4D7ECfdEB89C6EC",
|
|
31
|
+
dispatchModel: "selective",
|
|
32
|
+
protocols: {},
|
|
33
|
+
},
|
|
34
|
+
// Arbitrum mainnet
|
|
35
|
+
42161: {
|
|
36
|
+
chainId: 42161,
|
|
37
|
+
name: "Arbitrum",
|
|
38
|
+
rpcEnvVar: "ARBITRUM_RPC_URL",
|
|
39
|
+
// CREATE2 deterministic deploy (2026-06-09, gitCommit 1199b33).
|
|
40
|
+
// Supersedes 0x2716B12832DED0EF5688519c5Fe069EFc0374E02 (SAIL-405).
|
|
41
|
+
kernel: "0x02ABC18B65A328de2e749F56ba79ACF2718a6659",
|
|
42
|
+
mandateFactory: "0x14EDd6c2a56EfC0d71E215ab13094B9AF90543d2",
|
|
43
|
+
governance: "0x7A478118715791728BDE3bc7A4D7ECfdEB89C6EC",
|
|
44
|
+
dispatchModel: "selective",
|
|
45
|
+
protocols: {},
|
|
46
|
+
},
|
|
47
|
+
// Unichain mainnet
|
|
48
|
+
130: {
|
|
49
|
+
chainId: 130,
|
|
50
|
+
name: "Unichain",
|
|
51
|
+
rpcEnvVar: "UNICHAIN_RPC_URL",
|
|
52
|
+
// CREATE2 deterministic deploy (2026-06-09, gitCommit 1199b33).
|
|
53
|
+
// Supersedes 0xD985029960a9B7C2E7E38e102C448b8b8539B156 (SAIL-406).
|
|
54
|
+
kernel: "0x02ABC18B65A328de2e749F56ba79ACF2718a6659",
|
|
55
|
+
mandateFactory: "0x14EDd6c2a56EfC0d71E215ab13094B9AF90543d2",
|
|
56
|
+
governance: "0x7A478118715791728BDE3bc7A4D7ECfdEB89C6EC",
|
|
57
|
+
dispatchModel: "selective",
|
|
58
|
+
protocols: {},
|
|
59
|
+
},
|
|
60
|
+
// Base Sepolia (testnet)
|
|
61
|
+
84532: {
|
|
62
|
+
chainId: 84532,
|
|
63
|
+
name: "Base Sepolia",
|
|
64
|
+
rpcEnvVar: "BASE_SEPOLIA_RPC_URL",
|
|
65
|
+
// CREATE2 deterministic deploy (2026-06-09, gitCommit 1199b33).
|
|
66
|
+
// Supersedes 0xf1D0F4C9893612627409948BAa9d82a01a373799 (SAIL-405).
|
|
67
|
+
kernel: "0x02ABC18B65A328de2e749F56ba79ACF2718a6659",
|
|
68
|
+
mandateFactory: "0x14EDd6c2a56EfC0d71E215ab13094B9AF90543d2",
|
|
69
|
+
governance: "0x7A478118715791728BDE3bc7A4D7ECfdEB89C6EC",
|
|
70
|
+
dispatchModel: "selective",
|
|
71
|
+
protocols: {},
|
|
72
|
+
},
|
|
73
|
+
// Eth Sepolia (testnet)
|
|
74
|
+
11155111: {
|
|
75
|
+
chainId: 11155111,
|
|
76
|
+
name: "Eth Sepolia",
|
|
77
|
+
rpcEnvVar: "SEPOLIA_RPC_URL",
|
|
78
|
+
// CREATE2 deterministic deploy (2026-06-09, gitCommit 1199b33).
|
|
79
|
+
kernel: "0x02ABC18B65A328de2e749F56ba79ACF2718a6659",
|
|
80
|
+
mandateFactory: "0x14EDd6c2a56EfC0d71E215ab13094B9AF90543d2",
|
|
81
|
+
governance: "0x7A478118715791728BDE3bc7A4D7ECfdEB89C6EC",
|
|
82
|
+
dispatchModel: "selective",
|
|
83
|
+
protocols: {},
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
/** Returns the ChainConfig for a given chainId, or throws if unsupported. */
|
|
87
|
+
export function getChain(chainId) {
|
|
88
|
+
const config = chains[chainId];
|
|
89
|
+
if (!config) {
|
|
90
|
+
throw new Error(`Chain ${chainId} is not supported. Supported chains: 1 (Ethereum), 8453 (Base), 42161 (Arbitrum), 130 (Unichain), 84532 (Base Sepolia), 11155111 (Eth Sepolia).`);
|
|
91
|
+
}
|
|
92
|
+
return config;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=chains.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chains.js","sourceRoot":"","sources":["../src/chains.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,MAAM,GAAgC;IACjD,mBAAmB;IACnB,CAAC,EAAE;QACD,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,UAAU;QAChB,SAAS,EAAE,qBAAqB;QAChC,gEAAgE;QAChE,MAAM,EAAE,4CAA4C;QACpD,cAAc,EAAE,4CAA4C;QAC5D,UAAU,EAAE,4CAA4C;QACxD,aAAa,EAAE,WAAW;QAC1B,SAAS,EAAE,EAAE;KACd;IACD,eAAe;IACf,IAAI,EAAE;QACJ,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,cAAc;QACzB,gEAAgE;QAChE,oEAAoE;QACpE,MAAM,EAAE,4CAA4C;QACpD,cAAc,EAAE,4CAA4C;QAC5D,UAAU,EAAE,4CAA4C;QACxD,aAAa,EAAE,WAAW;QAC1B,SAAS,EAAE,EAAE;KACd;IACD,mBAAmB;IACnB,KAAK,EAAE;QACL,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,UAAU;QAChB,SAAS,EAAE,kBAAkB;QAC7B,gEAAgE;QAChE,oEAAoE;QACpE,MAAM,EAAE,4CAA4C;QACpD,cAAc,EAAE,4CAA4C;QAC5D,UAAU,EAAE,4CAA4C;QACxD,aAAa,EAAE,WAAW;QAC1B,SAAS,EAAE,EAAE;KACd;IACD,mBAAmB;IACnB,GAAG,EAAE;QACH,OAAO,EAAE,GAAG;QACZ,IAAI,EAAE,UAAU;QAChB,SAAS,EAAE,kBAAkB;QAC7B,gEAAgE;QAChE,oEAAoE;QACpE,MAAM,EAAE,4CAA4C;QACpD,cAAc,EAAE,4CAA4C;QAC5D,UAAU,EAAE,4CAA4C;QACxD,aAAa,EAAE,WAAW;QAC1B,SAAS,EAAE,EAAE;KACd;IACD,yBAAyB;IACzB,KAAK,EAAE;QACL,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,cAAc;QACpB,SAAS,EAAE,sBAAsB;QACjC,gEAAgE;QAChE,oEAAoE;QACpE,MAAM,EAAE,4CAA4C;QACpD,cAAc,EAAE,4CAA4C;QAC5D,UAAU,EAAE,4CAA4C;QACxD,aAAa,EAAE,WAAW;QAC1B,SAAS,EAAE,EAAE;KACd;IACD,wBAAwB;IACxB,QAAQ,EAAE;QACR,OAAO,EAAE,QAAQ;QACjB,IAAI,EAAE,aAAa;QACnB,SAAS,EAAE,iBAAiB;QAC5B,gEAAgE;QAChE,MAAM,EAAE,4CAA4C;QACpD,cAAc,EAAE,4CAA4C;QAC5D,UAAU,EAAE,4CAA4C;QACxD,aAAa,EAAE,WAAW;QAC1B,SAAS,EAAE,EAAE;KACd;CACF,CAAC;AAEF,6EAA6E;AAC7E,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,SAAS,OAAO,iJAAiJ,CAClK,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
import type { Address } from "viem";
|
|
2
2
|
import type { DispatchModel } from "./capabilities.js";
|
|
3
|
-
/**
|
|
4
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Chains with a bundled Sail Protocol deployment.
|
|
5
|
+
* Mainnets: Ethereum (1), Base (8453), Arbitrum (42161), Unichain (130).
|
|
6
|
+
* Testnets: Base Sepolia (84532), Eth Sepolia (11155111).
|
|
7
|
+
*
|
|
8
|
+
* All six chains were redeployed via CREATE2 (global salt, gitCommit 1199b33)
|
|
9
|
+
* so every core contract lands at the same address on every chain.
|
|
10
|
+
*/
|
|
11
|
+
export type SailChainId = 1 | 8453 | 42161 | 130 | 84532 | 11155111;
|
|
5
12
|
/** A pre-audited mandate template available on a chain. */
|
|
6
13
|
export type KnownTemplate = {
|
|
7
14
|
kind: string;
|
|
@@ -21,7 +28,7 @@ export type CloneTemplateParam = {
|
|
|
21
28
|
* Rich, self-describing metadata for an EIP-1167 clone permission template — the
|
|
22
29
|
* wizard-/tooling-facing companion to the bare `standaloneTemplates` address map.
|
|
23
30
|
* `address` mirrors `standaloneTemplates[key]` (the clone LOGIC). A clone is created
|
|
24
|
-
* per account via `
|
|
31
|
+
* per account via `MandateFactory.deployAndAttach(account, address, salt,
|
|
25
32
|
* initData)`, where `initData` ABI-encodes a call to `initialize(initParams…)`.
|
|
26
33
|
*/
|
|
27
34
|
export type CloneTemplateInfo = {
|
|
@@ -46,7 +53,7 @@ export type SailDeployment = {
|
|
|
46
53
|
governance: Address;
|
|
47
54
|
timelock: Address;
|
|
48
55
|
kernel: Address;
|
|
49
|
-
|
|
56
|
+
mandateFactory: Address;
|
|
50
57
|
standardFeePolicy: Address;
|
|
51
58
|
safeModuleEnabler: Address;
|
|
52
59
|
treasury: Address;
|
|
@@ -57,15 +64,15 @@ export type SailDeployment = {
|
|
|
57
64
|
* Dispatch model this kernel implements, as a static hint. Verified on-chain
|
|
58
65
|
* against each kernel's DISPATCH_TYPEHASH. The SDK still prefers live detection
|
|
59
66
|
* (detectKernelCapabilities) and uses this only as a fallback when the on-chain
|
|
60
|
-
* read is unavailable. All
|
|
61
|
-
*
|
|
67
|
+
* read is unavailable. All deployed chains run the "selective" model, verified
|
|
68
|
+
* on-chain against each kernel's DISPATCH_TYPEHASH.
|
|
62
69
|
*/
|
|
63
70
|
dispatchModel?: DispatchModel;
|
|
64
71
|
/** Pre-audited shared mandate templates available on this chain. */
|
|
65
72
|
knownTemplates?: KnownTemplate[];
|
|
66
73
|
/**
|
|
67
74
|
* Standalone (EIP-1167 clone) permission template LOGIC addresses, keyed by a
|
|
68
|
-
* short name. These are the `impl` argument to
|
|
75
|
+
* short name. These are the `impl` argument to MandateFactory.deployAndAttach.
|
|
69
76
|
*/
|
|
70
77
|
standaloneTemplates?: Record<string, Address>;
|
|
71
78
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deployments.d.ts","sourceRoot":"","sources":["../src/deployments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD
|
|
1
|
+
{"version":3,"file":"deployments.d.ts","sourceRoot":"","sources":["../src/deployments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;;;;;;GAOG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,GAAG,KAAK,GAAG,GAAG,GAAG,KAAK,GAAG,QAAQ,CAAC;AAEpE,2DAA2D;AAC3D,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,WAAW,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,oFAAoF;AACpF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,6CAA6C;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,gEAAgE;IAChE,OAAO,EAAE,OAAO,CAAC;IACjB,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+EAA+E;IAC/E,UAAU,EAAE,kBAAkB,EAAE,CAAC;IACjC,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,sEAAsE;AACtE,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,WAAW,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;IACxB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,qBAAqB,EAAE,MAAM,CAAC;IAC9B;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,oEAAoE;IACpE,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IACjC;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9C;;;;;OAKG;IACH,cAAc,CAAC,EAAE,iBAAiB,EAAE,CAAC;CACtC,CAAC;AAoBF,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,WAAW,EAAE,cAAc,CAwI/D,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAMjE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,cAAc,CA4BlF"}
|
|
@@ -1,172 +1,154 @@
|
|
|
1
1
|
const zero = "0x0000000000000000000000000000000000000000";
|
|
2
|
+
/**
|
|
3
|
+
* CREATE2-deterministic core addresses — identical on every chain (gitCommit 1199b33,
|
|
4
|
+
* deployment mode: create2-global-salt, factory: 0x4e59b44847b379578588920cA78FbF26c0B4956C).
|
|
5
|
+
*
|
|
6
|
+
* Because kernel, safeModuleEnabler, and standardFeePolicy are the same on every chain,
|
|
7
|
+
* SailKernel.createAccount produces the same SMA address with the same owner/manager/salt
|
|
8
|
+
* on every supported chain — enabling true cross-chain deterministic SMA deployment.
|
|
9
|
+
*/
|
|
10
|
+
const CREATE2_KERNEL = "0x02ABC18B65A328de2e749F56ba79ACF2718a6659";
|
|
11
|
+
const CREATE2_GOVERNANCE = "0x7A478118715791728BDE3bc7A4D7ECfdEB89C6EC";
|
|
12
|
+
const CREATE2_TIMELOCK = "0xE48Ba8DB6d748adafD13155c3590f62e58a77f56";
|
|
13
|
+
const CREATE2_SAFE_MODULE_ENABLER = "0x7897Cb53a4be4a2eaAf46D60573C4Fd83b33fE1F";
|
|
14
|
+
const CREATE2_MANDATE_FACTORY = "0x14EDd6c2a56EfC0d71E215ab13094B9AF90543d2";
|
|
15
|
+
const CREATE2_STANDARD_FEE_POLICY = "0xe7B5901b839cFFDEd9D4108A22712C8BfdA1D80D";
|
|
16
|
+
const CREATE2_TREASURY = "0xB01dCE443d052e44b7D13726c0EC9fFB7f5815B6";
|
|
2
17
|
export const sailDeployments = {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
kernel: "0xf1D0F4C9893612627409948BAa9d82a01a373799",
|
|
18
|
-
permissionFactory: "0xdfF6a2272F667cDf78Af4681b9c88A219998db95",
|
|
19
|
-
standardFeePolicy: "0x05570F7973b46Eb9Ed4518422891EFC26BD58b97",
|
|
20
|
-
safeModuleEnabler: "0xB2C2B52d94412e3472C9fb2B52186eA12a935869",
|
|
21
|
-
treasury: "0xB01dCE443d052e44b7D13726c0EC9fFB7f5815B6",
|
|
18
|
+
// ── Ethereum mainnet ─────────────────────────────────────────────────────────
|
|
19
|
+
1: {
|
|
20
|
+
// CREATE2 deterministic deploy (2026-06-09, gitCommit 1199b33).
|
|
21
|
+
// allowlistBootstrapped=true (genesis bootstrap), zero fees, 48h timelock.
|
|
22
|
+
chainId: 1,
|
|
23
|
+
blockNumber: 25280925,
|
|
24
|
+
deployer: CREATE2_TREASURY,
|
|
25
|
+
governance: CREATE2_GOVERNANCE,
|
|
26
|
+
timelock: CREATE2_TIMELOCK,
|
|
27
|
+
kernel: CREATE2_KERNEL,
|
|
28
|
+
mandateFactory: CREATE2_MANDATE_FACTORY,
|
|
29
|
+
standardFeePolicy: CREATE2_STANDARD_FEE_POLICY,
|
|
30
|
+
safeModuleEnabler: CREATE2_SAFE_MODULE_ENABLER,
|
|
31
|
+
treasury: CREATE2_TREASURY,
|
|
22
32
|
maxPermissionFeeWei: 1000000000000000n,
|
|
23
33
|
initialBaseFee: 0n,
|
|
24
34
|
initialComplexityRate: 0n,
|
|
25
|
-
dispatchModel: "selective",
|
|
35
|
+
dispatchModel: "selective",
|
|
26
36
|
knownTemplates: [],
|
|
27
37
|
standaloneTemplates: {},
|
|
28
38
|
},
|
|
39
|
+
// ── Base mainnet ─────────────────────────────────────────────────────────────
|
|
29
40
|
8453: {
|
|
30
|
-
//
|
|
31
|
-
//
|
|
32
|
-
//
|
|
33
|
-
// local CREATE2 proxy prediction carried over; allowlistBootstrapped=true,
|
|
34
|
-
// zero fees, onboarding live. Supersedes 0x20eff0DbE752e22655A6dAA5A94521FA06CDdE06.
|
|
35
|
-
// Only `core` was redeployed; shared/standalone permission templates are NOT yet
|
|
36
|
-
// deployed against this kernel (run the templates targets + refill the maps first).
|
|
41
|
+
// CREATE2 deterministic deploy (2026-06-09, gitCommit 1199b33). Supersedes
|
|
42
|
+
// 0x6319d3dfDDe3804ba93D65752b00c52bFb05a1ab (SAIL-405 redeploy).
|
|
43
|
+
// allowlistBootstrapped=true, zero fees, 48h timelock.
|
|
37
44
|
chainId: 8453,
|
|
38
|
-
blockNumber:
|
|
39
|
-
deployer:
|
|
40
|
-
governance:
|
|
41
|
-
timelock:
|
|
42
|
-
kernel:
|
|
43
|
-
|
|
44
|
-
standardFeePolicy:
|
|
45
|
-
safeModuleEnabler:
|
|
46
|
-
treasury:
|
|
45
|
+
blockNumber: 47115338,
|
|
46
|
+
deployer: CREATE2_TREASURY,
|
|
47
|
+
governance: CREATE2_GOVERNANCE,
|
|
48
|
+
timelock: CREATE2_TIMELOCK,
|
|
49
|
+
kernel: CREATE2_KERNEL,
|
|
50
|
+
mandateFactory: CREATE2_MANDATE_FACTORY,
|
|
51
|
+
standardFeePolicy: CREATE2_STANDARD_FEE_POLICY,
|
|
52
|
+
safeModuleEnabler: CREATE2_SAFE_MODULE_ENABLER,
|
|
53
|
+
treasury: CREATE2_TREASURY,
|
|
47
54
|
maxPermissionFeeWei: 1000000000000000n,
|
|
48
55
|
initialBaseFee: 0n,
|
|
49
56
|
initialComplexityRate: 0n,
|
|
50
|
-
dispatchModel: "selective",
|
|
57
|
+
dispatchModel: "selective",
|
|
51
58
|
knownTemplates: [],
|
|
52
59
|
standaloneTemplates: {},
|
|
53
60
|
},
|
|
61
|
+
// ── Arbitrum mainnet ─────────────────────────────────────────────────────────
|
|
54
62
|
42161: {
|
|
55
|
-
//
|
|
56
|
-
//
|
|
57
|
-
//
|
|
58
|
-
// local CREATE2 proxy prediction carried over; allowlistBootstrapped=true,
|
|
59
|
-
// zero fees, onboarding live. Supersedes 0x9AF32E0C395fb31f5cA28994351F8fAE3003e125.
|
|
60
|
-
// Bootstrap was sent as a standalone tx post-core-deploy; identical end state to Base.
|
|
61
|
-
// Only `core` was redeployed; shared/standalone permission templates are NOT yet
|
|
62
|
-
// deployed against this kernel (run the templates targets + refill the maps first).
|
|
63
|
+
// CREATE2 deterministic deploy (2026-06-09, gitCommit 1199b33). Supersedes
|
|
64
|
+
// 0x2716B12832DED0EF5688519c5Fe069EFc0374E02 (SAIL-405 redeploy).
|
|
65
|
+
// allowlistBootstrapped=true, zero fees, 48h timelock.
|
|
63
66
|
chainId: 42161,
|
|
64
|
-
blockNumber:
|
|
65
|
-
deployer:
|
|
66
|
-
governance:
|
|
67
|
-
timelock:
|
|
68
|
-
kernel:
|
|
69
|
-
|
|
70
|
-
standardFeePolicy:
|
|
71
|
-
safeModuleEnabler:
|
|
72
|
-
treasury:
|
|
67
|
+
blockNumber: 471736462,
|
|
68
|
+
deployer: CREATE2_TREASURY,
|
|
69
|
+
governance: CREATE2_GOVERNANCE,
|
|
70
|
+
timelock: CREATE2_TIMELOCK,
|
|
71
|
+
kernel: CREATE2_KERNEL,
|
|
72
|
+
mandateFactory: CREATE2_MANDATE_FACTORY,
|
|
73
|
+
standardFeePolicy: CREATE2_STANDARD_FEE_POLICY,
|
|
74
|
+
safeModuleEnabler: CREATE2_SAFE_MODULE_ENABLER,
|
|
75
|
+
treasury: CREATE2_TREASURY,
|
|
73
76
|
maxPermissionFeeWei: 1000000000000000n,
|
|
74
77
|
initialBaseFee: 0n,
|
|
75
78
|
initialComplexityRate: 0n,
|
|
76
|
-
dispatchModel: "selective",
|
|
79
|
+
dispatchModel: "selective",
|
|
77
80
|
knownTemplates: [],
|
|
78
81
|
standaloneTemplates: {},
|
|
79
82
|
},
|
|
83
|
+
// ── Unichain mainnet ─────────────────────────────────────────────────────────
|
|
80
84
|
130: {
|
|
81
|
-
//
|
|
82
|
-
//
|
|
83
|
-
//
|
|
84
|
-
//
|
|
85
|
-
//
|
|
86
|
-
// 0xd7d408eb…fb4c), zero fees, onboarding live without the 48h timelock.
|
|
87
|
-
// First chain to ship permission templates against the kernel.
|
|
85
|
+
// CREATE2 deterministic deploy (2026-06-09, gitCommit 1199b33). Supersedes
|
|
86
|
+
// 0xD985029960a9B7C2E7E38e102C448b8b8539B156 (SAIL-406 deploy).
|
|
87
|
+
// NOTE: knownTemplates and standaloneTemplates from SAIL-406 were deployed
|
|
88
|
+
// against the old kernel 0xD985029... and are now invalid. They must be
|
|
89
|
+
// redeployed against the new kernel 0x02ABC1... and re-populated here.
|
|
88
90
|
chainId: 130,
|
|
89
|
-
blockNumber:
|
|
90
|
-
deployer:
|
|
91
|
-
governance:
|
|
92
|
-
timelock:
|
|
93
|
-
kernel:
|
|
94
|
-
|
|
95
|
-
standardFeePolicy:
|
|
96
|
-
safeModuleEnabler:
|
|
97
|
-
treasury:
|
|
91
|
+
blockNumber: 50271704,
|
|
92
|
+
deployer: CREATE2_TREASURY,
|
|
93
|
+
governance: CREATE2_GOVERNANCE,
|
|
94
|
+
timelock: CREATE2_TIMELOCK,
|
|
95
|
+
kernel: CREATE2_KERNEL,
|
|
96
|
+
mandateFactory: CREATE2_MANDATE_FACTORY,
|
|
97
|
+
standardFeePolicy: CREATE2_STANDARD_FEE_POLICY,
|
|
98
|
+
safeModuleEnabler: CREATE2_SAFE_MODULE_ENABLER,
|
|
99
|
+
treasury: CREATE2_TREASURY,
|
|
98
100
|
maxPermissionFeeWei: 1000000000000000n,
|
|
99
101
|
initialBaseFee: 0n,
|
|
100
102
|
initialComplexityRate: 0n,
|
|
101
|
-
dispatchModel: "selective",
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
description: "Allows transfers only to a pre-approved target address.",
|
|
151
|
-
},
|
|
152
|
-
],
|
|
153
|
-
standaloneTemplates: {
|
|
154
|
-
// EIP-1167 clone LOGIC addresses — the `impl` argument to
|
|
155
|
-
// PermissionFactory.deployAndAttach(account, impl, salt, initData). A clone
|
|
156
|
-
// is created and configured per account via its initialize(...).
|
|
157
|
-
azuroPrediction: "0xd48cdBB25bF0A214dEffECac3c9431650834b046",
|
|
158
|
-
boundedApprove: "0xbF7089A905081054c9dA628707f2e1EF70A7F300",
|
|
159
|
-
boundedBorrow: "0x17D466309C7E0237960f68126Cc4A109D194ac28",
|
|
160
|
-
boundedDeposit: "0xf49E304EDf806AF46E8f17740e56C1CBFad5d264",
|
|
161
|
-
boundedLiFi: "0x6a0171013FeD6B2Eda16A4dd4DB33Fa34b7F3e3f",
|
|
162
|
-
boundedSwap: "0x06696F9dd4bD0994f55b075600627Dc6E54635c9",
|
|
163
|
-
boundedWithdraw: "0xE207CfC8c2204b15ee5fD22B79472929706c7E4b",
|
|
164
|
-
gmxPerp: "0xB1bb967aC11D61C0599c8458D9B950461db5D4E9",
|
|
165
|
-
gainsNetworkPerp: "0x1297673f71A9be02bc876Dbd0ceaB3c96D268bE3",
|
|
166
|
-
limitlessPrediction: "0x2bE4280d8816626e1dea4E94A83d9334A971AF90",
|
|
167
|
-
synthetixPerp: "0x711a70B16D013a9B96Bd6733F4b3097e5787f860",
|
|
168
|
-
transferTarget: "0x8428155b6b9eea4E78b9a52c2312752eD04Baf16",
|
|
169
|
-
},
|
|
103
|
+
dispatchModel: "selective",
|
|
104
|
+
// Templates cleared: the SAIL-406 shared + standalone templates were deployed
|
|
105
|
+
// against the old kernel (0xD985029...) and are invalid against the new one.
|
|
106
|
+
// Re-populate after redeploying templates against 0x02ABC1...
|
|
107
|
+
knownTemplates: [],
|
|
108
|
+
standaloneTemplates: {},
|
|
109
|
+
},
|
|
110
|
+
// ── Base Sepolia (testnet) ───────────────────────────────────────────────────
|
|
111
|
+
84532: {
|
|
112
|
+
// CREATE2 deterministic deploy (2026-06-09, gitCommit 1199b33). Supersedes
|
|
113
|
+
// 0xf1D0F4C9893612627409948BAa9d82a01a373799 (SAIL-405 redeploy).
|
|
114
|
+
// allowlistBootstrapped=true, zero fees, 48h timelock.
|
|
115
|
+
chainId: 84532,
|
|
116
|
+
blockNumber: 42625843,
|
|
117
|
+
deployer: CREATE2_TREASURY,
|
|
118
|
+
governance: CREATE2_GOVERNANCE,
|
|
119
|
+
timelock: CREATE2_TIMELOCK,
|
|
120
|
+
kernel: CREATE2_KERNEL,
|
|
121
|
+
mandateFactory: CREATE2_MANDATE_FACTORY,
|
|
122
|
+
standardFeePolicy: CREATE2_STANDARD_FEE_POLICY,
|
|
123
|
+
safeModuleEnabler: CREATE2_SAFE_MODULE_ENABLER,
|
|
124
|
+
treasury: CREATE2_TREASURY,
|
|
125
|
+
maxPermissionFeeWei: 1000000000000000n,
|
|
126
|
+
initialBaseFee: 0n,
|
|
127
|
+
initialComplexityRate: 0n,
|
|
128
|
+
dispatchModel: "selective",
|
|
129
|
+
knownTemplates: [],
|
|
130
|
+
standaloneTemplates: {},
|
|
131
|
+
},
|
|
132
|
+
// ── Eth Sepolia (testnet) ────────────────────────────────────────────────────
|
|
133
|
+
11155111: {
|
|
134
|
+
// CREATE2 deterministic deploy (2026-06-09, gitCommit 1199b33).
|
|
135
|
+
// allowlistBootstrapped=true, zero fees, 48h timelock.
|
|
136
|
+
chainId: 11155111,
|
|
137
|
+
blockNumber: 11023571,
|
|
138
|
+
deployer: CREATE2_TREASURY,
|
|
139
|
+
governance: CREATE2_GOVERNANCE,
|
|
140
|
+
timelock: CREATE2_TIMELOCK,
|
|
141
|
+
kernel: CREATE2_KERNEL,
|
|
142
|
+
mandateFactory: CREATE2_MANDATE_FACTORY,
|
|
143
|
+
standardFeePolicy: CREATE2_STANDARD_FEE_POLICY,
|
|
144
|
+
safeModuleEnabler: CREATE2_SAFE_MODULE_ENABLER,
|
|
145
|
+
treasury: CREATE2_TREASURY,
|
|
146
|
+
maxPermissionFeeWei: 1000000000000000n,
|
|
147
|
+
initialBaseFee: 0n,
|
|
148
|
+
initialComplexityRate: 0n,
|
|
149
|
+
dispatchModel: "selective",
|
|
150
|
+
knownTemplates: [],
|
|
151
|
+
standaloneTemplates: {},
|
|
170
152
|
},
|
|
171
153
|
};
|
|
172
154
|
export function getSailDeployment(chainId) {
|
|
@@ -177,6 +159,14 @@ export function getSailDeployment(chainId) {
|
|
|
177
159
|
return deployment;
|
|
178
160
|
}
|
|
179
161
|
export function normalizeDeployment(input) {
|
|
162
|
+
// Guard: mandateFactory is required. Accept the legacy permissionFactory alias too,
|
|
163
|
+
// but if both are absent the config is malformed — cast-to-Address would silently
|
|
164
|
+
// produce undefined and cause a confusing runtime error far from the source.
|
|
165
|
+
if (!input.mandateFactory && !input.permissionFactory) {
|
|
166
|
+
throw new Error('normalizeDeployment: deployment config is missing "mandateFactory" ' +
|
|
167
|
+
'(and the legacy "permissionFactory" alias). ' +
|
|
168
|
+
"Add a mandateFactory address to the deployment configuration.");
|
|
169
|
+
}
|
|
180
170
|
return {
|
|
181
171
|
chainId: Number(input.chainId),
|
|
182
172
|
blockNumber: Number(input.blockNumber),
|
|
@@ -184,7 +174,8 @@ export function normalizeDeployment(input) {
|
|
|
184
174
|
governance: input.governance,
|
|
185
175
|
timelock: input.timelock,
|
|
186
176
|
kernel: input.kernel,
|
|
187
|
-
|
|
177
|
+
// Accept both names: new manifests use mandateFactory; old ones used permissionFactory.
|
|
178
|
+
mandateFactory: (input.mandateFactory ?? input.permissionFactory),
|
|
188
179
|
standardFeePolicy: input.standardFeePolicy,
|
|
189
180
|
safeModuleEnabler: input.safeModuleEnabler,
|
|
190
181
|
treasury: input.treasury,
|