Skip to content

Commit 34b7664

Browse files
joshuahannanclaude
andcommitted
Update EVM bridge FLIP to clarify storage-based fee model
Bridge fees are only charged when an operation causes the bridge account to store an asset long-term. Operations that release assets from existing escrow or burn assets do not incur a bridge fee. Reflects changes from onflow/flow-evm-bridge#202 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 78f59ce commit 34b7664

1 file changed

Lines changed: 26 additions & 17 deletions

File tree

application/20231222-evm-vm-bridge.md

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ flip: 237
44
title: Flow EVM VM Bridge
55
authors: Giovanni Sanchez (giovanni.sanchez@dapperlabs.com)
66
sponsor: Jerome Pimmel (jerome.pimmel@dapperlabs.com)
7-
updated: 2023-12-22
7+
updated: 2026-03-13
88
---
99

1010
# FLIP 237: Flow VM Bridge
@@ -295,6 +295,11 @@ The task of bridging FTs & NFTs between VMs can be split into four distinct case
295295
asset can either be Cadence- or EVM-native, and it can either be bridged from Cadence to EVM or EVM to Cadence. The
296296
following sections outline an NFT bridge path for each case.
297297

298+
> :information_source: **Fee model:** Bridge fees are only charged when an operation causes the bridge account to store
299+
> an asset long-term (e.g., escrowing a Cadence NFT or holding an ERC721 in the bridge's COA). Operations that release
300+
> assets from existing escrow or burn assets do **not** incur a bridge fee, because they do not add to the bridge
301+
> account's storage. Onboarding operations always incur a separate flat onboarding fee regardless of direction.
302+
298303
> :information_source: A note about bridge "onboarding" - assets moving from one VM to another must at minimum have
299304
> contracts defining them in their target VM. These contracts must be deployed in a transaction preceding the movement
300305
> of the asset as deployed contracts are not available in the Cadence's state space until the deploying transaction has
@@ -320,13 +325,13 @@ following sections outline an NFT bridge path for each case.
320325

321326
*Lock in Cadence & Mint/Transfer in EVM*
322327

323-
1. Pre-flight checks: Assert the type is supported, has been onboarded, and fee provider can provide onboarding fee
328+
1. Pre-flight checks: Assert the type is supported, has been onboarded, and fee provider can cover the bridge fee
324329
2. Get a URI for the NFT
325330
- Default to project-specified URI
326331
- If not defined, serialize the NFT as JSON data URL
327332
3. Lock NFT in escrow
328-
4. Calculate the bridge fee based on flat fee + storage usage
329-
5. Withdraw onboard fee from given fee Provider & deposit to bridge Vault
333+
4. Calculate the bridge fee based on storage consumed by escrowing the NFT in the bridge account
334+
5. Withdraw bridge fee from given fee Provider & deposit to bridge Vault
330335
6. Get the token's corresponding ERC721 contract address
331336
5. Execute the bridge
332337
- Check if the ERC721 is factory-deployed - Cadence-native: return true
@@ -341,9 +346,12 @@ following sections outline an NFT bridge path for each case.
341346

342347
*Unlock in Cadence & Transfer in EVM*
343348

344-
1. Pre-flight checks: Assert the type is supported, has been onboarded, and fee provider can provide onboarding fee
345-
2. Withdraw the bridge fee from the given Provider & deposit to bridge Vault
346-
3. Get the requested type's associated EVM contract address
349+
> :information_source: No bridge fee is charged for this operation. Releasing a Cadence NFT from existing bridge escrow
350+
> reduces storage in the bridge account rather than adding to it. The storage fee was already covered when the NFT was
351+
> originally escrowed on the Cadence → EVM path.
352+
353+
1. Pre-flight checks: Assert the type is supported and has been onboarded
354+
2. Get the requested type's associated EVM contract address
347355
4. Assert the caller is the requested ERC721 token owner or approved
348356
5. Execute the provided protected callback
349357
6. Assert that now the bridge COA is the ERC721 token owner after executing the protected callback
@@ -374,16 +382,17 @@ following sections outline an NFT bridge path for each case.
374382

375383
*Mint/Unlock in Cadence & Transfer in EVM*
376384

377-
1. Pre-flight checks: Assert the type is supported, has been onboarded, and fee provider can provide onboarding fee
378-
2. Withdraw the bridge fee from the given Provider & deposit to bridge Vault
379-
3. Get the requested type's associated EVM contract address
380-
4. Assert the caller is the requested ERC721 token owner or approved
381-
5. Execute the provided protected callback
382-
6. Assert that now the bridge COA is the ERC721 token owner after executing the protected callback
383-
7. Derive the requested type's contract address & name & attempt to borrow the contract as EVMBridgeMinter
384-
8. Get the tokenURI from the ERC721 contract
385-
9. If the corresponding Cadence NFT is in escrow, unlock the NFT <- false in this case
386-
10. Otherwise, mint a new NFT with the ERC721 URI & define the source contract's ERC721 ID and return
385+
1. Pre-flight checks: Assert the type is supported and has been onboarded, and fee provider can cover the bridge fee
386+
2. Get the requested type's associated EVM contract address
387+
3. Assert the caller is the requested ERC721 token owner or approved
388+
4. Execute the provided protected callback
389+
5. Assert that now the bridge COA is the ERC721 token owner after executing the protected callback
390+
6. Calculate the bridge fee based on storage consumed by holding the ERC721 in the bridge's EVM account (COA)
391+
7. Withdraw bridge fee from the given Provider & deposit to bridge Vault
392+
8. Derive the requested type's contract address & name & attempt to borrow the contract as EVMBridgeMinter
393+
9. Get the tokenURI from the ERC721 contract
394+
10. If the corresponding Cadence NFT is in escrow, unlock the NFT <- false in this case
395+
11. Otherwise, mint a new NFT with the ERC721 URI & define the source contract's ERC721 ID and return
387396

388397
![Cadence-native Cadence to EVM](20231222-evm-vm-bridge-resources/evm_native_nft_from_evm.png)
389398

0 commit comments

Comments
 (0)