Skip to content

Deployment addresses

Both the trusted core and the seven shared permission templates deploy via deterministic CREATE2 with a global (chain-independent) salt per contract, through the standard CREATE2 factory 0x4e59b44847b379578588920cA78FbF26c0B4956C. The practical consequence: every core contract and every template has the same address on every chain, and so does the resulting SMA. The Protocol repository is the canonical source of truth.

ContractAddress
SailKernel0x38b508756c976e876EFF05a29E731A4d348BA6ED
SailGovernance0x4315B37cA4A315A7042af1Fcb37F8436f4D24356
TimelockController0xC1E5F9A581D4100Aa949f80204540a33aD97A7b6
MandateFactory0x6d2C802ffa0d9A8Ed69A5Bf22c1b63ccB566B8Fc
StandardFeePolicy0x1087312447C8a2BfA15EB9cE23590E3502DBA04b
SafeModuleEnabler0x7897Cb53a4be4a2eaAf46D60573C4Fd83b33fE1F

Shared permission templates (identical on every chain)

Section titled “Shared permission templates (identical on every chain)”

Multi-tenant templates — one deployment per chain serves every account, bound to the canonical core kernel above (constructor (kernel, author), author = the deployer EOA below).

TemplateAddress
SwapPermission0x35cEEa0db96997Cc3CF3beB42FFa36A499342F7C
SwapPermissionNoOracle0x34Ba96CbEd1f46c88A5265E645DC5fe41662b519
BorrowPermission0x3e2666051599223cEAb10De55C89A0842857d8AF
DepositPermission0xBfB5e13a97b12Ee89d2F2b9B65eCf7e0E371911f
WithdrawPermission0xB8A6CC40466c0C33a230f87a1EBC368568B96269
TransferPermission0xda909a1CC584fb7559Ce4A828b008B473Da095e1
ApproveAndCallBatchPermission0x0535A4D51333484ef583103DAB1a9449756ab732

Superseded templates (still live on-chain)

Section titled “Superseded templates (still live on-chain)”
TemplateAddressNotes
WithdrawPermission (v1)0xF5eF5dda450a130e3020d54f565E830e4a7531f8The original ERC-20-transfer withdraw gate (transfer / transferFrom to one allowed recipient). Replaced in place by the vault-exit WithdrawPermission (v2) above, deployed under a rotated salt (sail.template.withdraw.v2) so the two do not collide.

The v1 contract is not disabled or revoked — templates are immutable and the protocol has no kill switch — but Sailor no longer references it, and no account ever registered it. New registrations use the v2 address. The two are not config-compatible (the blob changed from (address[] tokens, address allowedRecipient, uint256 maxAmountPerTx) to (address[] targets, address[] tokens, uint256 maxAmountPerTx)), and the introspection identity was bumped to sail.permission.WithdrawPermission.v2 so consumers can tell them apart. Counting the superseded v1, eight withdraw-family contracts exist on-chain — but the shared-template set is still seven.

Governance & config (identical on every chain)

Section titled “Governance & config (identical on every chain)”
RoleAddressNotes
Admin Safe (3/5)0x152a32c851d317Cd54F1E6423377d7D58Dd3DE8Cparameter governance behind the 48h timelock
Treasury Safe (3/5)0x7b37F85575F1568a37dBA342BC5FE6d393F0872fprotocol fee recipient
Emergency Safe (2/3)0xFf02DE6630F192Bc6d14608f5C52a9f1ae478961emergency pause (auto-expiry + cooldown)
Deployer EOA0xB01dCE443d052e44b7D13726c0EC9fFB7f5815B6deployment only; holds no protocol authority

All chains run the selective-dispatch kernel via CREATE2 and have had their onboarding allowlists bootstrapped (allowlistBootstrapped() == true).

ChainChain IDNativeType
Ethereum1ETHmainnet
Base8453ETHmainnet
Arbitrum42161ETHmainnet
Optimism10ETHmainnet
Unichain130ETHmainnet
World480ETHmainnet
MegaETH4326ETHmainnet
Robinhood4663ETHmainnet
BSC56BNBmainnet
HyperEVM999HYPEmainnet
Base Sepolia84532ETHtestnet
Eth Sepolia11155111ETHtestnet

That’s 12 chains — 10 mainnets and 2 testnets. The CREATE2 factory (0x4e59b44847b379578588920cA78FbF26c0B4956C) and the Safe v1.4.1 proxy factory (0x4e1DCf7AD4e460CfD30791CCC4F9c8a4f820ec67) are present at their canonical addresses on all twelve, so the same-address property holds on each. Robinhood (4663) was deployed by replaying the exact CREATE2 salt + init code recovered from the original Base transactions, so its core and template addresses are byte-for-byte identical to every other chain.

FeeValue
Permission registration fee (live)0.00015 ETH on the 10 ETH-native chains (Robinhood included); 0.00045 BNB on BSC; 0.005 HYPE on HyperEVM
Registration-fee cap (immutable)MAX_PERMISSION_FEE_WEI = 0.01 native-unit ceiling per chain
Protocol cut on manager fees0 at launch (immutable cap MAX_PROTOCOL_CUT_BPS = 2500 bps = 25%)
Management / performance / distributor fees0 at launch

The registration fee was deployed at 0.00015 native on every chain (CREATE2 requires byte-identical constructor arguments, so the address is only reproducible with the same fee). Governance later raised the live rate on BSC and HyperEVM via the 48h timelock — which does not change the already-locked contract address. See Fees.

External dependencies (canonical, present on all chains)

Section titled “External dependencies (canonical, present on all chains)”
ContractAddress
CREATE2 factory0x4e59b44847b379578588920cA78FbF26c0B4956C
Safe v1.4.1 ProxyFactory0x4e1DCf7AD4e460CfD30791CCC4F9c8a4f820ec67
Safe v1.4.1 singleton0x41675C099F32341bf84BFc5382aF534df5C7461a
SafeL2 v1.4.1 singleton0x29fcB43b46531BcA003ddC8FCB67FFE91900C762

These are the values seeded into the kernel’s trusted allowlists (trustedSafeFactory, trustedSafeSingleton, trustedModuleSetup → the SafeModuleEnabler above, trustedFeePolicy → the StandardFeePolicy above, plus the Safe-proxy runtime codehash). For this deploy, governance is the admin Safe, so allowlists were seeded post-deploy via SailGovernance.bootstrapAllowlists() (a one-shot, non-timelocked latch) rather than at genesis.