• Stars
    star
    358
  • Rank 118,855 (Top 3 %)
  • Language
    Solidity
  • License
    MIT License
  • Created over 6 years ago
  • Updated over 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Gas-Efficient Solidity DateTime Library



BokkyPooBah's DateTime Library

A gas-efficient Solidity date and time library.

Instead of using loops and lookup tables, this date conversions library uses formulae to convert year/month/day hour:minute:second to a Unix timestamp and back.

See BokkyPooBah’s Gas-Efficient Solidity DateTime Library for more explanations.

Thank you to Alex Kampa, James Zaki and Adrian Guerrera for helping to validate this library. Thanks also to Oleksii Matiiasevych for asking about leap seconds.



Table Of Contents



History

Version Date Notes
v1.00-pre-release May 25 2018 "Rarefaction" pre-release. I'm currently trying to get this library audited, so don't use in production mode yet.
v1.00-pre-release-a Jun 2 2018 "Rarefaction" pre-release a. Added the contracts/BokkyPooBahsDateTimeContract.sol wrapper for convenience.
Alex Kampa conducted a range of tests on the library.
v1.00-pre-release-b Jun 4 2018 "Rarefaction" pre-release b. Replaced public function with internal for easier EtherScan verification - a83e13b.
Deployed contracts/BokkyPooBahsDateTimeContract.sol with the inlined contracts/BokkyPooBahsDateTimeLibrary.sol to the Ropsten network at address 0x07239bb079094481bfaac91ca842426860021aaa
v1.00-pre-release-c June 8 2018 "Rarefaction" pre-release c. Added require(year >= 1970) to _daysFromDate(...) in 4002b27 as highlighted in James Zaki's audit
v1.00-pre-release-d Sep 1 2018 "Rarefaction" pre-release d. Added isValidDate(...) and isValidDateTime(...) in 380061b as highlighted in Adrian Guerrera's audit
v1.00 Sep 2 2018 "Rarefaction" release
v1.01 Feb 14 2019 "Notoryctes" release. Upgraded contracts to Solidity 0.5.x.
Updated to MIT Licence
v1.01 Feb 17 2019 Bug bounty added


Bug Bounty Scope And Donations

Details of the bug bounty program for this project can be found at BokkyPooBah's Hall Of Fame And Bug Bounties. Please consider donating to support the bug bounty, and the development and maintenance of decentralised applications.

The scope of the bug bounty for this project follows:



Deployment

v1.00 of the source code for BokkyPooBahsDateTimeContract.sol and TestDateTime.sol has been deployed to:

For each of the deployed contracts above, you can click on the Read Contract tab to test out the date/time/timestamp functions.



Questions And Answers

Questions by _dredge

User /u/_dredge asked the following questions:

Some Muslim countries have a Friday/Saturday weekend. Workday(1-7) may be more useful.

I presume leap seconds and such details are taken care of in the Unix timecode.

Some additional ideas for functions below.

Quarter calculations

weekNumber(1-53)

Complete years / months / weeks / days

Nearest years / months / weeks / days

Regarding regions and systems where Friday/Saturday are weekends, please use the function getDayOfWeek(timestamp) that returns 1 (= Monday, ..., 7 (= Sunday) to determine whether you should treat a day as a weekday or weekend.

See the next question regarding the leap seconds.

Regarding the additional ideas, thanks!


What about the leap second?

Asked by Oleksii Matiiasevych and /u/_dredge above.

For example, a leap second was inserted on Jan 01 1999.

From the first answer to Unix time and leap seconds:

The number of seconds per day are fixed with Unix timestamps.

The Unix time number is zero at the Unix epoch, and increases by exactly 86400 per day since the epoch.

So it cannot represent leap seconds. The OS will slow down the clock to accommodate for this. The leap seconds is simply not existent as far a Unix timestamps are concerned.

And from the second answer to Unix time and leap seconds:

Unix time is easy to work with, but some timestamps are not real times, and some timestamps are not unique times.

That is, there are some duplicate timestamps representing two different seconds in time, because in unix time the sixtieth second might have to repeat itself (as there can't be a sixty-first second). Theoretically, they could also be gaps in the future because the sixtieth second doesn't have to exist, although no skipping leap seconds have been issued so far.

Rationale for unix time: it's defined so that it's easy to work with. Adding support for leap seconds to the standard libraries is very tricky. ...

This library aims to replicate the Unix time functionality and assumes that leap seconds are handled by the underlying operating system.


What is the maximum year 2345?

Asked by Adrian Guerrera.

2345 is just an arbitrary number chosen for the year limit to test to. The algorithms should still work beyond this date.


Why are there no input validations to some of the functions?

Asked by Adrian Guerrera. Specifically, the functions _daysFromDate, timestampFromDate and timestampFromDateTime.

The date and time inputs should be validated before the values are passed to these functions. The validation functions isValidDate(...) and isValidDateTime(...) have now been added for this purpose.


Why are all variables 256-bit integers?

This library provides a cheap conversion between the timestamp and year/month/day hour:minute:second formats. There is no requirement for this library to store a packed structure to represent a DateTime as this data can be stored as a uint256 and converted on the fly to year/month/day hour:minute:second.


Why do you call this a gas-efficient library?

The formulae for converting between a timestamp and year/month/day hour:minute:second format uses a mathematically simple algorithm without any loops. The gas cost is relatively constant (as there are no loops) and the mathematical computations are relative cheap (compared to using loops and looking up data from storage).


Can this library be written more efficiently?

Most likely. The aim of this first version is for the conversions to be computed correctly.


How gas-efficient is this library?

From Gas Cost, timestampToDateTime(…) has an execution gas cost of 3,101 gas, and timestampFromDateTime(…) has an execution gas cost of 2,566 gas.



Conventions

All dates, times and Unix timestamps are UTC.

Unit Range Notes
timestamp >= 0 Unix timestamp, number of seconds since 1970/01/01 00:00:00 UTC
year 1970 ... 2345
month 1 ... 12
day 1 ... 31
hour 0 ... 23
minute 0 ... 59
second 0 ... 59
dayOfWeek 1 ... 7 1 = Monday, ..., 7 = Sunday
year/month/day 1970/01/01 ... 2345/12/31

_days, _months and _years variable names are _-prefixed as the non-prefixed versions are reserved words in Solidity.

All functions operate on the uint timestamp data type, except for functions prefixed with _.



Functions

_daysFromDate

Calculate the number of days _days from 1970/01/01 to year/month/day.

function _daysFromDate(uint year, uint month, uint day) public pure returns (uint _days)

NOTE This function does not validate the year/month/day input. Use isValidDate(...) to validate the input if necessary.


_daysToDate

Calculate year/month/day from the number of days _days since 1970/01/01 .

function _daysToDate(uint _days) public pure returns (uint year, uint month, uint day)

timestampFromDate

Calculate the timestamp to year/month/day.

function timestampFromDate(uint year, uint month, uint day) public pure returns (uint timestamp)

NOTE This function does not validate the year/month/day input. Use isValidDate(...) to validate the input if necessary.


timestampFromDateTime

Calculate the timestamp to year/month/day hour:minute:second UTC.

function timestampFromDateTime(uint year, uint month, uint day, uint hour, uint minute, uint second) public pure returns (uint timestamp)

NOTE This function does not validate the year/month/day hour:minute:second input. Use isValidDateTime(...) to validate the input if necessary.


timestampToDate

Calculate year/month/day from timestamp.

function timestampToDate(uint timestamp) public pure returns (uint year, uint month, uint day)

timestampToDateTime

Calculate year/month/day hour:minute:second from timestamp.

function timestampToDateTime(uint timestamp) public pure returns (uint year, uint month, uint day, uint hour, uint minute, uint second)

isValidDate

Is the date specified by year/month/day a valid date?

function isValidDate(uint year, uint month, uint day) internal pure returns (bool valid)


isValidDateTime

Is the date/time specified by year/month/day hour:minute:second a valid date/time?

function isValidDateTime(uint year, uint month, uint day, uint hour, uint minute, uint second) internal pure returns (bool valid)

isLeapYear

Is the year specified by timestamp a leap year?

function isLeapYear(uint timestamp) public pure returns (bool leapYear)

_isLeapYear

Is the specified year (e.g. 2018) a leap year?

function _isLeapYear(uint year) public pure returns (bool leapYear)

isWeekDay

Is the day specified by timestamp a weekday (Monday, ..., Friday)?

function isWeekDay(uint timestamp) public pure returns (bool weekDay)

isWeekEnd

Is the day specified by timestamp a weekend (Saturday, Sunday)?

function isWeekEnd(uint timestamp) public pure returns (bool weekEnd)

getDaysInMonth

Return the day in the month daysInMonth for the month specified by timestamp.

function getDaysInMonth(uint timestamp) public pure returns (uint daysInMonth)

_getDaysInMonth

Return the day in the month daysInMonth (1, ..., 31) for the month specified by the year/month.

function _getDaysInMonth(uint year, uint month) public pure returns (uint daysInMonth)

getDayOfWeek

Return the day of the week dayOfWeek (1 = Monday, ..., 7 = Sunday) for the date specified by timestamp.

function getDayOfWeek(uint timestamp) public pure returns (uint dayOfWeek)

getYear

Get the year of the date specified by timestamp.

function getYear(uint timestamp) public pure returns (uint year)

getMonth

Get the month of the date specified by timestamp.

function getMonth(uint timestamp) public pure returns (uint month)

getDay

Get the day of the month day (1, ..., 31) of the date specified timestamp.

function getDay(uint timestamp) public pure returns (uint day)

getHour

Get the hour of the date and time specified by timestamp.

function getHour(uint timestamp) public pure returns (uint hour)

getMinute

Get the minute of the date and time specified by timestamp.

function getMinute(uint timestamp) public pure returns (uint minute)

getSecond

Get the second of the date and time specified by timestamp.

function getSecond(uint timestamp) public pure returns (uint second)

addYears

Add _years years to the date and time specified by timestamp.

Note that the resulting day of the month will be adjusted if it exceeds the valid number of days in the month. For example, if the original date is 2020/02/29 and an additional year is added to this date, the resulting date will be an invalid date of 2021/02/29. The resulting date is then adjusted to 2021/02/28.

function addYears(uint timestamp, uint _years) public pure returns (uint newTimestamp)

addMonths

Add _months months to the date and time specified by timestamp.

Note that the resulting day of the month will be adjusted if it exceeds the valid number of days in the month. For example, if the original date is 2019/01/31 and an additional month is added to this date, the resulting date will be an invalid date of 2019/02/31. The resulting date is then adjusted to 2019/02/28.

function addMonths(uint timestamp, uint _months) public pure returns (uint newTimestamp)

addDays

Add _days days to the date and time specified by timestamp.

function addDays(uint timestamp, uint _days) public pure returns (uint newTimestamp)

addHours

Add _hours hours to the date and time specified by timestamp.

function addHours(uint timestamp, uint _hours) public pure returns (uint newTimestamp)

addMinutes

Add _minutes minutes to the date and time specified by timestamp.

function addMinutes(uint timestamp, uint _minutes) public pure returns (uint newTimestamp)

addSeconds

Add _seconds seconds to the date and time specified by timestamp.

function addSeconds(uint timestamp, uint _seconds) public pure returns (uint newTimestamp)

subYears

Subtract _years years from the date and time specified by timestamp.

Note that the resulting day of the month will be adjusted if it exceeds the valid number of days in the month. For example, if the original date is 2020/02/29 and a year is subtracted from this date, the resulting date will be an invalid date of 2019/02/29. The resulting date is then adjusted to 2019/02/28.

function subYears(uint timestamp, uint _years) public pure returns (uint newTimestamp)

subMonths

Subtract _months months from the date and time specified by timestamp.

Note that the resulting day of the month will be adjusted if it exceeds the valid number of days in the month. For example, if the original date is 2019/03/31 and a month is subtracted from this date, the resulting date will be an invalid date of 2019/02/31. The resulting date is then adjusted to 2019/02/28.

function subMonths(uint timestamp, uint _months) public pure returns (uint newTimestamp)

subDays

Subtract _days days from the date and time specified by timestamp.

function subDays(uint timestamp, uint _days) public pure returns (uint newTimestamp)

subHours

Subtract _hours hours from the date and time specified by timestamp.

function subHours(uint timestamp, uint _hours) public pure returns (uint newTimestamp)

subMinutes

Subtract _minutes minutes from the date and time specified by timestamp.

function subMinutes(uint timestamp, uint _minutes) public pure returns (uint newTimestamp)

subSeconds

Subtract _seconds seconds from the date and time specified by timestamp.

function subSeconds(uint timestamp, uint _seconds) public pure returns (uint newTimestamp)

diffYears

Calculate the number of years between the dates specified by fromTimeStamp and toTimestamp.

Note that this calculation is computed as getYear(toTimestamp) - getYear(fromTimestamp), rather that subtracting the years (since 1970/01/01) represented by both {to|from}Timestamp.

function diffYears(uint fromTimestamp, uint toTimestamp) public pure returns (uint _years)

diffMonths

Calculate the number of months between the dates specified by fromTimeStamp and toTimestamp.

Note that this calculation is computed as getYear(toTimestamp) * 12 + getMonth(toTimestamp) - getYear(fromTimestamp) * 12 - getMonth(fromTimestamp), rather that subtracting the months (since 1970/01/01) represented by both {to|from}Timestamp.

function diffMonths(uint fromTimestamp, uint toTimestamp) public pure returns (uint _months)

diffDays

Calculate the number of days between the dates specified by fromTimeStamp and toTimestamp.

Note that this calculation is computed as (toTimestamp - fromTimestamp) / SECONDS_PER_DAY, rather that subtracting the days (since 1970/01/01) represented by both {to|from}Timestamp.

function diffDays(uint fromTimestamp, uint toTimestamp) public pure returns (uint _days)

diffHours

Calculate the number of hours between the dates specified by fromTimeStamp and toTimestamp.

Note that this calculation is computed as (toTimestamp - fromTimestamp) / SECONDS_PER_HOUR, rather that subtracting the hours (since 1970/01/01) represented by both {to|from}Timestamp.

function diffHours(uint fromTimestamp, uint toTimestamp) public pure returns (uint _hours)

diffMinutes

Calculate the number of minutes between the dates specified by fromTimeStamp and toTimestamp.

Note that this calculation is computed as (toTimestamp - fromTimestamp) / SECONDS_PER_MINUTE, rather that subtracting the minutes (since 1970/01/01) represented by both {to|from}Timestamp.

function diffMinutes(uint fromTimestamp, uint toTimestamp) public pure returns (uint _minutes)

diffSeconds

Calculate the number of seconds between the dates specified by fromTimeStamp and toTimestamp.

Note that this calculation is computed as toTimestamp - fromTimestamp.

function diffSeconds(uint fromTimestamp, uint toTimestamp) public pure returns (uint _seconds)


Gas Cost

timestampToDateTime(...) Gas Cost

From executing the following function, the transaction gas cost is 24,693

> testDateTime.timestampToDateTime(1527120000)
[2018, 5, 24, 0, 0, 0]
> testDateTime.timestampToDateTime.estimateGas(1527120000)
24693

From Remix, the execution gas cost is 3,101 .

From my latest testing with Remix using Solidity 0.4.24:


timestampFromDateTime(...) Gas Cost

From executing the following function, the transaction gas cost is 25,054

> testDateTime.timestampFromDateTime(2018, 05, 24, 1, 2, 3)
1527123723
> testDateTime.timestampFromDateTime.estimateGas(2018, 05, 24, 1, 2, 3)
25054

From Remix, the execution gas cost is 2,566 .

From my latest testing with Remix using Solidity 0.4.24:


Remix Gas Estimates

Remix gas estimates using Solidity 0.4.24:

{
    "Creation": {
        "codeDepositCost": "908400",
        "executionCost": "942",
        "totalCost": "909342"
    },
    "External": {
        "DOW_FRI()": "1130",
        "DOW_MON()": "1262",
        "DOW_SAT()": "1064",
        "DOW_SUN()": "360",
        "DOW_THU()": "1108",
        "DOW_TUE()": "250",
        "DOW_WED()": "778",
        "OFFSET19700101()": "932",
        "SECONDS_PER_DAY()": "690",
        "SECONDS_PER_HOUR()": "580",
        "SECONDS_PER_MINUTE()": "1196",
        "_daysFromDate(uint256,uint256,uint256)": "638",
        "_daysToDate(uint256)": "1280",
        "_getDaysInMonth(uint256,uint256)": "885",
        "_isLeapYear(uint256)": "1115",
        "_now()": "997",
        "_nowDateTime()": "1562",
        "addDays(uint256,uint256)": "772",
        "addHours(uint256,uint256)": "662",
        "addMinutes(uint256,uint256)": "838",
        "addMonths(uint256,uint256)": "1851",
        "addSeconds(uint256,uint256)": "896",
        "addYears(uint256,uint256)": "1846",
        "diffDays(uint256,uint256)": "1207",
        "diffHours(uint256,uint256)": "503",
        "diffMinutes(uint256,uint256)": "316",
        "diffMonths(uint256,uint256)": "infinite",
        "diffSeconds(uint256,uint256)": "712",
        "diffYears(uint256,uint256)": "infinite",
        "getDay(uint256)": "1114",
        "getDayOfWeek(uint256)": "415",
        "getDaysInMonth(uint256)": "1120",
        "getHour(uint256)": "491",
        "getMinute(uint256)": "1373",
        "getMonth(uint256)": "1378",
        "getSecond(uint256)": "810",
        "getYear(uint256)": "1337",
        "isLeapYear(uint256)": "1633",
        "isValidDate(uint256,uint256,uint256)": "942",
        "isValidDateTime(uint256,uint256,uint256,uint256,uint256,uint256)": "1269",
        "isWeekDay(uint256)": "1284",
        "isWeekEnd(uint256)": "624",
        "subDays(uint256,uint256)": "1146",
        "subHours(uint256,uint256)": "288",
        "subMinutes(uint256,uint256)": "992",
        "subMonths(uint256,uint256)": "2363",
        "subSeconds(uint256,uint256)": "1336",
        "subYears(uint256,uint256)": "1871",
        "timestampFromDate(uint256,uint256,uint256)": "718",
        "timestampFromDateTime(uint256,uint256,uint256,uint256,uint256,uint256)": "1077",
        "timestampToDate(uint256)": "infinite",
        "timestampToDateTime(uint256)": "1945"
    }
}


Algorithm

The formulae to convert year/month/day hour:minute:second to a Unix timestamp and back use the algorithms from Converting Between Julian Dates and Gregorian Calendar Dates. These algorithms were originally designed by Fliegel and van Flandern (1968).

Note that these algorithms depend on negative numbers, so Solidity unsigned integers uint are converted to signed integers int to compute the date conversions and the results are converted back to uint for general use.


Converting YYYYMMDD to Unix Timestamp

The Fortran algorithm follows:

    INTEGER FUNCTION JD (YEAR,MONTH,DAY)
C
C---COMPUTES THE JULIAN DATE (JD) GIVEN A GREGORIAN CALENDAR
C   DATE (YEAR,MONTH,DAY).
C
    INTEGER YEAR,MONTH,DAY,I,J,K
C
    I= YEAR
    J= MONTH
    K= DAY
C
    JD= K-32075+1461*(I+4800+(J-14)/12)/4+367*(J-2-(J-14)/12*12)
   2    /12-3*((I+4900+(J-14)/12)/100)/4
C
    RETURN
    END

Translating this formula, and subtracting an offset (2,440,588) so 1970/01/01 is day 0:

days = day
     - 32075
     + 1461 * (year + 4800 + (month - 14) / 12) / 4
     + 367 * (month - 2 - (month - 14) / 12 * 12) / 12
     - 3 * ((year + 4900 + (month - 14) / 12) / 100) / 4
     - offset

Converting Unix Timestamp To YYYYMMDD

The Fortran algorithm follows:

    SUBROUTINE GDATE (JD, YEAR,MONTH,DAY)
C
C---COMPUTES THE GREGORIAN CALENDAR DATE (YEAR,MONTH,DAY)
C   GIVEN THE JULIAN DATE (JD).
C
    INTEGER JD,YEAR,MONTH,DAY,I,J,K
C
    L= JD+68569
    N= 4*L/146097
    L= L-(146097*N+3)/4
    I= 4000*(L+1)/1461001
    L= L-1461*I/4+31
    J= 80*L/2447
    K= L-2447*J/80
    L= J/11
    J= J+2-12*L
    I= 100*(N-49)+I+L
C
    YEAR= I
    MONTH= J
    DAY= K
C
    RETURN
    END

Translating this formula and adding an offset (2,440,588) so 1970/01/01 is day 0:

int L = days + 68569 + offset
int N = 4 * L / 146097
L = L - (146097 * N + 3) / 4
year = 4000 * (L + 1) / 1461001
L = L - 1461 * year / 4 + 31
month = 80 * L / 2447
dd = L - 2447 * month / 80
L = month / 11
month = month + 2 - 12 * L
year = 100 * (N - 49) + year + L


Testing

Details of the testing environment can be found in test.

The DateTime library calculations have been tested for the date range 1970/01/01 to 2345/12/01 for periodically sampled dates.

The following functions were tested using the script test/01_test1.sh with the summary results saved in test/test1results.txt and the detailed output saved in test/test1output.txt:

  • Deploy contracts/BokkyPooBahsDateTimeLibrary.sol library
  • Deploy contracts/TestDateTime.sol contract
  • Test isValidDate(...)
  • Test isValidDateTime(...)
  • Test isLeapYear(...)
  • Test _isLeapYear(...)
  • Test isWeekDay(...)
  • Test isWeekEnd(...)
  • Test getDaysInMonth(...)
  • Test _getDaysInMonth(...)
  • Test getDayOfWeek(...)
  • Test get{Year|Month|Day|Hour|Minute|Second}(...)
  • Test add{Years|Months|Days|Hours|Minutes|Seconds}(...)
  • Test sub{Years|Months|Days|Hours|Minutes|Seconds}(...)
  • Test diff{Years|Months|Days|Hours|Minutes|Seconds}(...)
  • For a range of Unix timestamps from 1970/01/01 to 2345/12/21
    • Generate the year/month/day hour/minute/second from the Unix timestamp using timestampToDateTime(...)
    • Generate the Unix timestamp from the calculated year/month/day hour/minute/second using timestampFromDateTime(...)
    • Compare the year/month/day hour/minute/second to the JavaScript Date calculation


References

A copy of the webpage with the algorithm Converting Between Julian Dates and Gregorian Calendar Dates has been saved to docs/ConvertingBetweenJulianDatesAndGregorianCalendarDates.pdf as some people have had difficulty accessing this page.



Enjoy!

(c) BokkyPooBah / Bok Consulting Pty Ltd - Feb 17 2019. The MIT Licence.

More Repositories

1

TokenTrader

TokenTrader And TokenSeller Decentralised Trustless Exchange Contract
Shell
146
star
2

BokkyPooBahsRedBlackTreeLibrary

BokkyPooBah's Red-Black Binary Search Tree Library
Solidity
143
star
3

WeenusTokenFaucet

An ERC20 token faucet on the Ethereum mainnet, layer 2s and testnets
Solidity
118
star
4

Tokens

Tokens, Tokens, Tokens
Solidity
107
star
5

BokkyPooBahsTokenTeleportationServiceSmartContract

BokkyPooBah's Token Teleportation Service Smart Contract
Shell
78
star
6

MagicalInternetMoney

Magical Internet Money - EVM chain crypto asset manager, with support for ERC-5564 Stealth Addresses and ERC-6538: Stealth Meta-Address Registry (WIP)
JavaScript
55
star
7

SolidityFlattener

A Simple-To-Install Solidity Flattener
Solidity
52
star
8

Nix

Nix - NFT Decentralised Exchange Smart Contracts
Solidity
42
star
9

BokkyPooBahsEthereumWorkshop

BokkyPooBah's Ethereum Workshop Workspace
29
star
10

BokkysCheatsheet

BokkyPooBah's CheatSheet
25
star
11

EthereumFoos

A Curated List Of Costly Ethereum Mistakes To Learn From (WIP)
24
star
12

chadex

Fully on-chain orderbook ERC-20/ERC-20 DEX using Red-Black Trees and Queues (WIP)
Solidity
24
star
13

DecentralisedFutureFundDAO

Decentralised Future Fund DAO
Solidity
23
star
14

umswap

umswap - "Like WETH, but for ERC-721s"
Solidity
15
star
15

MoonCatTools

Tools to manage your MoonCats. Note that there is a vulnerability in the smart contract if sellers accept bids, through front-running to alter the amount the seller receives!
Shell
14
star
16

Index

Index To BokkyPooBah's GitHub Repositories
13
star
17

Blockswap

Swapping of tokens from Waves to Ethereum and back
JavaScript
12
star
18

aenus

aenus advanced ENS and NFT utilities
JavaScript
11
star
19

SecurityToken

Security Token (WIP)
Solidity
11
star
20

ParityMultisigRecoveryReconciliation

Parity Multisig Vulnerability - White Hat Group Rescue Reconciliation
Shell
11
star
21

BeeeefRegistry

Beeeef Registry
Solidity
11
star
22

CryptoPunksData

CryptoPunks Historical Event Browser Dapp @ https://bokkypoobah.github.io/CryptoPunksData/
Solidity
10
star
23

FixedSupplyTokenFactory

Fixed Supply Token 👊 Contract + Factory - A Token Contract Vending Machine
JavaScript
10
star
24

Banananas

Small web3 dapp to browse banananas created by the Boring Banana Co (not associated). Web3 UI at https://bokkypoobah.github.io/Banananas/
JavaScript
10
star
25

NFTAnnuity

Get a loan on your CryptoPunk, ERC-721 & ERC-1177 NFTs
Solidity
9
star
26

DividendPayingTokenContract

Dividend Paying Token Contract - NOTE THAT THIS IS FOR AN EXERCISE!
Solidity
9
star
27

DEXWallet

Decentralised Exchange Wallet
Solidity
9
star
28

TheDAOVoter

Perl script to list and vote on The DAO proposals
Perl
8
star
29

LiveEduCrowdsaleContractAudit

LiveEdu Crowdsale Contract Audit
Shell
7
star
30

BancorCrowdsaleAnalysis

Bancor Crowdsale Analysis
Shell
7
star
31

ClubEth

ClubEth App Smart Contract
Solidity
7
star
32

NFTPostcardApp

BabyZombies ERC-1155 NFT
JavaScript
7
star
33

ZombieBabyOpenEdition

An ERC-1155 Non-Fungible Token contract based on OpenZeppelin v4.0.0
Solidity
7
star
34

EthereumForBunnies

Ethereum For Bunnies
7
star
35

ProxyFactoryTest

ProxyFactory contract for cheaper gas deployment of cloned contracts
Solidity
7
star
36

GetStartedWithDevelopingInEthereum

Getting Started In Ethereum, with an interactive ERC-20, ERC-721 and ERC-1155 token contract explorer dapp
Solidity
7
star
37

BestBastardGANPunks

SMOL WEB3 DAPP FOR LISTING OF BASTARD GAN PUNKS V2 (NOT AFFILIATED WITH THOSE LOSER BASTARDS https://bastardganpunks.club/). Web3 UI at https://bokkypoobah.github.io/BestBastardGANPunks/
JavaScript
6
star
38

ExploringCryptoPunksOnChain

Small Web3 UI to exploring CryptoPunks on-chain data.
JavaScript
5
star
39

NixApp

Nix App - NFT Decentralised Exchange Web3 UI
5
star
40

InvestFeedCrowdsaleAudit

InvestFeed Crowdsale Audit
Shell
5
star
41

TopSecrets

Recipe to build a TopSecrets read-only offline crypto device
HTML
5
star
42

ApprovalTool

Lightweight tool to manage your approvals for ERC-20, ERC-721 and ERC-1155 token contracts
5
star
43

TheDAOETCTokenBalance

Scripts and data to compute the balances of The DAO token holders on the Ethereum Classic chain
Shell
4
star
44

MemeCoinData

Tool to scrape data related to ERC-20 tokens
4
star
45

txs

Txs - Ethereum Transaction Reporter
4
star
46

BokkyPooBahsEth2.0ValidatorNodeRecipe

BokkyPooBahs eth 2.0 validator node cheat sheet
3
star
47

GnosisMultisigCli

Gnosis Multisig Command Line Interface - WIP
Perl
3
star
48

BokkyPooBahsHallOfFameAndBugBounties

BokkyPooBah's Hall Of Fame
3
star
49

MoonCatExplainer

MoonCatExplainer
JavaScript
3
star
50

TheDAOData

Data related to The DAO
Shell
3
star
51

TestToadz

TestToadz - ERC-721 Testnet Faucets
Solidity
3
star
52

OpenANXTokenOld

OpenANX Decentralised Exchange Token Sale Smart Contract - moved to https://github.com/openanx/OpenANXToken
Shell
3
star
53

FindGNTTokenTrader

Find Golem Network Token (GNT) TokenTrader Information
Shell
3
star
54

MoonCatToolsApp

MoonCat Tools App (WIP)
2
star
55

ensutils

ENS Utilities
2
star
56

EthereumWalletMultisigTest

Ethereum Wallet Multisig Test
2
star
57

CryptoPosition4MacExcel

Crypto Position For Excel On The Mac
2
star
58

EthereumNetworkAttackData

Data relating to the Ethereum network attacks between Sep 18 2016 and Oct 20 2016
Perl
2
star
59

MoonCatListing

Shell
2
star
60

RAREPeperiumToken

RARE Peperium Token
Shell
2
star
61

MusteringMoonCats

Mustering MoonCats
2
star
62

EtherVendingMachine

Ethereum Vending Machine
2
star
63

Workshop162

Workshop #162 Buidling - Unstoppable Dapps From 0 To Go - ETH ❤️ ENS ❤️ IPFS #1
JavaScript
2
star
64

TokenCardICOAnalysis

TokenCard ICO Analysis
Shell
2
star
65

LOST

LOST - Your Personal NFT Organiser And Gem Explorer
JavaScript
2
star
66

ProofOfPepesInfo

Some info on the Proof of Pepes NFT Collection (not affiliated)
2
star
67

HashDemons

HashDemons
JavaScript
2
star
68

BokkyPooBahsEtherRefundablePrize

BokkyPooBah's Ether Refundable Prize (BERP)
Shell
2
star
69

VictoriasSecrets

Royalty Class Online/Offline Wallet For EVM Chains (WIP)
2
star
70

ConsenSysMultiSigWalletAudit

ConsenSys/Gnosis MultiSig Wallet Audit (WIP, Bug Bounty Available)
JavaScript
2
star
71

AkropolisSaleContractAudit

Audit of https://github.com/akropolisio/akropolis-sale (fork link now broken)
JavaScript
2
star
72

TokenExplorer

ERC-20, ERC-721 and ERC-1155 Token Explorer
2
star
73

BestENSNames

ENS Portfolio Manager (WIP)
2
star
74

SentinelChainTokenContractAudit

Sentinel Chain Token Contract Audit
JavaScript
1
star
75

BATICOAnalysis

BAT ICO Analysis
Shell
1
star
76

CryptoDickButtsOnChain

CryptoDickButtsOnChain
Solidity
1
star
77

TheDAOETCDrains

Scripts and data related to the draining of The DAO on the Ethereum ETC chain
Shell
1
star
78

TheDAORefundsCalcs

Some calculations relating to The DAO Refunds
Shell
1
star
79

OAXSwimGatewayStableCoinContractAudit

JavaScript
1
star
80

MobileGoToken

MobileGo Token
1
star
81

FunFairCrowdsaleContractAudit

FunFair Crowdsale Contract Audit
Shell
1
star
82

PrivatixCrowdsaleContractAudit

Privatix Crowdsale Contract Audit
JavaScript
1
star
83

DaoCasinoTokenSaleContractAudit

Dao.Casino Crowdsale Contract
Shell
1
star
84

Dexy

Decentralised Exchange (Work in progress)
JavaScript
1
star
85

TokenToolz

Token Toolz
Solidity
1
star
86

AuctionFactory

Auction Factory
Solidity
1
star
87

Registry

Registry
Solidity
1
star
88

MyFinalFormInfo

My Final Form (not associated) Data
Solidity
1
star
89

AHistoryOfPunksInScreenshots

A History Of Punks In Screenshots
1
star
90

ENSAuctionToken

ENS Auction Token
1
star
91

GlicPixxxSurfer

GLICPIXXXVER002 Surfer
1
star
92

BestLunarToken

ZOMBIE BGANPunks LunarToken Advanced Occupation Base 135. Not affiliated.
Solidity
1
star
93

onchainmyheart

onchainmy❤
Solidity
1
star
94

FxxxLandRush

Fxxx Land Rush
Solidity
1
star
95

HoprTokenAudit

HOPR ERC-777 Token Contract Audit
Solidity
1
star
96

NFTSpreads

NFT Spreads
1
star
97

BGANPUNKToolsApp

Bastard GAN Punks Tools App
JavaScript
1
star
98

chadmode

chadmode
1
star