Skip to content

ibremseth/tendril

Repository files navigation

Tendril

Tendril

One wallet. Every chain. Same address.

Tendril gives you a single contract identity across every Ethereum L2. Plant a tendril to any chain and control it from your root wallet on L1 — no multisigs, no bridge UIs, no per-chain key management.

Why

Managing contracts across L2s today means separate deployments, separate admin keys, and separate transactions on each chain. Tendril collapses that into one operation from one address:

  • Same address everywhere — Deterministic CREATE2 deployment means your tendril lives at the same address on every chain
  • One root, full control — Sign once on L1, execute on any L2 through native bridge messaging
  • Deploy contracts cross-chain — Spin up upgradeable proxies on any chain from your root wallet
  • No trusted intermediaries — Uses native L1-to-L2 bridges with address aliasing, not relayers or oracles

How it works

A tendril contract is deployed to the same deterministic address on every chain via the Arachnid CREATE2 deployer. On the root chain (L1), the admin is your wallet. On L2s, the admin is the address-aliased tendril contract, so only cross-chain messages from the parent tendril are authorized.

When you execute a command, the CLI encodes your call, wraps it in the appropriate bridge message, and sends it from your root. The message flows through the bridge and executes on the target chain.

Setup

bun i && forge install
cp .env.example .env
Variable Description
ROOT Your root admin address
PRIVATE_KEY Private key for signing (optional if using keystore)
ETH_KEYSTORE Foundry keystore name
PLANT_SEED CREATE2 salt for planting (default: zero)
# Plant your first tendril
bun tendril plant sepolia

CLI

bun tendril <command> [options]

Global options

Flag Description
--root <address> Root admin address (overrides ROOT env)
--sim Simulate without sending
-v, --verbose Detailed output

Commands

plant <chain> — Deploy a tendril to a new chain

bun tendril plant base-sepolia

addr — Show the tendril address for the current root

bun tendril addr

execute <chain> <to> <sig> [args...] — Execute a call through a tendril

bun tendril execute base-sepolia 0xAddr "transfer(address,uint256)" 0xTo 1000

deploy <chain> <impl> — Deploy an upgradeable proxy through a tendril

bun tendril deploy base-sepolia 0xImpl --salt 0x01 --init "initialize(address)" --init-args 0xOwner

inspect — Show deployment status across all chains

bun tendril inspect

Configured Chains

Chain Type
mainnet Root
sepolia Root
base OP
base-sepolia OP
optimism OP
op-sepolia OP
arbitrum Arb
arb-sepolia Arb

Support

If this is useful to you: 0x15AaC

About

Deploy and manage smart contracts across any Ethereum L2+ from a single address using deterministic cross-chain messaging

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors