Smart Contracts Built for
the AI Era.
Cadence is a safe, resource-oriented programming language built for the Flow blockchain. Designed for digital ownership and optimized for AI-driven development.
Architectural Pillars
Atomic Multi-Step Transactions
Compose complex DeFi flows — claim, swap, restake — in a single transaction. Everything succeeds or everything reverts. No intermediary contracts needed.
User-Custodied Assets
User assets stay in user accounts, not in contract storage. Combined with a strong static type system and capability-based access control, Cadence eliminates entire classes of DeFi vulnerabilities.
Composable DeFi Primitives
Resources flow freely between contracts, enabling seamless integration of lending, swapping, and yield strategies. Build new DeFi functionality on top of any standard.
import "DeFiActions"
import "FlowToken"
import "IncrementFiStakingConnectors"
import "IncrementFiPoolLiquidityConnectors"
import "SwapConnectors"
// Schedule daily yield compounding with Flow Actions
transaction(stakingPoolId: UInt64, executionEffort: UInt64) {
prepare(signer: auth(Storage, Capabilities) &Account) {
// Compose DeFi actions atomically: Claim → Zap → Restake
let operationID = DeFiActions.createUniqueIdentifier()
// Source: Claim staking rewards
let rewardsSource = IncrementFiStakingConnectors.PoolRewardsSource(
userCertificate: signer.capabilities.storage
.issue<&StakingPool>(/storage/userCertificate),
pid: stakingPoolId,
uniqueID: operationID
)
// Swapper: Convert single reward token → LP tokens
let zapper = IncrementFiPoolLiquidityConnectors.Zapper(
token0Type: Type<@FlowToken.Vault>(),
token1Type: Type<@RewardToken.Vault>(),
stableMode: false,
uniqueID: operationID
)
// Compose: Wrap rewards source with zapper
let lpSource = SwapConnectors.SwapSource(
swapper: zapper,
source: rewardsSource,
uniqueID: operationID
)
// Sink: Restake LP tokens back into pool
let poolSink = IncrementFiStakingConnectors.PoolSink(
pid: stakingPoolId,
staker: signer.address,
uniqueID: operationID
)
}
}LEDGER VS. RESOURCES
Centralized Accounting
Assets are just entries in a contract's private dictionary. To move value, you update two numbers. This "ledger" model is prone to reentrancy bugs.
function transfer(address to, uint val) {
balances[msg.sender] -= val;
balances[to] += val;
}
Direct Ownership
Tokens live in the user's account as vault resources. Withdrawing creates a new resource the compiler tracks: it must be deposited or explicitly destroyed, it cannot be silently lost or duplicated.
auth(FungibleToken.Withdraw) &FlowToken.Vault>
(from: /storage/flowTokenVault)!
let payment <- vault.withdraw(amount: 10.0)
receiver.deposit(from: <- payment)
// payment: must be deposited, cannot be duplicated