From 079d31a9aae1af9f4f9b4ff6a54b976f835ccd9b Mon Sep 17 00:00:00 2001 From: Brian Doyle Date: Wed, 12 Nov 2025 09:37:03 -0500 Subject: [PATCH 01/13] Update language to use compute units instead of gas for Cadence txs --- ...-data-availibility-with-cadence-scripts.md | 2 +- .../getting-started/production-deployment.md | 81 +- .../cross-vm-apps/introduction.md | 2 +- .../flow-101.md | 2 +- .../flow-actions/intro-to-flow-actions.md | 2 +- .../scheduled-transactions-introduction.md | 6 +- .../blockchain-development-tutorials/index.md | 9 +- .../tokens/nft-cadence.md | 2 +- .../cursor/cadence-rules.md | 41 +- .../cadence/advanced-concepts/randomness.md | 2 - .../scheduled-transactions.md | 65 +- docs/build/cadence/basics/fees.md | 9 +- docs/build/cadence/basics/scripts.md | 2 +- docs/build/cadence/basics/transactions.md | 2 +- .../core-contracts/10-nft-storefront.md | 4 +- .../project-development-tips.md | 2 +- docs/build/evm/fees.md | 14 +- docs/build/flow.md | 10 +- .../fcl-js/packages-docs/fcl/mutate.md | 46 +- .../clients/fcl-js/packages-docs/sdk/index.md | 33 +- .../fcl-js/packages-docs/types/index.md | 695 +++++++++--------- docs/build/tools/clients/flow-go-sdk/index.md | 13 +- docs/build/tools/emulator/index.md | 8 +- docs/build/tools/flow-cli/flix.md | 6 +- .../transactions/build-transactions.md | 4 +- .../transactions/send-transactions.md | 24 +- docs/ecosystem/block-explorers.md | 2 +- docs/ecosystem/defi-liquidity/faq.md | 4 +- docs/ecosystem/wallets.md | 2 +- docs/protocol/network-architecture/index.md | 2 +- 30 files changed, 532 insertions(+), 564 deletions(-) diff --git a/docs/blockchain-development-tutorials/cadence/cadence-advantages/native-data-availibility-with-cadence-scripts.md b/docs/blockchain-development-tutorials/cadence/cadence-advantages/native-data-availibility-with-cadence-scripts.md index e0a1877199..2277e1de5a 100644 --- a/docs/blockchain-development-tutorials/cadence/cadence-advantages/native-data-availibility-with-cadence-scripts.md +++ b/docs/blockchain-development-tutorials/cadence/cadence-advantages/native-data-availibility-with-cadence-scripts.md @@ -29,7 +29,7 @@ In Cadence, **scripts** are general-purpose read programs. They can traverse pub :::info -In Cadence, a _script_ is a read-only program that can access public data across accounts and contracts in a strongly typed way. It does not require gas or user signatures. +In Cadence, a _script_ is a read-only program that can access public data across accounts and contracts in a strongly typed way. It does not require payment, in gas or compute units, or user signatures. ::: diff --git a/docs/blockchain-development-tutorials/cadence/getting-started/production-deployment.md b/docs/blockchain-development-tutorials/cadence/getting-started/production-deployment.md index c0700a6e46..895cdea14b 100644 --- a/docs/blockchain-development-tutorials/cadence/getting-started/production-deployment.md +++ b/docs/blockchain-development-tutorials/cadence/getting-started/production-deployment.md @@ -35,7 +35,7 @@ After you complete this tutorial, you'll be able to: - **Implement monitoring and maintenance** practices for production applications. - **Understand the deployment pipeline** from development to production. -**Prerequisites:** +**Prerequisites:** - Completed all previous tutorials ([Environment Setup], [Smart Contract Interaction], [Building a Frontend App]). - Counter contract and frontend app working locally. @@ -54,6 +54,7 @@ Flow has several networks for different purposes: - **Mainnet**: Production network with real Flow tokens. Each network has its own: + - Access nodes and APIs. - Account addresses and contract deployments. - Token economics (free on testnet, real value on mainnet). @@ -67,6 +68,7 @@ flow accounts create --network testnet ``` When prompted: + 1. **Account name**: Enter `testnet-account` 2. **Select "Testnet" Network** @@ -92,7 +94,7 @@ flow accounts fund --network testnet testnet-account Check your account balance: ```zsh -flow accounts list +flow accounts list ``` You will see your account details with a balance of Flow tokens. @@ -106,8 +108,9 @@ flow config add deployment ``` Follow the prompts: + 1. **Network**: `testnet` -2. **Account**: `testnet-account` +2. **Account**: `testnet-account` 3. **Contract**: `Counter` 4. **Deploy more contracts**: `yes` 5. **Contract**: `NumberFormatter` @@ -117,21 +120,14 @@ Your `flow.json` now includes a testnet deployment section: ```json { "deployments": { - "emulator": { - "default": [ - "Counter" - ], - "emulator-account": [ - "NumberFormatter" - ] - }, - "testnet": { - "testnet-account": [ - "Counter", - "NumberFormatter" - ] - } - } + "emulator": { + "default": ["Counter"], + "emulator-account": ["NumberFormatter"] + }, + "testnet": { + "testnet-account": ["Counter", "NumberFormatter"] + } + } } ``` @@ -148,8 +144,8 @@ You will see output similar to: ```zsh Deploying 2 contracts for accounts: testnet-account -Counter -> 0x9942a81bc6c3c5b7 (d8fe130e5b2212a5c7b3c34fe6e74ede80c750bc4c57e57788e81b247dcd7fe0) -NumberFormatter -> 0x9942a81bc6c3c5b7 (9a550aeefa5ede62cb95f0549084b2ab7abf3a493cf853d50c1c377a7be733b2) +Counter -> 0x9942a81bc6c3c5b7 (d8fe130e5b2212a5c7b3c34fe6e74ede80c750bc4c57e57788e81b247dcd7fe0) +NumberFormatter -> 0x9942a81bc6c3c5b7 (9a550aeefa5ede62cb95f0549084b2ab7abf3a493cf853d50c1c377a7be733b2) 🎉 All contracts deployed successfully ``` @@ -163,6 +159,7 @@ flow scripts execute cadence/scripts/GetCounter.cdc --network testnet ``` You should see: + ```zsh Result: "0" ``` @@ -224,7 +221,7 @@ export default function RootLayout({ **Key changes:** - `accessNodeUrl`: Changed from localhost to Flow's testnet REST API. -- `flowNetwork`: Changed from 'emulator' to 'testnet'. +- `flowNetwork`: Changed from 'emulator' to 'testnet'. - `discoveryWallet`: Updated to use testnet wallet discovery. ### Test your testnet frontend @@ -240,7 +237,7 @@ Visit `http://localhost:3000` and you will see: 1. **Counter value**: Displays the current count from your testnet contract. 2. **Connect Wallet**: You can now connect with various Flow wallets (not just Dev Wallet). 3. **Increment functionality**: Transactions are sent to the live testnet. -4. **Real transaction costs**: Small amounts of testnet Flow are used for gas. +4. **Real transaction costs**: Small amounts of testnet Flow are used for compute units, the Flow Cadence equivalence of gas. **Important**: When you connect your wallet, make sure to: @@ -270,6 +267,7 @@ flow accounts create --network mainnet ``` When prompted: + 1. **Account name**: Enter `mainnet-account` 2. **Select "Mainnet" Network** @@ -277,7 +275,7 @@ When prompted: You can purchase Flow tokens from major exchanges like [Coinbase], [Moonpay], and [Binance]. -To obtain Flow directly from the Flow Wallet, click "Buy" in your account. +To obtain Flow directly from the Flow Wallet, click "Buy" in your account. ![flow-wallet-icons](./imgs/flow-wallet-icons.png) @@ -294,8 +292,9 @@ flow config add deployment --network mainnet ``` Follow the prompts: + 1. **Network**: `mainnet` -2. **Account**: `mainnet-account` +2. **Account**: `mainnet-account` 3. **Contract**: `Counter` 4. **Deploy more contracts**: `yes` 5. **Contract**: `NumberFormatter` @@ -314,27 +313,17 @@ Your `flow.json` will now include mainnet configuration: } }, "deployments": { - "emulator": { - "default": [ - "Counter" - ], - "emulator-account": [ - "NumberFormatter" - ] - }, - "testnet": { - "testnet-account": [ - "Counter", - "NumberFormatter" - ] - }, - "mainnet": { - "mainnet-account": [ - "Counter", - "NumberFormatter" - ] - } - } + "emulator": { + "default": ["Counter"], + "emulator-account": ["NumberFormatter"] + }, + "testnet": { + "testnet-account": ["Counter", "NumberFormatter"] + }, + "mainnet": { + "mainnet-account": ["Counter", "NumberFormatter"] + } + } } ``` @@ -406,4 +395,4 @@ npm run build [Flow Wallet]: https://wallet.flow.com/ [Coinbase]: https://www.coinbase.com/en-in/how-to-buy/flow [Moonpay]: https://www.moonpay.com/buy/flow -[Binance]: https://www.binance.com/en-IN/how-to-buy/flow \ No newline at end of file +[Binance]: https://www.binance.com/en-IN/how-to-buy/flow diff --git a/docs/blockchain-development-tutorials/cross-vm-apps/introduction.md b/docs/blockchain-development-tutorials/cross-vm-apps/introduction.md index 3d7e2b3cdc..ba143d5b27 100644 --- a/docs/blockchain-development-tutorials/cross-vm-apps/introduction.md +++ b/docs/blockchain-development-tutorials/cross-vm-apps/introduction.md @@ -100,7 +100,7 @@ Click `Send Batch Transaction Example` and approve the transaction. You'll see t :::tip -Currently, the Flow wallet sponsors all gas for all transactions signed with the wallet on both testnet **and mainnet!** +Currently, the Flow wallet sponsors all gas/compute units for all transactions signed with the wallet on both testnet **and mainnet!** ::: diff --git a/docs/blockchain-development-tutorials/flow-101.md b/docs/blockchain-development-tutorials/flow-101.md index c7aa63a120..ebc02bff94 100644 --- a/docs/blockchain-development-tutorials/flow-101.md +++ b/docs/blockchain-development-tutorials/flow-101.md @@ -81,7 +81,7 @@ Other defining features of Flow include: - **Fast finality**, making applications responsive and user-friendly. - **Resistance to Miner Extractable Value (MEV)**, protecting users from front-running. - **EVM equivalence**, allowing developers to deploy Solidity contracts on Flow EVM. -- **Low gas fees**, which make applications affordable and accessible to users. +- **Low compute/gas fees**, which make applications affordable and accessible to users. Flow has already powered some of the most successful Web3 products to date, including: diff --git a/docs/blockchain-development-tutorials/forte/flow-actions/intro-to-flow-actions.md b/docs/blockchain-development-tutorials/forte/flow-actions/intro-to-flow-actions.md index 6932792e75..152f5dddab 100644 --- a/docs/blockchain-development-tutorials/forte/flow-actions/intro-to-flow-actions.md +++ b/docs/blockchain-development-tutorials/forte/flow-actions/intro-to-flow-actions.md @@ -380,7 +380,7 @@ Flash loans allow you to create one transaction during which you: This scenario may be a scam. A scammer could set up this situation as bait and cancel the buy order the instant someone purchases the NFT that is for sale. You'd have paid a vast amount of money for something worthless. -The great thing about Cadence transactions, with or without Actions, is that you can set up an atomic transaction where everything either works, or is reverted. Either you make 100k, or nothing happens except a tiny expenditure of gas. +The great thing about Cadence transactions, with or without Actions, is that you can set up an atomic transaction where everything either works, or is reverted. Either you make 100k, or nothing happens except a tiny expenditure of compute units. ::: diff --git a/docs/blockchain-development-tutorials/forte/scheduled-transactions/scheduled-transactions-introduction.md b/docs/blockchain-development-tutorials/forte/scheduled-transactions/scheduled-transactions-introduction.md index 938d522276..5af31d2ae6 100644 --- a/docs/blockchain-development-tutorials/forte/scheduled-transactions/scheduled-transactions-introduction.md +++ b/docs/blockchain-development-tutorials/forte/scheduled-transactions/scheduled-transactions-introduction.md @@ -27,7 +27,7 @@ We will update these tutorials, but you may need to refactor your code if the im Flow, EVM, and other blockchains are a form of a **single** shared computer that anyone can use, with no admin privileges, super user roles, or complete control. For this to work, it must be impossible for any user to freeze the computer, on purpose or by accident. -As a result, most blockchain computers, including EVM and Solana, aren't [Turing Complete], because they can't run an unbounded loop. Each transaction must occur within one block, and can't consume more gas than the limit. +As a result, most blockchain computers, including EVM and Solana, aren't [Turing Complete], because they can't run an unbounded loop. Each transaction must occur within one block, and can't consume more compute units, or gas, than the limit. While this limitation prevents infinite loops, it makes it so that you can't do anything 100% onchain if you need it to happen at a later time or after a trigger. As a result, developers must often build products that involve a fair amount of traditional infrastructure and requires users to give those developers a great amount of trust that their backend will execute the promised task. @@ -291,9 +291,9 @@ let pr = priority == 0 : FlowTransactionScheduler.Priority.Low ``` -The `executionEffort` is also supplied as an argument in the transaction. This represents the gas limit for your transaction and used to prepare the estimate for the gas fees that must be paid for the transaction, and directly in the call to `schedule()` the transaction. +The `executionEffort` is also supplied as an argument in the transaction. This represents the compute unit limit for your transaction and used to prepare the estimate for the compute unit fees that must be paid for the transaction, and directly in the call to `schedule()` the transaction. -- `fees`: A [vault] containing the appropriate amount of gas fees needed to pay for the execution of the scheduled transaction. +- `fees`: A [vault] containing the appropriate amount of compute unit fees needed to pay for the execution of the scheduled transaction. To create the vault, the `estimate()` function calculates the amount needed: diff --git a/docs/blockchain-development-tutorials/index.md b/docs/blockchain-development-tutorials/index.md index d81cdd684e..a5678f04a1 100644 --- a/docs/blockchain-development-tutorials/index.md +++ b/docs/blockchain-development-tutorials/index.md @@ -78,7 +78,6 @@ Learn how to implement scheduled transactions for time-based smart contract exec Cadence tutorials covering Flow's native smart contract language for secure and resource-oriented blockchain development. - [Mobile Development] - Mobile development tutorials for building Flow blockchain applications on iOS, Android, and React Native platforms. - - [iOS Quickstart] - Build native iOS applications that interact with Flow blockchain using Swift and Flow SDK for mobile-first blockchain experiences. - [React Native Quickstart] - Get started building mobile applications on Flow using React Native with FCL integration for wallet connections and blockchain interactions. - [Walletless PWA] - Build a Progressive Web App with walletless authentication on Flow, enabling user onboarding without requiring traditional crypto wallets. @@ -97,19 +96,17 @@ Comprehensive tutorials for building on Flow EVM using Solidity smart contracts - [EVM Setup] - Setup guides for Flow EVM development environment, network configuration, and toolchain preparation. - [EVM Development Tools] - Overview of development tools for building Solidity smart contracts on Flow EVM, including Hardhat, Foundry, and Remix IDE. - - [Flow Hardhat Guide] - Using Hardhat to deploy a Solidity contract to Flow EVM with step-by-step configuration, deployment, and interaction examples including contract verification. - [Using Foundry with Flow] - Using Foundry to deploy a Solidity contract to Flow EVM, covering ERC-20 token development, testing, deployment, and state interaction with Foundry tools. - [Flow Remix Guide] - Deploy and interact with Solidity smart contracts on Flow EVM using the Remix IDE with network configuration and contract verification. - [EVM Frameworks] - JavaScript frameworks and libraries for building frontend applications that interact with Flow EVM, including RainbowKit, wagmi, Ethers.js, and Web3.js. - - [RainbowKit Integration] - Integrate RainbowKit with Flow EVM to provide wallet connection functionality in React applications with custom wallet support and network configuration. - [Wagmi Integration] - Integrate wagmi React hooks with Flow EVM for type-safe Ethereum interactions, wallet management, and smart contract integration in React applications. - [Ethers.js Integration] - Connect to Flow EVM using Ethers.js library for blockchain interactions, smart contract deployment, and transaction management in JavaScript applications. - [Web3.js Integration] - Use Web3.js library to interact with Flow EVM, covering wallet connections, smart contract interactions, and transaction handling in JavaScript applications. -- [Build a Fully-Onchain Image Gallery] - Learn how to store images up to approximately 32kb onchain on Flow EVM using Solidity smart contracts and Next.js frontend with gas-efficient blockchain storage. +- [Build a Fully-Onchain Image Gallery] - Learn how to store images up to approximately 32kb onchain on Flow EVM using Solidity smart contracts and Next.js frontend. Spend millions of gas for less than a tenth of a cent. ## [Token Development] @@ -127,7 +124,7 @@ Build applications that span both Flow EVM and Cadence virtual machines, enablin - [Cross-VM Application Introduction] - Introduction to building applications that leverage both Flow EVM and Cadence environments for enhanced functionality and cross-VM asset management. - [Add Flow Cadence to Your wagmi App] - Integrate cross-VM functionality with wagmi React hooks to enable seamless interactions between Flow EVM and Cadence environments in frontend applications. - [Interacting with COAs] - Interact with Cadence-Owned Accounts (COA) to bridge assets and functionality between Cadence and EVM environments on Flow blockchain. -- [Batched EVM Transactions] - Execute batched transactions on Flow EVM to improve efficiency and enable atomic multi-operation workflows with reduced gas costs. +- [Batched EVM Transactions] - Execute batched transactions on Flow EVM to improve efficiency and enable atomic multi-operation workflows. - [Direct Calls] - Make direct calls between Cadence and EVM environments on Flow for seamless cross-VM smart contract interactions and data exchange. - [Cross-VM Bridge] - Use the VM Bridge to transfer assets and data between Flow's Cadence and EVM environments for cross-VM application development. @@ -142,7 +139,7 @@ Tutorials for using Flow's native Verifiable Random Function (VRF) to generate c Implement gasless transaction patterns on Flow to improve user experience by removing the need for users to hold native tokens for gas fees. -- [Gas-Free EVM Endpoint] - Use Flow's gas-free EVM endpoint to enable sponsored transactions that remove gas fee barriers for users interacting with EVM smart contracts. +- [Gas-Free EVM Endpoint] - Build a sponsored transaction EVM endpoint to enable sponsored transactions that remove gas fee barriers for users interacting with EVM smart contracts. ## [Use AI to Build on the Flow Blockchain] diff --git a/docs/blockchain-development-tutorials/tokens/nft-cadence.md b/docs/blockchain-development-tutorials/tokens/nft-cadence.md index d90319f466..4b379e98a2 100644 --- a/docs/blockchain-development-tutorials/tokens/nft-cadence.md +++ b/docs/blockchain-development-tutorials/tokens/nft-cadence.md @@ -743,7 +743,7 @@ Congratulations! You've successfully created an NFT collection for the `test-acc To retrieve the NFTs associated with an account, you'll need a script. Scripts are read-only operations that allow you to query the blockchain. They don't modify the blockchain's state, and therefore, -they don't require gas fees or signatures (read more about scripts here). +they don't require compute unit fees or signatures (read more about scripts here). Start by creating a script file using the `generate` command again: diff --git a/docs/blockchain-development-tutorials/use-AI-to-build-on-flow/cursor/cadence-rules.md b/docs/blockchain-development-tutorials/use-AI-to-build-on-flow/cursor/cadence-rules.md index 2e84f97e19..a04008b7df 100644 --- a/docs/blockchain-development-tutorials/use-AI-to-build-on-flow/cursor/cadence-rules.md +++ b/docs/blockchain-development-tutorials/use-AI-to-build-on-flow/cursor/cadence-rules.md @@ -5,19 +5,19 @@ sidebar_position: 3 label: Cadence Rules sidebar_label: Cadence Rules keywords: - - Cursor Rules - - AI - - Cursor - - Cadence - - AI_Flow - - Cadence Rules + - Cursor Rules + - AI + - Cursor + - Cadence + - AI_Flow + - Cadence Rules --- # Cadence Rules ## Overview -When building with AI, it's hard to make the agent consistently understand what standards it should use when building or generating responses. To migitate this issue, Cursor Rules sets up global rules, project wide rules or documents specific rules that it inserts in the agent's context before reading the prompt. With Cursor Rules, you can create an assistant that can consistently understand the intended development process, desired formatted responses, and avoid common mistakes. Consider it your tool to make guard rails for agents that can reduce hallucination and incorrect development flows. +When building with AI, it's hard to make the agent consistently understand what standards it should use when building or generating responses. To migitate this issue, Cursor Rules sets up global rules, project wide rules or documents specific rules that it inserts in the agent's context before reading the prompt. With Cursor Rules, you can create an assistant that can consistently understand the intended development process, desired formatted responses, and avoid common mistakes. Consider it your tool to make guard rails for agents that can reduce hallucination and incorrect development flows. In this guide, you'll learn how to configure and use Cursor Rules that transform your AI assistant into a Flow development expert with persistent knowledge of Cadence syntax patterns, NFT standards, project configuration, and development workflows. @@ -51,17 +51,16 @@ Cursor offers two rule types: - **Project Rules**: Live in `.cursor/rules`, version-controlled with your code, and apply to specific projects. - **User Rules**: Global preferences in Cursor Settings that apply across all your projects. - ### Rule anatomy Each rule file is written in MDC (`.mdc`), a format supporting metadata and content. Control how rules are applied from the type dropdown which changes properties `description`, `globs`, `alwaysApply`. -|Rule Type |Description | -|------------------------|---------------------------------------------------------------------------------| -|Always Apply |Always included in model context. | -|Apply to Specific Files |Included when files matching a glob pattern are referenced. | -|Apply Intellegently |Available to AI, which decides whether to include it. Must provide a description. | -|Apply Manually |Only included when explicitly mentioned using `@ruleName`. | +| Rule Type | Description | +| ----------------------- | --------------------------------------------------------------------------------- | +| Always Apply | Always included in model context. | +| Apply to Specific Files | Included when files matching a glob pattern are referenced. | +| Apply Intellegently | Available to AI, which decides whether to include it. Must provide a description. | +| Apply Manually | Only included when explicitly mentioned using `@ruleName`. | ```mdc --- @@ -116,7 +115,7 @@ project/ Create rules with the Cursor Rule command or going to Cursor Settings > Rules. This creates a new rule file in `.cursor/rules`. From settings you can see all rules and their status. -Click the cog icon on the upper right section of the window. Then, click "Rules and Memories" on the left side bar. Finally click "+ Add Rule" in the User Rules or Project Rules section (depending on your objective). +Click the cog icon on the upper right section of the window. Then, click "Rules and Memories" on the left side bar. Finally click "+ Add Rule" in the User Rules or Project Rules section (depending on your objective). ![Creating a Cursor Rule](./imgs/cursor_rules1.png) @@ -246,7 +245,7 @@ Recommended Apply config: `Apply Intelligently` - **Best Practices**: Language-specific patterns that follow Cadence conventions. - **Authorization Mastery**: Proper transaction permission handling. - **Type Safety**: Correct resource handling and type conversions. -- **Performance**: Optimized patterns for gas efficiency. +- **Performance**: Optimized patterns for compute unit (gas) efficiency. #### Usage Examples @@ -280,7 +279,7 @@ The [flow-development-workflow.mdc] rule provides comprehensive workflow methodo - **Deployment Verification**: Post-deployment validation protocols and testing strategies. - **FCL Integration**: Frontend configuration, network management, and user experience patterns. - **Error Resolution**: Systematic debugging approaches and common error prevention. -- **Optimization Techniques**: Computation limit handling and gas efficiency strategies. +- **Optimization Techniques**: Computation limit handling and compute unit (gas) efficiency strategies. - **Testnet Validation**: Comprehensive validation protocols before mainnet deployment. **Perfect for:** @@ -289,7 +288,7 @@ The [flow-development-workflow.mdc] rule provides comprehensive workflow methodo - Moving between development stages (emulator → testnet → mainnet). - Debugging deployment or transaction authorization issues. - Integrating frontend applications with FCL. -- Handling computation limits and gas optimization. +- Handling computation limits and compute unit (gas) optimization. - Learning Flow development best practices and official patterns. - Comprehensive project validation strategies. @@ -338,7 +337,7 @@ Recommended Apply config: `Apply Intelligently` - **Development Sequence**: Emulator testing → Frontend integration → Testnet → Validation. - **Error Resolution**: Syntax errors, deployment errors, FCL errors, computation limits. - **FCL Best Practices**: Network configuration, contract address management, user authentication. -- **Optimization**: Accumulative processing, loop optimization, gas efficiency. +- **Optimization**: Accumulative processing, loop optimization, compute unit (gas) efficiency. - **Deployment**: Verification protocols, update strategies, multi-network consistency. - **Documentation Usage**: When and how to reference official Flow resources. @@ -530,8 +529,8 @@ You discovered five specialized Cursor Rules designed specifically for Cadence a Now that you have completed this guide, you should be able to: - Configure and use Cursor Rules to enhance AI assistance for Flow blockchain development -- Apply specialized Cadence syntax patterns and NFT development standards through persistent AI context -- Utilize workflow-based rules to guide project setup, deployment, and debugging processes across the Flow development lifecycle +- Apply specialized Cadence syntax patterns and NFT development standards through persistent AI context +- Utilize workflow-based rules to guide project setup, deployment, and debugging processes across the Flow development lifecycle diff --git a/docs/build/cadence/advanced-concepts/randomness.md b/docs/build/cadence/advanced-concepts/randomness.md index 3d64b18f1f..0a93def7a2 100644 --- a/docs/build/cadence/advanced-concepts/randomness.md +++ b/docs/build/cadence/advanced-concepts/randomness.md @@ -98,8 +98,6 @@ Although the user (or the honest coin toss contract) cannot predict or bias the The recommended way to mitigate the problems above is via a commit-reveal scheme. The scheme involves two steps: commit and reveal. During the commit phase, the user transaction commits to accepting the future output of a smart contract where the last remaining input is an unknown random source. The user transaction does not know the random source at the time of committing. The smart contract stores this commitment on the blockchain. The reveal phase can start as early as the next block, when the committed beacon's source of randomness becomes available. The reveal phase can be executed at any block after that, now that the commitment to a past block is stored onchain. With a second transaction, the smart contract can be executed to explicitly generate the random outputs. -There are ideas how to further optimize the developer experience in the future. For example, a transaction could delegate part of its gas to an independent transaction it spawns. Conceptually, also this future solution would be a commit-and-reveal scheme, just immediately happening within the same block. Until we eventually get to this next level, developers can implement their own commit-reveal using the tools available to them on Cadence and EVM. - ### Commit-Reveal pattern on Flow [FLIP 123: Onchain Random beacon history for commit-reveal schemes](https://github.com/onflow/flips/blob/main/protocol/20230728-commit-reveal.md#flip-123-onchain-random-beacon-history-for-commit-reveal-schemes) was introduced to provide a safe pattern to use randomness in transactions so that it's not possible to revert unfavorable randomized transaction results. diff --git a/docs/build/cadence/advanced-concepts/scheduled-transactions.md b/docs/build/cadence/advanced-concepts/scheduled-transactions.md index 3670dd6644..71dd0065e6 100644 --- a/docs/build/cadence/advanced-concepts/scheduled-transactions.md +++ b/docs/build/cadence/advanced-concepts/scheduled-transactions.md @@ -25,9 +25,10 @@ Scheduled transactions were part of the Forte network upgrade and are available Scheduled transactions on the Flow blockchain enable users and smart contracts to autonomously execute predefined logic at specific future times without external triggers. This powerful feature allows developers to create "wake up" patterns where contracts can schedule themselves to run at predetermined block timestamps, enabling novel blockchain automation patterns. Key benefits include: + - **Autonomous execution**: No need for external services or manual intervention - **Time-based automation**: Execute transactions based on blockchain time -- **Predictable scheduling**: Guaranteed execution within specified time windows +- **Predictable scheduling**: Guaranteed execution within specified time windows Common use cases include recurring payments, automated arbitrage, time-based contract logic, delayed executions, and periodic maintenance tasks. @@ -73,7 +74,7 @@ access(all) contract TransferFLOWHandler { access(all) let HandlerStoragePath: StoragePath access(all) let HandlerPublicPath: PublicPath - + access(all) resource Handler: FlowTransactionScheduler.TransactionHandler { access(all) var from: Capability @@ -84,7 +85,7 @@ access(all) contract TransferFLOWHandler { // The actual logic that is executed when the scheduled transaction // is executed - access(FlowTransactionScheduler.Execute) + access(FlowTransactionScheduler.Execute) fun executeTransaction(id: UInt64, data: AnyStruct?) { if let to = data as Address { let providerRef = self.from.borrow() @@ -97,7 +98,7 @@ access(all) contract TransferFLOWHandler { // Deposit the withdrawn tokens in the recipient's receiver receiverRef.deposit(from: <-providerRef.withdraw(amount: self.amount)) - + } else { panic("Unable to transfer FLOW because the data provided when scheduling the transaction is not a Flow address!") } @@ -111,10 +112,9 @@ access(all) contract TransferFLOWHandler { } // other functions left out for simplicity -} +} ``` - ### Scheduling Scheduling involves creating the specific transaction that will execute at a specified future timestamp. The system uses three priority levels: @@ -124,13 +124,14 @@ Scheduling involves creating the specific transaction that will execute at a spe - **Low Priority**: Opportunistic execution when network capacity allows, lowest fees but no guarantee about timing. Each transaction requires: + - **Handler Capability**: A capability to a resource implementing `TransactionHandler` interface, like the FLOW transfer one above. - **Timestamp**: Future Unix timestamp when execution should occur (fractional seconds ignored) -- **Execution Effort**: Computational resources allocated (gas limit for the transaction) +- **Execution Effort**: Computational resources allocated (compute unit limit for the transaction) - **Fees**: Flow tokens to cover execution costs and storage costs for the -transaction data. + transaction data. - **Optional Data**: Arbitrary data forwarded to the handler during execution -that may be relevant to the transaction. + that may be relevant to the transaction. These arguments are required by the [`FlowTransactionScheduler.schedule()` function](https://github.com/onflow/flow-core-contracts/blob/master/contracts/FlowTransactionScheduler.cdc#L732). This function returns a `ScheduledTransaction` resource object. @@ -145,7 +146,8 @@ is emitted with information about the scheduled transaction and handler. ### Fees Fee calculation includes: -- **Base execution fee**: Based on computational effort using standard Flow fee structure + +- **Base execution fee**: Based on computational effort using standard Flow fee structure - **Priority multiplier**: Higher priorities pay more (High: 10x, Medium: 5x, Low: 2x base rate) - **Storage fee**: Cost for storing transaction data on-chain @@ -165,7 +167,7 @@ is not emitted. ### Canceling -Scheduled transactions can be canceled before execution. +Scheduled transactions can be canceled before execution. Canceling returns a portion of the fees (configurable refund percentage, 50% as of now). Please keep in mind the refund percentage can change in the future. To cancel, you need the `ScheduledTransaction` resource that was returned during scheduling. The scheduled transaction manager also makes cancelling scheduled transaction easier. @@ -179,7 +181,7 @@ Scheduled transactions follow a specific lifecycle with corresponding events: - Status: `Scheduled` 2. **Pending Execution**: Transaction timestamp has arrived and it's ready for execution - - Event: `FlowTransactionScheduler.PendingExecution` + - Event: `FlowTransactionScheduler.PendingExecution` - Status: `Executed` (Executed does not necessarily mean it succeeded, just that execution was attempted) 3. **Executed**: Transaction has been processed by the blockchain @@ -197,8 +199,9 @@ The `FlowTransactionScheduler` contract is deployed to the service account and m The `FlowTransactionSchedulerUtils` contract provides utilities for scheduled transactions, such as the transaction `Manager` resource, common handlers, and metadata views related to scheduled transactions. Below are listed the addresses of both transaction scheduler contracts on each network they are deployed: + - **Emulator**: `0xf8d6e0586b0a20c7` -- **Cadence Testing Framework: `0x0000000000000001` +- \*\*Cadence Testing Framework: `0x0000000000000001` - **Testnet**: `0x8c5303eaa26202d6` ## Examples @@ -214,12 +217,12 @@ import "FlowTransactionScheduler" access(all) contract TestFlowScheduledTransactionHandler { access(all) let HandlerStoragePath: StoragePath access(all) let HandlerPublicPath: PublicPath - + access(all) event TransactionExecuted(data: String) access(all) resource Handler: FlowTransactionScheduler.TransactionHandler { - - access(FlowTransactionScheduler.Execute) + + access(FlowTransactionScheduler.Execute) fun executeTransaction(id: UInt64, data: AnyStruct?) { if let string: String = data as? String { emit TransactionExecuted(data: string) @@ -228,7 +231,7 @@ access(all) contract TestFlowScheduledTransactionHandler { } } - // public functions that anyone can call to get information about + // public functions that anyone can call to get information about // this handler access(all) view fun getViews(): [Type] { return [Type(), Type(), Type()] @@ -290,15 +293,15 @@ transaction(timestamp: UFix64, feeAmount: UFix64, effort: UInt64, priority: UInt let managerRef = account.capabilities.storage.issue<&{FlowTransactionSchedulerUtils.Manager}>(FlowTransactionSchedulerUtils.managerStoragePath) account.capabilities.publish(managerRef, at: FlowTransactionSchedulerUtils.managerPublicPath) } - + // If a transaction handler has not been created for this account yet, create one, // store it, and issue a capability that will be used to create the transaction if !account.storage.check<@TestFlowScheduledTransactionHandler.Handler>(from: TestFlowScheduledTransactionHandler.HandlerStoragePath) { let handler <- TestFlowScheduledTransactionHandler.createHandler() - + account.storage.save(<-handler, to: TestFlowScheduledTransactionHandler.HandlerStoragePath) account.capabilities.storage.issue(TestFlowScheduledTransactionHandler.HandlerStoragePath) - + let publicHandlerCap = account.capabilities.storage.issue<&{FlowTransactionScheduler.TransactionHandler}>(TestFlowScheduledTransactionHandler.HandlerStoragePath) account.capabilities.publish(publicHandlerCap, at: TestFlowScheduledTransactionHandler.HandlerPublicPath) } @@ -306,7 +309,7 @@ transaction(timestamp: UFix64, feeAmount: UFix64, effort: UInt64, priority: UInt // Get the entitled capability that will be used to create the transaction // Need to check both controllers because the order of controllers is not guaranteed var handlerCap: Capability? = nil - + if let cap = account.capabilities.storage .getControllers(forPath: TestFlowScheduledTransactionHandler.HandlerStoragePath)[0] .capability as? Capability { @@ -316,11 +319,11 @@ transaction(timestamp: UFix64, feeAmount: UFix64, effort: UInt64, priority: UInt .getControllers(forPath: TestFlowScheduledTransactionHandler.HandlerStoragePath)[1] .capability as! Capability } - + // borrow a reference to the vault that will be used for fees let vault = account.storage.borrow(from: /storage/flowTokenVault) ?? panic("Could not borrow FlowToken vault") - + let fees <- vault.withdraw(amount: feeAmount) as! @FlowToken.Vault let priorityEnum = FlowTransactionScheduler.Priority(rawValue: priority) ?? FlowTransactionScheduler.Priority.High @@ -339,7 +342,7 @@ transaction(timestamp: UFix64, feeAmount: UFix64, effort: UInt64, priority: UInt fees: <-fees ) } -} +} ``` ### 3. Querying Transaction Information @@ -363,7 +366,7 @@ import "FlowToken" transaction(transactionId: UInt64) { prepare(account: auth(BorrowValue, SaveValue, LoadValue) &Account) { - + // borrow a reference to the manager let manager = account.storage.borrow(from: FlowTransactionSchedulerUtils.managerStoragePath) ?? panic("Could not borrow a Manager reference from \(FlowTransactionSchedulerUtils.managerStoragePath)") @@ -383,7 +386,7 @@ transaction(transactionId: UInt64) { This script helps estimate the cost of scheduling a transaction before actually submitting it, useful for budgeting and validation. ```cadence -// estimate_fees.cdc - Script to estimate scheduling costs +// estimate_fees.cdc - Script to estimate scheduling costs import "FlowTransactionScheduler" access(all) fun main( @@ -392,13 +395,13 @@ access(all) fun main( priority: UInt8, executionEffort: UInt64 ): FlowTransactionScheduler.EstimatedScheduledTransaction { - + let priorityEnum = FlowTransactionScheduler.Priority(rawValue: priority) ?? FlowTransactionScheduler.Priority.Medium - + return FlowTransactionScheduler.estimate( data: dataSize, - timestamp: timestamp, + timestamp: timestamp, priority: priorityEnum, executionEffort: executionEffort ) @@ -421,6 +424,7 @@ flow events get \ ``` This command fetches the last 200 blocks of events for: + - **Scheduled**: When a transaction is scheduled - **PendingExecution**: When a transaction is ready for execution - **Executed**: When a transaction has been executed @@ -439,5 +443,4 @@ Block explorer support for scheduled transactions is also coming, which will pro For feature requests and suggestions for scheduled transaction tooling, please visit [github.com/onflow/flow](https://github.com/onflow/flow) and create an issue with the tag `scheduled_transactions`. - -Read FLIP for more details: https://github.com/onflow/flips/blob/main/protocol/20250609-scheduled-callbacks.md \ No newline at end of file +Read FLIP for more details: https://github.com/onflow/flips/blob/main/protocol/20250609-scheduled-callbacks.md diff --git a/docs/build/cadence/basics/fees.md b/docs/build/cadence/basics/fees.md index d6d9fec464..049daa9f65 100644 --- a/docs/build/cadence/basics/fees.md +++ b/docs/build/cadence/basics/fees.md @@ -15,6 +15,7 @@ keywords: - network protection - blockchain fees - gas fees + - compute unit fees - Flow token - fee structure - cost estimation @@ -32,13 +33,17 @@ Are you an EVM developer looking for information about EVM Accounts on Flow? If A transaction fee is a cost paid in Flow by the payer account and is required for a transaction to be included in the Flow blockchain. Fees are necessary for protecting the network against spam/infinite running transactions and to provide monetary incentives for participants that make up the Flow network. -A transaction fee is paid regardless of whether a transaction succeeds or fails. If the payer account doesn't have sufficient Flow balance to pay for the transaction fee, the transaction will fail. We can limit the transaction fee to some extent by providing the gas limit value when submitting the transaction. +Transaction fees are calculated in compute units. Compute units are similar to gas in EVM networks, but are not calculated in exactly the same manner. + +A transaction fee is paid regardless of whether a transaction succeeds or fails. If the payer account doesn't have sufficient Flow balance to pay for the transaction fee, the transaction will fail. We can limit the transaction fee to some extent by providing the compute unit limit value when submitting the transaction. ### Understanding the need for transaction fees +One of the ways that a single computer that no one owns and anyone can use from being monopolized by any part is to charge a fee measured by the amount of computation needed to execute code. All blockchains implement a form of this system. + Segmented transaction fees are essential to ensure fair pricing based on the impact on the network. For instance, more heavy operations will require more resources to process and propagate transactions. Common operations, however, will stay reasonably priced. -Fees will improve the overall security of the network by making malicious actions (eg spam) on the network less viable. +Fees improve the overall security of the network by making malicious actions (eg spam) on the network less viable. They also prevent the computer from crashing in the event that an infinite loop is started maliciously or accidentally. The unique Flow architecture is targeted at high throughput. It makes it easier to have slack in the system, so short spikes can be handled more gracefully. diff --git a/docs/build/cadence/basics/scripts.md b/docs/build/cadence/basics/scripts.md index 7c52a53a66..10e2989f9b 100644 --- a/docs/build/cadence/basics/scripts.md +++ b/docs/build/cadence/basics/scripts.md @@ -121,7 +121,7 @@ Following are some recommendations on how to write efficient scripts: 1. **Rate limit** - Script execution is subjected to API rate-limits imposed by the Access nodes and the Execution nodes. The rate limits for the Public Access nodes hosted by QuickNode are outlined [here](https://www.quicknode.com/docs/flow#endpoint-rate-limits). -2. **Computation limit** - Similar to a transaction, each script is also subjected to a computation limit. The specific value can be configured by individual Access and Execution node operators. Currently, the default compute (gas) limit for a script is 100,000. +2. **Computation limit** - Similar to a transaction, each script is also subjected to a computation limit. The specific value can be configured by individual Access and Execution node operators. Currently, the default compute unit (gas) limit for a script is 100,000. 3. **Historic block data limit** 1. Script execution on execution nodes is restricted to approximately the last 100 blocks. Any request for script execution on an execution node on a past block (specified by block ID or block height) will fail if that block is more than 100 blocks in the past. diff --git a/docs/build/cadence/basics/transactions.md b/docs/build/cadence/basics/transactions.md index 4f4bd54232..284f04c058 100644 --- a/docs/build/cadence/basics/transactions.md +++ b/docs/build/cadence/basics/transactions.md @@ -114,7 +114,7 @@ what parts of their account a transaction can access. ### Payer -A payer is the account that pays the fees for the transaction. A transaction must specify exactly one payer. The payer is only responsible for paying the network and gas fees; the transaction is not authorized to access resources or code stored in the payer account. +A payer is the account that pays the fees for the transaction. A transaction must specify exactly one payer. The payer is only responsible for paying the network and compute unit fees; the transaction is not authorized to access resources or code stored in the payer account. By explicitly specifying a payer a transaction can be paid by third-party services such as wallet providers. diff --git a/docs/build/cadence/core-contracts/10-nft-storefront.md b/docs/build/cadence/core-contracts/10-nft-storefront.md index 8241d9c687..183bb86675 100644 --- a/docs/build/cadence/core-contracts/10-nft-storefront.md +++ b/docs/build/cadence/core-contracts/10-nft-storefront.md @@ -135,9 +135,9 @@ During the listing purchase all saleCuts are paid automatically. This also inclu ### Considerations -1. **Auto cleanup -** `NFTStorefrontV2` offers a unique ability to do auto cleanup of duplicate listings during a purchase. It comes with a drawback if one NFT has thousands of duplicate listings. It will become the bottleneck during purchasing one of the listings as it will likely trigger an out-of-gas error. +1. **Auto cleanup -** `NFTStorefrontV2` offers a unique ability to do auto cleanup of duplicate listings during a purchase. It comes with a drawback if one NFT has thousands of duplicate listings. It will become the bottleneck during purchasing one of the listings as it will likely trigger an out-of-compute error. - **Note -** _We recommended NOT to have more than 50 (TBD) duplicate listings of any given NFT._ + **Note -** _We recommended NOT to have more than 50 duplicate listings of any given NFT._ 2. **Unsupported receiver capability** - A common pitfall during the purchase of an NFT that some saleCut receivers don't have a supported receiver capability because that entitled sale cut would transfer to first valid sale cut receiver. However, it can be partially solved by providing the generic receiver using the [`FungibleTokenSwitchboard`] contract and adding all the currency capabilities the beneficiary wants to receive. More on the `FungibleTokenSwitchboard` can be read in [Fungible Token Switchboard] diff --git a/docs/build/cadence/smart-contracts/best-practices/project-development-tips.md b/docs/build/cadence/smart-contracts/best-practices/project-development-tips.md index 1b3b018f8b..513a5846e3 100644 --- a/docs/build/cadence/smart-contracts/best-practices/project-development-tips.md +++ b/docs/build/cadence/smart-contracts/best-practices/project-development-tips.md @@ -96,7 +96,7 @@ Here are some recommendations for how projects can organize the foundations of t Developing a dapp requires a clear vision for the role of the smart contract and how it's integrated. Security vulnerabilities may arise from bugs directly in smart contract code (and elsewhere in the system). Asynchronous interaction vectors may lead to forms of malicious abuse, -DOS etc in a contract triggering explosive gas costs for the developer or other problems. +DOS etc in a contract triggering explosive compute unit costs for the developer or other problems. We recommend that engineers leading a project and deploying to mainnet have an understanding of software and security engineering fundamentals and have been thorough diff --git a/docs/build/evm/fees.md b/docs/build/evm/fees.md index 9e1b40d6dd..52b5ec3a85 100644 --- a/docs/build/evm/fees.md +++ b/docs/build/evm/fees.md @@ -21,10 +21,10 @@ With Flow EVM, EVM operations can now be called within Cadence transactions. EVM Transaction fee on EVM = surge x [inclusion fee + (execution effort * unit cost)] ``` -- `Surge' factor` dynamically accounts for network pressure and market conditions. This is currently constant at 1.0 but subject to change with community approval. +- `Surge' factor` dynamically accounts for network pressure and market conditions. - `Inclusion fee` accounts for the resources required to process a transaction due to its core properties (byte size, signatures). This is currently constant at 1E-6 FLOW, but subject to change with community approval. - `Execution fee` The fee that accounts for the operational cost of running the transaction script, processing the results, sending results for verification, generating verification receipts, etc. and is calculated as a product of `execution effort units` and the `cost per unit`. - - `Execution Effort (computation)` is based on transaction type and operations that are called during the execution of a transaction. The weights determine how “costly” (time consuming) each operation is. + - `Execution Effort (computation)` is based on transaction type and operations that are called during the execution of a transaction. The weights determine how costly (time consuming) each operation is. - `Execution Effort Unit Cost` = `2.49E-07 FLOW` (currently constant, but subject to change with community approval)

Calculation of Execution Effort

@@ -45,11 +45,9 @@ where ``` ``` -`EVMGasUsageCost` - The ratio that converts EVM gas into Flow computation units (execution effort) is currently set at `1/5000` but subject to revision by community approval +`EVMGasUsageCost` - The ratio that converts EVM gas into Flow compute units (execution effort) is currently set at `1/5000` but subject to revision by community approval ``` -**Note**: The weights and unit cost mentioned above have been updated recently to accommodate an increased computation limit on Flow, which now supports the deployment of larger EVM contracts. For detailed information, refer to the relevant [FLIP](https://github.com/onflow/flips/blob/main/governance/20240508-computation-limit-hike.md) and join the ongoing discussion on the community [forum post](https://forum.flow.com/t/proposing-transaction-fee-changes-and-flow-evm-gas-charges-for-flow-crescendo-launch/5817). These values may be adjusted in the future based on community feedback and evolving requirements. -
@@ -65,13 +63,13 @@ Assume a simple NFT transfer transaction that makes 31 cadence loop calls, reads **Scenario 1 - Cadence-only Transaction** ``` -Execution Effort = 0.00478 * (31) + 0.00246 * (5668) + 0.00234 *(1668) + 8.65988 *(0) + EVMGasUsageCost * EVMGasUsage +Compute Units = 0.00478 * (31) + 0.00246 * (5668) + 0.00234 *(1668) + 8.65988 *(0) + EVMGasUsageCost * EVMGasUsage ``` But since `EVMGasUsage` is 0 for a Cadence transaction, ``` -Execution Effort = 18.04378 +Compute Units = 18.04378 ``` Thus @@ -84,7 +82,7 @@ Transaction fee = [1E-6 FLOW + (18.04378 * 2.49E-07 FLOW)] x 1 = 5.5E-06 FLOW If the EVMGasUsage can be assumed to be 21,000 gas (typical for a simple transfer), ``` -Execution Effort = 0.00478 * (31) + 0.00246 * (5668) + 0.00234 *(1668) + 8.65988 *(0) + 1/5000 * 21000 = 22.24378 +Compute Units = 0.00478 * (31) + 0.00246 * (5668) + 0.00234 *(1668) + 8.65988 *(0) + 1/5000 * 21000 = 22.24378 ``` Thus diff --git a/docs/build/flow.md b/docs/build/flow.md index 81e90c0adf..7869123780 100644 --- a/docs/build/flow.md +++ b/docs/build/flow.md @@ -74,7 +74,7 @@ Flow is unique in supporting two powerful programming languages for smart contra - **Cadence**: A modern programming language developed by smart contract application builders. - **Solidity**: The industry-standard language for EVM development, fully supported on Flow with full EVM equivalence. -EVM and Cadence environments both use FLOW as gas for transactions and are connected by a native bridge that allows seamless and cheap communication between them. Fungible and non-fungible tokens can also be seamlessly transferred between environments using the native VM token bridge, taking place instantly in a single atomic transaction. +EVM and Cadence environments both use FLOW as compute units, or gas, for transactions and are connected by a native bridge that allows seamless and cheap communication between them. Fungible and non-fungible tokens can also be seamlessly transferred between environments using the native VM token bridge, taking place instantly in a single atomic transaction. This means developers can choose the language that best fits their needs while maintaining full interoperability between both environments. @@ -113,15 +113,15 @@ EVM-equivalency on Flow works behind-the-scenes by implementing a minimal transa - **Scalable and Secure Architecture**: The [multi-role architecture] of Flow allows the network to [scale without sharding] to serve billions of users without reducing the decentralization of consensus and verification. - **True, fast finality**: For most other networks, it takes minutes, [a day], or even [a week] to reach hard finality — the point at which a transaction cannot be reversed. On Flow, the median time for finality is [under 10 seconds], without compromising security. - **Consumer onboarding**: Flow was designed for mainstream consumers, with payment onramps catalyzing a safe and low-friction path from fiat to crypto. -- **Efficient gas costs**: The Flow blockchain is extremely efficient, allowing apps to do more computation at lower costs. +- **Efficient compute unit (gas) costs**: The Flow blockchain is extremely efficient, allowing apps to do more computation at lower costs. ### MEV resilience The [MEV Resilient] design on Flow offers DeFi builders improved market efficiency, fairness, trust, and long-term viability for their apps. Since Flow EVM transactions are composed and executed within a Cadence transaction, block production is handled by the [multi-role architecture] on Flow. -This robust MEV resilience is a significant difference from other EVM-compatible networks and results in reasonably priced and predictable gas fees. The impracticality of frontrunning or other attacks improves the user experience by eliminating failed transactions and invisible fees. +This robust MEV resilience is a significant difference from other EVM-compatible networks and results in reasonably priced and predictable compute unit (gas) fees. The impracticality of frontrunning or other attacks improves the user experience by eliminating failed transactions and invisible fees. -### Scalability, performance, and low gas fees +### Scalability, performance, and low compute unit (gas) fees For sustainable user adoption, apps require the network they build on to be secure, efficient, affordable, and fast. Gas fees are ultra-low cost on the network, but Flow goes a step further allowing for gasless experiences through sponsored transactions. @@ -197,7 +197,7 @@ This means developers can: - **Compose complex operations**: Build sophisticated DeFi strategies by combining multiple Actions in one transaction - **Eliminate integration complexity**: Use standardized interfaces instead of custom contract integrations - **Ensure atomicity**: All operations succeed together or fail together, eliminating partial execution risks -- **Reduce gas costs**: Execute multiple protocol interactions more efficiently than separate transactions +- **Reduce compute unit (gas) costs**: Execute multiple protocol interactions more efficiently than separate transactions ### Scheduled Transaction: Autonomous onchain execution diff --git a/docs/build/tools/clients/fcl-js/packages-docs/fcl/mutate.md b/docs/build/tools/clients/fcl-js/packages-docs/fcl/mutate.md index cc6b828978..3654da3a53 100644 --- a/docs/build/tools/clients/fcl-js/packages-docs/fcl/mutate.md +++ b/docs/build/tools/clients/fcl-js/packages-docs/fcl/mutate.md @@ -1,6 +1,6 @@ --- -title: "mutate" -description: "mutate function documentation." +title: 'mutate' +description: 'mutate function documentation.' --- @@ -21,12 +21,13 @@ Cadence code that are replaced with actual addresses at execution time. It also for standardized transaction execution patterns. The mutate function accepts a configuration object with the following structure: + ```typescript { cadence?: string, // The Cadence transaction code to execute (required if template not provided) args?: Function, // Function that returns an array of arguments for the transaction template?: any, // Interaction Template object or URL for standardized transactions -limit?: number, // Compute (gas) limit for the transaction execution +limit?: number, // Compute units limit for the transaction execution authz?: AccountAuthorization, // Authorization function for all signatory roles (proposer, payer, authorizer) proposer?: AccountAuthorization, // Specific authorization function for the proposer role payer?: AccountAuthorization, // Specific authorization function for the payer role @@ -39,34 +40,34 @@ authorizations?: AccountAuthorization[] // Array of authorization functions for You can import the entire package and access the function: ```typescript -import * as fcl from "@onflow/fcl" +import * as fcl from '@onflow/fcl'; -fcl.mutate(opts) +fcl.mutate(opts); ``` Or import directly the specific function: ```typescript -import { mutate } from "@onflow/fcl" +import { mutate } from '@onflow/fcl'; -mutate(opts) +mutate(opts); ``` ## Usage ```typescript // Basic transaction submission -import * as fcl from "@onflow/fcl" +import * as fcl from '@onflow/fcl'; // Configure FCL first fcl.config({ - "accessNode.api": "https://rest-testnet.onflow.org", - "discovery.wallet": "https://fcl-discovery.onflow.org/testnet/authn", - "flow.network": "testnet" -}) + 'accessNode.api': 'https://rest-testnet.onflow.org', + 'discovery.wallet': 'https://fcl-discovery.onflow.org/testnet/authn', + 'flow.network': 'testnet', +}); // Authenticate user -await fcl.authenticate() +await fcl.authenticate(); // Submit a basic transaction const txId = await fcl.mutate({ @@ -78,31 +79,26 @@ const txId = await fcl.mutate({ } } `, - args: (arg, t) => [ - arg("Hello Flow!", t.String) - ], - limit: 50 -}) + args: (arg, t) => [arg('Hello Flow!', t.String)], + limit: 50, +}); -console.log("Transaction submitted:", txId) +console.log('Transaction submitted:', txId); ``` ## Parameters -### `opts` - +### `opts` - Type: `any` - Description: Transaction configuration options - ## Returns ```typescript -(opts?: MutateOptions) => Promise +(opts?: MutateOptions) => Promise; ``` - Promise that resolves to the transaction ID (txId) when the transaction is submitted ---- \ No newline at end of file +--- diff --git a/docs/build/tools/clients/fcl-js/packages-docs/sdk/index.md b/docs/build/tools/clients/fcl-js/packages-docs/sdk/index.md index a91ed49f93..984be78090 100644 --- a/docs/build/tools/clients/fcl-js/packages-docs/sdk/index.md +++ b/docs/build/tools/clients/fcl-js/packages-docs/sdk/index.md @@ -1,6 +1,6 @@ --- -title: "@onflow/sdk" -description: "Low-level JavaScript/TypeScript SDK for interacting with the Flow blockchain." +title: '@onflow/sdk' +description: 'Low-level JavaScript/TypeScript SDK for interacting with the Flow blockchain.' --- @@ -34,13 +34,13 @@ yarn add @onflow/sdk You can import the entire package: ```typescript -import * as sdk from "@onflow/sdk" +import * as sdk from '@onflow/sdk'; ``` Or import specific functions: ```typescript -import { functionName } from "@onflow/sdk" +import { functionName } from '@onflow/sdk'; ``` ## Connect @@ -50,11 +50,11 @@ By default, the library uses HTTP to communicate with the access nodes and it mu Example: ```typescript -import { config } from "@onflow/fcl" +import { config } from '@onflow/fcl'; config({ - "accessNode.api": "https://rest-testnet.onflow.org" -}) + 'accessNode.api': 'https://rest-testnet.onflow.org', +}); ``` ## Querying the Flow Network @@ -95,7 +95,7 @@ A proposal key contains three fields: A transaction is only valid if its declared sequence number matches the current on-chain sequence number for that key. The sequence number increments by one after the transaction is executed. -**Payer** is the account that pays the fees for the transaction. A transaction must specify exactly one payer. The payer is only responsible for paying the network and gas fees; the transaction is not authorized to access resources or code stored in the payer account. +**Payer** is the account that pays the fees for the transaction. A transaction must specify exactly one payer. The payer is only responsible for paying the network and compute unit (gas) fees; the transaction is not authorized to access resources or code stored in the payer account. **Authorizers** are accounts that authorize a transaction to read and mutate their resources. A transaction can specify zero or more authorizers, depending on how many accounts the transaction needs to access. @@ -109,14 +109,17 @@ transaction { } ``` -**Gas limit** is the limit on the amount of computation a transaction requires, and it will abort if it exceeds its gas limit. -Cadence uses metering to measure the number of operations per transaction. You can read more about it in the [Cadence documentation](https://cadence-lang.org/docs). +**Compute Limit** is the limit on the amount of computation a transaction requires, and it will abort if it exceeds its compute unit (gas) limit. Cadence uses metering to measure the number of operations per transaction. You can read more about it in the [Cadence documentation](https://cadence-lang.org/docs). -The gas limit depends on the complexity of the transaction script. Until dedicated gas estimation tooling exists, it's best to use the emulator to test complex transactions and determine a safe limit. +The compute limit depends on the complexity of the transaction script. Until dedicated estimation tooling exists, it's best to use the emulator to test complex transactions and determine a safe limit. -**Reference block** specifies an expiration window (measured in blocks) during which a transaction is considered valid by the network. -A transaction will be rejected if it is submitted past its expiry block. Flow calculates transaction expiry using the _reference block_ field on a transaction. -A transaction expires after `600` blocks are committed on top of the reference block, which takes about 10 minutes at average Mainnet block rates. +Keep in mind that Flow is **very** efficient, so transaction fees are generally low. A limit resulting in max charges of `.001` Flow is sufficient to cover even complex transactions. + +- Flow token transfer: 19 CU. + - Single NFT Transfer: 26 CU. + - EVM Token transfer 28 CU. + +**Reference block** specifies an expiration window (measured in blocks) during which a transaction is considered valid by the network. A transaction will be rejected if it is submitted past its expiry block. Flow calculates transaction expiry using the _reference block_ field on a transaction. A transaction expires after `600` blocks are committed on top of the reference block, which takes about 10 minutes at average Mainnet block rates. ## API Reference @@ -200,4 +203,4 @@ This section contains documentation for all of the functions and namespaces in t - [voucherToTxId](./voucherToTxId.md) - Converts a voucher object to a transaction ID. This function computes the... - [why](./why.md) - Returns the reason for an interaction failure. ---- \ No newline at end of file +--- diff --git a/docs/build/tools/clients/fcl-js/packages-docs/types/index.md b/docs/build/tools/clients/fcl-js/packages-docs/types/index.md index 6d377abbd5..bcf9a40217 100644 --- a/docs/build/tools/clients/fcl-js/packages-docs/types/index.md +++ b/docs/build/tools/clients/fcl-js/packages-docs/types/index.md @@ -14,93 +14,89 @@ Documentation for core types used throughout the Flow Client Library (FCL). ### Account ```typescript -import { type Account } from "@onflow/fcl" +import { type Account } from '@onflow/fcl'; ``` - **Properties:** -| Name | Type | Description | -| ---- | ---- | ----------- | -| `address` | `string` | The address of the account | -| `balance` | `number` | The FLOW balance of the account in 10^8 | -| `code` | `number` | The code of any Cadence contracts stored in the account | -| `contracts` | `Record` | Any contracts deployed to this account | -| `keys` | `AccountKey[]` | The keys associated with the account | +| Name | Type | Description | +| ----------- | ------------------------ | ------------------------------------------------------- | +| `address` | `string` | The address of the account | +| `balance` | `number` | The FLOW balance of the account in 10^8 | +| `code` | `number` | The code of any Cadence contracts stored in the account | +| `contracts` | `Record` | Any contracts deployed to this account | +| `keys` | `AccountKey[]` | The keys associated with the account | ### AccountKey ```typescript -import { type AccountKey } from "@onflow/fcl" +import { type AccountKey } from '@onflow/fcl'; ``` - **Properties:** -| Name | Type | Description | -| ---- | ---- | ----------- | -| `index` | `number` | The index of the key in the account | -| `publicKey` | `string` | The public key of the account key | -| `signAlgo` | `SignatureAlgorithm` | The signature algorithm used by the key | -| `signAlgoString` | `string` | The signature algorithm used by the key as a string | -| `hashAlgo` | `HashAlgorithm` | The hashing algorithm used by the key | -| `hashAlgoString` | `string` | The hashing algorithm used by the key as a string | -| `sequenceNumber` | `number` | The sequence number of the key | -| `weight` | `number` | The weight of the key | -| `revoked` | `boolean` | Whether or not the key has been revoked | +| Name | Type | Description | +| ---------------- | -------------------- | --------------------------------------------------- | +| `index` | `number` | The index of the key in the account | +| `publicKey` | `string` | The public key of the account key | +| `signAlgo` | `SignatureAlgorithm` | The signature algorithm used by the key | +| `signAlgoString` | `string` | The signature algorithm used by the key as a string | +| `hashAlgo` | `HashAlgorithm` | The hashing algorithm used by the key | +| `hashAlgoString` | `string` | The hashing algorithm used by the key as a string | +| `sequenceNumber` | `number` | The sequence number of the key | +| `weight` | `number` | The weight of the key | +| `revoked` | `boolean` | Whether or not the key has been revoked | ### AccountStatusEvent ```typescript -import { type AccountStatusEvent } from "@onflow/fcl" +import { type AccountStatusEvent } from '@onflow/fcl'; ``` - **Properties:** -| Name | Type | Description | -| ---- | ---- | ----------- | +| Name | Type | Description | +| ---------------- | -------- | -------------------------------------------------------------- | | `accountAddress` | `string` | The address of the account which the event is associated with. | ### Block ```typescript -import { type Block } from "@onflow/fcl" +import { type Block } from '@onflow/fcl'; ``` - **Properties:** -| Name | Type | Description | -| ---- | ---- | ----------- | -| `id` | `string` | The id of the block | -| `parentId` | `string` | The id of the parent block | -| `height` | `number` | The height of the block | -| `timestamp` | `string` | Time related fields | -| `parentVoterSignature` | `string` | The parent voter signature of the block | -| `collectionGuarantees` | `CollectionGuarantee[]` | Contains the ids of collections included in the block | -| `blockSeals` | `BlockSeal[]` | The details of which nodes executed and sealed the blocks | +| Name | Type | Description | +| ---------------------- | ----------------------- | --------------------------------------------------------- | +| `id` | `string` | The id of the block | +| `parentId` | `string` | The id of the parent block | +| `height` | `number` | The height of the block | +| `timestamp` | `string` | Time related fields | +| `parentVoterSignature` | `string` | The parent voter signature of the block | +| `collectionGuarantees` | `CollectionGuarantee[]` | Contains the ids of collections included in the block | +| `blockSeals` | `BlockSeal[]` | The details of which nodes executed and sealed the blocks | ### BlockDigest ```typescript -import { type BlockDigest } from "@onflow/fcl" +import { type BlockDigest } from '@onflow/fcl'; ``` BlockDigest holds lightweight block information which includes only block id, block height and block timestamp. **Properties:** -| Name | Type | Description | -| ---- | ---- | ----------- | -| `id` | `string` | The id of the block | -| `height` | `number` | The height of the block | -| `timestamp` | `string` | Timestamp of the block | +| Name | Type | Description | +| ----------- | -------- | ----------------------- | +| `id` | `string` | The id of the block | +| `height` | `number` | The height of the block | +| `timestamp` | `string` | Timestamp of the block | ### BlockHeader ```typescript -import { type BlockHeader } from "@onflow/fcl" +import { type BlockHeader } from '@onflow/fcl'; ``` Header contains all meta-data for a block, as well as a hash representing @@ -109,608 +105,581 @@ on after validating the contents against the payload hash. **Properties:** -| Name | Type | Description | -| ---- | ---- | ----------- | -| `id` | `string` | The id of the block | -| `parentId` | `string` | The id of the parent block | -| `height` | `number` | The height of the block | -| `timestamp` | `string` | The timestamp of the block | +| Name | Type | Description | +| ---------------------- | -------- | --------------------------------------- | +| `id` | `string` | The id of the block | +| `parentId` | `string` | The id of the parent block | +| `height` | `number` | The height of the block | +| `timestamp` | `string` | The timestamp of the block | | `parentVoterSignature` | `string` | The parent voter signature of the block | ### BlockHeartbeat ```typescript -import { type BlockHeartbeat } from "@onflow/fcl" +import { type BlockHeartbeat } from '@onflow/fcl'; ``` - **Properties:** -| Name | Type | Description | -| ---- | ---- | ----------- | -| `blockId` | `string` | The ID of the block | -| `blockHeight` | `number` | The height of the block | -| `timestamp` | `string` | The timestamp of the block | +| Name | Type | Description | +| ------------- | -------- | -------------------------- | +| `blockId` | `string` | The ID of the block | +| `blockHeight` | `number` | The height of the block | +| `timestamp` | `string` | The timestamp of the block | ### BlockSeal ```typescript -import { type BlockSeal } from "@onflow/fcl" +import { type BlockSeal } from '@onflow/fcl'; ``` - **Properties:** -| Name | Type | Description | -| ---- | ---- | ----------- | -| `blockId` | `string` | The id of the block | +| Name | Type | Description | +| -------------------- | -------- | ------------------------------------- | +| `blockId` | `string` | The id of the block | | `executionReceiptId` | `string` | The execution receipt id of the block | ### CollectionGuarantee ```typescript -import { type CollectionGuarantee } from "@onflow/fcl" +import { type CollectionGuarantee } from '@onflow/fcl'; ``` - **Properties:** -| Name | Type | Description | -| ---- | ---- | ----------- | -| `collectionId` | `string` | The id of the block | -| `signerIds` | `string[]` | The signer ids of the block | +| Name | Type | Description | +| -------------- | ---------- | --------------------------- | +| `collectionId` | `string` | The id of the block | +| `signerIds` | `string[]` | The signer ids of the block | ### CompositeSignature ```typescript -import { type CompositeSignature } from "@onflow/fcl" +import { type CompositeSignature } from '@onflow/fcl'; ``` - **Properties:** -| Name | Type | Description | -| ---- | ---- | ----------- | -| `f_type` | `string` | A type identifier used internally by FCL | -| `f_vsn` | `string` | FCL protocol version | -| `addr` | `string` | Flow Address (sans prefix) | -| `keyId` | `number` | Key ID | -| `signature` | `string` | Signature as a hex string | +| Name | Type | Description | +| --------------- | -------- | -------------------------------------------------------------------------- | +| `f_type` | `string` | A type identifier used internally by FCL | +| `f_vsn` | `string` | FCL protocol version | +| `addr` | `string` | Flow Address (sans prefix) | +| `keyId` | `number` | Key ID | +| `signature` | `string` | Signature as a hex string | | `extensionData` | `string` | Optional signature extension data for alternative schemes (e.g., WebAuthn) | ### CurrentUser ```typescript -import { type CurrentUser } from "@onflow/fcl" +import { type CurrentUser } from '@onflow/fcl'; ``` - **Properties:** -| Name | Type | Description | -| ---- | ---- | ----------- | -| `addr` | `string` | The public address of the current user | -| `cid` | `string` | A wallet specified content identifier for user metadata | -| `expiresAt` | `number` | A wallet specified time-frame for a valid session | -| `f_type` | `string` | A type identifier used internally by FCL | -| `f_vsn` | `string` | FCL protocol version | -| `loggedIn` | `boolean` | Whether or not the current user is logged in | -| `services` | `Service[]` | A list of trusted services that express ways of interacting with the current user's identity | +| Name | Type | Description | +| ----------- | ----------- | -------------------------------------------------------------------------------------------- | +| `addr` | `string` | The public address of the current user | +| `cid` | `string` | A wallet specified content identifier for user metadata | +| `expiresAt` | `number` | A wallet specified time-frame for a valid session | +| `f_type` | `string` | A type identifier used internally by FCL | +| `f_vsn` | `string` | FCL protocol version | +| `loggedIn` | `boolean` | Whether or not the current user is logged in | +| `services` | `Service[]` | A list of trusted services that express ways of interacting with the current user's identity | ### Event ```typescript -import { type Event } from "@onflow/fcl" +import { type Event } from '@onflow/fcl'; ``` - **Properties:** -| Name | Type | Description | -| ---- | ---- | ----------- | -| `blockId` | `string` | ID of the block that contains the event. | -| `blockHeight` | `number` | Height of the block that contains the event. | -| `blockTimestamp` | `string` | The timestamp of when the block was sealed in a DateString format. eg. '2021-06-25T13:42:04.227Z' | -| `type` | `string` | A string containing the event name. | -| `transactionId` | `string` | Can be used to query transaction information, eg. via a Flow block explorer. | -| `transactionIndex` | `number` | Used to prevent replay attacks. | -| `eventIndex` | `number` | Used to prevent replay attacks. | -| `data` | `any` | The data emitted from the event. | +| Name | Type | Description | +| ------------------ | -------- | ------------------------------------------------------------------------------------------------- | +| `blockId` | `string` | ID of the block that contains the event. | +| `blockHeight` | `number` | Height of the block that contains the event. | +| `blockTimestamp` | `string` | The timestamp of when the block was sealed in a DateString format. eg. '2021-06-25T13:42:04.227Z' | +| `type` | `string` | A string containing the event name. | +| `transactionId` | `string` | Can be used to query transaction information, eg. via a Flow block explorer. | +| `transactionIndex` | `number` | Used to prevent replay attacks. | +| `eventIndex` | `number` | Used to prevent replay attacks. | +| `data` | `any` | The data emitted from the event. | ### EventFilter ```typescript -import { type EventFilter } from "@onflow/fcl" +import { type EventFilter } from '@onflow/fcl'; ``` - **Properties:** -| Name | Type | Description | -| ---- | ---- | ----------- | -| `eventTypes` | `string[]` | The event types to listen for | -| `addresses` | `string[]` | The addresses to listen for | -| `contracts` | `string[]` | The contracts to listen for | -| `startBlockId` | `string` | The block ID to start listening for events | -| `startHeight` | `number` | The block height to start listening for events | -| `heartbeatInterval` | `number` | The interval in milliseconds to send a heartbeat to the Access Node | +| Name | Type | Description | +| ------------------- | ---------- | ------------------------------------------------------------------- | +| `eventTypes` | `string[]` | The event types to listen for | +| `addresses` | `string[]` | The addresses to listen for | +| `contracts` | `string[]` | The contracts to listen for | +| `startBlockId` | `string` | The block ID to start listening for events | +| `startHeight` | `number` | The block height to start listening for events | +| `heartbeatInterval` | `number` | The interval in milliseconds to send a heartbeat to the Access Node | ### Interaction ```typescript -import { type Interaction } from "@onflow/fcl" +import { type Interaction } from '@onflow/fcl'; ``` - **Properties:** -| Name | Type | Description | -| ---- | ---- | ----------- | -| `tag` | `InteractionTag` | The type of interaction | -| `assigns` | `Record` | Assigned values for the interaction | -| `status` | `InteractionStatus` | The status of the interaction | -| `reason` | `string` | Reason for the current status | -| `accounts` | `Record` | Accounts involved in the interaction | -| `params` | `Record` | Parameters for the interaction | -| `arguments` | `Record` | Arguments for the interaction | -| `message` | `{ cadence: string; refBlock: string; computeLimit: number; proposer: string; payer: string; authorizations: string[]; params: Record[]; arguments: string[]; }` | Message details for the interaction | -| `proposer` | `string` | The proposer of the transaction | -| `authorizations` | `string[]` | The authorizations for the transaction | -| `payer` | `string[]` | The payer(s) of the transaction | -| `events` | `{ eventType: string; start: string \| number; end: string \| number; blockIds: string[]; }` | Event-related information | -| `transaction` | `{ id: string; }` | Transaction-related information | -| `block` | `{ id: string; height: string \| number; isSealed: boolean; }` | Block-related information | -| `account` | `{ addr: string; }` | Account-related information | -| `collection` | `{ id: string; }` | Collection-related information | -| `subscribeEvents` | `{ eventTypes: string[]; addresses: string[]; contracts: string[]; startBlockId: string; startHeight: number; heartbeatInterval: number; }` | Event subscription information | +| Name | Type | Description | +| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------- | +| `tag` | `InteractionTag` | The type of interaction | +| `assigns` | `Record` | Assigned values for the interaction | +| `status` | `InteractionStatus` | The status of the interaction | +| `reason` | `string` | Reason for the current status | +| `accounts` | `Record` | Accounts involved in the interaction | +| `params` | `Record` | Parameters for the interaction | +| `arguments` | `Record` | Arguments for the interaction | +| `message` | `{ cadence: string; refBlock: string; computeLimit: number; proposer: string; payer: string; authorizations: string[]; params: Record[]; arguments: string[]; }` | Message details for the interaction | +| `proposer` | `string` | The proposer of the transaction | +| `authorizations` | `string[]` | The authorizations for the transaction | +| `payer` | `string[]` | The payer(s) of the transaction | +| `events` | `{ eventType: string; start: string \| number; end: string \| number; blockIds: string[]; }` | Event-related information | +| `transaction` | `{ id: string; }` | Transaction-related information | +| `block` | `{ id: string; height: string \| number; isSealed: boolean; }` | Block-related information | +| `account` | `{ addr: string; }` | Account-related information | +| `collection` | `{ id: string; }` | Collection-related information | +| `subscribeEvents` | `{ eventTypes: string[]; addresses: string[]; contracts: string[]; startBlockId: string; startHeight: number; heartbeatInterval: number; }` | Event subscription information | ### InteractionAccount ```typescript -import { type InteractionAccount } from "@onflow/fcl" +import { type InteractionAccount } from '@onflow/fcl'; ``` - **Properties:** -| Name | Type | Description | -| ---- | ---- | ----------- | -| `kind` | `InteractionResolverKind.ACCOUNT` | The kind of interaction resolver | -| `tempId` | `string` | Temporary identifier for the account | -| `addr` | `string` | The address of the account | -| `keyId` | `string \| number` | The key ID used for signing | -| `sequenceNum` | `number` | The sequence number for the account key | -| `signature` | `string` | The signature for the account | -| `extensionData` | `string` | Optional extension data for alternative signature schemes (e.g., WebAuthn) | -| `signingFunction` | `any` | Function used for signing | -| `resolve` | `any` | Resolver function for the account | -| `role` | `{ proposer: boolean; authorizer: boolean; payer: boolean; param?: boolean; }` | Role of the account in the transaction | -| `authorization` | `any` | Authorization details for the account | +| Name | Type | Description | +| ----------------- | ------------------------------------------------------------------------------ | -------------------------------------------------------------------------- | +| `kind` | `InteractionResolverKind.ACCOUNT` | The kind of interaction resolver | +| `tempId` | `string` | Temporary identifier for the account | +| `addr` | `string` | The address of the account | +| `keyId` | `string \| number` | The key ID used for signing | +| `sequenceNum` | `number` | The sequence number for the account key | +| `signature` | `string` | The signature for the account | +| `extensionData` | `string` | Optional extension data for alternative signature schemes (e.g., WebAuthn) | +| `signingFunction` | `any` | Function used for signing | +| `resolve` | `any` | Resolver function for the account | +| `role` | `{ proposer: boolean; authorizer: boolean; payer: boolean; param?: boolean; }` | Role of the account in the transaction | +| `authorization` | `any` | Authorization details for the account | ### Key ```typescript -import { type Key } from "@onflow/fcl" +import { type Key } from '@onflow/fcl'; ``` - **Properties:** -| Name | Type | Description | -| ---- | ---- | ----------- | -| `sequenceNumber` | `number` | Sequence number of key used by the proposer of this transaction | -| `keyId` | `number` | The ID of the key in the account used by the proposer of this transaction | -| `address` | `string` | The address of the proposer of this transaction | +| Name | Type | Description | +| ---------------- | -------- | ------------------------------------------------------------------------- | +| `sequenceNumber` | `number` | Sequence number of key used by the proposer of this transaction | +| `keyId` | `number` | The ID of the key in the account used by the proposer of this transaction | +| `address` | `string` | The address of the proposer of this transaction | ### NodeVersionInfo ```typescript -import { type NodeVersionInfo } from "@onflow/fcl" +import { type NodeVersionInfo } from '@onflow/fcl'; ``` - **Properties:** -| Name | Type | Description | -| ---- | ---- | ----------- | -| `semver` | `string` | The semver version of the node. | -| `commit` | `string` | The commit hash of the node. | -| `sporkId` | `string` | The spork id of the node. | -| `protocolVersion` | `number` | The protocol version of the node. | +| Name | Type | Description | +| ---------------------- | -------- | ---------------------------------------- | +| `semver` | `string` | The semver version of the node. | +| `commit` | `string` | The commit hash of the node. | +| `sporkId` | `string` | The spork id of the node. | +| `protocolVersion` | `number` | The protocol version of the node. | | `sporkRootBlockHeight` | `number` | The spork root block height of the node. | -| `nodeRootBlockHeight` | `number` | The node root block height of the node. | +| `nodeRootBlockHeight` | `number` | The node root block height of the node. | ### Provider ```typescript -import { type Provider } from "@onflow/fcl" +import { type Provider } from '@onflow/fcl'; ``` - **Properties:** -| Name | Type | Description | -| ---- | ---- | ----------- | -| `address` | `string` | The blockchain address of the Wallet provider. | -| `name` | `string` | The name of the Wallet provider. | -| `icon` | `string` | The icon of the Wallet provider (may be a URL or a data URI). | -| `description` | `string` | A brief description of the Wallet provider. | -| `color` | `string` | The preferred color to represent the Wallet provider (e.g., for UI styling). | -| `supportEmail` | `string` | The support email address of the Wallet provider. | -| `website` | `string` | The website URL of the Wallet provider. | -| `is_installed` | `boolean` | Indicates whether the Wallet provider is installed (if applicable). | +| Name | Type | Description | +| ------------------ | --------- | ---------------------------------------------------------------------------- | +| `address` | `string` | The blockchain address of the Wallet provider. | +| `name` | `string` | The name of the Wallet provider. | +| `icon` | `string` | The icon of the Wallet provider (may be a URL or a data URI). | +| `description` | `string` | A brief description of the Wallet provider. | +| `color` | `string` | The preferred color to represent the Wallet provider (e.g., for UI styling). | +| `supportEmail` | `string` | The support email address of the Wallet provider. | +| `website` | `string` | The website URL of the Wallet provider. | +| `is_installed` | `boolean` | Indicates whether the Wallet provider is installed (if applicable). | | `requires_install` | `boolean` | Indicates whether the Wallet provider requires installation (if applicable). | -| `install_link` | `string` | The install link for the Wallet provider. | +| `install_link` | `string` | The install link for the Wallet provider. | ### Service ```typescript -import { type Service } from "@onflow/fcl" +import { type Service } from '@onflow/fcl'; ``` - **Properties:** -| Name | Type | Description | -| ---- | ---- | ----------- | -| `f_type` | `string` | A type identifier used internally by FCL | -| `f_vsn` | `string` | FCL protocol version | -| `type` | `string` | Service type | -| `method` | `string` | Service method | -| `uid` | `string` | Service uid | -| `endpoint` | `string` | Service endpoint | -| `provider` | `Provider` | Service provider object | -| `params` | `Record` | Service parameters | -| `data` | `Record` | Service data | -| `headers` | `Record` | Service headers | +| Name | Type | Description | +| ---------- | ------------------------ | ---------------------------------------- | +| `f_type` | `string` | A type identifier used internally by FCL | +| `f_vsn` | `string` | FCL protocol version | +| `type` | `string` | Service type | +| `method` | `string` | Service method | +| `uid` | `string` | Service uid | +| `endpoint` | `string` | Service endpoint | +| `provider` | `Provider` | Service provider object | +| `params` | `Record` | Service parameters | +| `data` | `Record` | Service data | +| `headers` | `Record` | Service headers | ### Signature ```typescript -import { type Signature } from "@onflow/fcl" +import { type Signature } from '@onflow/fcl'; ``` - **Properties:** -| Name | Type | Description | -| ---- | ---- | ----------- | -| `sequenceNumber` | `string` | Sequence number of the key used to perform this signature. | -| `keyId` | `number` | ID of the key in the account used to perform this signature. | -| `signature` | `string` | The signature represented as a hex string. | +| Name | Type | Description | +| ---------------- | -------- | ------------------------------------------------------------ | +| `sequenceNumber` | `string` | Sequence number of the key used to perform this signature. | +| `keyId` | `number` | ID of the key in the account used to perform this signature. | +| `signature` | `string` | The signature represented as a hex string. | ### StreamConnection ```typescript -import { type StreamConnection } from "@onflow/fcl" +import { type StreamConnection } from '@onflow/fcl'; ``` - - ### Transaction ```typescript -import { type Transaction } from "@onflow/fcl" +import { type Transaction } from '@onflow/fcl'; ``` - **Properties:** -| Name | Type | Description | -| ---- | ---- | ----------- | -| `script` | `string` | The Cadence code used to execute this transaction. | -| `args` | `string[]` | The JSON-CDC encoded arguments passed in to the transaction. | -| `referenceBlockId` | `string` | The reference block id for this transaction. | -| `gasLimit` | `number` | The gas limit for the transaction. | -| `proposalKey` | `Key` | The key used by the proposer of this transaction. | -| `sequenceNumber` | `string` | Sequence number of the key used by the proposer of this transaction. | -| `keyId` | `number` | The ID of the key in the account used by the proposer of this transaction. | -| `address` | `string` | The address of the proposer of this transaction. | -| `payer` | `string` | Address of the payer of the transaction. | -| `proposer` | `string` | Address of the proposer of this transaction. | -| `authorizers` | `string[]` | Array of addresses of authorizers of this transaction. | -| `payloadSignatures` | `Signature[]` | The payload signatures for the transaction. | -| `envelopeSignatures` | `Signature[]` | The envelope signatures for the transaction. | +| Name | Type | Description | +| -------------------- | ------------- | -------------------------------------------------------------------------- | +| `script` | `string` | The Cadence code used to execute this transaction. | +| `args` | `string[]` | The JSON-CDC encoded arguments passed in to the transaction. | +| `referenceBlockId` | `string` | The reference block id for this transaction. | +| `computeLimit` | `number` | The compute unit limit for the transaction. | +| `proposalKey` | `Key` | The key used by the proposer of this transaction. | +| `sequenceNumber` | `string` | Sequence number of the key used by the proposer of this transaction. | +| `keyId` | `number` | The ID of the key in the account used by the proposer of this transaction. | +| `address` | `string` | The address of the proposer of this transaction. | +| `payer` | `string` | Address of the payer of the transaction. | +| `proposer` | `string` | Address of the proposer of this transaction. | +| `authorizers` | `string[]` | Array of addresses of authorizers of this transaction. | +| `payloadSignatures` | `Signature[]` | The payload signatures for the transaction. | +| `envelopeSignatures` | `Signature[]` | The envelope signatures for the transaction. | ### TransactionStatus ```typescript -import { type TransactionStatus } from "@onflow/fcl" +import { type TransactionStatus } from '@onflow/fcl'; ``` - **Properties:** -| Name | Type | Description | -| ---- | ---- | ----------- | -| `blockId` | `string` | The ID of the Block the transaction is included in. | -| `status` | `TransactionExecutionStatus` | The execution status of the transaction | -| `statusString` | `string` | The status as as descriptive text (e.g. "FINALIZED"). | -| `statusCode` | `0 \| 1` | The result of the transaction, if executed (i.e. 0 for success, 1 for failure) | -| `errorMessage` | `string` | The error message of the transaction. | -| `events` | `Event[]` | The events for this result. | - +| Name | Type | Description | +| -------------- | ---------------------------- | ------------------------------------------------------------------------------ | +| `blockId` | `string` | The ID of the Block the transaction is included in. | +| `status` | `TransactionExecutionStatus` | The execution status of the transaction | +| `statusString` | `string` | The status as as descriptive text (e.g. "FINALIZED"). | +| `statusCode` | `0 \| 1` | The result of the transaction, if executed (i.e. 0 for success, 1 for failure) | +| `errorMessage` | `string` | The error message of the transaction. | +| `events` | `Event[]` | The events for this result. | ## Types ### EventStream ```typescript -import { type EventStream } from "@onflow/fcl" +import { type EventStream } from '@onflow/fcl'; ``` - **Properties:** -| Name | Type | Description | -| ---- | ---- | ----------- | -| `on` | `{ (channel: C, listener: (data: { events: Event[]; heartbeat: BlockHeartbeat; }[C]) => void): EventStream; (event: "close", listener: () => void): EventStream; (event: "error", listener: (err: any) => void): EventStream; }` | | -| `off` | `{ (event: C, listener: (data: { events: Event[]; heartbeat: BlockHeartbeat; }[C]) => void): EventStream; (event: "close", listener: () => void): EventStream; (event: "error", listener: (err: any) => void): EventStream; }` | | -| `close` | `() => void` | | +| Name | Type | Description | +| ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | +| `on` | `{ (channel: C, listener: (data: { events: Event[]; heartbeat: BlockHeartbeat; }[C]) => void): EventStream; (event: "close", listener: () => void): EventStream; (event: "error", listener: (err: any) => void): EventStream; }` | | +| `off` | `{ (event: C, listener: (data: { events: Event[]; heartbeat: BlockHeartbeat; }[C]) => void): EventStream; (event: "close", listener: () => void): EventStream; (event: "error", listener: (err: any) => void): EventStream; }` | | +| `close` | `() => void` | | ### RawSubscriptionData ```typescript -import { type RawSubscriptionData } from "@onflow/fcl" +import { type RawSubscriptionData } from '@onflow/fcl'; ``` Raw data returned by a subscription, which will vary depending on the topic and is not decoded - ### SdkTransport ```typescript -import { type SdkTransport } from "@onflow/fcl" +import { type SdkTransport } from '@onflow/fcl'; ``` Transport interface for the Flow SDK that provides methods for sending interactions and subscribing to data **Properties:** -| Name | Type | Description | -| ---- | ---- | ----------- | -| `send` | `SendFn` | Function to send an interaction to the Flow blockchain | +| Name | Type | Description | +| ----------- | ------------- | ---------------------------------------------------------------- | +| `send` | `SendFn` | Function to send an interaction to the Flow blockchain | | `subscribe` | `SubscribeFn` | Function to subscribe to real-time data from the Flow blockchain | ### Subscription ```typescript -import { type Subscription } from "@onflow/fcl" +import { type Subscription } from '@onflow/fcl'; ``` A subscription object that allows managing the subscription lifecycle **Properties:** -| Name | Type | Description | -| ---- | ---- | ----------- | +| Name | Type | Description | +| ------------- | ------------ | --------------------------------------------- | | `unsubscribe` | `() => void` | Function to unsubscribe from the subscription | ### SubscriptionArgs ```typescript -import { type SubscriptionArgs } from "@onflow/fcl" +import { type SubscriptionArgs } from '@onflow/fcl'; ``` Arguments for a subscription, which will vary depending on the topic - ### SubscriptionData ```typescript -import { type SubscriptionData } from "@onflow/fcl" +import { type SubscriptionData } from '@onflow/fcl'; ``` The data returned by a subscription, which will vary depending on the topic - - ## Enums ### FvmErrorCode ```typescript -import { FvmErrorCode } from "@onflow/fcl" +import { FvmErrorCode } from '@onflow/fcl'; ``` Error codes defined by the Flow Virtual Machine (FVM) for various types of errors that can occur during transaction execution **Members:** -| Name | Value | -| ---- | ----- | -| `UNKNOWN_ERROR` | -1 | -| `TX_VALIDATION_ERROR` | 1000 | -| `INVALID_TX_BYTE_SIZE_ERROR` | 1001 | -| `INVALID_REFERENCE_BLOCK_ERROR` | 1002 | -| `EXPIRED_TRANSACTION_ERROR` | 1003 | -| `INVALID_SCRIPT_ERROR` | 1004 | -| `INVALID_GAS_LIMIT_ERROR` | 1005 | -| `INVALID_PROPOSAL_SIGNATURE_ERROR` | 1006 | -| `INVALID_PROPOSAL_SEQ_NUMBER_ERROR` | 1007 | -| `INVALID_PAYLOAD_SIGNATURE_ERROR` | 1008 | -| `INVALID_ENVELOPE_SIGNATURE_ERROR` | 1009 | -| `FVM_INTERNAL_ERROR` | 1050 | -| `VALUE_ERROR` | 1051 | -| `INVALID_ARGUMENT_ERROR` | 1052 | -| `INVALID_ADDRESS_ERROR` | 1053 | -| `INVALID_LOCATION_ERROR` | 1054 | -| `ACCOUNT_AUTHORIZATION_ERROR` | 1055 | -| `OPERATION_AUTHORIZATION_ERROR` | 1056 | -| `OPERATION_NOT_SUPPORTED_ERROR` | 1057 | -| `BLOCK_HEIGHT_OUT_OF_RANGE_ERROR` | 1058 | -| `EXECUTION_ERROR` | 1100 | -| `CADENCE_RUNTIME_ERROR` | 1101 | -| `ENCODING_UNSUPPORTED_VALUE` | 1102 | -| `STORAGE_CAPACITY_EXCEEDED` | 1103 | -| `GAS_LIMIT_EXCEEDED_ERROR` | 1104 | -| `EVENT_LIMIT_EXCEEDED_ERROR` | 1105 | -| `LEDGER_INTERACTION_LIMIT_EXCEEDED_ERROR` | 1106 | -| `STATE_KEY_SIZE_LIMIT_ERROR` | 1107 | -| `STATE_VALUE_SIZE_LIMIT_ERROR` | 1108 | -| `TRANSACTION_FEE_DEDUCTION_FAILED_ERROR` | 1109 | -| `COMPUTATION_LIMIT_EXCEEDED_ERROR` | 1110 | -| `MEMORY_LIMIT_EXCEEDED_ERROR` | 1111 | -| `COULD_NOT_DECODE_EXECUTION_PARAMETER_FROM_STATE` | 1112 | -| `SCRIPT_EXECUTION_TIMED_OUT_ERROR` | 1113 | -| `SCRIPT_EXECUTION_CANCELLED_ERROR` | 1114 | -| `EVENT_ENCODING_ERROR` | 1115 | -| `INVALID_INTERNAL_STATE_ACCESS_ERROR` | 1116 | -| `INSUFFICIENT_PAYER_BALANCE` | 1118 | -| `ACCOUNT_ERROR` | 1200 | -| `ACCOUNT_NOT_FOUND_ERROR` | 1201 | -| `ACCOUNT_PUBLIC_KEY_NOT_FOUND_ERROR` | 1202 | -| `ACCOUNT_ALREADY_EXISTS_ERROR` | 1203 | -| `FROZEN_ACCOUNT_ERROR` | 1204 | -| `ACCOUNT_STORAGE_NOT_INITIALIZED_ERROR` | 1205 | -| `ACCOUNT_PUBLIC_KEY_LIMIT_ERROR` | 1206 | -| `CONTRACT_ERROR` | 1250 | -| `CONTRACT_NOT_FOUND_ERROR` | 1251 | -| `CONTRACT_NAMES_NOT_FOUND_ERROR` | 1252 | -| `EVM_EXECUTION_ERROR` | 1300 | +| Name | Value | +| ------------------------------------------------- | ----- | +| `UNKNOWN_ERROR` | -1 | +| `TX_VALIDATION_ERROR` | 1000 | +| `INVALID_TX_BYTE_SIZE_ERROR` | 1001 | +| `INVALID_REFERENCE_BLOCK_ERROR` | 1002 | +| `EXPIRED_TRANSACTION_ERROR` | 1003 | +| `INVALID_SCRIPT_ERROR` | 1004 | +| `INVALID_GAS_LIMIT_ERROR` | 1005 | +| `INVALID_PROPOSAL_SIGNATURE_ERROR` | 1006 | +| `INVALID_PROPOSAL_SEQ_NUMBER_ERROR` | 1007 | +| `INVALID_PAYLOAD_SIGNATURE_ERROR` | 1008 | +| `INVALID_ENVELOPE_SIGNATURE_ERROR` | 1009 | +| `FVM_INTERNAL_ERROR` | 1050 | +| `VALUE_ERROR` | 1051 | +| `INVALID_ARGUMENT_ERROR` | 1052 | +| `INVALID_ADDRESS_ERROR` | 1053 | +| `INVALID_LOCATION_ERROR` | 1054 | +| `ACCOUNT_AUTHORIZATION_ERROR` | 1055 | +| `OPERATION_AUTHORIZATION_ERROR` | 1056 | +| `OPERATION_NOT_SUPPORTED_ERROR` | 1057 | +| `BLOCK_HEIGHT_OUT_OF_RANGE_ERROR` | 1058 | +| `EXECUTION_ERROR` | 1100 | +| `CADENCE_RUNTIME_ERROR` | 1101 | +| `ENCODING_UNSUPPORTED_VALUE` | 1102 | +| `STORAGE_CAPACITY_EXCEEDED` | 1103 | +| `GAS_LIMIT_EXCEEDED_ERROR` | 1104 | +| `EVENT_LIMIT_EXCEEDED_ERROR` | 1105 | +| `LEDGER_INTERACTION_LIMIT_EXCEEDED_ERROR` | 1106 | +| `STATE_KEY_SIZE_LIMIT_ERROR` | 1107 | +| `STATE_VALUE_SIZE_LIMIT_ERROR` | 1108 | +| `TRANSACTION_FEE_DEDUCTION_FAILED_ERROR` | 1109 | +| `COMPUTATION_LIMIT_EXCEEDED_ERROR` | 1110 | +| `MEMORY_LIMIT_EXCEEDED_ERROR` | 1111 | +| `COULD_NOT_DECODE_EXECUTION_PARAMETER_FROM_STATE` | 1112 | +| `SCRIPT_EXECUTION_TIMED_OUT_ERROR` | 1113 | +| `SCRIPT_EXECUTION_CANCELLED_ERROR` | 1114 | +| `EVENT_ENCODING_ERROR` | 1115 | +| `INVALID_INTERNAL_STATE_ACCESS_ERROR` | 1116 | +| `INSUFFICIENT_PAYER_BALANCE` | 1118 | +| `ACCOUNT_ERROR` | 1200 | +| `ACCOUNT_NOT_FOUND_ERROR` | 1201 | +| `ACCOUNT_PUBLIC_KEY_NOT_FOUND_ERROR` | 1202 | +| `ACCOUNT_ALREADY_EXISTS_ERROR` | 1203 | +| `FROZEN_ACCOUNT_ERROR` | 1204 | +| `ACCOUNT_STORAGE_NOT_INITIALIZED_ERROR` | 1205 | +| `ACCOUNT_PUBLIC_KEY_LIMIT_ERROR` | 1206 | +| `CONTRACT_ERROR` | 1250 | +| `CONTRACT_NOT_FOUND_ERROR` | 1251 | +| `CONTRACT_NAMES_NOT_FOUND_ERROR` | 1252 | +| `EVM_EXECUTION_ERROR` | 1300 | ### HashAlgorithm ```typescript -import { HashAlgorithm } from "@onflow/fcl" +import { HashAlgorithm } from '@onflow/fcl'; ``` - **Members:** -| Name | Value | -| ---- | ----- | -| `SHA2_256` | 1 | -| `SHA2_384` | 2 | -| `SHA3_256` | 3 | -| `SHA3_384` | 4 | -| `KMAC128_BLS_BLS12_381` | 5 | +| Name | Value | +| ----------------------- | ----- | +| `SHA2_256` | 1 | +| `SHA2_384` | 2 | +| `SHA3_256` | 3 | +| `SHA3_384` | 4 | +| `KMAC128_BLS_BLS12_381` | 5 | ### InteractionResolverKind ```typescript -import { InteractionResolverKind } from "@onflow/fcl" +import { InteractionResolverKind } from '@onflow/fcl'; ``` Represents different kinds of interaction resolvers **Members:** -| Name | Value | -| ---- | ----- | +| Name | Value | +| ---------- | ---------- | | `ARGUMENT` | "ARGUMENT" | -| `ACCOUNT` | "ACCOUNT" | +| `ACCOUNT` | "ACCOUNT" | ### InteractionStatus ```typescript -import { InteractionStatus } from "@onflow/fcl" +import { InteractionStatus } from '@onflow/fcl'; ``` Status of an interaction with the Flow blockchain **Members:** -| Name | Value | -| ---- | ----- | +| Name | Value | +| ----- | ----- | | `BAD` | "BAD" | -| `OK` | "OK" | +| `OK` | "OK" | ### InteractionTag ```typescript -import { InteractionTag } from "@onflow/fcl" +import { InteractionTag } from '@onflow/fcl'; ``` Represents different types of interactions with the Flow blockchain **Members:** -| Name | Value | -| ---- | ----- | -| `UNKNOWN` | "UNKNOWN" | -| `SCRIPT` | "SCRIPT" | -| `TRANSACTION` | "TRANSACTION" | +| Name | Value | +| ------------------------ | ------------------------ | +| `UNKNOWN` | "UNKNOWN" | +| `SCRIPT` | "SCRIPT" | +| `TRANSACTION` | "TRANSACTION" | | `GET_TRANSACTION_STATUS` | "GET_TRANSACTION_STATUS" | -| `GET_ACCOUNT` | "GET_ACCOUNT" | -| `GET_EVENTS` | "GET_EVENTS" | -| `PING` | "PING" | -| `GET_TRANSACTION` | "GET_TRANSACTION" | -| `GET_BLOCK` | "GET_BLOCK" | -| `GET_BLOCK_HEADER` | "GET_BLOCK_HEADER" | -| `GET_COLLECTION` | "GET_COLLECTION" | +| `GET_ACCOUNT` | "GET_ACCOUNT" | +| `GET_EVENTS` | "GET_EVENTS" | +| `PING` | "PING" | +| `GET_TRANSACTION` | "GET_TRANSACTION" | +| `GET_BLOCK` | "GET_BLOCK" | +| `GET_BLOCK_HEADER` | "GET_BLOCK_HEADER" | +| `GET_COLLECTION` | "GET_COLLECTION" | | `GET_NETWORK_PARAMETERS` | "GET_NETWORK_PARAMETERS" | -| `SUBSCRIBE_EVENTS` | "SUBSCRIBE_EVENTS" | -| `GET_NODE_VERSION_INFO` | "GET_NODE_VERSION_INFO" | +| `SUBSCRIBE_EVENTS` | "SUBSCRIBE_EVENTS" | +| `GET_NODE_VERSION_INFO` | "GET_NODE_VERSION_INFO" | ### SignatureAlgorithm ```typescript -import { SignatureAlgorithm } from "@onflow/fcl" +import { SignatureAlgorithm } from '@onflow/fcl'; ``` - **Members:** -| Name | Value | -| ---- | ----- | -| `ECDSA_P256` | 1 | -| `ECDSA_secp256k1` | 2 | -| `BLS_BLS12_381` | 3 | +| Name | Value | +| ----------------- | ----- | +| `ECDSA_P256` | 1 | +| `ECDSA_secp256k1` | 2 | +| `BLS_BLS12_381` | 3 | ### SubscriptionTopic ```typescript -import { SubscriptionTopic } from "@onflow/fcl" +import { SubscriptionTopic } from '@onflow/fcl'; ``` Represents different topics that can be subscribed to for real-time data from the Flow blockchain **Members:** -| Name | Value | -| ---- | ----- | -| `BLOCKS` | "blocks" | -| `BLOCK_HEADERS` | "block_headers" | -| `BLOCK_DIGESTS` | "block_digests" | -| `ACCOUNT_STATUSES` | "account_statuses" | +| Name | Value | +| ---------------------- | ---------------------- | +| `BLOCKS` | "blocks" | +| `BLOCK_HEADERS` | "block_headers" | +| `BLOCK_DIGESTS` | "block_digests" | +| `ACCOUNT_STATUSES` | "account_statuses" | | `TRANSACTION_STATUSES` | "transaction_statuses" | -| `EVENTS` | "events" | +| `EVENTS` | "events" | ### TransactionExecutionStatus ```typescript -import { TransactionExecutionStatus } from "@onflow/fcl" +import { TransactionExecutionStatus } from '@onflow/fcl'; ``` The execution status of the transaction. **Members:** -| Name | Value | -| ---- | ----- | -| `UNKNOWN` | 0 | -| `PENDING` | 1 | -| `FINALIZED` | 2 | -| `EXECUTED` | 3 | -| `SEALED` | 4 | -| `EXPIRED` | 5 | +| Name | Value | +| ----------- | ----- | +| `UNKNOWN` | 0 | +| `PENDING` | 1 | +| `FINALIZED` | 2 | +| `EXECUTED` | 3 | +| `SEALED` | 4 | +| `EXPIRED` | 5 | ### TransactionRole ```typescript -import { TransactionRole } from "@onflow/fcl" +import { TransactionRole } from '@onflow/fcl'; ``` Represents different roles in a transaction **Members:** -| Name | Value | -| ---- | ----- | +| Name | Value | +| ------------ | ------------ | | `AUTHORIZER` | "authorizer" | -| `PAYER` | "payer" | -| `PROPOSER` | "proposer" | +| `PAYER` | "payer" | +| `PROPOSER` | "proposer" | - ---- \ No newline at end of file +--- diff --git a/docs/build/tools/clients/flow-go-sdk/index.md b/docs/build/tools/clients/flow-go-sdk/index.md index 011979ad77..2eea2386f3 100644 --- a/docs/build/tools/clients/flow-go-sdk/index.md +++ b/docs/build/tools/clients/flow-go-sdk/index.md @@ -534,7 +534,7 @@ A proposal key contains three fields: A transaction is only valid if its declared sequence number matches the current onchain sequence number for that key. The sequence number increments by one after the transaction is executed. -📖 **[Payer](../../../cadence/basics/transactions.md#signer-roles)** is the account that pays the fees for the transaction. A transaction must specify exactly one payer. The payer is only responsible for paying the network and gas fees; the transaction is not authorized to access resources or code stored in the payer account. +📖 **[Payer](../../../cadence/basics/transactions.md#signer-roles)** is the account that pays the fees for the transaction. A transaction must specify exactly one payer. The payer is only responsible for paying the network and compute unit fees; the transaction is not authorized to access resources or code stored in the payer account. 📖 **[Authorizers](../../../cadence/basics/transactions.md#signer-roles)** are accounts that authorize a transaction to read and mutate their resources. A transaction can specify zero or more authorizers, depending on how many accounts the transaction needs to access. @@ -550,10 +550,15 @@ transaction { #### Gas Limit -📖 **Gas limit** is the limit on the amount of computation a transaction requires, and it will abort if it exceeds its gas limit. -Cadence uses metering to measure the number of operations per transaction. You can read more about it in the [Cadence documentation](https://cadence-lang.org/docs). +**Compute Limit** is the limit on the amount of computation a transaction requires, and it will abort if it exceeds its compute unit (gas) limit. Cadence uses metering to measure the number of operations per transaction. You can read more about it in the [Cadence documentation](https://cadence-lang.org/docs). -The gas limit depends on the complexity of the transaction script. Until dedicated gas estimation tooling exists, it's best to use the emulator to test complex transactions and determine a safe limit. +The compute limit depends on the complexity of the transaction script. Until dedicated estimation tooling exists, it's best to use the emulator to test complex transactions and determine a safe limit. + +Keep in mind that Flow is **very** efficient, so transaction fees are generally low. A limit resulting in max charges of `.001` Flow is sufficient to cover even complex transactions. + +- Flow token transfer: 19 CU. +- Single NFT Transfer: 26 CU. +- EVM Token transfer 28 CU. #### Reference Block diff --git a/docs/build/tools/emulator/index.md b/docs/build/tools/emulator/index.md index 06e1a2017b..88f078853a 100644 --- a/docs/build/tools/emulator/index.md +++ b/docs/build/tools/emulator/index.md @@ -96,8 +96,8 @@ This starts a local Flow network with: - `--computation-reporting`: Enable computation reporting - `--legacy-upgrade`: Enable legacy contract upgrade behavior - `--scheduled-transactions`: Enable scheduled transactions (default true) - - `--script-gas-limit `: Gas limit for scripts (default `100000`) - - `--transaction-max-gas-limit `: Max transaction gas limit (default `9999`) + - `--script-compute-limit `: Compute unit limit for scripts (default `100000`) + - `--transaction-max-compute-limit `: Max transaction compute unit limit (default `9999`) - `--transaction-expiry `: Transaction expiry in blocks (default `10`) - `--skip-tx-validation`: Skip tx signature and sequence number checks - `--simple-addresses`: Use sequential addresses starting with `0x01` @@ -221,9 +221,9 @@ flow emulator list To learn more about using the Emulator, please have a look at the [public GitHub repository]. - + [Flow CLI]: ../flow-cli/index.md [installation guide]: ../flow-cli/install.md [Create Emulator Snapshot]: ../flow-cli/utils/snapshot-save.md -[public GitHub repository]: https://github.com/onflow/flow-emulator \ No newline at end of file +[public GitHub repository]: https://github.com/onflow/flow-emulator diff --git a/docs/build/tools/flow-cli/flix.md b/docs/build/tools/flow-cli/flix.md index 17a1a53cc2..217f834716 100644 --- a/docs/build/tools/flow-cli/flix.md +++ b/docs/build/tools/flow-cli/flix.md @@ -475,13 +475,13 @@ Specify the name of the account that will be used as payer in the transaction. Specify the name of the account(s) that will be used as authorizer(s) in the transaction. If you want to provide multiple authorizers separate them using commas (e.g. `alice,bob`) -### Gas Limit +### Compute Limit -- Flag: `--gas-limit` +- Flag: `--compute-limit` - Valid inputs: an integer greater than zero. - Default: `1000` -Specify the gas limit for this transaction. +Specify the compute unit (gas) limit for this transaction. ### Host diff --git a/docs/build/tools/flow-cli/transactions/build-transactions.md b/docs/build/tools/flow-cli/transactions/build-transactions.md index bb0c5f0831..a257b26376 100644 --- a/docs/build/tools/flow-cli/transactions/build-transactions.md +++ b/docs/build/tools/flow-cli/transactions/build-transactions.md @@ -140,11 +140,11 @@ Cadence JSON format contains `type` and `value` keys and is ### Gas Limit -- Flag: `--gas-limit` +- Flag: `--compute-limit` - Valid inputs: an integer greater than zero. - Default: `1000` -Specify the gas limit for this transaction. +Specify the compute unit (gas) limit for this transaction. ### Host diff --git a/docs/build/tools/flow-cli/transactions/send-transactions.md b/docs/build/tools/flow-cli/transactions/send-transactions.md index c48ec7e25e..59cc81cff7 100644 --- a/docs/build/tools/flow-cli/transactions/send-transactions.md +++ b/docs/build/tools/flow-cli/transactions/send-transactions.md @@ -15,13 +15,13 @@ flow transactions send [ ...] [flags] ```shell > flow transactions send ./tx.cdc "Hello" - + Status ✅ SEALED ID b04b6bcc3164f5ee6b77fa502c3a682e0db57fc47e5b8a8ef3b56aae50ad49c8 Payer f8d6e0586b0a20c7 Authorizers [f8d6e0586b0a20c7] -Proposal Key: +Proposal Key: Address f8d6e0586b0a20c7 Index 0 Sequence 0 @@ -40,10 +40,13 @@ Payload (hidden, use --include payload) ``` Multiple arguments example: + ```shell > flow transactions send tx1.cdc Foo 1 2 10.9 0x1 '[123,222]' '["a","b"]' ``` + Transaction code: + ``` transaction(a: String, b: Int, c: UInt16, d: UFix64, e: Address, f: [Int], g: [String]) { prepare(authorizer: &Account) {} @@ -64,6 +67,7 @@ In the above example, the `flow.json` file would look something like this: ``` JSON arguments from a file example: + ```shell > flow transactions send tx1.cdc --args-json "$(cat args.json)" ``` @@ -71,6 +75,7 @@ JSON arguments from a file example: ## Arguments ### Code Filename + - Name: `code filename` - Valid inputs: Any filename and path valid on the system. @@ -78,8 +83,9 @@ The first argument is a path to a Cadence file containing the transaction to be executed. ### Arguments + - Name: `argument` -- Valid inputs: valid [cadence values](https://cadencelang.dev/docs/1.0/json-cadence-spec) +- Valid inputs: valid [cadence values](https://cadencelang.dev/docs/1.0/json-cadence-spec) matching argument type in transaction code. Input arguments values matching corresponding types in the source code and passed in the same order. @@ -98,13 +104,13 @@ Specify fields to include in the result output. Applies only to the text output. - Flag: `--code` -⚠️ No longer supported: use filename argument. +⚠️ No longer supported: use filename argument. ### Results - Flag: `--results` -⚠️ No longer supported: all transactions will provide result. +⚠️ No longer supported: all transactions will provide result. ### Exclude Fields @@ -148,16 +154,16 @@ Specify the name of the account(s) that will be used as authorizer(s) in the tra - Example: `flow transactions send ./tx.cdc '[{"type": "String", "value": "Hello World"}]'` Arguments passed to the Cadence transaction in Cadence JSON format. -Cadence JSON format contains `type` and `value` keys and is +Cadence JSON format contains `type` and `value` keys and is [documented here](https://cadencelang.dev/docs/1.0/json-cadence-spec). -### Gas Limit +### Compute Limit -- Flag: `--gas-limit` +- Flag: `--compute-limit` - Valid inputs: an integer greater than zero. - Default: `1000` -Specify the gas limit for this transaction. +Specify the compute unit (gas) limit for this transaction. ### Host diff --git a/docs/ecosystem/block-explorers.md b/docs/ecosystem/block-explorers.md index 751d39e7e4..562d976671 100644 --- a/docs/ecosystem/block-explorers.md +++ b/docs/ecosystem/block-explorers.md @@ -20,7 +20,7 @@ Block explorers are user-friendly online tools that visually present blockchain - Transactions - Contracts - Network activity (transaction count) -- Transaction cost (gas fee) +- Transaction cost (compute unit/gas fee) - Validators information ### Supported networks: diff --git a/docs/ecosystem/defi-liquidity/faq.md b/docs/ecosystem/defi-liquidity/faq.md index e83ed599e8..2444c05f11 100644 --- a/docs/ecosystem/defi-liquidity/faq.md +++ b/docs/ecosystem/defi-liquidity/faq.md @@ -25,8 +25,8 @@ Below are common questions regarding stablecoins, liquidity, and bridging on Flo ## Bridging and Gas -
-No, Flow uses $FLOW as the gas token. [WETH](./defi-contracts-mainnet#stablecoins--wrapped-assets) is supported on Flow EVM when [bridging](../bridges.md) from another chain. $WFLOW is used as an ERC20 in DeFi apps and not used for gas. +
+No, Flow uses $FLOW as the compute unit (gas) token. [WETH](./defi-contracts-mainnet#stablecoins--wrapped-assets) is supported on Flow EVM when [bridging](../bridges.md) from another chain. $WFLOW is used as an ERC20 in DeFi apps and not used for gas.
diff --git a/docs/ecosystem/wallets.md b/docs/ecosystem/wallets.md index 69f215b0fe..6bf7b63551 100644 --- a/docs/ecosystem/wallets.md +++ b/docs/ecosystem/wallets.md @@ -13,7 +13,7 @@ Store, manage, and interact securely with tokens and digital assets on Flow. Dis ## Flow Wallet -[Flow Wallet](https://wallet.flow.com/) - The is the most popular Flow-native wallet, it sponsors all gas fees for users and interacts seamlessly with both Cadence and EVM dApps in the ecosystem. +[Flow Wallet](https://wallet.flow.com/) - The is the most popular Flow-native wallet, it sponsors all compute unit (gas) fees for users and interacts seamlessly with both Cadence and EVM dApps in the ecosystem. ## Ledger diff --git a/docs/protocol/network-architecture/index.md b/docs/protocol/network-architecture/index.md index 31c975b7db..e5a6b4c0f6 100644 --- a/docs/protocol/network-architecture/index.md +++ b/docs/protocol/network-architecture/index.md @@ -16,7 +16,7 @@ Flow ships what roll-ups only promise: **a full modular feature-set on a single - **Decentralized sequencing** via Consensus + Collector roles - no central bottleneck and [MEV-resistance] - **Native data availability** - Flow architecture ensures all necessary state data is available within the protocol, allowing nodes to verify state without relying on an external data availability layer - **Execution / verification split** for lightweight validators, yet one global state for atomic composability -- **Protocol-level [account abstraction]:** multi-key wallets, gas sponsorship, scoped capabilities +- **Protocol-level [account abstraction]:** multi-key wallets, compute unit (gas) sponsorship, scoped capabilities - **Dual runtimes:** [EVM equivalence] alongside Cadence, so Solidity and resource-oriented contracts live side-by-side To appreciate architecture of Flow, it's important to first understand the core challenges in building performant blockchains - and then explore how the Flow **multi-role architecture** addresses them directly. From a20b4eded314071418f6603d3a7164b9ef1ee5fa Mon Sep 17 00:00:00 2001 From: Brian Doyle Date: Wed, 12 Nov 2025 09:43:45 -0500 Subject: [PATCH 02/13] Fee graphic update pemdas --- .../Screenshot_2023-08-17_at_17.16.32.png | Bin 51336 -> 55734 bytes docs/build/cadence/basics/transactions.md | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/build/cadence/basics/_fees_images/Screenshot_2023-08-17_at_17.16.32.png b/docs/build/cadence/basics/_fees_images/Screenshot_2023-08-17_at_17.16.32.png index c5af964523217413eda610b99c0c4ec7630fe139..5bedf970dcad86a75a1e5a846979b0f99ab01795 100644 GIT binary patch literal 55734 zcmZ^K2|Uza_y1TT*`tu1Y>^3NH;62Wv4oT@Or=b+jcvw~%9>rsR+c2POd;DCMP^2_ zXNwtQWM_2_c=G-+RBvk)VWgt0D#ln%-9wH zVB(^un@_UPzgaiVeF6X&%)E_^tj&##B&_{??|J(`008+kPj~mz=1TIIyLa8)F};ck zr~HF$Qbn`2q#HOS15l4~)4XKQ&I>MRG7yh`5 zO!e<27PZ?fop~3=kIqWJozGEv4Dbu{H?(16V)8td`qA0d7T^&K7?-+cV9GEaV6YN+ zGMp){fcdUCLnRxVKMT?qFwTe-iZ@UbbOVfQo0}0A&3xXsNuZaBOS2_B4}I=Fm^p2Q zZaW{7KAdoxXEoo=+9@-)(59GhlB4YAiN01ZJ<$`=OwvXyEY>+jHzT>2V`WOlgr40x zl44;=tl{AJ!N=oat|lbd(5QOJ?Dy5U3MF@Ug701TF&IjsPM&uS@ZDFb%lo?tk9rCp z6Vr0r@v(lT%B5QHJ$I_k%<(Zk@#y%tMexCqD9a0`Pyn3Ay=shee3w479*|q+_be>| z7wGAe07iz>0492hf&Kx+dIOmMNdo|~^e0^+=`R4R^yg{%zx5l&|1M?Xdc*YJX+ZPe ziiUPZ=H~RLou@wp@;KmuZ(y8{y*>cIsONq2R^Tnm8`_?}Q02Q`z8(BwPz_5QvYHu{V@Hs`RdbR5aCf z|6%igmHfM-|Dv=HfcP8vLg|Eopnr?yzli^{@c$(Ihvlt*v((U3{ZE$vQSu*@e_ufx z?C(wIcK7cXf>d;Y|5x6B)z=079pL{M@PA43pIo{)L8o+q|1&i}r>^X~-v9s%0OrPq zH$xa!3RqiRuGJqqUNAQ^d&_#&;yv3%eqJRoIXa>E&B=sF-fJ@ow+a)ug?FCHzwvM^ zlz1a`@_L%=srP|b*?6v>X5+bil3{Q%67{KX{ddr>f`E0-CM@6h@@CWhb*E1gRpawN zeDC#5H}+AC9qbCCwV8rgmN{}w*ByUG54wE15Zz#>bJ{)f;15dCHRSj`$N(rjsS@jp899~Jcc-q-wpdfRJo z{8+}pfbiT-AyHXyU)$wzX4@{Hf^hN3t#jlZCrlV<`eU znBkrzVKZ7d{&ezzKUd2#>DBp-*gFO-mdL3$C&qM6`*n-D(Dv4X+b1D<>dnOk!P8AW z&Tl4#)oW+vJTs+(M�Ifaq-;>-UznA!JObPI2}P`~XfK@dTmyq;fH8zygGbsG7? zb3C6PVD-H*Ry-o4QSh^jrsG0=Jd>eF@Nd7Jylos1vV#2 zPbAHW!p0<#2@vh~qBf&b%rCGOju~}@V`KM=5EIY)Nx=f9V4uJ%Z)ZK`CKi&LkDmENt|hj2M(-4ta4%|sqjK%o3&D_@o1>5TScTTHDTQ9Mb;EI|flGU;6vYp-+gj^u ztQxp%+}JHAovA~@s{<1;w-;;gTj1NBCXS%ml$X_LBS+eYWo)T6ay8kx$XbVhA2PqI zv#&STxQVwzkivRQ9Algv^{;|{RY&{?^N4Av@)4=$#7mECZ`7m?xgAlmgYeDOPNJg< zYYz96U^B4Li78)e--ANbm=BMyqe`&G^v-w9#%7-_z=UoA7!) zfM6>J7}2`jzT$pUb=m(m4UcCzoMGb-bqJ3CPHV`*UJpITci%$Z}4x|5GqLG^%wV!5s+>VfKJM}g7d{&wrVqpuC%Vm~)$A5Aw z^BnKL*;VbQ5B$~Jxq5cM&*lO1KkEbf^hQzi>f@FgQ(o)>%J8@E9=84G0w=g#VzS6q zt}i;;Dp&U&JReS-iCrztutI8}HeT+n#(?z?x7yu1gUo_hj`Y;}EBRta3Zx>GernEg z?Eh*+LG<^q;1yB^xS?gOx#yLV6SCQ;;&9~Oz1C)`lxGrfgV(u)uhxI}knFUI(OGX* zYlo&xaXGpng4&*ZN$_{e`=~}x>tAP&*PZS1KUyeBnOH0@daO_F;9e;VUsG|A7K4*J z4!+e*!6wJw+muv+i$K6ve}?^j{U@X69G6g$v%>h=N7YTTDci2ko`0>dE1!_bcJ}ym zuNV2TVFLGpTii9}7-YU3S`cl*lJjKKq;jCdw4IRODlf-%gXhaPbU3cuGVhnq0TR;V z^F2wZVaQ5n{EOeL4?2pWx0zP@-+Sd>!G>%=-uU8CdwbYuCe{fiZe902{bP8!$&Wk@ zps(Z6B>w20F!XcUOCh!IwB7Y>ji14kJ8DZDtvRZf{D_@duP^ui5}4|Y-c1k4p828H zcX>@aglIaqT@%^1+Om$?i!C`CAdgq{{d;RcC#o?$`dI&JwQ0Wa`||nm>du&fja-wn z+#M$zT|*($$ky#&cP9Ja8oA|jR+m((k%6zHUHA35DoYTJ_=uJQ*n~H1I&|I%F8HuB zj(4Y_v8^{*d+Gf_pJR^k@Xdc81WOzT`(9B{i&n!lEJL5h^pkI#1r5M~+n3Oiu_7Kt zhb#A?Jr^6R8kGnW=yrRSvC6|?JMi3n(Maky@jn_DyI6LXNBefB!+rOc9NQoI z47_pv=fqOXj&=>NJiYGtCpX64P-8lz1Tn9JuVYvK@@A;??vSNMeMt&PyWJ@|w%9c( z;{~h0;m|!`-lq$;qaQ8dHIHxSHtZNT%BccB_pZ_&+V35-FBF}@_I`M%p;A@dP@}A` zQd6lKJTTgREp%hH@|_TH__6tVlcIyt_Y;lfqf9|V%1bR7X^tz~nG@ql2WRTW?eJ6B zZ3&?6w=W$m!eiZ_9hLo6-^fS%tBr2u8$~UAzjLW%m179uWP|F+-@!%WAa6!xxf-Wn zc?AJKwSe-kt68kqE|Xu|yLPGHw^ID_XJ=NWTO^}VP9>VaaKQ$9FJ3Mb{S60*d!JZ? z$pA*K#3zwTlpseF^@`sO#(Ro&J{+IST@PIO86o$a<=cLo>R8fEVwMj&Jj{G~>fM7x zq}O%z>y)%uS98bKG(>FU``^09$*+*4+d0*Q$;2w41xMk0Ea=U>wPWAa_xz=8p|Sf?AG@*)Mi9&e2t*5QctiBYAMKgjnXvwAqUa9Y?h_y!B-$J z-XkNlcN^M$n)(t@U+M0^+=_Dy-Z^2F4f>Te|4Vz^I2cVUSY}!6$Jv>OT?pU@PHd>= z^SS8=jT`DMTXsDZYZ=Voq1o(qJcmTBtnO_J`u?y}1{O$XUwngPHc0J$$9gSu?^_ML zL>Mt+eAI8s5*m^Qa7D_r+3J4CTb%&(E!)1}54ZmSN|WBnxsUDPYQ|*x$VXtWH&_G=W@2TTKQUx1T`zECSA`YRKg#qgpsR5lwR~G1V(MO0-V%mbly^E5b~<4 z5gZ=PJTcfgWCJjPtVpawpD6Q4fK1V)04W+HYv-E)kM!#7EX%nVRh49ylGkHq;w`Qz zs^>#}!iDXj+ws0d(pdB3jxKIUBvH{}{myD;67d!1dP?&HzB>s<$b_jzcCD!F`D>vb z2FdD*Ccv68%~!-My{-&|tP}5n*|@{P{SaIw(I6#&_GFYLr1VEA!=;Ll^QLzWw@ZF^ z?|f!Da&By{t~I}rdLaKwa|U~Lktwu>TfA_-=N(1H#V0ZQ@EMZil~LlGjcyI0R2;pe zk#4Tq7I@g@YGTfuck+TKR~T`n`~IABn@^7iz3+=S7h0^84uo6O$Ru~hk`lG|c=eA= zu*vIkizU(sELJ?I%>g5;SSA9&w^$RWVKzdq%>-N z#0A7Mh5BcvR2QVnh^^x%?L;vC$(Cj+1Oe1;(I!9X!bb;TBDS4a(o4M7@;TlV9EFvF4diX(& z?3>OYrbzIGJgB#%&xtO>+>ShL{o2F5!bdAV#0&36(q@aa^@eH>cP8iOg{F^o8Yk7h z75XwhT=Yyd{58p+8ZB@r%`TCRO3#(MoZM%SBx z<3#*C!%g9R(ydwAW8)WMEibm+DN&SgZS^f`(HAY-D+sSjuuv~c6f1QOF_6v^JAdCb zhr`_t+WY;Sc&8$Ib#F{!^n;!2FbGSdo~a=^hNnI^)q}NhQtQBFz;GGFxWk<@_g|H* zDtD9LXnLm>eQ2QF)J3J(i`U%2HgpQf$_~!ShjuB8nMQuBjBIo9%G9VI&$du+1EKVC zx>=ry1r@&EMAT?^t*`zO91M2S9k+FAPRLT-8NXesp6#KqSfVKUvkf?&Di(w*`8nd? zkrv@2ha|U(kDIW%jK5V9&reL<)h6yzOwFfrwyLZcbpGfFvIsq zvg+P3_CUXFw;qWLO5A}iF*zIQ7)VXaxv zVUg3ym6Tp{BZ`)iW!111*6#<@%KdluN}uQNrApgLFO8U>(Q?a(1fyW~VXmcN7V)Bx z!8yTIsTx?A*3S{;iI4tFdn#^d@Q=4w8O8jLbWlL7Im^WZ|il!DEnPb)Zf<;L+( z_vgb9K00?Nb-gvoXr|s5yS*{xtYG9~M=XoiQmZ&{nSm1}MSWTx?X2#l!PW1Vnynm0 z?c`$8g8YPVYb{A`_$M*A69q0rGmO{(g~`mS1ck?4Qd)t8x>HebcZRkJasrq+l$oC?j-sG}jCLd1h@_ixQQ%(K_!Ku9#?)zRE_M?}+cF<6 z&kvaRa_1QcN*R^cm8Wbl-F0mGCWg;T2T{t_W7clowNOQ^k|lk*mjyyy9(6`>kODG= z7MYw@q>S1;o~_6GD;yWf36I%v;20Wm-1k7yqskFWrIoil_Gc1fMOPkq%zLJBV?Bh^ zr^XzI&411RXjCY)kn0}!vdPMQ8n~m@uyIkmEaU=v*2~}e75Z*GY&Y1VJeVcAVdojN zLNE+}TJsG8*)$Vk#k6JgDP03GS_ejANp{~~pjCF>3i9dhCD2}9mKUqPrh)_3VFc#M zBMvKy4tpEAKSy9c%M^LI!N#JY_v~FG;>P!1DVd_b(2P}c@t8#74^q{Ng`7TD&Uj%u^S>lBRFC0 zz&bs$`U?c^qciR6m4o$CM%#5i(H57P*780*R83{oW|;vTUA`24^x5f{4v93AGz7*o zz@YKd{SK2p5OKYo5?H?>>t7>7`{NI(s*mExc;7ffRa>mSD#w=y>$54IpO>TggT~)6 z#SNAv--3%!)AUH!L%$ZHvwawpjR2F*QTxo92-Ln6WcgCdC{Go28N@J8jVDbo)fI2rMgLqb0$up-o9*sym^^c7MRW zrHmUqTDsJ~i%8($-^;uOT=Q%olnRleY1dMGmcRyi{GoL0qWM}i%|8gTmq;HE*L85&IB z0ueacVCXb$>>D>mC}aGzzV_HNW}0T~x*TWz{k$25d%*ea*;2y>ereF~+3{2moMfL; zHPIQGqWhZjz?+F)~rX`R)Lag0T5v_k$M|7xM*ir{7T|UlF!dzseeleNyPjiI)7s9BKxg6LDp!=KAri z#8PUnTm+gRu=y-yOkC^x_h+UJL7mk;nM7kQ5KOYmF+p5^SP=+n1SmyXz6D$9J;{t@ zP_F^!yNbJ|_VLbP9JO$NU@a|%!$#@5Fg49UJ{2!YkTa%&a@x~=+RHJbv!>PYXeQ0K zC;+P{S0+fdbOx1UW`^b+P;h)=H!mus(kpvx`0U~Z6WoGC$s-%c;zC%evS|%aYXi|@ zKR-$8gP8hjIgCb*ZPnSlC@pWOaHbW!QU246L^2iujH4AR*xcDM9RjKRV2O0kVc-Zv zpMl^x%Cxak&Y-Qe3lk=&^jO4Zg+bR1#VG!+ZqTRY)CY+_%h)lmIPnf!Bmt-B`7gKE zS0#;F(mJYF-g58d$a}g;;Jeo#5TiQktuuU-g?%KcBBo!_vf1B7`kr{q#Pi7Ur}Gf6 z?2>s!*1}khOz7ppW$WA$3gPhG4#$E{&(ZQ2aPFhUqpCWV^xTl?nXMskqt4^~%8La$ z6`ral7u9pj9t_%73>W=HKQF7+;^er_oy_v%^eNPTg!R#xed;z2DR=X+E4Rve0IJpx zL+lf5#4i_m-=bp|n+CZIsZ6Lb{?tt50YLV0l%1T@x*I&XFr^B8Hb~5j8nBlT!R#eC zeAu)bJ#{kdb%Zc96UcBb(D*}%QVSXIMeJmlyQJ1Qx~S0w8DABZ;d`G&&0AG!f7Rz} zc>!;~d@x9MqgC8@boWYxB31*bSQDst1jzdju9iby~#rotE_=o-W&1jp_tE! zij1P1{R<1u1jzTfyQ@0ggwXQkY+8Ubmu= zC46-zN>R-Dtu8g(`cJ(=c&V@8*&)=}_tFt~<%5tyl4e*$l3PS=S7?$xRS&@Tty5HR>Cu+73UmJ;?vZ|>mv8q9|izNq7aIx&A!*ys24W>4AzcEO*%L+z1#U~FtNa&8*=?({e5{?LcIYo!I8oaRS z?;?&F4p&8ETfa?j7VeHM43waGi}+Z)F;QK3QpidI z{H`tQ(Cr?*^)hxnS_wio*fVDVKp}<;TgIqrZ)u+zLlzfNnOM%nN|(ZU&ui70;PGu5 zuDwrcA2_cO%%5;M5=3{5EG?zA^bgfWue z%P;mp)Xq1{o!MHuC`8q8=vDl@(D<3&ioT+Wr!Ev$tn9psGImj32$z0MAN=_1S;gq^ z?ScvO@nuiDAS4^NZ7Wi;uuot0p@qYB@v%)%s*SLh1?qjGRu>l~m87}5(V0{6tznlF z=vqD?Kq!URZ-%K6qddf+2cOZK^@IA6F31YEN zIg>$r)k^9gDD7Z^Q>DCSNm1J4sg@yiE@L;V5)A!soI4Pe7&nqT9h3^6G0kAv$OMZU zm1TLZwtqK)b?ztE(V^Vyzv20NV|H{rJ$u}f8=plQEC6|=TONGi1Rb4a4|+?NJn*mN z7cK;GxP}^V5Eg5|2j3op=GS+!6^}grBDJycpnI&SIrM?}Ta8JdPxOa$e?NV>Kjx4S zVC^3yVlB{}vnvt`x@m%$%T`KJRW2MY>v zmd6!fi31*uhT#V1f%mh&_vvG@*)MIX9p(lK9!o$l_H`QwNy(ZaaG~a0pl4I^7FGw_ z?;FCKuD1kOZOGUP6S7cXSF6#eK5vWaQ+U(4o1vSl=kL|5FO#xMh}+1rBLjyB%~*cL z`N0_xEnND1{-eS9o7y4>SDDI?;uK7_+j=6~)7@*r(hISsH#RhqLr5_JHpAV((h`!x zg1m%WR05JUfYFI8@$r;n*^-@lr_ou0Y`-jujz*}eGA5+Y$~&P8NhSGFG8D1WVs=6M zJbAksb$R8iwy6hpD2Q5vTQenXnLYSit;G$By>PuWc4Pn0SxL0pS?-eieCW~(B`cE98F{>mqC^YSGm z@d^ltqH?RxMz_Nn%t6I%XM5?WAE7KadPLQahuSY;{=xTkaEoP&PlC%vOV7$i_mIH! zfZ|Trb5X?B!1u`5HGF%d9Qh2Zcg3mHPKL`|g_!IpR=Cf;VJ;HDIFA&K&I_!_7BNlR zl7B=NNI^!``kxmfbWh1 zHBi?5_$ExBcgx{y&*9Cb`+Erpf#{-%m#ryos}$%pmIU3c+SzTHO7*v_eKir^zJb@4 zzZ;wQi%2eJ6D!W+V4o~CRQe*u#7O?@+ggq-q{JPA1j(ZEN7wzER1xn#;>wbn+Nxbv zY1my}^~ps$fq)Y=l_D2lUAGckbj5+XZaaJ5%1;VaE8ut2&n)c1G#y>LOvNG->}g8p zLU7PvcERC}&Ao5$DDy#Da>ss>PjA6**pyEq4c@Y5$Xtq*1c;F!3hX~Rd>JRs3r9cL zl8JgR-C#@xgk4k@j2GP%iW$ROn5=BfZZ?k#4@TIv?tr{d=G7 zs-1q6m5&*I(xHeZA~D}Ht$$dfO{(p(8GU|0T{hQEo(|SQVE3InVgP-GDV%07@5rN< zW`3a*m9Tb_Erc|XlHpFpc(puM{R5FH(Ij#2V-&!s_5P0R$Rj2(#JNp@(6Lzfw3;*` zvzl#bcvOXDF(_0iT8$rYOYBESPn5FdGiK`gRy9v65Y`0 zQp9#-xEwqvb4A-n*_hII?!~VHeLWX;Y^~ykmfgQimT*YUb~F(?-w}KqfR`zm8iJtkF->k1HMy!N@n#shVSENSK zWBu z_@{ph@rV9+uLj(fClNVgK&P0oA8K#ubY*DHh ze+j*R7 zxwV_$b!7viBla-r&Q^rP`2a?sTlj`f8p-o`&bd6|6^ghK+GjP$8nm#lxu|AFNl;L8 zBpJN{Ye#8dHfQEWcD4vLa?x7cx@j-n1x2IYkWxEP$Q(XfRN_rN_{N2J zE;n5Ke79pJ9axAJ-?ker`X6xZu<}60J!!YIW-GBK4*AIT5 z_ZbKpb-BM6sVxttrma>@#<`vP2iwtPqMPz)LK(x2m?@WR{NrrbFz@nXj>C5vZCEZ4 zm2mKfiRHRHS7wAkscTFyn|#P&wO5_wrSn=@@#EYLQLO70%^03a+<*oIVE$X1U=Mp6kphjA16(3OU}R!a;CZmlc}2v!IDR8MCZDpn4H?24MzdDbkl0&D z7Ng8_np#HOpl4$93F7UYGoEE4HFAM*`jn=#oko58{Y}2*yG96X_DYCT$euQM!vee^ zFVIwcHzR-!AV`tUWQ6E}PMMiYKGmW|sRQa*p+qK}uABQ{49H9G$ytNpw6L^;a0I=l z*wEA@=S5EK1tV zK`?PSRnqk2GuFlGr#@ddp(9$|5BS8OWH>flO#STwyOSl740QSF{V9d*aHR*jpAjKl zQxn?z$Y+aXB$&WH+z zPE>X1#AW+A=|(V@{sH*_z*htId^1cKeM~S>={e)@y&?lNpUNt9rku9r&XbHg*Lgzo zvj%>-K_>;ppclo#xizL7t*{cRh5L->J}MMAG*hN*a9dNJxnO!uJ7V?yaqRP{6lsKb zc}O}R8kfL1wO|^=EAbWBRW$2YS)0Czin9S^(QKWU_=qXN7y38UOKTcFB#G!oPJNB> zz)Q1s!A+W!GC|j2o@;5(yRXs$BT;AOYSS^3cL-eQxq+-n*$#mJ_FaW|K=-S zS-hQvnuvn-@!{QoV{sYG6AN;GC}p~e_ov(Y?A4Ak1;At5qnX4RGmsZ}exL|PKaLS) zzwKg0X?>gg85Fr(L2lYZx8ZUwTX^W;K+dz9SAYaNiIJKg9Logmx zS^dP>V?OwpM2I}Nf|e@ZEb^pqj{H# zk5BXTseHi-g^?v{z|NHQJ&Z}JbkoW2#l7i8E1HN*v>K(Z2=a~TMuN4!OruhLnrsOgUa$Uh` z&>_A4pOFnhvOAs9?StK~hzT2s>yWyc{p)*)%}&)ShUwrC9td_;+O1F0fqL}%Dp-rW z!=HCx&JsG}$Axulb--lJ-;K%XEJ?bN#F|H$M=1CXf6GR#bVM35zqt^-cXHwq*L!C9 z@Jrn77z>zW)E(v$#(-fv$L7jtOEI3aymFk00n&X-857gqtASu+`P2ZvPt zB#4BDyCw(Vt;UDx3;DZwhHnXJKmhw#0p`_Axz@I&<#=>ry3G<8+e$Uj~tfc_bIx5-sJKmOU_zG09h*~rk>?tG%{8M_CLMkR z<=~UXZc$GP#z>K4)*XUAap*#^*re~VvVw(jEn-Qha@e;dx!)*SYBOVG67wcTr{t#lh)_pc59AlsD106oN#I9lg+OdEx*AMQ59QE>K0 zvs*bTo|HE$tiI7_S-inx&n`=RNbVTqMv;Y5OF##@1RZN5AuYN|c8jTY_XO}MEBYmx zc}J2&P<$sVC|~tZdL3a_RFYCYEVlBnUMSQ?VJF?^&+`$w>Rc2MU7fDvkE zotxZ0x@|0UAv%KUtms;l1COK%dh8E$3zUv!vWr$ogM|oZtG#`2v0fI4V&@)idi4Fm zr11WART&p}MQ>+E(?sbPasfk-WP}G9HV`|kjQg-VPkGy1l?lqM{8DgXnZ*En!_^99 zp^k_ou3)%BT$!|@`3yfr!kZ(hZXPE9MRxWPY~nOX`K_BazBH!68^$AG^PG5(8)>p=h;iJv$jWvi3Sz zeXe`oM0VG0VP3Xm&`9=C#v3+sMtW3tO2IVA+RA5&ffNl zO9c(OXAGp98L89Cgu&$=$E0|qn|G1zMr67pZ)pIix)d6?dQgdhkb{mevG0q2Hj}Rt`22x6jb)4)7uT3bEy@B5*OSU zrKxYN;MhGjLl!NzA91F+nuiiExv_g^jL-&|-&kpWsuFlH{y4`Urg!TvPreLgd~?Dn znxA;K!X-0{`)ArVR7y7bE_SYgRi79t@lwxBD=z4UwJzA75?j4OQ{T&1kj1`|)x+tl zO8FQ}3qW@vOZ3&K>A8a0A4{FRovhyGBCby?g87 ztI=L9BvXnujII?Ko}Hv2Y;sW#f(xi)bBQI?&)wMpk_fb8L5Pc(UTvnt8%x0Wre?6j zMMp{YYXnvdf6gxY5{}`?6`}V^_6Dbq2V+z8NV;!MP(z=@=M!gINj;Os4yd-O2GdY6 z6mjY)6|D}E#P1{w?d`Es$A-PGq6lxf;~ld;fHzY4;>%T6i;LiRoTDQWlSzqonHyPd zO#DQ$pdo91?;qVfSlB-*Ps(rK=``x@8ooax+A#jE1WJudL%vE$0fF#;l&6Yg=C`$K zDt@99b(wCQOV(M_ypxOlMwfN!Z2NEc%fs34%g~PBCweov1use9p|>J?IH40nq2B0f zEqQ?*imiYli!SGHRac@7E1pS)#VT58>GIfhF42wDUbGs6Z%8JCDqX@T)=y)b4VtFO zw{*>TilooiS`U_^L2T7V(fmDJ}0DXZxRK(5W*T>o15;utN~p z`{gPA6tK(Ia}mV1fu4$WZH56B@)mO8>d|W)Y-&kwd+b>t;z_cz54Y}iiPuaPO-y)o z#a3YU$Eg2r;$WN`s&;hkTuL3$sLngRn5q?4?94cY!D!4sRcv%98H z8CFbZ{E3}mho6$zV)iT|MJvl?eRA@=0}fgC+dU@WKw=guW#MuF3e_2RH%boZicg}+ zPbkfC=`TH6@k00uo#lC-h`$q}XbjLsf5BTZfeANElNi6GZtGG*>s#t3l%p^MOim=^ z)YlzZ15dc%IdNVu6GC-Jt*B=@a7iM%>w#K#u0gQe;pd6ffUClYq^yw-tBl>mAjnY6 zT~a(NMZG^3C{|}tZI^F;HUUmLEM*f~xr)Kb`rC~5*q;+^PB4cj-+0jq+-kB)ojdnN zscj)q^Ri(^@0df^^|n!8s!-d2COy0=?(^oxfZQw6^PjSIt6L4Pv;MAh`n3gzz0SMX zbQ##udS9d5{Zese)8EjLkxEyHMXa*#Q)d>CjmXLbXC`Lf&|Y1aTZqc>Rm}QPYMIs1 zByyfqg@gdUZ2tRs&V-+ zJYu-~1{_!9QJms&gRJYGt%O=gxg{sO)DH9SBt%zw;0^$p!@&dZSmQcng!3&Nbh9dY zR8AN;B=EUl=FMAk${O?`g8=gM1M`zs^m6F|MW*EzNGa_X)% zPV?2~fe=$9QVyS4Z~Yc#aW+pSm@Gl$pVNIFFB9a1?~>jV6FnW}DIPe}ZMbhJ2qtoY!XzUNn)Y&SAc-Agy@m0zk0|#wR&v?7tE1 zM-BbTFMIX#CojH;q%&e9&x;%UE$iG{4;-=CMHoret}pa(WB(*hl1D*|Qm;FKxHoBol2YXrKJ|5uF=*B5tbA-cvf($)$ zI#2UPq3$?r?5$_kt=!fp6dBm4WpKm6CyhdANY9;Vj{x490qJ`l30n3XM2&!R zfMVZludWPn_*Lo#Ux#fzSt3$T(TYmxXnOCJtqokB-Sz88S?v~Yo(Aq*Z|Z|JF%6C3 z-Zgmgr30x#=UEACX4_hZtS&AV^v#r$Hon=Jl3@rp#2K#iIp>1-YqGoA+Y8^@9VD=e z@yjXYW)t~&6`MO}0yx2Vx>8Rf?&{BL!OPq9_J&AitB)xe`X0L|cwT2;-HR5lu_*CL z(LBQa+V>c494`k()^x8gLRfK$d~LyKnibM@l>=$R=sEWCs0~=uZd-+m?JGD4 z*m`4JcR?&r59^5K)-BRl#6~)gUmWK_XGQvS=G=Vuv&UThdq3BW!L?VvHE0SG%wHHE zUn|=|57nR7>RLp+PxjPlDWEAt{~VL;B0x4wS40p+^u1;9JYt&-@;;NVS`QyV@>n60 zG#VU3<3h8*E_S`h7R6C30g&HbYo=F#PRo~`InS&3Msb%Vtq+#S`N%sDbc{tufx$t# zZKRQYcRw*hF#z!KP#TvzS9pZ| zEkH_CYd*I%JX(9N%ZfSqcH66n;WI^=L>FG)M&8k5kzL-&uuo-l7p1;j?~>r^cU^OB zT!*Pc<$U^VoKOA@v!XD31TJ-cPUqB2HH+$&dH!X0jX&4@Ucv=#i*9u4$R`Z7XPN8j zr+uip32Wt~yS|-U9x)1cuCL;<8`;36kFKx!@g>_lx@f@{E0g}C`+i~Q_p^E$S}qnf zmDI88p#@q2@94o0;vZZ`Uq4jG!vl2oNEy(v+PfENini`Zw1sCiine66-@7N*^cN&O zYIjid`1I`Vu5GS}9_)E5=cIp9TG4>OYBMgs;U$oJ`pH-B^IF{JnuSRNn<`inwxkL@ zv5+`{4)z1h4zwfNm-nl~imvtcsM^?S|8h;4`Hs>RbC#CkY6sXH`}k?}OH^EiXvNQN z>jVpbvDPdSnF-JI`G+DP)W@*-6^W^k9+xouv$`*qbWoq4HDtPCw=#2Q)w-zRL}@i= z=R|c;(5Tf8xn_BIlZ2n=ck1E`0N~v!6BtCXCPGUR<6EINsIo*6-H*iXTNS&=vGb9{ zedNTmw!uzy#WHSq*GG5KhvD*pMqi5|*90~SvdMBynRgo(o4pCg!>Ij(WfrS)`g`%c z1v-r$rG50Y|08B?F}AG-p!v818yWP#HTf z1PqrNqOQ{hU%tuJyq>`_9;EU+a25~!4xUG-aIpd=zVf*0kipWGTcX|(Zx5?`Pyg0x2-zbqX?I5$9kJ?D4Fd+F$e+E3 zRsxFl^AY=#_=bo>+Li5ae+vCd*M!jh{Iuh8dq>LeJ%Tv#*Vb1xbYkeyUSH&&(G}3{ z?*MhWZ)MUmMK8$(c%_Z}&ows34<=y;N4c=$!`(?@S7M&Mv`KQU%kD%kOtdZFkN2A) zgNueN*SKXn@7GQT_d0&aVPJT!Y5mnRbvNdcdY8cak}5&XQS^nv6*%-!-T*X5KU91TC#3#SHNs-@0_XJQs8q-Qrl-!{DPFb zGmyQ`y##lavB+iftIpmt5v#3cGlP`^s4&z+=8Z*^eGtN z6Tjn%-Cj0(Jv;p<&dqt`65Dyv<>#c!eu1oQ_2FPQ{Z<+s$XN#~xY5HLrKk%u*i3n5 zIgIa@eC2@x_l2QsdK?a-+uq@Z$cWt0ZQj0~&~UOscSz^_0%9(o98OphQxK<37c<=z zpwKesih@Uv={HMbMy|Fl7aBJ3F}!D9Vdg)9;YkK?i}^$_!lxoOtF4k*HY!_ zFh4YIeY@>33K0G|X(3()5DWy#0bb^o*eIeLj#MjcTESeFqPka|?Z_vG^8>yE{}E zu9z88XZgC527C9L`&?bgws60;->olC;xE>BemgsQHgn=i_^%&JzY+ACWCc5$MaREE z;m1hQWi&m+tfzs+0(;#mrkO+tAHVgO zHJ{np3&^OlLTF)jCK#bOJDGUW+mup4%(}Ybdfczi=NZ17v|v1Yq}DWFAIl@>$#M$FouD>`aOT;dk`7h0+=sQbNc>e1zwg zm~Mqa%5%MSqq_TDTaux^Mu$p5$*aUz@kw)f_y@XatL2e^f8Lf5G&0w}fb;bfUT~q% z4b;bCCGv2R3y++8ZG4sjEpC&-%Wel?BM)4=;BR}j7i!et=oGv{eMWxBQ}K4W^lg<6 z=}26`gpqKCUEX!P-=1ATU*dsjA??&uwf{|;Rab*&N%^QUva_P$lU|AOd{Jb?d^{7u zI)f!s%KB``rUa*!0g@HLc;IS9M>zYR0}VLHna-l4e%63<>ly2x_WZU3@t*H184x7bLOdt&8;_-*B;m8rZV!(J1j zcRnJiec(HTkwzm3L6gV9om;&sF1k?-kXKN+Y|2Eibz=Uh8;r6ya{6U>M^OeREPwW6Ygtf2&--?Q5`VaYw9J7^eCQ@l*?yn0ROH)r}%hTTe(y!T+M^EFYSF zzdlY0@>N1nQIJqdNomPpA}t^wQqnmZ28=NjY3Xj1Qt2AKfpnL2jP4O*4A{nY@Au&T z5BA`5on6;C@7L=<&m`9Wk-xjF2C!C!M3H{uq7sLad|QC5R?jc!TI4kAnYZ2!A1xw} znY7{;BR##tS4v{DGo0)C!Zn-a+WcEzpzSaPKabn5MAArdUOeHW`j3pUkx% z4obX#74-QY_ZKk=Zn@EDUjyvQJ%4X$$7Aecl^6Gr32|oKh0pKCkw>^4asEyM?5Dht z*a4313s!&Sl}??Jnxh_b|IxUZ(f@Y=aItzS3k>MD5Si1{bo%kFb!@6-&lw53JL5ChmRFNH9US!j<_D!Z#-^% zYjIMlRim0A-+cpdU6CC)TTO!b`)r9dSXk>H1&+D4uD)fTEx{oKFN~{PESF)P#LCfv zbT#+}HNT?SD7n1SBWN7%rXj*26t;xS?Q1wHBM$@?uU;DZM^y`!)PyS+Do@Gv@g>0gX4!hr?m6XAjb*j^`DFBA5TWdXVD!_hdB*b zbFR&{HN*ZROAzB+&L`TK=)7E~tk`nXZJlllbfsF>+S6{G9R8sD!ufFyVgNMi~a1SEI|~hoQ>;~VwbV`g?b*OimxQ$#K3h(7T^o*AxU3| zMF7Bj`aEf#*Elx*0^`+UfJ)u}G0vH1KkwHanq~{`h3~(*>GDG(>Y7oPQ%#_5PtjizhPZiZ&0+#Q%}Ob8DupS3N`t6>J$=OZDy@r$vu4Fu>z3Zc{tUg@C!9pRm0$zog?t#o;E`AU>( zJF#s38}K^2GG{$KXCYzh<$A$~nY)#IBQi6&^LMT;VEW-)e#`v8C}3LIJWoqmM5@CW zcf-Jc*H2fNs_qT)J^Nz-d00p7_wNn+Ike9!a{Y1CrTP znf?AnZz zhmoRpL?=BQrT0^=DN+perTTX%U~6nh!QL_vr??jgeINEXy_iXnxw26HKu~}I07dvz znE7wU0VfL8rvCU?fBg)ZepV3|BQxJOZBc>{F(b4txeo$RO_#2=cP+*NzK^u#;~haI z9le6wVrKOQ$}7>mO$UFJj+0wxMhnVzB%e;0B@~dfls1#~(P#Mz9N)_=a1&{UU8a?T zshlDoZwZvTthxU$x6}GHCBMhDI&=beZ$2z_8z+ZrP`=Z>b&~UtB>Ux2;hq>3V zG`3qTX#9UX$^4;e>(8R{D7Bi|ugy^wH5X&N|0%3#0I)aEX}rfit8pW>7?w-{28!TF z@S#=Z;^|%N-jaC=^3IyI74jE9gU8>btHym}|1Ub`8pKFh>|GE1Mdak*XC}0VLAIby zQGW_f-SgqKp1UPzRzzGB9f!?{2`*OO;!me*ayZ?kvY;8bulxD9(B;$3&iw*`m#Myg zP-|YLh}R5^)?B7844pSG-yUuPmW3(cL`)@_OC5h|5C}|2E6@Dq3&jTrRsJ<5y zrRp3e35tjfcK=JAYO3eNZ78v~SSQCt0E$|I?cQUNchNxNLCu~^ihA1%I%Un&69%R+ zFhH$$1BT+*Bx|b=f7lY+po9&0Wj<`Xts;r#l?LrLwwAQ~rZ~pVd|R8zxklhF@YEO2 z`K8SQ7%19TRfH-%F7+KK4s7wGAZScZ^Xi1qGL;7xRrJ5jO=l+8T#IU*z%>^0R{s%a z)BmX~=Fj2hZHgUhqOTkmH1!|lJhNQ+v_xh4?*^va4N}_F8PdXf6fo2B-Fh*0>P7{z zNV63;RS8SdmVc^a6Fq8EUhL4c??KL_Z_Z#nLE4ye1j(#qn1>12K!D3Qn?L;D7u_z> z{G1!uw3KS+eCBxL`s4Rc7?N++-HJ$ZV#v>S{w#X(>%84K#Gy{eZ0=mDQ&g`-F*tbJOUGD6aNy0e!q!W_W1n$= zXg%PHczZv~u%`YjbRo=Iz{Qb0X0ERX*!YI{6>_>DFkkb6gG4jdy9-HRN^mPdZ>*=8 zZv0058w?B18kh)W+PS+L9)zYafU}C3CmQV~Tup%BF3zG{R+F4ruFl2bPwSi8QPw+U zUZb#8_F`6=hacw*TYf^VVrCd?lm%w>xk^V@UO1&4v0^9-D<7Qy*U~ql!9*!qFUy6! z2VVc-20NpxoTNz}NU~a^6uWLg6s1?}7i9E%-wz1f;GQ#Fe5fP_W8t_=e5gp~2Iu=h z6Xz*5JUSkOh_#a|y#WO*_l9-Z9JH~3Mh7l9tS)O_@NZmIe8e|M9j=kYxY=*P6lFb< z9eb4O_b}RxlQOw`>g@V^-LMh^+Z4HgU;#MY-(zlq3KjgfVqja^0?Y*HppnK;e(-{>wFkDeD*fR3cP_wk7(;sIoymbp@7f=jFT;)V)e`Z#)FRt~Lki)q-(wk&Dlm#gjF`jO?b1M!FV`){^@ERiv}qkHm=8Be%S-U=J*ZE$-!|<)W>qCNqbFSFu5%N zJj~w-m0bh|bh0nU8(mm9tSn}%8h89(ZDohM zB3WV-I2RKX&;IF0^UntKaG|UdXI=kNm~TNt%W6mDVbh;>LB%RAfR>$~(P%S17$Am2 zK?bS&X=!2ffA?)V_qF9Y-K&M z!^U0}T1~z+OFq^C?EPO12t{hvwO29DuTNBsHym#CKJO5!zi|~v_xZqm!6sVk;ET5g zIL`=`6!Z%Znj5`H6B~JhHfc7DChBL$k0Rg=&0AHwcysv9zVA%l!K3JhC>lR79QW_^ zA3yZNLnjt2hQml$-p(RsTkw;g<%CMkff{2T8Q<|F#@whD5(t_o_6^{~IkmtWYIgCj zP(_TH;?{3{ZY$4?E=Lm7rBnEV1yuy%RgEcT_BCcsZS>KC0`AWnMO$Lyo#SQH1EDDm9QYc~o~Cj8e4pj(S=)WUbGVphtY1 zZg*wr7A{KxR9(pcMJF7P0YmMf)8PRjm}nEb%&_-^1~5 z1bNQ-Zbs)@{1%g2cWY zGuY-KIce1P-_GVbSqbK1?oZmcAY}@G7n`U)!mm(n4KuA<(mAjlQ~%ABo}6Q9#^>$6 zOFl*!j+`Ct6ngwzb(hv$_>Y67XLC^_|0%dVmB-Fni@2>jJMhGr8e*QXcc*M@GGy3C3{L~Pyb1J%34vy&A%WAF1t zYaP5+UM*U1Wg9@cJm9j(l-fwwBc@Av4_HuHucs9?T-?+?n$-TL^aK~Mvl|XP9(x2k zY}akd<;vf8z04XusvX15L&R!(7BF{`T#jw=lQBl~6Vj>kmX*r9V%m1pyX2Syya1pW zCx&m(mU~)y>=FzkxGM+EpirA)3!T36PQ9s9*A6%XcRFOSOH<{pW&(TmE>tU=)dDW4 zvuW2|=tEnT9scy4$_Dr3rIw2h?RKuqbfNkeP19ZswfBZ$Idq2+>Ka_OZ`VU+ug*43 z6)o3j7J%!KS|@&Hi)2Zhf2dP`#3l@-y)c)az;0_iSLk+@Ga&a=apgM|%BaFquA8RY z_whDfy@rpoxvS$AlKFDg)K}W^{c_EFoJ#QrRy@7`<#BWNVEDxz&*-^a!o%Lgyu_f5 zr$;s2)A!A-bRQdv__N3?Ba|_(%CEb|1_)v~4z%9<{E6F$M z!bC~3y_PCOte*+A)i(1xX93lS05z9&A^{Qwl5Q}=MSr2{_o6~9`@6Xialf8dk~SkQ}*ko(A-73yw9JLw_Fr_ zqY72PD0?nt+<4r)koieev9Zdt73jZTx;gxe-xD-FDcZ>WrC($Rp#QKMwQalfeWo!m z89%fAOpI|0E#+7y>ntZF4C}QrFriHctL)gWp}5Wa`>%$xdc7H3tLSf zOp`Ffd->$a?{OaEBYsAyV5LJM<*hy6`;u^5!%u8?G!$tSXo(XmF=p>VL~y|gx8Fy! zbF}D^UvdS)>B@IrJ&ZSqb7P8KWntls@A7Yv>6lS(*?9iaiDz3*hf=dc)k5XF1h08) zd36-Ss1Dm5>!DkO>+xfufr=Tc$}o;pSP`F9eoEzLZR%`&198fabT)jx=u~SzGLWB@ zK~z;n-&$BrQLwepF+GofoOX$Agg+E$g*UUmFlDA5BKznB6!4(!S$!R4+q|oZZI{|5 z3t$Oh<&MG;)Am9QCip0rT&az)g9N^{@HpRB>>?%rK(cqYMa7V32(H4C^=juU;eZnG zt4j_*`Rx>eUm&di6&%16G1;5drx--xx3ue(&X))Ib(#mU%cs(?<%@COEf8sDYdFtd zmD9fv)oQy>VK$H!%*CC}#k*Xs1nOAa6M4%sT`zlZPOGq!AA(lttcSS|ocgX7BDbds z!tu(kh|5D`-zi(8`Cn4~7f7zWT+XUrxVdvjMn%X963X?YHYO_khpI@KYb3fI!*GtY z39-Y}B9z>Hh~aWq`16Jt#CeR2D`qxu=@hbsdc;aN`C1kY;nxV~2>8hPxk`u>tZis| zv1*<8Gw5=F6=B7GxZIpsc=TaJ%}<<4xr$wY0sX4°H2;Fbe^YGrYLLNnkY)woL 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%0D>0AW+h9aa;IAz)w>f@3^ zqb6P)qK}?~lrL4x1c5#?^pcl)$;lVAR~!>zd9bYW=FwnI7mv!cB#VoKTmdkQV`1n6 z{E*3*(P<4-6?Q~~9_EG(r>c-ojt`4*TJ1teD^i@RE)j4G`N>F#$3!yB$+e86FY@38+g8a<=QRK1t_j}9Z#tsi>s*=o zQS6ikO;c>c9Cpce9GI~l#nds4DoX6XKgX`ne(>IHr0kslT_1EVbH$X_jWbBSTa%HTZQvCSE9 zKrI?29x7d&2Aa1*j%W&#(~yY5v+eYD!=JSo-c9-U+P2e7>K(RIzJ*+cyiDb^UO6>i zL}vQ=Zl7fLvZT|ngx&D#E6{oEjmMG#-x-P3o@9)cP

``vo?ul-xqKfDNg65)E` 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 diff --git a/docs/build/cadence/basics/transactions.md b/docs/build/cadence/basics/transactions.md index 284f04c058..b4202a3687 100644 --- a/docs/build/cadence/basics/transactions.md +++ b/docs/build/cadence/basics/transactions.md @@ -189,8 +189,8 @@ In the dominant Proof-of-Stake (PoS) environment, which includes most chains exc | Chain | Preliminary | Soft finality | Hard finality | | -------- | ----------- | ------------- | ------------- | -| Solana | 100ms | n/a | ~30s | -| Ethereum | 15s | n/a | ~15m | +| Solana | 100ms | n/a | ~13s | +| Ethereum | 15s | n/a | ~13m | | Flow | bypass | 4s | ~10s | #### Flow From efa8d4c5215f81710050197548c67a2015b2c85d Mon Sep 17 00:00:00 2001 From: Brian Doyle Date: Wed, 12 Nov 2025 09:47:02 -0500 Subject: [PATCH 03/13] Add link to surge fee flip --- docs/build/cadence/basics/fees.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/build/cadence/basics/fees.md b/docs/build/cadence/basics/fees.md index 049daa9f65..5a5e5cf0e2 100644 --- a/docs/build/cadence/basics/fees.md +++ b/docs/build/cadence/basics/fees.md @@ -84,9 +84,9 @@ Right now, the inclusion effort is always 1.0 and the inclusion effort cost is f **Surge Factor** -In the future, a network surge will be applied when the network is busy due to an increased influx of transactions required to be processed or a decrease in the ability to process transactions. Right now, the network surge is fixed to `1.0`. +A network surge factor is applied when the network is busy due to an increased influx of transactions required to be processed or a decrease in the ability to process transactions. -Currently, both the inclusion fee and surge factor don't represent any significant Flow fees. Keep in mind this can change in the future. +See [FLIP 336](https://github.com/onflow/flips/blob/main/governance/20250727-dynamic-transaction-fees.md) for details on this calculation. **Estimating transaction costs** From 244d4bab25c4d4999eb76bcc28cd42dbda3be1ee Mon Sep 17 00:00:00 2001 From: Brian Doyle Date: Tue, 18 Nov 2025 08:58:50 -0500 Subject: [PATCH 04/13] Update docs/blockchain-development-tutorials/cadence/getting-started/production-deployment.md Co-authored-by: Vishal <1117327+vishalchangrani@users.noreply.github.com> --- .../cadence/getting-started/production-deployment.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/blockchain-development-tutorials/cadence/getting-started/production-deployment.md b/docs/blockchain-development-tutorials/cadence/getting-started/production-deployment.md index 895cdea14b..d1f7f66c5a 100644 --- a/docs/blockchain-development-tutorials/cadence/getting-started/production-deployment.md +++ b/docs/blockchain-development-tutorials/cadence/getting-started/production-deployment.md @@ -237,7 +237,7 @@ Visit `http://localhost:3000` and you will see: 1. **Counter value**: Displays the current count from your testnet contract. 2. **Connect Wallet**: You can now connect with various Flow wallets (not just Dev Wallet). 3. **Increment functionality**: Transactions are sent to the live testnet. -4. **Real transaction costs**: Small amounts of testnet Flow are used for compute units, the Flow Cadence equivalence of gas. +4. **Real transaction costs**: Small amounts of testnet Flow are used to pay for compute units, the Flow Cadence equivalence of gas. **Important**: When you connect your wallet, make sure to: From 068db4724a8ca85a5c18fcf3615b36c1884ee770 Mon Sep 17 00:00:00 2001 From: Brian Doyle Date: Tue, 18 Nov 2025 08:59:21 -0500 Subject: [PATCH 05/13] Update docs/blockchain-development-tutorials/cadence/cadence-advantages/native-data-availibility-with-cadence-scripts.md Co-authored-by: Vishal <1117327+vishalchangrani@users.noreply.github.com> --- .../native-data-availibility-with-cadence-scripts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/blockchain-development-tutorials/cadence/cadence-advantages/native-data-availibility-with-cadence-scripts.md b/docs/blockchain-development-tutorials/cadence/cadence-advantages/native-data-availibility-with-cadence-scripts.md index 2277e1de5a..6e2f8f1440 100644 --- a/docs/blockchain-development-tutorials/cadence/cadence-advantages/native-data-availibility-with-cadence-scripts.md +++ b/docs/blockchain-development-tutorials/cadence/cadence-advantages/native-data-availibility-with-cadence-scripts.md @@ -29,7 +29,7 @@ In Cadence, **scripts** are general-purpose read programs. They can traverse pub :::info -In Cadence, a _script_ is a read-only program that can access public data across accounts and contracts in a strongly typed way. It does not require payment, in gas or compute units, or user signatures. +In Cadence, a _script_ is a read-only program that can access public data across accounts and contracts in a strongly typed way. It does not require a user signatures not does it incur any fees. ::: From 17e0a9584184949e77a07b7d7ba7203e18d8fe86 Mon Sep 17 00:00:00 2001 From: Brian Doyle Date: Tue, 18 Nov 2025 08:59:35 -0500 Subject: [PATCH 06/13] Update docs/blockchain-development-tutorials/cross-vm-apps/introduction.md Co-authored-by: Vishal <1117327+vishalchangrani@users.noreply.github.com> --- .../cross-vm-apps/introduction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/blockchain-development-tutorials/cross-vm-apps/introduction.md b/docs/blockchain-development-tutorials/cross-vm-apps/introduction.md index ba143d5b27..fee7e2ab0d 100644 --- a/docs/blockchain-development-tutorials/cross-vm-apps/introduction.md +++ b/docs/blockchain-development-tutorials/cross-vm-apps/introduction.md @@ -100,7 +100,7 @@ Click `Send Batch Transaction Example` and approve the transaction. You'll see t :::tip -Currently, the Flow wallet sponsors all gas/compute units for all transactions signed with the wallet on both testnet **and mainnet!** +Currently, the Flow wallet sponsors the fees for the compute units (equivalent of gas) for all transactions signed with the wallet on both testnet **and mainnet!** ::: From 5011caa8de86260176001b1fae28064b3938481a Mon Sep 17 00:00:00 2001 From: Brian Doyle Date: Tue, 18 Nov 2025 09:00:31 -0500 Subject: [PATCH 07/13] Update docs/build/cadence/advanced-concepts/scheduled-transactions.md Co-authored-by: Vishal <1117327+vishalchangrani@users.noreply.github.com> --- docs/build/cadence/advanced-concepts/scheduled-transactions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/build/cadence/advanced-concepts/scheduled-transactions.md b/docs/build/cadence/advanced-concepts/scheduled-transactions.md index 71dd0065e6..8c4465c317 100644 --- a/docs/build/cadence/advanced-concepts/scheduled-transactions.md +++ b/docs/build/cadence/advanced-concepts/scheduled-transactions.md @@ -443,4 +443,4 @@ Block explorer support for scheduled transactions is also coming, which will pro For feature requests and suggestions for scheduled transaction tooling, please visit [github.com/onflow/flow](https://github.com/onflow/flow) and create an issue with the tag `scheduled_transactions`. -Read FLIP for more details: https://github.com/onflow/flips/blob/main/protocol/20250609-scheduled-callbacks.md +Read [FLIP 330: Scheduled Callbacks](https://github.com/onflow/flips/blob/main/protocol/20250609-scheduled-callbacks.md) for more details: From 60017ce71ab26c506a6325c5d84ecb7052f04d26 Mon Sep 17 00:00:00 2001 From: Brian Doyle Date: Tue, 18 Nov 2025 09:00:53 -0500 Subject: [PATCH 08/13] Update docs/build/cadence/basics/fees.md Co-authored-by: Vishal <1117327+vishalchangrani@users.noreply.github.com> --- docs/build/cadence/basics/fees.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/build/cadence/basics/fees.md b/docs/build/cadence/basics/fees.md index 5a5e5cf0e2..35780c3380 100644 --- a/docs/build/cadence/basics/fees.md +++ b/docs/build/cadence/basics/fees.md @@ -33,7 +33,7 @@ Are you an EVM developer looking for information about EVM Accounts on Flow? If A transaction fee is a cost paid in Flow by the payer account and is required for a transaction to be included in the Flow blockchain. Fees are necessary for protecting the network against spam/infinite running transactions and to provide monetary incentives for participants that make up the Flow network. -Transaction fees are calculated in compute units. Compute units are similar to gas in EVM networks, but are not calculated in exactly the same manner. +On Flow, transaction fees are determined using `compute units (CU)`, a metric that captures the effort needed to include and execute a transaction. Compute units function similarly to gas in EVM systems but are derived differently. The final fee paid by the user is calculated by multiplying the transaction’s total compute units by the current compute-unit price, with all fees payable in FLOW. A transaction fee is paid regardless of whether a transaction succeeds or fails. If the payer account doesn't have sufficient Flow balance to pay for the transaction fee, the transaction will fail. We can limit the transaction fee to some extent by providing the compute unit limit value when submitting the transaction. From 86c9bb4187a507577c4ec52026e242ca71bf42b5 Mon Sep 17 00:00:00 2001 From: Brian Doyle Date: Tue, 18 Nov 2025 09:01:08 -0500 Subject: [PATCH 09/13] Update docs/blockchain-development-tutorials/flow-101.md Co-authored-by: Vishal <1117327+vishalchangrani@users.noreply.github.com> --- docs/blockchain-development-tutorials/flow-101.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/blockchain-development-tutorials/flow-101.md b/docs/blockchain-development-tutorials/flow-101.md index ebc02bff94..ec151e2a0d 100644 --- a/docs/blockchain-development-tutorials/flow-101.md +++ b/docs/blockchain-development-tutorials/flow-101.md @@ -81,7 +81,7 @@ Other defining features of Flow include: - **Fast finality**, making applications responsive and user-friendly. - **Resistance to Miner Extractable Value (MEV)**, protecting users from front-running. - **EVM equivalence**, allowing developers to deploy Solidity contracts on Flow EVM. -- **Low compute/gas fees**, which make applications affordable and accessible to users. +- **Low compute fees (on the Cadence side) and low gas fees (on the EVM side)**, which make applications affordable and accessible to users. Flow has already powered some of the most successful Web3 products to date, including: From c7c4966cfd42cdb2d4abfbdba44d138b2b1fabde Mon Sep 17 00:00:00 2001 From: Brian Doyle Date: Tue, 18 Nov 2025 09:05:39 -0500 Subject: [PATCH 10/13] Update docs/build/tools/clients/fcl-js/packages-docs/sdk/index.md Co-authored-by: Vishal <1117327+vishalchangrani@users.noreply.github.com> --- docs/build/tools/clients/fcl-js/packages-docs/sdk/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/build/tools/clients/fcl-js/packages-docs/sdk/index.md b/docs/build/tools/clients/fcl-js/packages-docs/sdk/index.md index 984be78090..a8ec8cbfa1 100644 --- a/docs/build/tools/clients/fcl-js/packages-docs/sdk/index.md +++ b/docs/build/tools/clients/fcl-js/packages-docs/sdk/index.md @@ -109,7 +109,7 @@ transaction { } ``` -**Compute Limit** is the limit on the amount of computation a transaction requires, and it will abort if it exceeds its compute unit (gas) limit. Cadence uses metering to measure the number of operations per transaction. You can read more about it in the [Cadence documentation](https://cadence-lang.org/docs). +**Compute Limit** is the limit on the amount of computation a transaction requires, and it will abort if it exceeds its compute unit limit. Cadence uses metering to measure the number of operations per transaction. You can read more about it in the [Cadence documentation](https://cadence-lang.org/docs). The compute limit depends on the complexity of the transaction script. Until dedicated estimation tooling exists, it's best to use the emulator to test complex transactions and determine a safe limit. From b5aca40966b40098f91acd42464e2e103cb5ec76 Mon Sep 17 00:00:00 2001 From: Brian Doyle Date: Tue, 18 Nov 2025 09:06:41 -0500 Subject: [PATCH 11/13] Update docs/build/tools/clients/fcl-js/packages-docs/sdk/index.md Co-authored-by: Vishal <1117327+vishalchangrani@users.noreply.github.com> --- docs/build/tools/clients/fcl-js/packages-docs/sdk/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/build/tools/clients/fcl-js/packages-docs/sdk/index.md b/docs/build/tools/clients/fcl-js/packages-docs/sdk/index.md index a8ec8cbfa1..5474a3b367 100644 --- a/docs/build/tools/clients/fcl-js/packages-docs/sdk/index.md +++ b/docs/build/tools/clients/fcl-js/packages-docs/sdk/index.md @@ -119,7 +119,7 @@ Keep in mind that Flow is **very** efficient, so transaction fees are generally - Single NFT Transfer: 26 CU. - EVM Token transfer 28 CU. -**Reference block** specifies an expiration window (measured in blocks) during which a transaction is considered valid by the network. A transaction will be rejected if it is submitted past its expiry block. Flow calculates transaction expiry using the _reference block_ field on a transaction. A transaction expires after `600` blocks are committed on top of the reference block, which takes about 10 minutes at average Mainnet block rates. +**Reference block** specifies an expiration window (measured in blocks) during which a transaction is considered valid by the network. A transaction will be rejected if it is submitted past its expiry block. Flow calculates transaction expiry using the _reference block_ field on a transaction. A transaction expires after `600` blocks are committed on top of the reference block, which takes about 8 minutes at average Mainnet block rates. ## API Reference From 9108025d53562551d635c5377613d5b19acb1dfa Mon Sep 17 00:00:00 2001 From: Brian Doyle Date: Tue, 18 Nov 2025 09:06:59 -0500 Subject: [PATCH 12/13] Update docs/build/flow.md Co-authored-by: Vishal <1117327+vishalchangrani@users.noreply.github.com> --- docs/build/flow.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/build/flow.md b/docs/build/flow.md index 7869123780..bc8ccf2f56 100644 --- a/docs/build/flow.md +++ b/docs/build/flow.md @@ -113,7 +113,7 @@ EVM-equivalency on Flow works behind-the-scenes by implementing a minimal transa - **Scalable and Secure Architecture**: The [multi-role architecture] of Flow allows the network to [scale without sharding] to serve billions of users without reducing the decentralization of consensus and verification. - **True, fast finality**: For most other networks, it takes minutes, [a day], or even [a week] to reach hard finality — the point at which a transaction cannot be reversed. On Flow, the median time for finality is [under 10 seconds], without compromising security. - **Consumer onboarding**: Flow was designed for mainstream consumers, with payment onramps catalyzing a safe and low-friction path from fiat to crypto. -- **Efficient compute unit (gas) costs**: The Flow blockchain is extremely efficient, allowing apps to do more computation at lower costs. +- **Efficient compute unit and gas costs**: The Flow blockchain is extremely efficient both on the Cadence side and the EVM side, allowing apps to do more computation at lower costs. ### MEV resilience From 9c04ded5047b82cea61e39596cb9f054e8924fcd Mon Sep 17 00:00:00 2001 From: Brian Doyle Date: Tue, 18 Nov 2025 09:07:25 -0500 Subject: [PATCH 13/13] Update docs/build/flow.md Co-authored-by: Vishal <1117327+vishalchangrani@users.noreply.github.com> --- docs/build/flow.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/build/flow.md b/docs/build/flow.md index bc8ccf2f56..552a374dd0 100644 --- a/docs/build/flow.md +++ b/docs/build/flow.md @@ -74,7 +74,7 @@ Flow is unique in supporting two powerful programming languages for smart contra - **Cadence**: A modern programming language developed by smart contract application builders. - **Solidity**: The industry-standard language for EVM development, fully supported on Flow with full EVM equivalence. -EVM and Cadence environments both use FLOW as compute units, or gas, for transactions and are connected by a native bridge that allows seamless and cheap communication between them. Fungible and non-fungible tokens can also be seamlessly transferred between environments using the native VM token bridge, taking place instantly in a single atomic transaction. +EVM and Cadence environments both use FLOW for transactions fees (gas on the EVM side and compute unit of the Cadence side) and are connected by a native bridge that allows seamless and cheap communication between them. Fungible and non-fungible tokens can also be seamlessly transferred between environments using the native VM token bridge, taking place instantly in a single atomic transaction. This means developers can choose the language that best fits their needs while maintaining full interoperability between both environments.