diff --git a/.github/workflows/publish-soldeer.yaml b/.github/workflows/publish-soldeer.yaml new file mode 100644 index 0000000..b57bdc2 --- /dev/null +++ b/.github/workflows/publish-soldeer.yaml @@ -0,0 +1,9 @@ +name: Publish to Soldeer +on: + push: + tags: + - "v*" +jobs: + publish: + uses: rainlanguage/rainix/.github/workflows/publish-soldeer.yaml@main + secrets: inherit diff --git a/.github/workflows/rainix.yaml b/.github/workflows/rainix.yaml index 2d015f4..612abd5 100644 --- a/.github/workflows/rainix.yaml +++ b/.github/workflows/rainix.yaml @@ -1,48 +1,6 @@ -name: Rainix CI +name: rainix on: [push] - jobs: rainix: - strategy: - matrix: - os: [ubuntu-latest] - task: [rainix-sol-test, rainix-sol-static, rainix-sol-legal] - fail-fast: false - runs-on: ${{ matrix.os }} - env: - DEPLOYMENT_KEY: ${{ github.ref == 'refs/heads/main' && secrets.PRIVATE_KEY || secrets.PRIVATE_KEY_DEV }} - steps: - - uses: actions/checkout@v4 - with: - submodules: recursive - fetch-depth: 0 - - - uses: nixbuild/nix-quick-install-action@v30 - with: - nix_conf: | - keep-env-derivations = true - keep-outputs = true - - name: Restore and save Nix store - uses: nix-community/cache-nix-action@v6 - with: - # restore and save a cache using this key - primary-key: nix-${{ runner.os }}-${{ hashFiles('**/*.nix', '**/flake.lock') }} - # if there's no cache hit, restore a cache by this prefix - restore-prefixes-first-match: nix-${{ runner.os }}- - # collect garbage until the Nix store size (in bytes) is at most this number - # before trying to save a new cache - # 1G = 1073741824 - gc-max-store-size-linux: 1G - - - run: nix develop --command rainix-sol-prelude - - name: Run ${{ matrix.task }} - env: - ETH_RPC_URL: ${{ secrets.CI_DEPLOY_SEPOLIA_RPC_URL || vars.CI_DEPLOY_SEPOLIA_RPC_URL }} - ETHERSCAN_API_KEY: ${{ secrets.EXPLORER_VERIFICATION_KEY }} - DEPLOY_BROADCAST: '' - DEPLOY_VERIFIER: '' - DEPLOY_METABOARD_ADDRESS: ${{ vars.CI_DEPLOY_SEPOLIA_METABOARD_ADDRESS }} - CI_FORK_SEPOLIA_BLOCK_NUMBER: ${{ vars.CI_FORK_SEPOLIA_BLOCK_NUMBER }} - CI_FORK_SEPOLIA_DEPLOYER_ADDRESS: ${{ vars.CI_FORK_SEPOLIA_DEPLOYER_ADDRESS }} - CI_DEPLOY_SEPOLIA_RPC_URL: ${{ secrets.CI_DEPLOY_SEPOLIA_RPC_URL || vars.CI_DEPLOY_SEPOLIA_RPC_URL }} - run: nix develop --command ${{ matrix.task }} \ No newline at end of file + uses: rainlanguage/rainix/.github/workflows/rainix-sol.yaml@main + secrets: inherit diff --git a/.gitignore b/.gitignore index 321bd3a..f316912 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,13 @@ out cache +dependencies result .env meta target docs .DS_Store +.pre-commit-config.yaml # This is for our deploy scripts that report the addresses of deployed contracts -deployments \ No newline at end of file +deployments diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 31e42cc..0000000 --- a/.gitmodules +++ /dev/null @@ -1,6 +0,0 @@ -[submodule "lib/rain.solmem"] - path = lib/rain.solmem - url = https://github.com/rainlanguage/rain.solmem -[submodule "lib/openzeppelin-contracts"] - path = lib/openzeppelin-contracts - url = https://github.com/OpenZeppelin/openzeppelin-contracts diff --git a/.soldeerignore b/.soldeerignore new file mode 100644 index 0000000..b51fd62 --- /dev/null +++ b/.soldeerignore @@ -0,0 +1,29 @@ +.DS_Store +.coderabbitai.yaml +.gas-snapshot +.git +.github +.gitignore +.gitmodules +.pre-commit-config.yaml +.soldeerignore +.vscode +CLAUDE.md +/audit +/cache +/dependencies +/deployments +/docs +/flake.lock +/flake.nix +/foundry.lock +/foundry.toml +/lib +/meta +/out +/remappings.txt +/result +/slither.config.json +/soldeer.lock +/target +/test diff --git a/README.md b/README.md index ecc1a61..d8dc389 100644 --- a/README.md +++ b/README.md @@ -1,61 +1,63 @@ # rain.string -Tools for working with strings that we've found useful to build Rainlang. +Low-level string and parsing primitives used to build Rainlang. Specialised +parsing logic lives in dedicated Rainlang repos; this is the broadly-applicable, +gas-efficient base. -More specialised and complex parsing logic exists in other Rainlang repos, but -this stuff is broadly applicable and low level enough to be gas efficient enough -to do what needs to be done. +Parsing in Rainlang works like a bloom filter over individual characters. Read a +byte from memory, bit-shift, compare against a 32-byte mask representing +characters of interest (e.g. `0-9`, or `a-zA-Z0-9`). No regexes, in-memory sets, +or loops — every ASCII char fits unambiguously in a single 32-byte EVM word. -Generally parsing in rainlang works like a bloom filter on individual characters. -We read characters from memory one byte at a time then bit shift to compare it -against a bitmap mask that represents characters of interest. For example we -might need to know if a character is numeric `0-9` or alphanumeric `a-zA-Z0-9`, -and we cannot rely on regexes, in-memory sets, or even loops, that might be -easily at hand for similar tasks in other languages. +## Install -Luckily, EVM values are 32 bytes and so we can fit all posssible ASCII characters -in a single value as a bloom without any ambiguity. +Via [soldeer](https://soldeer.xyz): -## Dev stuff - -### Local environment & CI +```sh +forge soldeer install rain-string~ +``` -Uses nixos. +## Develop -Install `nix develop` - https://nixos.org/download.html. +This repo uses [nix](https://nixos.org/download.html). The default shell is the +slim `sol-shell` from [rainix](https://github.com/rainlanguage/rainix). -Run `nix develop` in this repo to drop into the shell. Please ONLY use the nix -version of `foundry` for development, to ensure versions are all compatible. +```sh +nix develop # enter the shell +forge soldeer install # install deps declared in foundry.toml +forge test +``` -Read the `flake.nix` file to find some additional commands included for dev and -CI usage. +Tasks: -## Legal stuff +- `rainix-sol-test` — `forge test` +- `rainix-sol-static` — slither +- `rainix-sol-legal` — `reuse lint` -Everything is under DecentraLicense 1.0 (DCL-1.0) which can be found in `LICENSES/`. +Use the nix-pinned `forge` for all development. -This is basically `CAL-1.0` which is an open source license -https://opensource.org/license/cal-1-0 +## Publish -The non-legal summary of DCL-1.0 is that the source is open, as expected, but -also user data in the systems that this code runs on must also be made available -to those users as relevant, and that private keys remain private. +Tag `v` on `main`. The +[`Publish to Soldeer`](.github/workflows/publish-soldeer.yaml) wrapper delegates +to rainix's reusable workflow, which derives the package name from the repo name +(`rain.string` → `rain-string`). -Roughly it's "not your keys, not your coins" aware, as close as we could get in -legalese. +## License -This is the default situation on permissionless blockchains, so shouldn't require -any additional effort by dev-users to adhere to the license terms. +DecentraLicense 1.0 (DCL-1.0) — full text in +[`LICENSES/`](LICENSES/LicenseRef-DCL-1.0.txt). Roughly `CAL-1.0` +([opensource.org](https://opensource.org/license/cal-1-0)) plus user-data +disclosure obligations consistent with permissionless-blockchain assumptions. -This repo is REUSE 3.2 compliant https://reuse.software/spec-3.2/ and compatible -with `reuse` tooling (also available in the nix shell here). +This repo is [REUSE 3.2](https://reuse.software/spec-3.2/) compliant. Verify +locally: -``` +```sh nix develop -c rainix-sol-legal ``` ## Contributions -Contributions are welcome **under the same license** as above. - -Contributors agree and warrant that their contributions are compliant. \ No newline at end of file +Welcome under the same license. Contributors warrant that their contributions +are compliant. diff --git a/REUSE.toml b/REUSE.toml index ba81de4..9367466 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -2,19 +2,22 @@ version = 1 [[annotations]] path = [ - ".gas-snapshot", - ".github/workflows/**/", - ".vscode/**/", - ".gitignore", - ".gitmodules", - "audit/**/", - "README.md", - "flake.lock", - "flake.nix", - "foundry.toml", - "slither.config.json", - "REUSE.toml", - "foundry.lock", + ".gas-snapshot", + ".github/workflows/**/", + ".vscode/**/", + ".gitignore", + ".gitmodules", + ".soldeerignore", + "audit/**/", + "README.md", + "flake.lock", + "flake.nix", + "foundry.toml", + "remappings.txt", + "slither.config.json", + "REUSE.toml", + "foundry.lock", + "soldeer.lock", ] SPDX-FileCopyrightText = "Copyright (c) 2020 Rain Open Source Software Ltd" SPDX-License-Identifier = "LicenseRef-DCL-1.0" diff --git a/flake.lock b/flake.lock index 6c8f51a..91cd50b 100644 --- a/flake.lock +++ b/flake.lock @@ -1,5 +1,21 @@ { "nodes": { + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1767039857, + "narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=", + "owner": "NixOS", + "repo": "flake-compat", + "rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "flake-compat", + "type": "github" + } + }, "flake-utils": { "inputs": { "systems": "systems" @@ -75,11 +91,11 @@ "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1768892915, - "narHash": "sha256-2+KHmLLjUg9vNzINfGaiFNP07gKz94Af09FcefKHUuE=", + "lastModified": 1773213477, + "narHash": "sha256-Pv1Z3QqGkSGEUV+9pM5vYIiI7VJo7Tfm6ZmR+JSp1zo=", "owner": "shazow", "repo": "foundry.nix", - "rev": "edf14357ad1816ac39469ae493f898200352d77d", + "rev": "3c73daa86c823d706824fd9bbcb85aa23fd0f668", "type": "github" }, "original": { @@ -88,6 +104,48 @@ "type": "github" } }, + "git-hooks-nix": { + "inputs": { + "flake-compat": "flake-compat", + "gitignore": "gitignore", + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1774104215, + "narHash": "sha256-EAtviqz0sEAxdHS4crqu7JGR5oI3BwaqG0mw7CmXkO8=", + "owner": "cachix", + "repo": "git-hooks.nix", + "rev": "f799ae951fde0627157f40aec28dec27b22076d0", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "git-hooks.nix", + "type": "github" + } + }, + "gitignore": { + "inputs": { + "nixpkgs": [ + "rainix", + "git-hooks-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1709087332, + "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, "nixpkgs": { "locked": { "lastModified": 1666753130, @@ -120,11 +178,27 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1768987938, - "narHash": "sha256-pvqBRTCRvwFM0Nm7aCQfqS0whDZ7WwoXUUTwvOXqus4=", + "lastModified": 1770073757, + "narHash": "sha256-Vy+G+F+3E/Tl+GMNgiHl9Pah2DgShmIUBJXmbiQPHbI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "47472570b1e607482890801aeaf29bfb749884f6", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1776017067, + "narHash": "sha256-oEp8fqJweZd5doqvH/aBAtc6NzZh+fh0tOhR09gQXck=", "owner": "nixos", "repo": "nixpkgs", - "rev": "95d8e2129409fd37b390c966b434eee3034f75e3", + "rev": "a5a7cf16648d79134eb4da0e3354b08913917b2f", "type": "github" }, "original": { @@ -133,7 +207,7 @@ "type": "github" } }, - "nixpkgs_3": { + "nixpkgs_4": { "locked": { "lastModified": 1744536153, "narHash": "sha256-awS2zRgF4uTwrOKwwiJcByDzDOdo3Q1rPZbiHQg/N38=", @@ -149,13 +223,13 @@ "type": "github" } }, - "nixpkgs_4": { + "nixpkgs_5": { "locked": { - "lastModified": 1766653575, - "narHash": "sha256-TPgxCS7+hWc4kPhzkU5dD2M5UuPhLuuaMNZ/IpwKQvI=", + "lastModified": 1771923393, + "narHash": "sha256-Fy0+UXELv9hOE8WjYhJt8fMDLYTU2Dqn3cX4BwoGBos=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "3c1016e6acd16ad96053116d0d3043029c9e2649", + "rev": "ea7f1f06811ce7fcc81d6c6fd4213150c23edcf2", "type": "github" }, "original": { @@ -169,17 +243,18 @@ "inputs": { "flake-utils": "flake-utils_2", "foundry": "foundry", - "nixpkgs": "nixpkgs_2", + "git-hooks-nix": "git-hooks-nix", + "nixpkgs": "nixpkgs_3", "nixpkgs-old": "nixpkgs-old", "rust-overlay": "rust-overlay", "solc": "solc" }, "locked": { - "lastModified": 1768991906, - "narHash": "sha256-W8AgvEKkz4BWTHDK3AGwk/vvVFtIF7UtHuZI8Ecv2qI=", + "lastModified": 1778356755, + "narHash": "sha256-1mMP/qepO/oyFx1zAAYGDXeWqIiGbIUtL+EzJdb7h18=", "owner": "rainprotocol", "repo": "rainix", - "rev": "5a9f13de1318b512ef118db6d0e7f9dbafe5205f", + "rev": "db62d884566bef2d69eab976217caf6c1bcd1d75", "type": "github" }, "original": { @@ -196,14 +271,14 @@ }, "rust-overlay": { "inputs": { - "nixpkgs": "nixpkgs_3" + "nixpkgs": "nixpkgs_4" }, "locked": { - "lastModified": 1768963622, - "narHash": "sha256-n6VHiUgrYD9yjagzG6ncVVqFbVTsKCI54tR9PNAFCo0=", + "lastModified": 1773216618, + "narHash": "sha256-iZlowevS+xKLGOXtZwpIrz3SWe7PtoGUfEeVZNib+WE=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "2ef5b3362af585a83bafd34e7fc9b1f388c2e5e2", + "rev": "07d7dc6fcc5eae76b4fb0e19d4afd939437bec97", "type": "github" }, "original": { @@ -215,15 +290,15 @@ "solc": { "inputs": { "flake-utils": "flake-utils_4", - "nixpkgs": "nixpkgs_4", + "nixpkgs": "nixpkgs_5", "solc-macos-amd64-list-json": "solc-macos-amd64-list-json" }, "locked": { - "lastModified": 1768831671, - "narHash": "sha256-0mmlYRtZK+eomevkQCCH7PL8QlSuALZQsjLroCWGE08=", + "lastModified": 1772085240, + "narHash": "sha256-+NEcuhT2A0QQumVx9Ze6g2iuNicyuW028Jq/HUJHGh4=", "owner": "hellwolf", "repo": "solc.nix", - "rev": "80ad871b93d15c7bccf71617f78f73c2d291a9c7", + "rev": "d3cc119973e484ea366f4b997b404bb00d7829ca", "type": "github" }, "original": { @@ -235,13 +310,13 @@ "solc-macos-amd64-list-json": { "flake": false, "locked": { - "narHash": "sha256-P+ZslplK4cQ/wnV/wykVKb+yTCviI0eylA3sk9uHmRo=", + "narHash": "sha256-oEiXc95EghuYCudzkPA9XBFOnMdgWFfTO2/4XUfSTpc=", "type": "file", - "url": "https://github.com/argotorg/solc-bin/raw/a11f1ad/macosx-amd64/list.json" + "url": "https://github.com/argotorg/solc-bin/raw/83cb756/macosx-amd64/list.json" }, "original": { "type": "file", - "url": "https://github.com/argotorg/solc-bin/raw/a11f1ad/macosx-amd64/list.json" + "url": "https://github.com/argotorg/solc-bin/raw/83cb756/macosx-amd64/list.json" } }, "systems": { diff --git a/flake.nix b/flake.nix index 640ac76..ce576f2 100644 --- a/flake.nix +++ b/flake.nix @@ -6,12 +6,14 @@ flake-utils.url = "github:numtide/flake-utils"; }; - outputs = { self, flake-utils, rainix }: - flake-utils.lib.eachDefaultSystem (system: - { - packages = rainix.packages.${system}; - devShells = rainix.devShells.${system}; - } - ); - -} \ No newline at end of file + outputs = + { + flake-utils, + rainix, + ... + }: + flake-utils.lib.eachDefaultSystem (system: { + packages = rainix.packages.${system}; + devShells.default = rainix.devShells.${system}.sol-shell; + }); +} diff --git a/foundry.toml b/foundry.toml index 694fa30..b274843 100644 --- a/foundry.toml +++ b/foundry.toml @@ -1,7 +1,16 @@ [profile.default] +libs = ["dependencies"] # See more config options https://github.com/foundry-rs/foundry/tree/master/config solc = "0.8.25" optimizer = true optimizer_runs = 100000 -evm_version = "cancun" \ No newline at end of file +evm_version = "cancun" + +[dependencies] +forge-std = "1.16.1" +"@openzeppelin-contracts" = "4.8.3" +"rain-solmem" = "0.1.3" + +[soldeer] +recursive_deps = false diff --git a/lib/openzeppelin-contracts b/lib/openzeppelin-contracts deleted file mode 160000 index fcbae53..0000000 --- a/lib/openzeppelin-contracts +++ /dev/null @@ -1 +0,0 @@ -Subproject commit fcbae5394ae8ad52d8e580a3477db99814b9d565 diff --git a/lib/rain.solmem b/lib/rain.solmem deleted file mode 160000 index 2e47e41..0000000 --- a/lib/rain.solmem +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 2e47e41af85a711d837b2518656db0efdae814c2 diff --git a/remappings.txt b/remappings.txt new file mode 100644 index 0000000..ddcfa39 --- /dev/null +++ b/remappings.txt @@ -0,0 +1,3 @@ +@openzeppelin-contracts-4.8.3/=dependencies/@openzeppelin-contracts-4.8.3/ +forge-std-1.16.1/=dependencies/forge-std-1.16.1/ +rain-solmem-0.1.3/=dependencies/rain-solmem-0.1.3/ diff --git a/soldeer.lock b/soldeer.lock new file mode 100644 index 0000000..a68f6a1 --- /dev/null +++ b/soldeer.lock @@ -0,0 +1,20 @@ +[[dependencies]] +name = "@openzeppelin-contracts" +version = "4.8.3" +url = "https://soldeer-revisions.s3.amazonaws.com/@openzeppelin-contracts/4_8_3_22-01-2024_13:13:46_contracts.zip" +checksum = "c6c0f1d430120cf45a3531a2fe740a4dffa1434ebccac753a59c54bc1ce65db9" +integrity = "3ecc700e5d25af23c53959baf3cfd3cbadbc0013e80dfca40cee9e7ea34e141d" + +[[dependencies]] +name = "forge-std" +version = "1.16.1" +url = "https://soldeer-revisions.s3.amazonaws.com/forge-std/1_16_1_08-05-2026_08:51:16_forge-std-1.16.zip" +checksum = "839b61832925c7152c7b6dffbfa4998d9e606211179bd8f604733124e8a7cb57" +integrity = "60e55d10150354ca4a1e2985c5456c834b92b82ef85ab0e1d92a7786cddbd219" + +[[dependencies]] +name = "rain-solmem" +version = "0.1.3" +url = "https://soldeer-revisions.s3.amazonaws.com/rain-solmem/0_1_3_09-05-2026_19:49:33_rain.zip" +checksum = "1d405bb81f7c9e56d1717de0d60da918d2fc2fa4db083efd2abe9906378d019f" +integrity = "e879d2743f9d884f647b9dd489889a83f2cea5f76eb69409a113e1baa69d3643" diff --git a/test/src/lib/mut/LibConformString.t.sol b/test/src/lib/mut/LibConformString.t.sol index a36f8de..66a878c 100644 --- a/test/src/lib/mut/LibConformString.t.sol +++ b/test/src/lib/mut/LibConformString.t.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {Test} from "forge-std/Test.sol"; +import {Test} from "forge-std-1.16.1/src/Test.sol"; import {LibConformString} from "src/lib/mut/LibConformString.sol"; import {LibParseChar} from "src/lib/parse/LibParseChar.sol"; diff --git a/test/src/lib/parse/LibParseChar.isMask.t.sol b/test/src/lib/parse/LibParseChar.isMask.t.sol index 8a37443..ad99e75 100644 --- a/test/src/lib/parse/LibParseChar.isMask.t.sol +++ b/test/src/lib/parse/LibParseChar.isMask.t.sol @@ -2,11 +2,11 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {Test} from "forge-std/Test.sol"; +import {Test} from "forge-std-1.16.1/src/Test.sol"; import {LibParseChar} from "src/lib/parse/LibParseChar.sol"; -import {Pointer} from "rain.solmem/lib/LibPointer.sol"; -import {LibBytes} from "rain.solmem/lib/LibBytes.sol"; +import {Pointer} from "rain-solmem-0.1.3/src/lib/LibPointer.sol"; +import {LibBytes} from "rain-solmem-0.1.3/src/lib/LibBytes.sol"; import {LibParseCharSlow} from "test/lib/parse/LibParseCharSlow.sol"; /// @title LibParseCharIsMaskTest diff --git a/test/src/lib/parse/LibParseChar.skipMask.t.sol b/test/src/lib/parse/LibParseChar.skipMask.t.sol index ace0c82..b7b4f10 100644 --- a/test/src/lib/parse/LibParseChar.skipMask.t.sol +++ b/test/src/lib/parse/LibParseChar.skipMask.t.sol @@ -2,11 +2,11 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {Test} from "forge-std/Test.sol"; +import {Test} from "forge-std-1.16.1/src/Test.sol"; import {LibParseChar} from "src/lib/parse/LibParseChar.sol"; -import {Pointer} from "rain.solmem/lib/LibPointer.sol"; -import {LibBytes} from "rain.solmem/lib/LibBytes.sol"; +import {Pointer} from "rain-solmem-0.1.3/src/lib/LibPointer.sol"; +import {LibBytes} from "rain-solmem-0.1.3/src/lib/LibBytes.sol"; import {LibParseCharSlow} from "test/lib/parse/LibParseCharSlow.sol"; /// @title LibParseCharSkipMaskTest diff --git a/test/src/lib/parse/LibParseDecimal.unsafeDecimalStringToInt.t.sol b/test/src/lib/parse/LibParseDecimal.unsafeDecimalStringToInt.t.sol index 0614cee..21b4616 100644 --- a/test/src/lib/parse/LibParseDecimal.unsafeDecimalStringToInt.t.sol +++ b/test/src/lib/parse/LibParseDecimal.unsafeDecimalStringToInt.t.sol @@ -2,9 +2,9 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {Test} from "forge-std/Test.sol"; -import {Strings} from "openzeppelin-contracts/contracts/utils/Strings.sol"; -import {LibBytes, Pointer} from "rain.solmem/lib/LibBytes.sol"; +import {Test} from "forge-std-1.16.1/src/Test.sol"; +import {Strings} from "@openzeppelin-contracts-4.8.3/utils/Strings.sol"; +import {LibBytes, Pointer} from "rain-solmem-0.1.3/src/lib/LibBytes.sol"; import {LibParseDecimal} from "src/lib/parse/LibParseDecimal.sol"; import {ParseEmptyDecimalString, ParseDecimalOverflow, ZeroStringStartPointer} from "src/error/ErrParse.sol"; diff --git a/test/src/lib/parse/LibParseDecimal.unsafeDecimalStringToSignedInt.t.sol b/test/src/lib/parse/LibParseDecimal.unsafeDecimalStringToSignedInt.t.sol index 1a57b6e..d9e1d3e 100644 --- a/test/src/lib/parse/LibParseDecimal.unsafeDecimalStringToSignedInt.t.sol +++ b/test/src/lib/parse/LibParseDecimal.unsafeDecimalStringToSignedInt.t.sol @@ -2,9 +2,9 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {Test} from "forge-std/Test.sol"; -import {Strings} from "openzeppelin-contracts/contracts/utils/Strings.sol"; -import {LibBytes, Pointer} from "rain.solmem/lib/LibBytes.sol"; +import {Test} from "forge-std-1.16.1/src/Test.sol"; +import {Strings} from "@openzeppelin-contracts-4.8.3/utils/Strings.sol"; +import {LibBytes, Pointer} from "rain-solmem-0.1.3/src/lib/LibBytes.sol"; import {LibParseDecimal} from "src/lib/parse/LibParseDecimal.sol"; import {ParseDecimalOverflow, ZeroStringStartPointer} from "src/error/ErrParse.sol";