Skip to content

**Bug Report: SDK Examples Use Non-Functional Primitives on V1 Devnet** #129

@tokiohub

Description

@tokiohub

Environment

Summary
Multiple SDK examples fail systematically due to non-functional Pod primitives, while equivalent standard Solidity implementations work correctly.

Root Cause Analysis
Based on source code review, requireTimeBefore() internally calls requireQuorum():

function requireTimeBefore(Time.Timestamp _timestamp, string memory _message) view {
    requireQuorum(Time.currentTime().lt(_timestamp), _message);
}

Repository Inconsistency

  • /examples/ directory: Uses non-functional Pod primitives
  • /docs/ within same repo: Shows working contracts with standard Solidity
  • Production contract (0x217F5658c6ecC27D439922263AD9Bb8e992e0373): Uses block.timestamp successfully
  • This creates confusion for developers following official examples

Affected Components

1. requireTimeBefore() - Auction Example

  • File: examples/solidity/src/Auction.sol
  • Issue: All calls to requireTimeBefore() result in failed transactions (status 0)
  • Evidence: Contract 0xfE4Ae4B2aAa8B686916F203AAB9939c40b22284B, all deadline values tested
  • Workaround: require(block.timestamp <= deadline) works (status 1)

2. requireQuorum() - Tokens Example

  • File: examples/tokens/contracts/Tokens.sol
  • Issue: requireQuorum() for balance validation causes transfer failures
  • Evidence: Contract 0x6eb77940fD64d791eb3B443b49a0073ad4cF22E0, all transfer attempts fail
  • Workaround: Standard require() works

3. FastTypes.Balance

  • Multiple examples using FastTypes.Balance
  • Issue: Systematic transfer failures across different contracts
  • Workaround: Standard mapping works

Working Examples

  • Voting, NFTs, Notary, HashChallenge function correctly
  • These use events, basic state, and simple Pod patterns
  • Standard Solidity patterns work as expected

Technical Evidence

  • 22 validator attestations received per transaction
  • Normal gas consumption and finality (~200ms)
  • Infrastructure functioning correctly
  • Issue isolated to specific primitives that depend on requireQuorum()

Contract Addresses Available for Investigation

  • Failing Auction: 0xfE4Ae4B2aAa8B686916F203AAB9939c40b22284B
  • Failing Tokens: 0x6eb77940fD64d791eb3B443b49a0073ad4cF22E0
  • Working contracts: Multiple addresses available upon request

Proposed Solutions

  1. Fix requireQuorum() implementation on devnet
  2. Update SDK examples to use working patterns consistent with documentation
  3. Add clear documentation about primitive limitations on devnet
  4. Align /examples/ directory with production patterns shown in /docs/

Impact
Developers following official examples get non-functional contracts, potentially blocking devnet adoption and creating frustration for early adopters.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions