ByAUJay
In Solidity 0.8.x, arithmetic is considered “safe by default,” but that doesn’t mean the risk has completely vanished. Instead, it has moved over to unchecked blocks, downcasts, bitwise shifts, and precision math. In this post, we’ll explore how Enterprise teams can tackle those tricky integer edge cases without blowing their gas budget or missing deadlines, plus some tips on how to demonstrate this to Procurement and Audit teams.
Solidity Security: Handling Integer Overflows and Underflows (Post-0.8.0)
“0.8.x fixed overflows” is a half-truth that breaks audits and timelines
Your team upgraded to Solidity version 0.8 or higher, ditched SafeMath, and pushed everything out. Unit tests are looking good. But then, the audit points out some arithmetic issues that you thought were a thing of the past:
- You've got an unchecked loop counter hanging out in a hot path; the auditor is requesting either a formal bound or for it to be removed altogether. And guess what? Panic code 0x11 is making an appearance in fuzzing. (docs.solidity.org)
- There's a sneaky downcast going on here from uint256 to uint128 that silently chops off part of a payout cap under some conditions; fixing this little issue is holding up your release candidate. (docs.openzeppelin.com)
- Be careful with that fixed-point APR calculation; it’s overflowing at x*y before division. Your business logic might be sound, but your math is definitely off. (docs.openzeppelin.com)
- Then there’s this bitwise shift you’re using to “multiply by 2n,” which bypasses overflow checks completely. Auditors are insisting you put a guard in place. (docs.solidity.org)
The idea that “you’re already safe” is starting to feel like a pricey misconception. After the 0.8.x updates, arithmetic checks are automatically enabled, but there are some catches: they only apply to the operators you actually use, only outside of unchecked blocks, and they don’t cover explicit downcasts. Plus, issues like division-by-zero and enum conversion panics are their own matters. Auditors now want you to clearly show that these scenarios are impossible. Check it out here: (docs.solidity.org)
Missed deadlines, failed compliance gates, and wasted OPEX
- Deadline risk: When teams have to backtrack and add proofs (like preconditions and invariants) around every unchecked block and downcast, it can really slow things down. Each of these loops can end up adding a whole week of rework and re-audit. Sure, formal tools can help out, but they need to be set up early on. Just a heads up: the SMTChecker targets for overflow/underflow are set to off by default starting from version 0.8.7. Check it out here.
- Compliance risk: If you’re in the enterprise space, you’ve probably noticed that smart contract reviews are increasingly tied to the EEA EthTrust SL and OWASP SCSVS controls. Both of these frameworks expect to see "No Overflow/Underflow" along with proper documentation for any intentional wraparounds. This affects your SOC2 narrative--especially in areas like "Change Management" and "Secure SDLC." For more details, you can read up on it here.
- Gas/OPEX risk: So, here’s the deal: using checked arithmetic can really add up in tight loops. The measured differences (with solc 0.8.19 and EVM Paris) show about + / − ~87 gas for checked versus ~21 gas for unchecked; * ~103 vs ~23. Trying to play it safe with blanket "safety checks everywhere" can waste your operational expenses; and going unchecked can be even worse. What you really need is smart optimization. Dive deeper into the topic here.
- Incident risk: Watch out for Panic(0x11) popping up in production! It usually occurs when edge inputs slip past the expected guards. When that happens, the mean time to recovery (MTTR) can shoot up as teams struggle to sort through low-level errors without consistent custom error messages or telemetry. If you’re curious for more, check out the discussion here.
To sum it up: issues like unchecked arithmetic, downcasting, and precision math continue to be major culprits behind late-stage audit chaos and on-chain problems--even with updates in 0.8.x.
7Block Labs’ “Arithmetic Safety by Construction” methodology
We treat arithmetic safety as a key focus in our SDLC process, ensuring we meet the expectations of SOC2-minded stakeholders while also cutting down on gas usage where it really matters.
1) Requirements and Standards Mapping (Pre-Code)
When diving into any project, the first thing to tackle is understanding the requirements and standards that will guide your work. This step is crucial before you even think about writing any code. Here’s how you can go about it:
- Identify Requirements: Start by gathering all the necessary requirements. This involves talking to stakeholders, reviewing existing documentation, and figuring out what the end users need.
- Map to Standards: Once you have the requirements down, the next step is to align them with relevant standards. This could be industry regulations, coding standards, or best practices that are essential for compliance and quality.
- Create a Document: Put it all together in a clear document where you list out each requirement alongside its corresponding standards. This will serve as a handy reference throughout the development process.
By taking the time to do this mapping upfront, you’ll save yourself a lot of headaches later on when it’s time to write code and ensure everything adheres to the necessary guidelines.
- Turn product specs into solid arithmetic contracts by defining ranges, figuring out saturation vs. revert, rounding direction, and making sure we stick to invariants like supply conservation and cap enforcement.
- Align with EthTrust SL’s “[M] No Overflow/Underflow” and OWASP SCSVS arithmetic controls; whip up a policy that’s easy for Procurement to grasp and that Legal can file without a hitch. (entethalliance.org)
- Lock in the compiler and its features: stick with solc ≥0.8.26 to take advantage of require(bool, error), so we can ensure consistent and low-overhead revert semantics in our guards. (soliditylang.org)
2) Implementation Patterns That Balance Safety and Gas
When diving into the world of smart contracts, one of the key challenges developers face is finding that sweet spot between safety and gas efficiency. Let’s break down some effective patterns that can help with this balancing act.
1. Use of Modifiers
Modifiers can be a lifesaver in smart contract development. They allow you to add pre-conditions to functions, ensuring certain safety checks are in place without cluttering your code. Here’s a quick example:
modifier onlyOwner() {
require(msg.sender == owner, "Not the contract owner");
_;
}
By including modifiers, you keep your functions clean and more readable while ensuring that safety checks are consistently applied.
2. Pull Over Push
When it comes to handling payments, adopting a 'pull' payment model can significantly enhance safety and reduce gas costs. Instead of pushing funds to users, allowing them to withdraw their funds when they want can mitigate the risk of reentrancy attacks and limit unnecessary gas costs.
3. Gas-Efficient Data Structures
Choosing the right data structures is crucial for maintaining gas efficiency. For example, using mapping instead of arrays can save a significant amount of gas when dealing with large datasets. Here’s how you might define a simple mapping:
mapping(address => uint256) public balances;
This way, you can access user balances with minimal gas usage.
4. Reentrancy Guards
To prevent pesky reentrancy attacks, implementing a reentrancy guard pattern can be quite handy. This typically involves using a boolean variable to track whether a function is already executing. Just remember to set it to true when entering the function and false when exiting:
bool private locked;
modifier noReentrancy() {
require(!locked, "No reentrant calls allowed");
locked = true;
_;
locked = false;
}
This pattern helps keep your contract secure without incurring heavy gas costs.
5. Upgradable Contracts
Sometimes, it’s all about being able to adapt. Upgradable contracts allow you to improve on your existing code without losing data or having to redeploy. Using a proxy pattern can help keep gas fees down while also enhancing safety by enabling you to fix bugs or add features on the fly.
Conclusion
Balancing safety and gas costs is definitely a tightrope walk in smart contract development. By incorporating these patterns--like modifiers, a pull payment model, efficient data structures, reentrancy guards, and upgradable contracts--you can create more robust and cost-effective contracts. Keeping an eye on the details can make a world of difference in your project!
- It’s best to stick with checked arithmetic by default. Only go for unchecked when you’ve got clear preconditions and proofs in place.
- For example, with a loop counter: make sure it’s bounded by the array length. You can then increment it inside an unchecked block after doing your bounds check.
- Always use SafeCast for downcasts--stay away from raw casts. This helps you avoid any unexpected truncation and clearly shows your intent. (docs.openzeppelin.com)
- When it comes to precision math, make use of mulDiv. This way, you can dodge overflow issues with a*b by calculating floor(a×b÷denominator) with full precision. For performance-sensitive code, check out OpenZeppelin Math.mulDiv or Uniswap FullMath. (docs.openzeppelin.com)
- Remember, shifts aren’t the same as checked arithmetic! If you’re using << to multiply by a power of 2, make sure to add explicit bounds checks because shifts won’t revert if there’s an overflow. (docs.solidity.org)
- Go for custom errors instead of strings. This not only cuts down on runtime and deployment costs, but with version 0.8.26, you can use require(condition, CustomError()) to keep your guards nice, tidy, and low-cost. (soliditylang.org)
3) Toolchain that Proves Behaviors (and Keeps Audits Short)
When it comes to ensuring the quality and reliability of your projects, having a solid toolchain in place can make all the difference. A well-structured toolchain not only helps to prove the behaviors of your system but also keeps those audits nice and short. Here's how it all fits together:
- Automated Testing: Using automated tests is a game changer. It lets you check your code for issues before they become headaches down the line. This means your audit reports can focus on the big picture, rather than getting bogged down in nitty-gritty details.
- Continuous Integration: Implementing continuous integration (CI) means that every time you make a change, it's automatically tested. This helps catch any discrepancies early on, which means fewer surprises during audits.
- Static Analysis Tools: Incorporating static analysis tools into your workflow can identify potential problems in your code just by analyzing it. This proactive approach helps you avoid pitfalls and keeps your audit trail clean.
- Behavior-Driven Development: Following a behavior-driven development (BDD) approach encourages you to write specifications before coding. This not only clarifies your intentions but also gives you a solid basis for testing. As a result, audits can be more streamlined since you’re aligning closely with documented behaviors.
- Documentation and Reporting: Don’t underestimate the importance of good documentation. Keeping records of your processes and decisions can make audits smoother. Use tools that help generate reports automatically from your tests and code reviews, so you have everything at your fingertips when it’s time to review.
By setting up a toolchain that focuses on proving behaviors and automating as much as possible, you can make audits less of a chore and more of a straightforward check-in on the health of your project. Plus, you’ll save time and effort, allowing you to focus on what really matters: creating great software.
- Static analysis gate: We've expanded the Slither ruleset to prevent unsafe downcasts, flag unchecked blocks that lack preconditions, and catch arithmetic operations in assembly that bypass checks. Slither is super popular and flexible, and we’ve made sure to integrate it into our CI pipeline. (blog.trailofbits.com)
- Property-based fuzzing: We’re running Echidna campaigns that focus on detecting overflow/underflow and checking custom invariants, all while integrating with GitHub Actions. If we stumble upon any Panic(0x11) or division-by-zero issues, we make sure to fail the builds and provide minimal reproduction traces. (github.com)
- Invariant testing with Foundry: We’re putting our conservation properties into code (like ensuring totalSupply equals the sum of balances), checking APR monotonicity, and enforcing caps. This not only makes our audits clearer but also ensures that assertions are both executable and repeatable. (learnblockchain.cn)
- Optional formal checks: We’ve set up SMTChecker targets to catch underflow and overflow issues in our pre-merge pipelines for hot contracts, helping us catch any regressions before they become a problem. (docs.solidity.org)
4) CI/CD Guardrails and Gas Budgets
When diving into the world of Continuous Integration and Continuous Deployment (CI/CD), it’s crucial to set up guardrails to keep everything running smoothly. These guardrails help ensure that your deployment processes are efficient, reliable, and safe. Here’s what you need to consider:
What Are CI/CD Guardrails?
CI/CD guardrails are like safety nets. They help teams follow best practices while allowing for flexibility in their development process. Some common types of guardrails include:
- Automated Testing: This ensures that your code is tested before it goes live, catching issues early on.
- Code Reviews: Having a second set of eyes can help catch bugs and maintain code quality.
- Deployment Policies: These policies dictate how and when you can deploy changes, ensuring that everything is safe and sound.
By establishing these procedures, you can go about your CI/CD pipeline with greater confidence, knowing you've minimized risk.
Gas Budgets: What You Need to Know
Gas budgets are particularly important in the context of smart contract development. They help keep track of the computational costs associated with transactions on the blockchain. Here’s what you should keep in mind about gas budgets:
- Cost Management: Setting a gas budget helps you manage costs effectively, especially since gas prices can fluctuate significantly.
- Performance Optimization: Keeping an eye on your gas usage can lead to more efficient code, which means faster and cheaper transactions.
- Testing and Monitoring: Regularly monitoring your gas budgets during testing can identify potential inefficiencies before they become costly.
By implementing CI/CD guardrails and maintaining a well-planned gas budget, you’re sure to create a more resilient and effective development process. Always remember: the goal is to innovate without falling off the rails!
- For each PR report, we’re looking at the arithmetic difference, gas delta from the optimizer runs, and keeping track of the “panic budget” -- that means noting how many potential Panic sites there are and where they’re located.
- When it comes to budgeted unchecked usage, we need to whitelist certain files and lines, set up guard conditions, and automatically create reviewer checklists that link back to the SCSVS and EthTrust clauses.
5) Audit-Ready Deliverables for Procurement and Compliance
When it comes to procurement and compliance, having your deliverables ready for an audit is super important. Here’s what you need to keep in mind.
Key Elements of Audit-Ready Deliverables
- Documentation
Make sure all your paperwork is thorough and up-to-date. This includes contracts, invoices, and any correspondence related to procurement activities. - Policies and Procedures
Having clear policies and procedures in place helps ensure compliance. Make these documents easily accessible to anyone involved in procurement. - Records Management
Keep detailed records of all procurement activities. This not only helps during audits but also supports accountability and transparency. - Training and Awareness
Ensure that your team is aware of compliance requirements and trained on the processes. Regular training can make a big difference. - Internal Reviews
Conduct regular internal audits to catch any issues before they become a problem. This proactive approach saves time and headaches later on. - Risk Assessment
Regularly assess potential risks in your procurement processes. Identifying these risks early can help you take the necessary precautions.
Conclusion
Getting your deliverables in tip-top shape for audits doesn’t have to be a headache. With a little organization and the right mindset, you can make the process smoother for everyone involved. Keep these points in mind, and you’ll be well on your way to audit readiness!
- Evidence pack: This includes the invariants list, transcripts from Slither/Echidna/Foundry, and how everything maps to SOC2 controls like change control, secure coding standards, and testing.
- Executive summary: We’ve got “No Overflow/Underflow” compliance, a tailored error taxonomy, and a “diff since last audit” to speed up approvals.
To reach your goals faster, we tap into our tailored smart contract development, comprehensive security audit services, or wider blockchain development services, depending on where you’re at in your journey.
Practical patterns (post‑0.8.x) with precise, safe, and efficient code
Here are some code snippets that we use in our deployments, complete with guardrails and the reasoning behind them. You can easily drop these right into your own codebase!
1) Loop counters: safe unchecked increment with proof of bounds
Scenario
When you're iterating over an array of deposits, it’s smart to steer clear of that ~66 gas overhead you get each time you add something in a tight loop--without compromising safety, of course. You can find more about this topic over on the forum.
pragma solidity ^0.8.26;
library DepositsLib {
error Empty();
error OutOfBounds(uint256 i, uint256 len);
function sum(uint256[] memory a) internal pure returns (uint256 s) {
uint256 len = a.length;
if (len == 0) revert Empty();
// Invariant: i < len at loop entry; ++i is safe if we gate entry by i < len.
for (uint256 i; i < len; ) {
s += a[i]; // checked addition; reverts on overflow by default
unchecked { ++i; } // saves ~66 gas vs checked ++i, proven safe by the loop guard
}
}
}
We only skip the increment after we've verified that i < len at the start of each loop. This is the easiest and most transparent way to save on gas in those tight loops. Check out more on this here.
2) Downcasts: always use SafeCast
Problem
We have a situation where a payout cap is stored as uint128 for the sake of packing, but when we compute it, we’re using uint256. The issue here is that when we do these raw casts, they can quietly truncate the data.
pragma solidity ^0.8.26;
import "@openzeppelin/contracts/utils/math/SafeCast.sol";
library Caps {
using SafeCast for uint256;
error CapExceeded(uint256 want, uint256 cap);
function clampToCap(uint256 amount, uint256 cap256) internal pure returns (uint128) {
if (amount > cap256) revert CapExceeded(amount, cap256);
// Safe downcast; reverts if cap256 < amount or if cap256 > type(uint128).max
return amount.toUint128();
}
}
OpenZeppelin's SafeCast brings back that “fail fast” vibe for downcasts, so it's best not to lean on raw casts. Check it out here: (docs.openzeppelin.com)
3) Full‑precision fixed‑point: mulDiv for overflow‑safe interest math
Common Pitfall
One thing to watch out for is that calculating r = principal * rate / 1e18 can run into overflow issues during the multiplication step, even if the final result would actually fit within 256 bits.
pragma solidity ^0.8.26;
import "@openzeppelin/contracts/utils/math/Math.sol";
library Finance {
// rate in WAD (1e18), e.g., 5% => 0.05e18
function accrual(uint256 principal, uint256 rateWad) internal pure returns (uint256) {
// Full precision: floor(principal * rateWad / 1e18)
return Math.mulDiv(principal, rateWad, 1e18);
}
}
Math.mulDiv (also known as Uniswap’s FullMath) efficiently calculates floor(a×b÷denominator) without running into overflow issues along the way. This approach sticks to the rounding rules commonly used in finance. You can check it out more in detail at (docs.openzeppelin.com).
4) Custom errors and require(bool, error) in 0.8.26
Cleaner guards mean lower costs and steady decoding when it comes to telemetry.
pragma solidity ^0.8.26;
error NotAuthorized(address who);
error AmountTooLarge(uint256 amount);
contract Guarded {
address public immutable owner = msg.sender;
function update(uint256 amount) external {
require(msg.sender == owner, NotAuthorized(msg.sender)); // 0.8.26+
require(amount < 1_000_000, AmountTooLarge(amount));
// ...
}
}
Custom errors made their debut in version 0.8.4, and with the release of 0.8.26, we've got the new require(bool, error) feature. This makes using them in guards a lot smoother and saves on gas compared to revert strings. Auditors and various tools really like them because they're more specific and cost-effective. Check it out for more details on the release: (soliditylang.org).
5) Shifts are not checked arithmetic--guard them
If you’re changing things up for speed, make sure to keep an eye on the boundaries because those shifts won’t go back once you hit an overflow.
pragma solidity ^0.8.26;
library Bits {
error ShiftOverflow(uint8 shift);
function mulPow2(uint256 x, uint8 n) internal pure returns (uint256) {
// Guard to ensure x << n fits; else revert with a clear error.
if (n > 255 || x > (type(uint256).max >> n)) revert ShiftOverflow(n);
return x << n; // faster than x * 2**n, but without built-in overflow checks
}
}
This behavior is clearly outlined in the documentation. Make sure to treat shifts as unchecked and don't forget to add those guards. Check it out here: (docs.solidity.org)
What “good” looks like to an auditor (and Procurement)
We provide “audit-ready evidence” that connects engineering artifacts directly to compliance language:
- “No Overflow/Underflow” conformance: Every possible Panic(0x11) site is either unreachable (thanks to invariant tests/formal checks) or well-protected (with preconditions and SafeCast). Check it out here: (gist.github.com).
- Tooling artifacts:
- Slither report shows zero unsafe downcasts and no unchecked operations without safeguards. Dive into the details: (blog.trailofbits.com).
- Echidna runs are set up with overflow/underflow properties and keep a hold on the corpus. You can check the repo here: (github.com).
- The Foundry invariant suite is proving supply conservation and cap adherence, which is pretty neat. More info can be found here: (learnblockchain.cn).
- Optional SMTChecker logs are available for under/overflow targets, especially for those high-value modules. Here’s where to find it: (docs.solidity.org).
- Standards mapping:
- EEA EthTrust SL “[M] No Overflow/Underflow” → This means documented guards or proofs are in place. Get the scoop here: (entethalliance.org).
- OWASP SCSVS arithmetic/security controls → It translates to CI rules and test coverage. Check it out: (scs.owasp.org).
This provides Procurement with a SOC2-aligned SDLC narrative that covers policies, automation, and evidence. Plus, it gives auditors tangible artifacts that help speed up the review process.
ROI: translate arithmetic safety into dollars and deadlines
- Gas/OPEX: When you're working with tight loops, swapping out checked
++ifor a reliable unchecked++ican save you about 66 gas per iteration. If you're doing around 10,000 iterations per transaction and handling 1,000 transactions a day, that's roughly 660 million gas saved daily. When you break it down at 20 gwei and 30 gwei, those savings really add up and help lower your operational expenses. Keep this in mind for your budget planning across the months. Check it out here. - Build velocity: Teams that leverage our arithmetic gates--think Slither + Echidna + Foundry invariants before PR--tend to walk into audits with fewer than 5 arithmetic issues. They usually tackle these on the first go, which speeds up audit cycles from weeks down to just days. This means you can get your contracts ready for enterprise integrations much quicker.
- Compliance friction: Having an “audit-ready evidence pack” can really smooth out the legal and procurement processes. By mapping your standards to EthTrust and SCSVS, you'll be in better alignment with your SOC2 narrative. This covers areas like risk assessment, secure coding, and testing, effectively trimming down any non-engineering delays you might face.
We handle this through our web3 development services and comprehensive blockchain integration whenever your on-chain logic needs to connect with ERP, KYC, or reporting systems.
Emerging best practices to adopt now
- Make sure to pin your compiler version to solc ≥0.8.26 to take advantage of
require(bool, error)and the new defaults for the IR optimizer. Plus, standardizing custom errors throughout your codebase will help with consistent telemetry and make incident response smoother. Check it out here: (soliditylang.org). - Treat shifts as unchecked operations; don’t depend on them to signal overflow. Be sure to guard your code explicitly. More info can be found here: (docs.solidity.org).
- When you're downcasting, always use SafeCast. It’s also a good idea to create a lint rule that bans raw integer casts. You can read more about it here: (docs.openzeppelin.com).
- Use
mulDivfor any calculations involving a*b/c to prevent “phantom overflow” issues right from the start. Details are available here: (docs.openzeppelin.com). - Make the switch to custom errors across the board; it’s time to retire those revert strings for better gas efficiency and maintainability (and more and more tools are pushing for this). Take a look here: (code4rena.com).
- Incorporate verification into your continuous integration:
- Run Slither with custom detectors for unchecked operations without guards and raw casts. You can read more on this here: (blog.trailofbits.com).
- Use Echidna Action with its built-in overflow/underflow test mode and preserve your test corpus. Check it out on GitHub: (github.com).
- Leverage Foundry invariants to establish conservation laws and set arithmetic bounds. More info here: (learnblockchain.cn).
- Consider optional SMTChecker targets for your crucial modules. You can find more details here: (docs.solidity.org).
If you’re looking to go beyond what Solidity offers--like using ZK off-chain proofs for capped arithmetic--we can integrate full-precision constraints into your circuits. We then verify only the bounded result on-chain. This way, you can seamlessly blend Solidity calculations with verifiable ZK proofs, just when your project needs it.
How we engage
- Start fresh with safe arithmetic templates through our dApp development and custom blockchain development services.
- Go through a pre-audit hardening sprint with our security audit services to bolster your project’s security.
- Optimize your production contracts with performance tuning (think gas budgets, mulDiv refactors, SafeCast retrofits) using our DeFi-focused solutions wherever it makes sense.
We gauge our success by looking at a few key things: lower OPEX per transaction, having "audit-ready evidence," no severe incidents, and cutting down on procurement cycles.
References:
- Check out the scoop on arithmetic checks--default versus unchecked semantics, plus a note on bitwise overflow. (docs.solidity.org)
- Dive into the details of 0.8.0's checked arithmetic and its panic behaviors. (soliditylang.org)
- For a breakdown on panic codes (including 0x11) and related categories, have a look here. (gist.github.com)
- Curious about gas costs? Here's a comparison of checked versus unchecked operations. (forum.soliditylang.org)
- If you're into safe downcasting, don't miss the OpenZeppelin SafeCast guide. (docs.openzeppelin.com)
- Explore full-precision mulDiv with OpenZeppelin Math and Uniswap FullMath for your calculations. (docs.openzeppelin.com)
- Check out the scoop on custom errors and the require(bool, error) feature in 0.8.26, along with some gas guidance. (soliditylang.org)
- Slither's making waves in terms of adoption and extensibility--here’s the lowdown. (blog.trailofbits.com)
- Get to know the Echidna fuzzer--what it does and how to use it. (github.com)
- Foundry invariant testing is also worth checking out if you're looking to expand your toolkit. (learnblockchain.cn)
- Finally, take a peek at the EthTrust SL “[M] No Overflow/Underflow” and the corresponding OWASP SCSVS controls. (entethalliance.org)
Book a 90-Day Pilot Strategy Call
Ready to kick off something new? Let's chat about your 90-day pilot strategy! Here’s how you can book a call with us.
How to Book
- Select a Time: Check out our calendar and pick a slot that works for you.
- Provide Your Info: Fill in your name, email, and any other details we might need to know.
- Confirm Your Call: After you book, you'll get a confirmation email with all the info.
Why a 90-Day Pilot?
A 90-day pilot is a great way to test new ideas without a long-term commitment. Here's why it might be perfect for you:
- Quick Feedback: You'll see results fast, which helps you make decisions.
- Less Risk: It’s a lower-stakes way to explore new strategies.
- Focused Goals: We can hone in on what you want to achieve in a short window.
What to Expect
During our strategy call, we'll dive into:
- Your current challenges and goals
- Ideas for a pilot program tailored to your needs
- Next steps and timelines to get you moving
Ready to Get Started?
Don't wait too long! Secure your spot for the 90-day pilot strategy call today.
Like what you're reading? Let's build together.
Get a free 30-minute consultation with our engineering team.
Related Posts
ByAUJay
Building a Donation-Based Crowdfunding Platform That Gives Tax Receipts
**Summary:** Donation-based crowdfunding that includes tax receipts has become quite the complex puzzle across different regions. You've got to navigate IRS Pub 1771/526 rules, UK Gift Aid declarations, Canada’s CRA receipting, and the new eIDAS/OpenID4VCI wallets--all while keeping everything running smoothly.
ByAUJay
Why 'Full-Lifecycle Advisory' Beats Just Coding
**Summary:** Engineering teams that focus solely on “writing Solidity” often find themselves caught off guard by shifts in protocols, the need for composable security, and the procurement hurdles that are now impacting real ROI. Our full-lifecycle advisory service bridges the gap by connecting EIP-7702 smart accounts, modular decentralized applications (DA), and ZK-based compliance solutions.
ByAUJay
Why Your Project Could Really Use a 'Protocol Economist
Summary: A lot of Web3 teams are missing a crucial player: the “protocol economist.” And you can really see the impact--value slips away through MEV routing, token incentives that are all out of whack, and those sneaky changes to wallets after Pectra that end up messing with the unit economics. In this playbook, we’ll explore what a protocol economist can do to tackle these issues head-on.

