From f3f00fc33926358b2a0500be0890907ae725c858 Mon Sep 17 00:00:00 2001 From: "joba.herc@gmail.com" Date: Wed, 11 Feb 2026 20:38:48 -0300 Subject: [PATCH 1/7] Initial settings - E2E - Rayls --- .env.example | 10 +- hardhat.config.ts | 26 ++-- package-lock.json | 260 ++++++++++++++++++--------------------- package.json | 13 +- scripts/generateUsers.ts | 17 +++ test/RaylsToken.e2e.ts | 24 ++++ test/owner.ts | 3 + tsconfig.json | 2 +- 8 files changed, 192 insertions(+), 163 deletions(-) create mode 100644 scripts/generateUsers.ts create mode 100644 test/RaylsToken.e2e.ts create mode 100644 test/owner.ts diff --git a/.env.example b/.env.example index 19445a1..775294c 100644 --- a/.env.example +++ b/.env.example @@ -1,4 +1,6 @@ -# Private key for the account that will deploy the contracts -# IMPORTANT: Never commit your actual .env file with real private keys to version control! -# Format: 0x followed by 64 hexadecimal characters -PRIVATE_KEY=0x0000000000000000000000000000000000000000000000000000000000000000 +RPC_URL= +CHAIN_ID= + +PRIVATE_KEY_OWNER= +PRIVATE_KEY_USER_A= 0x8a1CC296f87899369cF893c5867808bDd9c1995a +PRIVATE_KEY_USER_B= 0x3f91E42c86506f59664F4cdB4cBE957BCd2b862c diff --git a/hardhat.config.ts b/hardhat.config.ts index f0fd1b0..ec6be94 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -15,10 +15,14 @@ const config: HardhatUserConfig = { }, }, networks: { - rayls: { - url: "https://devnet-rpc.rayls.com", - accounts: process.env.PRIVATE_KEY ? [process.env.PRIVATE_KEY] : [], - chainId: 123123, // Update this if you know the actual chain ID + rayls_devnet: { + url: process.env.RPC_URL || "https://devnet-rpc.rayls.com", + chainId: Number(process.env.CHAIN_ID) || 123123, + accounts: [ + process.env.PRIVATE_KEY_OWNER!, + process.env.PRIVATE_KEY_USER_A!, + process.env.PRIVATE_KEY_USER_B!, + ].filter(Boolean) as string[], }, localhost: { url: "http://127.0.0.1:8545", @@ -26,18 +30,18 @@ const config: HardhatUserConfig = { }, etherscan: { apiKey: { - rayls: "no-api-key-needed", + rayls_devnet: "no-api-key-needed", }, customChains: [ { - network: "rayls", - chainId: 123123, + network: "rayls_devnet", + chainId: Number(process.env.CHAIN_ID) || 123123, urls: { apiURL: "https://devnet-explorer.rayls.com/api", - browserURL: "https://devnet-explorer.rayls.com" - } - } - ] + browserURL: "https://devnet-explorer.rayls.com", + }, + }, + ], }, paths: { sources: "./contracts", diff --git a/package-lock.json b/package-lock.json index 8cc8961..d0d3b46 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,23 +10,24 @@ "license": "MIT", "dependencies": { "@openzeppelin/contracts": "^5.0.0", - "dotenv": "^16.3.0" + "dotenv": "^16.6.1", + "ethers": "^6.16.0" }, "devDependencies": { "@nomicfoundation/hardhat-toolbox": "^4.0.0", - "@types/node": "^20.10.0", - "hardhat": "^2.19.0", - "ts-node": "^10.9.1", - "typescript": "^5.3.0" + "@types/chai": "^4.3.20", + "@types/node": "^20.19.33", + "chai": "^4.5.0", + "hardhat": "^2.28.5", + "ts-node": "^10.9.2", + "typescript": "^5.9.3" } }, "node_modules/@adraffy/ens-normalize": { "version": "1.10.1", "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", - "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", @@ -923,9 +924,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", - "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@noble/hashes": "1.3.2" }, @@ -937,9 +936,7 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", - "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 16" }, @@ -1002,92 +999,92 @@ } }, "node_modules/@nomicfoundation/edr": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.11.3.tgz", - "integrity": "sha512-kqILRkAd455Sd6v8mfP3C1/0tCOynJWY+Ir+k/9Boocu2kObCrsFgG+ZWB7fSBVdd9cPVSNrnhWS+V+PEo637g==", + "version": "0.12.0-next.23", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.12.0-next.23.tgz", + "integrity": "sha512-F2/6HZh8Q9RsgkOIkRrckldbhPjIZY7d4mT9LYuW68miwGQ5l7CkAgcz9fRRiurA0+YJhtsbx/EyrD9DmX9BOw==", "dev": true, "license": "MIT", "dependencies": { - "@nomicfoundation/edr-darwin-arm64": "0.11.3", - "@nomicfoundation/edr-darwin-x64": "0.11.3", - "@nomicfoundation/edr-linux-arm64-gnu": "0.11.3", - "@nomicfoundation/edr-linux-arm64-musl": "0.11.3", - "@nomicfoundation/edr-linux-x64-gnu": "0.11.3", - "@nomicfoundation/edr-linux-x64-musl": "0.11.3", - "@nomicfoundation/edr-win32-x64-msvc": "0.11.3" + "@nomicfoundation/edr-darwin-arm64": "0.12.0-next.23", + "@nomicfoundation/edr-darwin-x64": "0.12.0-next.23", + "@nomicfoundation/edr-linux-arm64-gnu": "0.12.0-next.23", + "@nomicfoundation/edr-linux-arm64-musl": "0.12.0-next.23", + "@nomicfoundation/edr-linux-x64-gnu": "0.12.0-next.23", + "@nomicfoundation/edr-linux-x64-musl": "0.12.0-next.23", + "@nomicfoundation/edr-win32-x64-msvc": "0.12.0-next.23" }, "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/@nomicfoundation/edr-darwin-arm64": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.11.3.tgz", - "integrity": "sha512-w0tksbdtSxz9nuzHKsfx4c2mwaD0+l5qKL2R290QdnN9gi9AV62p9DHkOgfBdyg6/a6ZlnQqnISi7C9avk/6VA==", + "version": "0.12.0-next.23", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.12.0-next.23.tgz", + "integrity": "sha512-Amh7mRoDzZyJJ4efqoePqdoZOzharmSOttZuJDlVE5yy07BoE8hL6ZRpa5fNYn0LCqn/KoWs8OHANWxhKDGhvQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/@nomicfoundation/edr-darwin-x64": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.11.3.tgz", - "integrity": "sha512-QR4jAFrPbOcrO7O2z2ESg+eUeIZPe2bPIlQYgiJ04ltbSGW27FblOzdd5+S3RoOD/dsZGKAvvy6dadBEl0NgoA==", + "version": "0.12.0-next.23", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.12.0-next.23.tgz", + "integrity": "sha512-9wn489FIQm7m0UCD+HhktjWx6vskZzeZD9oDc2k9ZvbBzdXwPp5tiDqUBJ+eQpByAzCDfteAJwRn2lQCE0U+Iw==", "dev": true, "license": "MIT", "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/@nomicfoundation/edr-linux-arm64-gnu": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.11.3.tgz", - "integrity": "sha512-Ktjv89RZZiUmOFPspuSBVJ61mBZQ2+HuLmV67InNlh9TSUec/iDjGIwAn59dx0bF/LOSrM7qg5od3KKac4LJDQ==", + "version": "0.12.0-next.23", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.12.0-next.23.tgz", + "integrity": "sha512-nlk5EejSzEUfEngv0Jkhqq3/wINIfF2ED9wAofc22w/V1DV99ASh9l3/e/MIHOQFecIZ9MDqt0Em9/oDyB1Uew==", "dev": true, "license": "MIT", "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/@nomicfoundation/edr-linux-arm64-musl": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.11.3.tgz", - "integrity": "sha512-B3sLJx1rL2E9pfdD4mApiwOZSrX0a/KQSBWdlq1uAhFKqkl00yZaY4LejgZndsJAa4iKGQJlGnw4HCGeVt0+jA==", + "version": "0.12.0-next.23", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.12.0-next.23.tgz", + "integrity": "sha512-SJuPBp3Rc6vM92UtVTUxZQ/QlLhLfwTftt2XUiYohmGKB3RjGzpgduEFMCA0LEnucUckU6UHrJNFHiDm77C4PQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/@nomicfoundation/edr-linux-x64-gnu": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.11.3.tgz", - "integrity": "sha512-D/4cFKDXH6UYyKPu6J3Y8TzW11UzeQI0+wS9QcJzjlrrfKj0ENW7g9VihD1O2FvXkdkTjcCZYb6ai8MMTCsaVw==", + "version": "0.12.0-next.23", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.12.0-next.23.tgz", + "integrity": "sha512-NU+Qs3u7Qt6t3bJFdmmjd5CsvgI2bPPzO31KifM2Ez96/jsXYho5debtTQnimlb5NAqiHTSlxjh/F8ROcptmeQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/@nomicfoundation/edr-linux-x64-musl": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.11.3.tgz", - "integrity": "sha512-ergXuIb4nIvmf+TqyiDX5tsE49311DrBky6+jNLgsGDTBaN1GS3OFwFS8I6Ri/GGn6xOaT8sKu3q7/m+WdlFzg==", + "version": "0.12.0-next.23", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.12.0-next.23.tgz", + "integrity": "sha512-F78fZA2h6/ssiCSZOovlgIu0dUeI7ItKPsDDF3UUlIibef052GCXmliMinC90jVPbrjUADMd1BUwjfI0Z8OllQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/@nomicfoundation/edr-win32-x64-msvc": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.11.3.tgz", - "integrity": "sha512-snvEf+WB3OV0wj2A7kQ+ZQqBquMcrozSLXcdnMdEl7Tmn+KDCbmFKBt3Tk0X3qOU4RKQpLPnTxdM07TJNVtung==", + "version": "0.12.0-next.23", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.12.0-next.23.tgz", + "integrity": "sha512-IfJZQJn7d/YyqhmguBIGoCKjE9dKjbu6V6iNEPApfwf5JyyjHYyyfkLU4rf7hygj57bfH4sl1jtQ6r8HnT62lw==", "dev": true, "license": "MIT", "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/@nomicfoundation/hardhat-chai-matchers": { @@ -1111,9 +1108,9 @@ } }, "node_modules/@nomicfoundation/hardhat-ethers": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.1.2.tgz", - "integrity": "sha512-7xEaz2X8p47qWIAqtV2z03MmusheHm8bvY2mDlxo9JiT2BgSx59GSdv5+mzwOvsuKDbTij7oqDnwFyYOlHREEQ==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.1.3.tgz", + "integrity": "sha512-208JcDeVIl+7Wu3MhFUUtiA8TJ7r2Rn3Wr+lSx9PfsDTKkbsAsWPY6N6wQ4mtzDv0/pB9nIbJhkjoHe1EsgNsA==", "dev": true, "license": "MIT", "peer": true, @@ -1123,7 +1120,7 @@ }, "peerDependencies": { "ethers": "^6.14.0", - "hardhat": "^2.26.0" + "hardhat": "^2.28.0" } }, "node_modules/@nomicfoundation/hardhat-network-helpers": { @@ -1628,8 +1625,7 @@ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.20.tgz", "integrity": "sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/chai-as-promised": { "version": "7.1.8", @@ -1693,9 +1689,9 @@ "peer": true }, "node_modules/@types/node": { - "version": "20.19.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.24.tgz", - "integrity": "sha512-FE5u0ezmi6y9OZEzlJfg37mqqf6ZDSF2V/NLjUyGrR9uTZ7Sb9F7bLNZ03S4XVUNRWGA7Ck4c1kK+YnuWjl+DA==", + "version": "20.19.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.33.tgz", + "integrity": "sha512-Rs1bVAIdBs5gbTIKza/tgpMuG1k3U/UMJLWecIMxNdJFDMzcM5LOiLVRYh3PilWEYDIeUDv7bpiHPLPsbydGcw==", "dev": true, "license": "MIT", "dependencies": { @@ -1788,9 +1784,7 @@ "version": "4.0.0-beta.5", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", - "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/agent-base": { "version": "6.0.2", @@ -1988,17 +1982,6 @@ "license": "MIT", "peer": true }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": "*" - } - }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -2055,15 +2038,15 @@ } }, "node_modules/axios": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.1.tgz", - "integrity": "sha512-hU4EGxxt+j7TQijx1oYdAjw4xuIp1wRQSsbMFwSthCWeBQur1eF+qJ5iQ5sN3Tw8YRzQNKb8jszgBdMDVqwJcw==", + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", + "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", "proxy-from-env": "^1.1.0" } }, @@ -2353,7 +2336,6 @@ "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.3", @@ -2381,6 +2363,16 @@ "chai": ">= 2.1.2 < 6" } }, + "node_modules/chai/node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -2415,7 +2407,6 @@ "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "get-func-name": "^2.0.2" }, @@ -2949,7 +2940,6 @@ "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "type-detect": "^4.0.0" }, @@ -3017,9 +3007,9 @@ } }, "node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", + "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -3497,10 +3487,9 @@ } }, "node_modules/ethers": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.15.0.tgz", - "integrity": "sha512-Kf/3ZW54L4UT0pZtsY/rf+EkBU7Qi5nnhonjUb8yTXcxH3cdcWrV2cRyk0Xk/4jK6OoHhxxZHriyhje20If2hQ==", - "dev": true, + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.16.0.tgz", + "integrity": "sha512-U1wulmetNymijEhpSEQ7Ct/P/Jw9/e7R1j5XIbPRydgV2DjLVMsULDlNksq3RQnFgKoLlZf88ijYtWEXcPa07A==", "funding": [ { "type": "individual", @@ -3512,7 +3501,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@adraffy/ens-normalize": "1.10.1", "@noble/curves": "1.2.0", @@ -3530,9 +3518,7 @@ "version": "22.7.5", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", - "dev": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~6.19.2" } @@ -3541,9 +3527,7 @@ "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ethjs-unit": { "version": "0.1.6", @@ -3634,9 +3618,9 @@ "peer": true }, "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "dev": true, "license": "ISC", "peer": true, @@ -3737,9 +3721,9 @@ } }, "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "dev": true, "license": "MIT", "peer": true, @@ -3835,7 +3819,6 @@ "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "*" } @@ -4093,7 +4076,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "peer": true, @@ -4182,15 +4165,15 @@ } }, "node_modules/hardhat": { - "version": "2.26.5", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.26.5.tgz", - "integrity": "sha512-TvFKUPGRaoemeVpnKsXt5I+kVCNrzP2cLwyNUveu0JKf2Q0lzh6LTgVBsWyYPlXAwBzyUQ6fsL98UgyF/QdOfA==", + "version": "2.28.5", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.28.5.tgz", + "integrity": "sha512-AlTvFAiLYXdy732uyzVWMFw5qjEpfAI0x9xMNe73cBzzD98ST783EaElDzbOXddJ7ro1Z3447FbO0xSinXfTVA==", "dev": true, "license": "MIT", "dependencies": { "@ethereumjs/util": "^9.1.0", "@ethersproject/abi": "^5.1.2", - "@nomicfoundation/edr": "^0.11.3", + "@nomicfoundation/edr": "0.12.0-next.23", "@nomicfoundation/solidity-analyzer": "^0.1.0", "@sentry/node": "^5.18.1", "adm-zip": "^0.4.16", @@ -4869,9 +4852,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", "dependencies": { @@ -4983,9 +4966,9 @@ } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", "dev": true, "license": "MIT" }, @@ -5045,7 +5028,6 @@ "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "get-func-name": "^2.0.1" } @@ -5653,7 +5635,6 @@ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "*" } @@ -5774,9 +5755,9 @@ "peer": true }, "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", "dev": true, "license": "BSD-3-Clause", "peer": true, @@ -6152,7 +6133,7 @@ "version": "5.0.15", "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "peer": true, @@ -6179,9 +6160,9 @@ } }, "node_modules/sc-istanbul/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "dev": true, "license": "MIT", "peer": true, @@ -6403,7 +6384,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "peer": true, @@ -6579,9 +6560,9 @@ } }, "node_modules/solidity-coverage": { - "version": "0.8.16", - "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.16.tgz", - "integrity": "sha512-qKqgm8TPpcnCK0HCDLJrjbOA2tQNEJY4dHX/LSSQ9iwYFS973MwjtgYn2Iv3vfCEQJTj5xtm4cuUMzlJsJSMbg==", + "version": "0.8.17", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.17.tgz", + "integrity": "sha512-5P8vnB6qVX9tt1MfuONtCTEaEGO/O4WuEidPHIAJjx4sktHHKhO3rFvnE0q8L30nWJPTrcqGQMT7jpE29B2qow==", "dev": true, "license": "ISC", "peer": true, @@ -6720,9 +6701,9 @@ } }, "node_modules/solidity-coverage/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "peer": true, @@ -7229,9 +7210,9 @@ } }, "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -7242,9 +7223,7 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "dev": true, - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/tsort": { "version": "0.0.1", @@ -7273,7 +7252,6 @@ "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -7349,7 +7327,7 @@ "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "peer": true, @@ -7663,9 +7641,9 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", "dev": true, "license": "MIT", "peer": true, @@ -7779,9 +7757,7 @@ "version": "8.17.1", "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" }, diff --git a/package.json b/package.json index a6d86f4..45eccab 100644 --- a/package.json +++ b/package.json @@ -24,13 +24,16 @@ "license": "MIT", "devDependencies": { "@nomicfoundation/hardhat-toolbox": "^4.0.0", - "@types/node": "^20.10.0", - "hardhat": "^2.19.0", - "ts-node": "^10.9.1", - "typescript": "^5.3.0" + "@types/chai": "^4.3.20", + "@types/node": "^20.19.33", + "chai": "^4.5.0", + "hardhat": "^2.28.5", + "ts-node": "^10.9.2", + "typescript": "^5.9.3" }, "dependencies": { "@openzeppelin/contracts": "^5.0.0", - "dotenv": "^16.3.0" + "dotenv": "^16.6.1", + "ethers": "^6.16.0" } } diff --git a/scripts/generateUsers.ts b/scripts/generateUsers.ts new file mode 100644 index 0000000..555dd33 --- /dev/null +++ b/scripts/generateUsers.ts @@ -0,0 +1,17 @@ +import { ethers } from "hardhat"; + +async function main() { + const userA = ethers.Wallet.createRandom(); + const userB = ethers.Wallet.createRandom(); + + console.log("User A address:", userA.address); + console.log("User A private key:", userA.privateKey); + + console.log("User B address:", userB.address); + console.log("User B private key:", userB.privateKey); +} + +main().catch((error) => { + console.error(error); + process.exitCode = 1; +}); diff --git a/test/RaylsToken.e2e.ts b/test/RaylsToken.e2e.ts new file mode 100644 index 0000000..545098c --- /dev/null +++ b/test/RaylsToken.e2e.ts @@ -0,0 +1,24 @@ +import { ethers } from "hardhat"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; + +let owner: SignerWithAddress; +let userA: SignerWithAddress; +let userB: SignerWithAddress; + +describe("Check Addresses", function () { + + before(async () => { + // Criando signers a partir das private keys do .env + owner = new ethers.Wallet(process.env.PRIVATE_KEY_OWNER!, ethers.provider) as unknown as SignerWithAddress; + userA = new ethers.Wallet(process.env.PRIVATE_KEY_USER_A!, ethers.provider) as unknown as SignerWithAddress; + userB = new ethers.Wallet(process.env.PRIVATE_KEY_USER_B!, ethers.provider) as unknown as SignerWithAddress; + }); + + it("should show the addresses", async function () { + // Apenas para garantir que o teste roda + console.log("Owner (from test):", owner.address); + console.log("User A (from test):", userA.address); + console.log("User B (from test):", userB.address); + }); + +}); diff --git a/test/owner.ts b/test/owner.ts new file mode 100644 index 0000000..b05934a --- /dev/null +++ b/test/owner.ts @@ -0,0 +1,3 @@ +import { ethers } from "hardhat"; + +const [owner, userA, userB] = await ethers.getSigners(); diff --git a/tsconfig.json b/tsconfig.json index 4ed0120..6a9af5f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,5 +10,5 @@ "outDir": "./dist" }, "include": ["./scripts", "./test", "./hardhat.config.ts"], - "files": ["./hardhat.config.ts"] + "files": ["./hardhat.config.ts", "./test/owner.ts"] } From ffe730d91d516c5254891c4b6eb3e88898a17779 Mon Sep 17 00:00:00 2001 From: "joba.herc@gmail.com" Date: Thu, 12 Feb 2026 14:23:38 -0300 Subject: [PATCH 2/7] Unit test adjustments and end-to-end test implementations --- test/RaylsToken.e2e.ts | 128 ++++++++++++++++++++++++++++++++++------ test/RaylsToken.test.ts | 4 +- test/owner.ts | 3 - tsconfig.json | 3 +- 4 files changed, 112 insertions(+), 26 deletions(-) delete mode 100644 test/owner.ts diff --git a/test/RaylsToken.e2e.ts b/test/RaylsToken.e2e.ts index 545098c..81477cb 100644 --- a/test/RaylsToken.e2e.ts +++ b/test/RaylsToken.e2e.ts @@ -1,24 +1,114 @@ +import { expect } from "chai"; import { ethers } from "hardhat"; +import { RaylsToken } from "../typechain-types"; import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; -let owner: SignerWithAddress; -let userA: SignerWithAddress; -let userB: SignerWithAddress; - -describe("Check Addresses", function () { - - before(async () => { - // Criando signers a partir das private keys do .env - owner = new ethers.Wallet(process.env.PRIVATE_KEY_OWNER!, ethers.provider) as unknown as SignerWithAddress; - userA = new ethers.Wallet(process.env.PRIVATE_KEY_USER_A!, ethers.provider) as unknown as SignerWithAddress; - userB = new ethers.Wallet(process.env.PRIVATE_KEY_USER_B!, ethers.provider) as unknown as SignerWithAddress; - }); - - it("should show the addresses", async function () { - // Apenas para garantir que o teste roda - console.log("Owner (from test):", owner.address); - console.log("User A (from test):", userA.address); - console.log("User B (from test):", userB.address); - }); +describe("RaylsToken - Full Integration E2E", function () { + + let token: RaylsToken; + let owner: SignerWithAddress; + let userA: SignerWithAddress; + let userB: SignerWithAddress; + + const initialSupply = ethers.parseUnits("1000000", 18); + const mintAmount = ethers.parseUnits("1000", 18); + const approveAmount = ethers.parseUnits("400", 18); + const burnAmount = ethers.parseUnits("100", 18); + +before(async function () { + [owner, userA, userB] = await ethers.getSigners(); + + // ===== Adiciona saldo para UserA e UserB (gas no Devnet) ===== + const fundAmount = ethers.parseEther("1"); // 1 RYL ou ETH + await owner.sendTransaction({ to: userA.address, value: fundAmount }); + await owner.sendTransaction({ to: userB.address, value: fundAmount }); + + const RaylsTokenFactory = await ethers.getContractFactory("RaylsToken"); + token = await RaylsTokenFactory.deploy(initialSupply); + await token.waitForDeployment(); +}); + + + it("Should deploy correctly and assign initial supply to owner", async function () { + expect(await token.owner()).to.equal(owner.address); + expect(await token.totalSupply()).to.equal(initialSupply); + expect(await token.balanceOf(owner.address)).to.equal(initialSupply); + }); + + + it("Owner should mint tokens to User A and emit Transfer event", async function () { + + const tx = await token.mint(userA.address, mintAmount); + + await expect(tx) + .to.emit(token, "Transfer") + .withArgs(ethers.ZeroAddress, userA.address, mintAmount); + + expect(await token.balanceOf(userA.address)).to.equal(mintAmount); + expect(await token.totalSupply()).to.equal(initialSupply + mintAmount); + }); + + it("Non-owner should not be able to mint", async function () { + await expect( + token.connect(userB).mint(userB.address, mintAmount) + ).to.be.revertedWithCustomError(token, "OwnableUnauthorizedAccount"); + }); + + + it("Should approve, transferFrom and emit events correctly", async function () { + + await expect( + token.connect(userA).approve(userB.address, approveAmount) + ) + .to.emit(token, "Approval") + .withArgs(userA.address, userB.address, approveAmount); + + expect( + await token.allowance(userA.address, userB.address) + ).to.equal(approveAmount); + + await expect( + token.connect(userB).transferFrom( + userA.address, + userB.address, + approveAmount + ) + ) + .to.emit(token, "Transfer") + .withArgs(userA.address, userB.address, approveAmount); + + expect(await token.balanceOf(userB.address)).to.equal(approveAmount); + expect(await token.balanceOf(userA.address)).to.equal( + mintAmount - approveAmount + ); + + expect( + await token.allowance(userA.address, userB.address) + ).to.equal(0); + }); + + + it("User B should burn tokens and reduce totalSupply", async function () { + + const totalBeforeBurn = await token.totalSupply(); + + await expect( + token.connect(userB).burn(burnAmount) + ) + .to.emit(token, "Transfer") + .withArgs(userB.address, ethers.ZeroAddress, burnAmount); + + const totalAfterBurn = await token.totalSupply(); + + expect(totalAfterBurn).to.equal(totalBeforeBurn - burnAmount); + expect(await token.balanceOf(userB.address)).to.equal( + approveAmount - burnAmount + ); + }); + + it("Should estimate gas for mint operation", async function () { + const estimatedGas = await token.mint.estimateGas(userA.address, 1n); + expect(estimatedGas).to.be.gt(0); + }); }); diff --git a/test/RaylsToken.test.ts b/test/RaylsToken.test.ts index 81bd0f1..ba103c5 100644 --- a/test/RaylsToken.test.ts +++ b/test/RaylsToken.test.ts @@ -19,8 +19,8 @@ describe("RaylsToken", function () { describe("Deployment", function () { it("Should set the right name and symbol", async function () { - expect(await token.name()).to.equal("Rayls Token"); - expect(await token.symbol()).to.equal("RAYLS"); + expect(await token.name()).to.equal("Rayls Test Token"); + expect(await token.symbol()).to.equal("RYLSTEST"); }); it("Should set the right decimals", async function () { diff --git a/test/owner.ts b/test/owner.ts deleted file mode 100644 index b05934a..0000000 --- a/test/owner.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { ethers } from "hardhat"; - -const [owner, userA, userB] = await ethers.getSigners(); diff --git a/tsconfig.json b/tsconfig.json index 6a9af5f..aa1e666 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,6 +9,5 @@ "resolveJsonModule": true, "outDir": "./dist" }, - "include": ["./scripts", "./test", "./hardhat.config.ts"], - "files": ["./hardhat.config.ts", "./test/owner.ts"] + "include": ["./scripts", "./test", "./hardhat.config.ts", "generateUsers.ts"] } From 8a6c172b7dd1f8d2ed854f65d4f9e434a1b69a96 Mon Sep 17 00:00:00 2001 From: "joba.herc@gmail.com" Date: Thu, 12 Feb 2026 17:25:38 -0300 Subject: [PATCH 3/7] remove-observation --- test/RaylsToken.e2e.ts | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/test/RaylsToken.e2e.ts b/test/RaylsToken.e2e.ts index 81477cb..0bd07a7 100644 --- a/test/RaylsToken.e2e.ts +++ b/test/RaylsToken.e2e.ts @@ -15,18 +15,17 @@ describe("RaylsToken - Full Integration E2E", function () { const approveAmount = ethers.parseUnits("400", 18); const burnAmount = ethers.parseUnits("100", 18); -before(async function () { - [owner, userA, userB] = await ethers.getSigners(); + before(async function () { + [owner, userA, userB] = await ethers.getSigners(); - // ===== Adiciona saldo para UserA e UserB (gas no Devnet) ===== - const fundAmount = ethers.parseEther("1"); // 1 RYL ou ETH - await owner.sendTransaction({ to: userA.address, value: fundAmount }); - await owner.sendTransaction({ to: userB.address, value: fundAmount }); + const fundAmount = ethers.parseEther("1"); + await owner.sendTransaction({ to: userA.address, value: fundAmount }); + await owner.sendTransaction({ to: userB.address, value: fundAmount }); - const RaylsTokenFactory = await ethers.getContractFactory("RaylsToken"); - token = await RaylsTokenFactory.deploy(initialSupply); - await token.waitForDeployment(); -}); + const RaylsTokenFactory = await ethers.getContractFactory("RaylsToken"); + token = await RaylsTokenFactory.deploy(initialSupply); + await token.waitForDeployment(); + }); it("Should deploy correctly and assign initial supply to owner", async function () { @@ -54,7 +53,6 @@ before(async function () { ).to.be.revertedWithCustomError(token, "OwnableUnauthorizedAccount"); }); - it("Should approve, transferFrom and emit events correctly", async function () { await expect( From d54c235c413901c2fc7cb4fbf39c00c435bc19e6 Mon Sep 17 00:00:00 2001 From: "joba.herc@gmail.com" Date: Thu, 12 Feb 2026 17:47:43 -0300 Subject: [PATCH 4/7] add-expect-total-supply --- test/RaylsToken.e2e.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/RaylsToken.e2e.ts b/test/RaylsToken.e2e.ts index 0bd07a7..3d43cd4 100644 --- a/test/RaylsToken.e2e.ts +++ b/test/RaylsToken.e2e.ts @@ -83,8 +83,9 @@ describe("RaylsToken - Full Integration E2E", function () { expect( await token.allowance(userA.address, userB.address) ).to.equal(0); - }); + expect(await token.totalSupply()).to.equal(initialSupply + mintAmount); + }); it("User B should burn tokens and reduce totalSupply", async function () { From 298caac3e199c56570ffed423616bd3a43837174 Mon Sep 17 00:00:00 2001 From: "joba.herc@gmail.com" Date: Thu, 12 Feb 2026 19:02:31 -0300 Subject: [PATCH 5/7] add page objects to the test interface --- test/RaylsToken.e2e.ts | 70 ++++++++++------------------ test/contractsObjets/RaylsTokenPO.ts | 55 ++++++++++++++++++++++ 2 files changed, 79 insertions(+), 46 deletions(-) create mode 100644 test/contractsObjets/RaylsTokenPO.ts diff --git a/test/RaylsToken.e2e.ts b/test/RaylsToken.e2e.ts index 3d43cd4..5a40549 100644 --- a/test/RaylsToken.e2e.ts +++ b/test/RaylsToken.e2e.ts @@ -2,10 +2,12 @@ import { expect } from "chai"; import { ethers } from "hardhat"; import { RaylsToken } from "../typechain-types"; import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; +import { RaylsTokenPO } from "./contractsObjets/RaylsTokenPO"; describe("RaylsToken - Full Integration E2E", function () { let token: RaylsToken; + let po: RaylsTokenPO; let owner: SignerWithAddress; let userA: SignerWithAddress; let userB: SignerWithAddress; @@ -25,89 +27,65 @@ describe("RaylsToken - Full Integration E2E", function () { const RaylsTokenFactory = await ethers.getContractFactory("RaylsToken"); token = await RaylsTokenFactory.deploy(initialSupply); await token.waitForDeployment(); + + po = new RaylsTokenPO(token); }); it("Should deploy correctly and assign initial supply to owner", async function () { - expect(await token.owner()).to.equal(owner.address); - expect(await token.totalSupply()).to.equal(initialSupply); - expect(await token.balanceOf(owner.address)).to.equal(initialSupply); + expect(await po.owner()).to.equal(owner.address); + expect(await po.totalSupply()).to.equal(initialSupply); + expect(await po.balanceOf(owner.address)).to.equal(initialSupply); }); it("Owner should mint tokens to User A and emit Transfer event", async function () { - - const tx = await token.mint(userA.address, mintAmount); - + const tx = await po.mint(userA, mintAmount); await expect(tx) .to.emit(token, "Transfer") .withArgs(ethers.ZeroAddress, userA.address, mintAmount); - expect(await token.balanceOf(userA.address)).to.equal(mintAmount); - expect(await token.totalSupply()).to.equal(initialSupply + mintAmount); + expect(await po.balanceOf(userA.address)).to.equal(mintAmount); + expect(await po.totalSupply()).to.equal(initialSupply + mintAmount); }); it("Non-owner should not be able to mint", async function () { await expect( - token.connect(userB).mint(userB.address, mintAmount) + po.mintAs(userB, userB, mintAmount) ).to.be.revertedWithCustomError(token, "OwnableUnauthorizedAccount"); }); it("Should approve, transferFrom and emit events correctly", async function () { - - await expect( - token.connect(userA).approve(userB.address, approveAmount) - ) + await expect(po.approve(userA, userB, approveAmount)) .to.emit(token, "Approval") .withArgs(userA.address, userB.address, approveAmount); - expect( - await token.allowance(userA.address, userB.address) - ).to.equal(approveAmount); + expect(await po.allowance(userA.address, userB.address)).to.equal(approveAmount); - await expect( - token.connect(userB).transferFrom( - userA.address, - userB.address, - approveAmount - ) - ) + await expect(po.transferFrom(userA, userB, approveAmount, userB)) .to.emit(token, "Transfer") .withArgs(userA.address, userB.address, approveAmount); - expect(await token.balanceOf(userB.address)).to.equal(approveAmount); - expect(await token.balanceOf(userA.address)).to.equal( - mintAmount - approveAmount - ); - - expect( - await token.allowance(userA.address, userB.address) - ).to.equal(0); - - expect(await token.totalSupply()).to.equal(initialSupply + mintAmount); + expect(await po.balanceOf(userB.address)).to.equal(approveAmount); + expect(await po.balanceOf(userA.address)).to.equal(mintAmount - approveAmount); + expect(await po.allowance(userA.address, userB.address)).to.equal(0); + expect(await po.totalSupply()).to.equal(initialSupply + mintAmount); }); it("User B should burn tokens and reduce totalSupply", async function () { - - const totalBeforeBurn = await token.totalSupply(); - - await expect( - token.connect(userB).burn(burnAmount) - ) + const totalBeforeBurn = await po.totalSupply(); + await expect(po.burn(userB, burnAmount)) .to.emit(token, "Transfer") .withArgs(userB.address, ethers.ZeroAddress, burnAmount); - const totalAfterBurn = await token.totalSupply(); - + const totalAfterBurn = await po.totalSupply(); expect(totalAfterBurn).to.equal(totalBeforeBurn - burnAmount); - expect(await token.balanceOf(userB.address)).to.equal( - approveAmount - burnAmount - ); + expect(await po.balanceOf(userB.address)).to.equal(approveAmount - burnAmount); }); it("Should estimate gas for mint operation", async function () { - const estimatedGas = await token.mint.estimateGas(userA.address, 1n); + const estimatedGas = await po.estimateGasMint(userA, 1n); expect(estimatedGas).to.be.gt(0); }); - + }); diff --git a/test/contractsObjets/RaylsTokenPO.ts b/test/contractsObjets/RaylsTokenPO.ts new file mode 100644 index 0000000..1116f09 --- /dev/null +++ b/test/contractsObjets/RaylsTokenPO.ts @@ -0,0 +1,55 @@ +import { RaylsToken } from "../typechain-types"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; + +export class RaylsTokenPO { + token: RaylsToken; + + constructor(token: RaylsToken) { + this.token = token; + } + + async balanceOf(address: string) { + return this.token.balanceOf(address); + } + + async totalSupply() { + return this.token.totalSupply(); + } + + async allowance(owner: string, spender: string) { + return this.token.allowance(owner, spender); + } + + async owner() { + return this.token.owner(); + } + + async mint(to: SignerWithAddress, amount: bigint) { + return this.token.mint(to.address, amount); + } + + async mintAs(from: SignerWithAddress, to: SignerWithAddress, amount: bigint) { + return this.token.connect(from).mint(to.address, amount); + } + + async burn(from: SignerWithAddress, amount: bigint) { + return this.token.connect(from).burn(amount); + } + + async approve(from: SignerWithAddress, spender: SignerWithAddress, amount: bigint) { + return this.token.connect(from).approve(spender.address, amount); + } + + async transferFrom( + from: SignerWithAddress, + to: SignerWithAddress, + amount: bigint, + sender: SignerWithAddress + ) { + return this.token.connect(sender).transferFrom(from.address, to.address, amount); + } + + async estimateGasMint(to: SignerWithAddress, amount: bigint) { + return this.token.mint.estimateGas(to.address, amount); + } +} From 7d4561f76381b4c282a8c575cfa48ea0a19e8b5a Mon Sep 17 00:00:00 2001 From: "joba.herc@gmail.com" Date: Thu, 12 Feb 2026 20:36:03 -0300 Subject: [PATCH 6/7] remove-data --- .env.example | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.env.example b/.env.example index 775294c..da3c811 100644 --- a/.env.example +++ b/.env.example @@ -2,5 +2,5 @@ RPC_URL= CHAIN_ID= PRIVATE_KEY_OWNER= -PRIVATE_KEY_USER_A= 0x8a1CC296f87899369cF893c5867808bDd9c1995a -PRIVATE_KEY_USER_B= 0x3f91E42c86506f59664F4cdB4cBE957BCd2b862c +PRIVATE_KEY_USER_A= +PRIVATE_KEY_USER_B= From 6e3e73369d222b1bcf81310b3669525764ffe011 Mon Sep 17 00:00:00 2001 From: "joba.herc@gmail.com" Date: Thu, 12 Feb 2026 20:39:52 -0300 Subject: [PATCH 7/7] adjust --- .env.example | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/.env.example b/.env.example index da3c811..eb48cd0 100644 --- a/.env.example +++ b/.env.example @@ -1,6 +1,12 @@ +# Private key for the account that will deploy the contracts +# IMPORTANT: Never commit your actual .env file with real private keys to version control! +# Format: 0x followed by 64 hexadecimal characters + +# Rayls Devnet RPC_URL= CHAIN_ID= -PRIVATE_KEY_OWNER= -PRIVATE_KEY_USER_A= -PRIVATE_KEY_USER_B= +# Wallets +PRIVATE_KEY_OWNER=PASTE_OWNER_PRIVATE_KEY_HERE +PRIVATE_KEY_USER_A=PASTE_USER_A_PRIVATE_KEY_HERE +PRIVATE_KEY_USER_B=PASTE_USER_B_PRIVATE_KEY_HERE