@@ -4,7 +4,7 @@ flip: 237
44title : Flow EVM VM Bridge
55authors : Giovanni Sanchez (giovanni.sanchez@dapperlabs.com)
66sponsor : 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
295295asset can either be Cadence- or EVM-native, and it can either be bridged from Cadence to EVM or EVM to Cadence. The
296296following 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
3243292 . Get a URI for the NFT
325330 - Default to project-specified URI
326331 - If not defined, serialize the NFT as JSON data URL
3273323 . 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
3303356 . Get the token's corresponding ERC721 contract address
3313365 . 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
3473554 . Assert the caller is the requested ERC721 token owner or approved
3483565 . Execute the provided protected callback
3493576 . 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