<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Pharos Production</title>
    <description>The latest articles on DEV Community by Pharos Production (pharos_production).</description>
    <link>https://dev.to/pharos_production</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F14317%2F945dcda9-b2d8-4e70-a174-d8b79989dff5.jpg</url>
      <title>DEV Community: Pharos Production</title>
      <link>https://dev.to/pharos_production</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pharos_production"/>
    <language>en</language>
    <item>
      <title>Smart Contract Release Audit: 8 Repository Artifacts</title>
      <dc:creator>Dmytro Nasyrov</dc:creator>
      <pubDate>Thu, 27 Aug 2026 10:45:19 +0000</pubDate>
      <link>https://dev.to/pharos_production/how-to-choose-a-smart-contract-development-company-8-repository-checks-9m</link>
      <guid>https://dev.to/pharos_production/how-to-choose-a-smart-contract-development-company-8-repository-checks-9m</guid>
      <description>&lt;p&gt;An auditable smart contract release is a chain of evidence, not a green CI badge. The repository should bind the build, threat model, invariant tests, privileged roles, deployment rehearsal, audit scope and handover runbook to one commit.&lt;/p&gt;

&lt;p&gt;This guide turns that chain into eight repository checks and a 60-minute technical review. Use it to determine whether a delivery process can reproduce and explain one EVM release. A failed build, unmapped privileged authority or audit report without a scope commit blocks the review.&lt;/p&gt;

&lt;p&gt;This is a release-audit framework, not a security certification.&lt;/p&gt;

&lt;h2&gt;
  
  
  A release claim needs a repository artifact
&lt;/h2&gt;

&lt;p&gt;"Security-first" is not evidence. A threat model and a failing test are evidence. So are a CI result and a deployment manifest.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://docs.soliditylang.org/en/latest/security-considerations.html" rel="noopener noreferrer"&gt;Solidity security guidance&lt;/a&gt; recommends code review and testing. It also discusses audits, small modular contracts and fail-safe design. A release review should therefore inspect how those practices appear in the repository, not merely ask whether the team uses them.&lt;/p&gt;

&lt;p&gt;A neutral rule matters here: &lt;a href="https://pharosproduction.com" rel="noopener noreferrer"&gt;Pharos Production's company profile&lt;/a&gt; should receive no credit for a claim that cannot be mapped to an inspectable artifact either. Apply the same test to any team presenting the release.&lt;/p&gt;

&lt;p&gt;Confidential client work does not invalidate this approach. The delivery team can provide a sanitized repository, a public project, an internal reference implementation or a live screen-share with sensitive names removed. You do not need customer source code. You need proof that the release process exists and can be reproduced.&lt;/p&gt;

&lt;h2&gt;
  
  
  Freeze one release as the review boundary
&lt;/h2&gt;

&lt;p&gt;Select one recent project close to the target chain and risk model. The review package should identify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the exact commit being demonstrated.&lt;/li&gt;
&lt;li&gt;compiler and framework versions, plus the dependency lock.&lt;/li&gt;
&lt;li&gt;reproducible build commands and CI entry points.&lt;/li&gt;
&lt;li&gt;the threat model with declared system invariants.&lt;/li&gt;
&lt;li&gt;every role that can upgrade, pause, mint or administer the system.&lt;/li&gt;
&lt;li&gt;deployment scripts plus a non-production rehearsal record.&lt;/li&gt;
&lt;li&gt;audit scope, remediation changes and unresolved risks.&lt;/li&gt;
&lt;li&gt;the handover runbook with named owners.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do not request seed phrases, private keys, customer data or proprietary business logic. A good evidence room proves the process without exposing secrets.&lt;/p&gt;

&lt;h2&gt;
  
  
  An eight-check repository scorecard
&lt;/h2&gt;

&lt;p&gt;Score each check from &lt;code&gt;0&lt;/code&gt; to &lt;code&gt;2&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;0&lt;/code&gt;: absent, verbal only or not reproducible.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;1&lt;/code&gt;: an artifact exists but is incomplete, stale or not bound to the demonstrated release.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;2&lt;/code&gt;: a reviewer can reproduce it and trace it to the same commit, configuration and release scope.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Evidence to inspect&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;0&lt;/code&gt; looks like&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;2&lt;/code&gt; looks like&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Build provenance&lt;/td&gt;
&lt;td&gt;pinned compiler, lockfile, documented commands and CI workflow&lt;/td&gt;
&lt;td&gt;"It builds on our lead developer's laptop"&lt;/td&gt;
&lt;td&gt;a clean checkout builds with the documented toolchain and no hidden local step&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Threat model&lt;/td&gt;
&lt;td&gt;assets, actors, trust boundaries, external dependencies, abuse cases and invariants&lt;/td&gt;
&lt;td&gt;a generic security checklist&lt;/td&gt;
&lt;td&gt;named failure scenarios are mapped to controls and tests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Test design&lt;/td&gt;
&lt;td&gt;unit, fuzz, invariant, integration or fork tests selected for the system's risks&lt;/td&gt;
&lt;td&gt;a coverage percentage with no risk mapping&lt;/td&gt;
&lt;td&gt;the team can reintroduce a bounded defect and show the relevant test fail&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. Static analysis and review debt&lt;/td&gt;
&lt;td&gt;tool configuration, CI output, suppressions, manual-review notes and finding owners&lt;/td&gt;
&lt;td&gt;a green badge or tool logo&lt;/td&gt;
&lt;td&gt;every material finding is fixed, accepted with rationale or assigned for action&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5. Upgrade and admin authority&lt;/td&gt;
&lt;td&gt;immutable or proxy decision, role map, current controllers, emergency powers and storage-layout checks&lt;/td&gt;
&lt;td&gt;"We use a multisig" with no address or authority map&lt;/td&gt;
&lt;td&gt;every privileged action has a controller, change path and observable event&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6. Deployment rehearsal&lt;/td&gt;
&lt;td&gt;versioned scripts, network parameters, address manifest, verification steps and dry-run receipt&lt;/td&gt;
&lt;td&gt;manual console commands reconstructed from memory&lt;/td&gt;
&lt;td&gt;the team can replay a non-production deployment from the reviewed commit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7. Audit handoff&lt;/td&gt;
&lt;td&gt;scope commit, exclusions, report, remediation pull requests, retest and accepted residual risk&lt;/td&gt;
&lt;td&gt;an audit PDF with no repository reference&lt;/td&gt;
&lt;td&gt;each finding traces from the reviewed commit to a change and final disposition&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8. Operational handover&lt;/td&gt;
&lt;td&gt;monitoring, incident roles, pause or containment procedure, key rotation and upgrade runbook&lt;/td&gt;
&lt;td&gt;support described only in the proposal&lt;/td&gt;
&lt;td&gt;the operator can run the system without an undocumented team-only action&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Across the 8 checks, the maximum is 16, but the total is not the decision. A hard stop overrides the score. Adjust the depth of each check to value at risk. Privilege concentration and external dependencies also matter.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjerlgkfdwg6d7nq0pont.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjerlgkfdwg6d7nq0pont.png" alt="Repository release-audit flow from a claim through a commit-bound artifact, reproducibility and ownership checks to a score, with failed gates routed to zero or block" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A claim earns points only after it is bound to one release, reproduced and assigned a disposition. Any failed hard gate routes to &lt;code&gt;0&lt;/code&gt; or &lt;code&gt;BLOCK&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Broader procurement questions such as team scope, regulatory fit, multi-chain experience and engagement evidence belong in a separate &lt;a href="https://pharosproduction.com/insights/comparisons/blockchain-development-companies/" rel="noopener noreferrer"&gt;blockchain development company evaluation framework&lt;/a&gt;. This repository review begins after one delivery system and one release boundary have been selected.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check the test model, not the test count
&lt;/h2&gt;

&lt;p&gt;Line coverage says which lines executed. It does not say that the important property was asserted.&lt;/p&gt;

&lt;p&gt;Ask the team to name the properties that must survive arbitrary user actions. Examples include conservation of assets, bounded issuance, withdrawal availability and authorization of privileged state changes. Then locate those properties in the test suite.&lt;/p&gt;

&lt;p&gt;Foundry's &lt;a href="https://getfoundry.sh/forge/invariant-testing" rel="noopener noreferrer"&gt;invariant-testing documentation&lt;/a&gt; explains that invariant campaigns run randomized sequences of calls and assert the declared invariants after each call. The repository should also expose what the fuzzer actually explored. Inspect its targets and run depth, then examine reverts and handler behavior. A passing campaign that never reaches a meaningful state is weak evidence.&lt;/p&gt;

&lt;p&gt;One demonstration is especially useful: ask the team to make a reversible local change that violates a declared invariant, then run the relevant test. The point is not theater. It verifies that the test can detect the failure it claims to control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read static-analysis suppressions as engineering debt
&lt;/h2&gt;

&lt;p&gt;Static analysis is a gate only when its configuration and output are reviewable. Slither can analyze Solidity and Vyper projects, integrate with CI and emit machine-readable results, as described in the &lt;a href="https://github.com/crytic/slither" rel="noopener noreferrer"&gt;project documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Do not award points for running &lt;code&gt;slither .&lt;/code&gt; alone. Inspect excluded detectors and path filters. Then review inline suppressions and the treatment of each material finding. A suppression needs a technical reason and a defined scope. It also needs an owner. Otherwise the tool may be green because the repository taught it not to look.&lt;/p&gt;

&lt;p&gt;Required status checks can prevent a protected GitHub branch from accepting changes until configured checks pass. That mechanism is documented in &lt;a href="https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/about-protected-branches" rel="noopener noreferrer"&gt;GitHub's protected-branch guidance&lt;/a&gt;. During due diligence, confirm that the security job is actually required on the release branch and that its expected source cannot be replaced casually.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make upgrade authority explicit
&lt;/h2&gt;

&lt;p&gt;"Upgradeable" is not a feature checkbox. It changes the trust model.&lt;/p&gt;

&lt;p&gt;For proxy-based systems, request the proxy pattern, initializer logic, storage-layout comparison and the current authority that can change implementation code. OpenZeppelin's &lt;a href="https://docs.openzeppelin.com/upgrades-plugins/writing-upgradeable" rel="noopener noreferrer"&gt;upgradeable-contract guidance&lt;/a&gt; documents initializer and storage-layout constraints. &lt;a href="https://eips.ethereum.org/EIPS/eip-1967" rel="noopener noreferrer"&gt;ERC-1967&lt;/a&gt; defines standard implementation, beacon and optional admin storage slots for common proxy designs.&lt;/p&gt;

&lt;p&gt;The evidence room should answer four questions without a sales call:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Which address can upgrade, pause, mint, seize, recover or change critical parameters?&lt;/li&gt;
&lt;li&gt;What contract, multisig, timelock or governance path controls that address?&lt;/li&gt;
&lt;li&gt;Which event or monitor reveals a change?&lt;/li&gt;
&lt;li&gt;What happens if the controller is compromised or unavailable?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;An immutable contract still needs an authority review. The answer may be "no upgrade path," but ownership, external dependencies and emergency behavior must remain visible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bind the audit to the release
&lt;/h2&gt;

&lt;p&gt;An audit report describes a scope at a point in time. Record the repository URL and commit hash beside it. Preserve the compiler settings, excluded components and deployed addresses in the same record. Then trace every finding to a remediation pull request, retest result or explicit risk acceptance.&lt;/p&gt;

&lt;p&gt;This avoids a common evidence break: the audit covers one commit while the deployment comes from a later branch with unreviewed changes. The team does not need to claim that an audit guarantees safety. It needs to show which code was reviewed and what changed afterward.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://scs.owasp.org/SCSVS/" rel="noopener noreferrer"&gt;OWASP Smart Contract Security Verification Standard&lt;/a&gt; can help structure the threat model and review scope. Its control groups cover architecture and code as well as governance, authorization and external interactions. Treat it as a control reference, not proof that the repository satisfies those controls.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run a 60-minute technical review
&lt;/h2&gt;

&lt;p&gt;A bounded live session is more discriminating than another capability deck:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Reviewer asks the delivery team to do&lt;/th&gt;
&lt;th&gt;Evidence produced&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0-10 minutes&lt;/td&gt;
&lt;td&gt;check out the named commit and build it with documented commands&lt;/td&gt;
&lt;td&gt;reproducible build or a concrete blocker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10-25 minutes&lt;/td&gt;
&lt;td&gt;run one unit path and one risk-based fuzz or invariant test&lt;/td&gt;
&lt;td&gt;test output plus an explanation of the property being checked&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;25-40 minutes&lt;/td&gt;
&lt;td&gt;walk through roles, upgrade paths and one compromised-admin scenario&lt;/td&gt;
&lt;td&gt;privilege map and containment decision&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;40-50 minutes&lt;/td&gt;
&lt;td&gt;trace one audit finding from scope commit to remediation&lt;/td&gt;
&lt;td&gt;commit-bound audit trail&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50-60 minutes&lt;/td&gt;
&lt;td&gt;replay a non-production deployment and inspect the handover package&lt;/td&gt;
&lt;td&gt;deployment receipt, address manifest and runbook&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The session is not a coding contest. It tests whether the release evidence remains coherent under inspection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hard stops that override the score
&lt;/h2&gt;

&lt;p&gt;Block or pause the release review when any of these remains unresolved:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a clean checkout cannot build without an undocumented machine or manual step.&lt;/li&gt;
&lt;li&gt;the audit report cannot be tied to a commit and declared scope.&lt;/li&gt;
&lt;li&gt;upgrade, pause, mint or deployment authority cannot be mapped to current controllers.&lt;/li&gt;
&lt;li&gt;a material static-analysis or audit finding is suppressed without rationale and ownership.&lt;/li&gt;
&lt;li&gt;production deployment depends on unrecorded console actions.&lt;/li&gt;
&lt;li&gt;a critical invariant has no test or explicit compensating control.&lt;/li&gt;
&lt;li&gt;the operator cannot monitor or contain the system without undocumented team-only knowledge.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A release can score well on six checks and still fail on unknown upgrade authority. Do not let arithmetic hide a control that can replace the code after review.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adapt the evidence request to the engagement
&lt;/h2&gt;

&lt;p&gt;During early discovery, finished code may not exist. Review the team's repository template and threat-model method instead. Inspect its CI gates and sample handover package separately. Mark future evidence as a delivery requirement.&lt;/p&gt;

&lt;p&gt;For non-EVM work, replace Solidity and Foundry with the target ecosystem's compiler and test framework. Substitute its analyzer and authority model for Slither and ERC-1967. The evidence jobs stay the same.&lt;/p&gt;

&lt;p&gt;A small immutable utility contract needs less ceremony than a protocol controlling treasury assets. It does not get a free pass on reproducible builds, authority mapping or release provenance. Scale the depth, not the existence, of the controls.&lt;/p&gt;

&lt;p&gt;Send this request before the sales call:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Please prepare a 60-minute technical review tied to one recent, representative release. First, show a sanitized repository or screen-share with a clean build, risk-mapped tests and static-analysis disposition. Then show the privileged-role map, non-production deployment rehearsal, commit-bound audit handoff and operational runbook. Do not share private keys or customer data. Omit confidential business logic as well.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The response shows whether another operator can reproduce the release without undocumented help.&lt;/p&gt;

</description>
      <category>solidity</category>
      <category>web3</category>
      <category>security</category>
      <category>blockchain</category>
    </item>
  </channel>
</rss>
