diff --git a/.env.sample b/.env.sample new file mode 100644 index 0000000..12a331f --- /dev/null +++ b/.env.sample @@ -0,0 +1,2 @@ +NETWORK_PRIVATE_KEY=somehexstringwithoutthe0xprefix +NETWORK_RPC_URL=wss://wss.calibration.node.glif.io/apigw/lotus/rpc/v1 \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ef90015..5797582 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -4,27 +4,36 @@ on: branches: [master] pull_request: +env: + NETWORK_PRIVATE_KEY: ${{ secrets.NETWORK_PRIVATE_KEY }} + NETWORK_RPC_URL: ${{ secrets.NETWORK_RPC_URL }} + jobs: build: - runs-on: ubuntu-latest + runs-on: ["ubuntu-latest"] steps: - name: Checkout 🛎️ uses: "actions/checkout@v4" + with: + submodules: recursive - name: Install nodejs 🔧 uses: actions/setup-node@v3 with: node-version: 22.3.0 + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + - name: Install dependencies run: npm ci - - name: Test - run: npm run test - - name: Build run: npm run build + - name: Test + run: npm run test + - name: Publish to npmjs uses: JS-DevTools/npm-publish@v1 if: github.ref == 'refs/heads/master' diff --git a/.gitignore b/.gitignore index 0ba9b39..100e200 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,7 @@ +# project files +.env +src/generated + # Compiler files cache/ out/ diff --git a/.gitmodules b/.gitmodules index c65a596..a1eaf6c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ -[submodule "contracts/lib/forge-std"] - path = contracts/lib/forge-std - url = https://github.com/foundry-rs/forge-std +[submodule "randomness-solidity"] + path = randomness-solidity + url = https://github.com/randa-mu/randomness-solidity diff --git a/README.md b/README.md index 0feefe6..7e4d71d 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,31 @@ -## randomness-js +# randomness-js A convenience library for retrieving, verifying and deriving randomness from the dcrypt network. Build everything by running `npm run build`. This creates a dist directory containing commonjs and esm modules. Solidity interfaces for randomness can be found in our [solidity repo](https://github.com/randa-mu/randamu-solidity-contracts). + +## Usage +First install the package by running `npm install randomness-js` +Then create an instance of randomness for your preferred network. An example for filecoin is below: +```javascript +import { JsonRpcProvider, Wallet } from "ethers" +import { Randomness } from "randomness-js" + +// set up your ethers objects +const rpc = new JsonRpcProvider("https://api.calibration.node.glif.io/rpc/v1") +const wallet = new Wallet("", rpc) + +// create and request some randomness +const randomness = Randomness.createFilecoinCalibnet(wallet) +const response = await randomness.requestRandomness() + +// the smart contracts verify the randomness anyway, but doesn't hurt to verify it for yourself to be sure :) +await randomness.verify(response) +``` + +## Development +- Clone the repo +- run `git submodule update --init --recursive` +For running the tests, you need to create a `.env` file at the project root filling in the fields detailed in [`.env.sample`](./.env.sample). \ No newline at end of file diff --git a/contracts/.github/workflows/test.yml b/contracts/.github/workflows/test.yml deleted file mode 100644 index 9282e82..0000000 --- a/contracts/.github/workflows/test.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: test - -on: workflow_dispatch - -env: - FOUNDRY_PROFILE: ci - -jobs: - check: - strategy: - fail-fast: true - - name: Foundry project - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - submodules: recursive - - - name: Install Foundry - uses: foundry-rs/foundry-toolchain@v1 - with: - version: nightly - - - name: Run Forge build - run: | - forge --version - forge build --sizes - id: build - - - name: Run Forge tests - run: | - forge test -vvv - id: test diff --git a/contracts/.gitignore b/contracts/.gitignore deleted file mode 100644 index 85198aa..0000000 --- a/contracts/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -# Compiler files -cache/ -out/ - -# Ignores development broadcast logs -!/broadcast -/broadcast/*/31337/ -/broadcast/**/dry-run/ - -# Docs -docs/ - -# Dotenv file -.env diff --git a/contracts/README.md b/contracts/README.md deleted file mode 100644 index 9265b45..0000000 --- a/contracts/README.md +++ /dev/null @@ -1,66 +0,0 @@ -## Foundry - -**Foundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust.** - -Foundry consists of: - -- **Forge**: Ethereum testing framework (like Truffle, Hardhat and DappTools). -- **Cast**: Swiss army knife for interacting with EVM smart contracts, sending transactions and getting chain data. -- **Anvil**: Local Ethereum node, akin to Ganache, Hardhat Network. -- **Chisel**: Fast, utilitarian, and verbose solidity REPL. - -## Documentation - -https://book.getfoundry.sh/ - -## Usage - -### Build - -```shell -$ forge build -``` - -### Test - -```shell -$ forge test -``` - -### Format - -```shell -$ forge fmt -``` - -### Gas Snapshots - -```shell -$ forge snapshot -``` - -### Anvil - -```shell -$ anvil -``` - -### Deploy - -```shell -$ forge script script/Counter.s.sol:CounterScript --rpc-url --private-key -``` - -### Cast - -```shell -$ cast -``` - -### Help - -```shell -$ forge --help -$ anvil --help -$ cast --help -``` diff --git a/contracts/foundry.toml b/contracts/foundry.toml deleted file mode 100644 index 25b918f..0000000 --- a/contracts/foundry.toml +++ /dev/null @@ -1,6 +0,0 @@ -[profile.default] -src = "src" -out = "out" -libs = ["lib"] - -# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options diff --git a/contracts/lib/forge-std b/contracts/lib/forge-std deleted file mode 160000 index 1eea5ba..0000000 --- a/contracts/lib/forge-std +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 1eea5bae12ae557d589f9f0f0edae2faa47cb262 diff --git a/contracts/src/AbstractRandomnessReceiver.sol b/contracts/src/AbstractRandomnessReceiver.sol deleted file mode 100644 index 7218ca0..0000000 --- a/contracts/src/AbstractRandomnessReceiver.sol +++ /dev/null @@ -1,15 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import {IRandomnessReceiver} from "./IRandomnessReceiver.sol"; - -abstract contract AbstractRandomnessReceiver { - address public immutable RANDOMNESS_PROVIDER = 0x9ed5a27a9f18529848D03AE699bDECC2Ba8D10FE; - - error NotAuthorizedRandomnessProvider(); - - modifier onlyRandomnessProvider(){ - if (msg.sender != RANDOMNESS_PROVIDER) revert NotAuthorizedRandomnessProvider(); - _; - } -} \ No newline at end of file diff --git a/contracts/src/FeistelShuffleOptimised.sol b/contracts/src/FeistelShuffleOptimised.sol deleted file mode 100644 index fc8cfa7..0000000 --- a/contracts/src/FeistelShuffleOptimised.sol +++ /dev/null @@ -1,179 +0,0 @@ -// SPDX-License-Identifier: MIT -// credit to our beloved friend Kevin Charm (https://github.com/kevincharm/) for this implementation -// which we pilfered from one of his repos -pragma solidity 0.8.24; - -/// @title FeistelShuffleOptimised -/// @author kevincharm -/// @notice Feistel shuffle implemented in Yul. -library FeistelShuffleOptimised { - error InvalidInputs(); - - /// @notice Compute a Feistel shuffle mapping for index `x` - /// @param x index of element in the list - /// @param domain Number of elements in the list - /// @param seed Random seed; determines the permutation - /// @param rounds Number of Feistel rounds to perform - /// @return resulting shuffled index - function shuffle(uint256 x, uint256 domain, uint256 seed, uint256 rounds) internal pure returns (uint256) { - // (domain != 0): domain must be non-zero (value of 1 also doesn't really make sense) - // (xPrime < domain): index to be permuted must lie within the domain of [0, domain) - // (rounds is even): we only handle even rounds to make the code simpler - if (domain == 0 || x >= domain || rounds & 1 == 1) { - revert InvalidInputs(); - } - - assembly { - // Calculate sqrt(s) using Babylonian method - function sqrt(s) -> z { - switch gt(s, 3) - // if (s > 3) - case 1 { - z := s - let r := add(div(s, 2), 1) - for {} lt(r, z) {} { - z := r - r := div(add(div(s, r), r), 2) - } - } - default { - if and(not(iszero(s)), 1) { - // else if (s != 0) - z := 1 - } - } - } - - // nps <- nextPerfectSquare(domain) - let sqrtN := sqrt(domain) - let nps - switch eq(exp(sqrtN, 2), domain) - case 1 { nps := domain } - default { - let sqrtN1 := add(sqrtN, 1) - // pre-check for square overflow - if gt(sqrtN1, sub(exp(2, 128), 1)) { - // overflow - revert(0, 0) - } - nps := exp(sqrtN1, 2) - } - // h <- sqrt(nps) - let h := sqrt(nps) - // Allocate scratch memory for inputs to keccak256 - let packed := mload(0x40) - mstore(0x40, add(packed, 0x80)) // 128B - // When calculating hashes for Feistel rounds, seed and domain - // do not change. So we can set them here just once. - mstore(add(packed, 0x40), seed) - mstore(add(packed, 0x60), domain) - // Loop until x < domain - for {} 1 {} { - let L := mod(x, h) - let R := div(x, h) - // Loop for desired number of rounds - for { let i := 0 } lt(i, rounds) { i := add(i, 1) } { - // Load R and i for next keccak256 round - mstore(packed, R) - mstore(add(packed, 0x20), i) - // roundHash <- keccak256([R, i, seed, domain]) - let roundHash := keccak256(packed, 0x80) - // nextR <- (L + roundHash) % h - let nextR := mod(add(L, roundHash), h) - L := R - R := nextR - } - // x <- h * R + L - x := add(mul(h, R), L) - if lt(x, domain) { break } - } - } - return x; - } - - /// @notice Compute the inverse Feistel shuffle mapping for the shuffled - /// index `xPrime` - /// @param xPrime shuffled index of element in the list - /// @param domain Number of elements in the list - /// @param seed Random seed; determines the permutation - /// @param rounds Number of Feistel rounds that was performed in the - /// original shuffle. - /// @return resulting shuffled index - function deshuffle(uint256 xPrime, uint256 domain, uint256 seed, uint256 rounds) internal pure returns (uint256) { - // (domain != 0): domain must be non-zero (value of 1 also doesn't really make sense) - // (xPrime < domain): index to be permuted must lie within the domain of [0, domain) - // (rounds is even): we only handle even rounds to make the code simpler - if (domain == 0 || xPrime >= domain || rounds & 1 == 1) { - revert InvalidInputs(); - } - - assembly { - // Calculate sqrt(s) using Babylonian method - function sqrt(s) -> z { - switch gt(s, 3) - // if (s > 3) - case 1 { - z := s - let r := add(div(s, 2), 1) - for {} lt(r, z) {} { - z := r - r := div(add(div(s, r), r), 2) - } - } - default { - if and(not(iszero(s)), 1) { - // else if (s != 0) - z := 1 - } - } - } - - // nps <- nextPerfectSquare(domain) - let sqrtN := sqrt(domain) - let nps - switch eq(exp(sqrtN, 2), domain) - case 1 { nps := domain } - default { - let sqrtN1 := add(sqrtN, 1) - // pre-check for square overflow - if gt(sqrtN1, sub(exp(2, 128), 1)) { - // overflow - revert(0, 0) - } - nps := exp(sqrtN1, 2) - } - // h <- sqrt(nps) - let h := sqrt(nps) - // Allocate scratch memory for inputs to keccak256 - let packed := mload(0x40) - mstore(0x40, add(packed, 0x80)) // 128B - // When calculating hashes for Feistel rounds, seed and domain - // do not change. So we can set them here just once. - mstore(add(packed, 0x40), seed) - mstore(add(packed, 0x60), domain) - // Loop until x < domain - for {} 1 {} { - let L := mod(xPrime, h) - let R := div(xPrime, h) - // Loop for desired number of rounds - for { let i := 0 } lt(i, rounds) { i := add(i, 1) } { - // Load L and i for next keccak256 round - mstore(packed, L) - mstore(add(packed, 0x20), sub(sub(rounds, i), 1)) - // roundHash <- keccak256([L, rounds - i - 1, seed, domain]) - // NB: extra arithmetic to avoid underflow - let roundHash := mod(keccak256(packed, 0x80), h) - // nextL <- (R - roundHash) % h - // NB: extra arithmetic to avoid underflow - let nextL := mod(sub(add(R, h), roundHash), h) - R := L - L := nextL - } - // x <- h * R + L - xPrime := add(mul(h, R), L) - if lt(xPrime, domain) { break } - } - } - return xPrime; - } -} diff --git a/contracts/src/IRandomnessProvider.sol b/contracts/src/IRandomnessProvider.sol deleted file mode 100644 index 58b784c..0000000 --- a/contracts/src/IRandomnessProvider.sol +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "./TypesLib.sol"; - -interface IRandomnessProvider { - /** - * @notice Requests the generation of a random value for a specified blockchain height. - * @dev Initiates a randomness request. - * The generated randomness will be associated with the returned `requestId`. - * @return requestId The unique identifier assigned to this randomness request. - */ - function requestRandomness() external returns (uint256 requestId); - - /** - * @notice Retrieves a specific request by its ID. - * @dev This function returns the Request struct associated with the given requestId. - * @param requestId The ID of the request to retrieve. - * @return The Request struct corresponding to the given requestId. - */ - function getRequest(uint256 requestId) external view returns (TypesLib.RandomnessRequest memory); - - /** - * @notice Retrieves all requests. - * @dev This function returns an array of all Request structs stored in the contract. - * @return An array containing all the Request structs. - */ - function getAllRequests() external view returns (TypesLib.RandomnessRequest[] memory); - - /** - * @notice Generates a message from the given request. - * @dev Creates a hash-based message using the `DST` and `nonce` fields of the `Request` struct. - * The resulting message is the hash of the encoded values, packed into a byte array. - * @param r The `Request` struct containing the data for generating the message. - * @return A byte array representing the hashed and encoded message. - */ - function messageFrom(TypesLib.RandomnessRequest memory r) external pure returns (bytes memory); -} diff --git a/contracts/src/IRandomnessReceiver.sol b/contracts/src/IRandomnessReceiver.sol deleted file mode 100644 index 2a3f187..0000000 --- a/contracts/src/IRandomnessReceiver.sol +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -interface IRandomnessReceiver { - /** - * @notice Receives a random value associated with a specific request. - * @dev This function is called to provide the randomness generated for a given request ID. - * It is intended to be called by a trusted source that provides randomness. - * @param requestId The unique identifier of the randomness request. - * @param randomness The generated random value, provided as a `bytes32` type. - */ - function receiveRandomness(uint256 requestId, bytes32 randomness) external; -} diff --git a/contracts/src/Randomness.sol b/contracts/src/Randomness.sol deleted file mode 100644 index 7930017..0000000 --- a/contracts/src/Randomness.sol +++ /dev/null @@ -1,47 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import {FeistelShuffleOptimised} from "./FeistelShuffleOptimised.sol"; - -library Randomness { - function getRandomnessProvider() public pure returns(address randomnessProvider){ - return 0x9ed5a27a9f18529848D03AE699bDECC2Ba8D10FE; - } - - /** - * @notice selects a set of indices randomly from a given array length - * @dev It is intended to be called with randomn bytes from the dcrypt or drand networks, but can also be called - * with random bytes from another source. - * @param lengthOfArray the length of the array you wish to draw indices from - * @param countToDraw the number of indices you wish to draw from the array - * @param randomBytes 32 bytes of uniformly distributed randomness - */ - function selectArrayIndices(uint256 lengthOfArray, uint256 countToDraw, bytes32 randomBytes) - public - pure - returns (uint256[] memory) - { - if (lengthOfArray == 0) { - return new uint256[](0); - } - - uint256[] memory winners = new uint256[](countToDraw); - if (lengthOfArray <= countToDraw) { - for (uint256 i = 0; i < countToDraw; i++) { - winners[i] = i; - } - return winners; - } - - uint256 randomness; - assembly { - randomness := randomBytes - } - - for (uint256 i = 0; i < countToDraw; i++) { - winners[i] = FeistelShuffleOptimised.deshuffle(i, lengthOfArray, randomness, 10); - } - - return winners; - } -} diff --git a/contracts/src/TypesLib.sol b/contracts/src/TypesLib.sol deleted file mode 100644 index 114162d..0000000 --- a/contracts/src/TypesLib.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -library TypesLib { - - // RandomnessRequest stores details needed to verify the signature - struct RandomnessRequest { - uint256 requestId; - address callback; - } - -} diff --git a/contracts/src/helper/MockRandomnessRequester.sol b/contracts/src/helper/MockRandomnessRequester.sol deleted file mode 100644 index 1016bd1..0000000 --- a/contracts/src/helper/MockRandomnessRequester.sol +++ /dev/null @@ -1,59 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; - -import "../IRandomnessReceiver.sol"; -import "../IRandomnessProvider.sol"; - -contract MockRandomnessRequester is IRandomnessProvider { - // the DST is used to separate randomness being used as signatures for other things - string public constant DST = "randomness:0.0.1:bn254"; - // while the signature is verifiable, this is done elsewhere so ensure only the signer contract can write back here - bytes32 public constant SIGNER_ROLE = keccak256("SIGNER_ROLE"); - - // Request stores details needed to verify the signature - struct Request { - uint256 nonce; - address callback; - } - - event RandomnessRequested(uint256 indexed requestID, uint256 nonce, address requester); - event RandomnessCallbackSuccess(uint256 indexed requestID, bytes32 randomness, bytes signature); - event RandomnessCallbackFailed(uint256 indexed requestID, bytes32 randomness, bytes signature); - - mapping(uint256 => address) requestIdToReceiver; - uint256 public lastRequestId; - uint256[] requests; - mapping(address => uint256[]) public receiverToRequestIds; - - function requestRandomness() external returns (uint256) { - lastRequestId++; - requestIdToReceiver[lastRequestId] = msg.sender; - requests.push(lastRequestId); - return lastRequestId; - } - - function getRequest(uint256 requestId) external view returns (TypesLib.RandomnessRequest memory){ - return TypesLib.RandomnessRequest(requestId, requestIdToReceiver[requestId]); - } - - function getAllRequests() external view returns (TypesLib.RandomnessRequest[] memory){ - TypesLib.RandomnessRequest[] memory allRequests = new TypesLib.RandomnessRequest[](lastRequestId); - for(uint i; i=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.0.tgz", - "integrity": "sha512-aP8x5pIw3xvYr/sXT+SEUwyhrXT8rUJRZltK/qN3Db80dcKpTett8cJxHyjk+xYSVXvNnl2SfcJVjbwxpOSscA==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", + "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.0" + "@babel/types": "^7.27.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -483,15 +488,15 @@ } }, "node_modules/@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", + "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0" }, "engines": { "node": ">=6.9.0" @@ -517,9 +522,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", - "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", + "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", "dev": true, "license": "MIT", "dependencies": { @@ -561,8 +566,78 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.0", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", "cpu": [ "arm64" ], @@ -576,6 +651,346 @@ "node": ">=18" } }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -713,19 +1128,34 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.1.tgz", - "integrity": "sha512-HFZ4Mp26nbWk9d/BpvP0YNL6W4UoZF0VFcTw/aPPA8RpOxeFQgK+ClABGgAUXs9Y/RGX/l1vOmrqz1MQt9MNuw==", + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", + "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { + "@eslint/core": "^0.13.0", "levn": "^0.4.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", + "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@humanfs/core": { "version": "0.19.0", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.0.tgz", @@ -1154,13 +1584,40 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@kevincharm/noble-bn254-drand": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@kevincharm/noble-bn254-drand/-/noble-bn254-drand-0.0.1.tgz", + "integrity": "sha512-HU5Gmst+nxYx8OYKMWuaJZyXh+9/oqJL/L9F3B4My4/IOZZBqIkZIfHQMuPN6KoFHBni08YOw0sRQqEyHVpnGg==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@noble/curves": "^1.6.0" + } + }, "node_modules/@noble/curves": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", - "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.1.tgz", + "integrity": "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==", "license": "MIT", "dependencies": { - "@noble/hashes": "1.3.2" + "@noble/hashes": "1.7.1" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/curves/node_modules/@noble/hashes": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.1.tgz", + "integrity": "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -1271,6 +1728,22 @@ "dev": true, "license": "MIT" }, + "node_modules/@typechain/ethers-v6": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@typechain/ethers-v6/-/ethers-v6-0.5.1.tgz", + "integrity": "sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.15", + "ts-essentials": "^7.0.1" + }, + "peerDependencies": { + "ethers": "6.x", + "typechain": "^8.3.2", + "typescript": ">=4.7.0" + } + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -1316,6 +1789,16 @@ "@babel/types": "^7.20.7" } }, + "node_modules/@types/dotenv": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@types/dotenv/-/dotenv-6.1.1.tgz", + "integrity": "sha512-ftQl3DtBvqHl9L16tpqqzA4YzCSXZfi7g8cQceTz5rOlYtk/IZbFjAv3mLOQlNIgOaylCQWQoBdDQHPgEBJPHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", @@ -1390,6 +1873,13 @@ "undici-types": "~6.19.8" } }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", @@ -1777,6 +2267,16 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/async": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", @@ -2103,84 +2603,214 @@ "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", + "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/command-line-usage": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", + "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-back": "^4.0.2", + "chalk": "^2.4.2", + "table-layout": "^1.0.2", + "typical": "^5.2.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/command-line-usage/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/command-line-usage/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "node_modules/command-line-usage/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "color-name": "1.1.3" } }, - "node_modules/cjs-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", - "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", + "node_modules/command-line-usage/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, "license": "MIT" }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "node_modules/command-line-usage/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=0.8.0" } }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "node_modules/command-line-usage/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" + "node": ">=4" } }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/command-line-usage/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=4" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "node_modules/command-line-usage/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=8" + } }, "node_modules/concat-map": { "version": "0.0.1", @@ -2226,9 +2856,9 @@ "license": "MIT" }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", "dependencies": { @@ -2273,6 +2903,16 @@ } } }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -2321,6 +2961,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/dotenv": { + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/ejs": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", @@ -2375,7 +3028,9 @@ } }, "node_modules/esbuild": { - "version": "0.24.0", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -2386,30 +3041,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.0", - "@esbuild/android-arm": "0.24.0", - "@esbuild/android-arm64": "0.24.0", - "@esbuild/android-x64": "0.24.0", - "@esbuild/darwin-arm64": "0.24.0", - "@esbuild/darwin-x64": "0.24.0", - "@esbuild/freebsd-arm64": "0.24.0", - "@esbuild/freebsd-x64": "0.24.0", - "@esbuild/linux-arm": "0.24.0", - "@esbuild/linux-arm64": "0.24.0", - "@esbuild/linux-ia32": "0.24.0", - "@esbuild/linux-loong64": "0.24.0", - "@esbuild/linux-mips64el": "0.24.0", - "@esbuild/linux-ppc64": "0.24.0", - "@esbuild/linux-riscv64": "0.24.0", - "@esbuild/linux-s390x": "0.24.0", - "@esbuild/linux-x64": "0.24.0", - "@esbuild/netbsd-x64": "0.24.0", - "@esbuild/openbsd-arm64": "0.24.0", - "@esbuild/openbsd-x64": "0.24.0", - "@esbuild/sunos-x64": "0.24.0", - "@esbuild/win32-arm64": "0.24.0", - "@esbuild/win32-ia32": "0.24.0", - "@esbuild/win32-x64": "0.24.0" + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" } }, "node_modules/escalade": { @@ -2730,6 +3386,18 @@ "node": ">=14.0.0" } }, + "node_modules/ethers/node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/ethers/node_modules/@types/node": { "version": "22.7.5", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", @@ -2922,6 +3590,19 @@ "node": ">=8" } }, + "node_modules/find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -2959,6 +3640,21 @@ "license": "ISC", "peer": true }, + "node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -4037,6 +4733,13 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "dev": true, + "license": "MIT" + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -4115,6 +4818,16 @@ "node": ">=6" } }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -4181,6 +4894,20 @@ "node": ">=8" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -4252,27 +4979,6 @@ "tmpl": "1.0.5" } }, - "node_modules/mcl-wasm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-1.7.0.tgz", - "integrity": "sha512-ok9uE7ekFh5+orI0dFT19KeY/y5P6ONp0dks8oo/KniyNK6mJ0zloL3+s6LiEQXW8VxQHwsfZslitL/R7MM9ew==", - "license": "BSD-3-Clause", - "dependencies": { - "@types/node": "^20.2.5" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/mcl-wasm/node_modules/@types/node": { - "version": "20.17.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.1.tgz", - "integrity": "sha512-j2VlPv1NnwPJbaCNv69FO/1z4lId0QmGvpT41YxitRtWlg96g/j8qcv2RKsLKe2F6OJgyXhupN1Xo17b2m139Q==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.19.2" - } - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -4327,6 +5033,19 @@ "node": "*" } }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -4602,6 +5321,22 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", @@ -4700,6 +5435,16 @@ "dev": true, "license": "MIT" }, + "node_modules/reduce-flatten": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", + "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -4894,6 +5639,13 @@ "node": ">=10" } }, + "node_modules/string-format": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", + "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", + "dev": true, + "license": "WTFPL OR MIT" + }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -4995,6 +5747,42 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/table-layout": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", + "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-back": "^4.0.1", + "deep-extend": "~0.6.0", + "typical": "^5.2.0", + "wordwrapjs": "^4.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/table-layout/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/table-layout/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -5051,6 +5839,32 @@ "typescript": ">=4.2.0" } }, + "node_modules/ts-command-line-args": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz", + "integrity": "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==", + "dev": true, + "license": "ISC", + "dependencies": { + "chalk": "^4.1.0", + "command-line-args": "^5.1.1", + "command-line-usage": "^6.1.0", + "string-format": "^2.0.0" + }, + "bin": { + "write-markdown": "dist/write-markdown.js" + } + }, + "node_modules/ts-essentials": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", + "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "typescript": ">=3.7.0" + } + }, "node_modules/ts-jest": { "version": "29.2.5", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz", @@ -5200,6 +6014,53 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typechain": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.3.2.tgz", + "integrity": "sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prettier": "^2.1.1", + "debug": "^4.3.1", + "fs-extra": "^7.0.0", + "glob": "7.1.7", + "js-sha3": "^0.8.0", + "lodash": "^4.17.15", + "mkdirp": "^1.0.4", + "prettier": "^2.3.1", + "ts-command-line-args": "^2.2.0", + "ts-essentials": "^7.0.1" + }, + "bin": { + "typechain": "dist/cli/cli.js" + }, + "peerDependencies": { + "typescript": ">=4.3.0" + } + }, + "node_modules/typechain/node_modules/glob": { + "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", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/typescript": { "version": "5.6.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", @@ -5236,12 +6097,32 @@ } } }, + "node_modules/typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/undici-types": { "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "license": "MIT" }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/update-browserslist-db": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", @@ -5343,6 +6224,30 @@ "node": ">=0.10.0" } }, + "node_modules/wordwrapjs": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", + "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", + "dev": true, + "license": "MIT", + "dependencies": { + "reduce-flatten": "^2.0.0", + "typical": "^5.2.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/wordwrapjs/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", diff --git a/package.json b/package.json index 35d190c..09f5a54 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "randomness-js", - "version": "0.0.1-rc5", + "version": "0.0.1-rc6", "description": "A library for consuming, verifying and using randomness from the dcipher network", "source": "src/index.ts", "main": "./dist/cjs/index.cjs", @@ -25,7 +25,9 @@ "README.md" ], "scripts": { - "build": "npm run clean && npm run build:cjs && npm run build:esm && npm run build:types", + "build": "npm run clean && npm run build:solidity && npm run build:generate && npm run build:cjs && npm run build:esm && npm run build:types", + "build:solidity": "(cd ./randomness-solidity && forge build && cd ..)", + "build:generate": "mkdir -p src/generated && npx typechain --target ethers-v6 --out-dir src/generated './randomness-solidity/out/*.sol/*.json'", "build:esm": "esbuild src/index.ts --bundle --platform=browser --format=esm --outdir=dist/esm --sourcemap --target=es2020 --out-extension:.js=.mjs", "build:cjs": "esbuild src/index.ts --bundle --platform=node --format=cjs --outdir=dist/cjs --sourcemap --target=es2020 --out-extension:.js=.cjs", "build:types": "tsc", @@ -49,18 +51,23 @@ }, "homepage": "https://github.com/randa-mu/randomness-js#readme", "dependencies": { + "@kevincharm/noble-bn254-drand": "^0.0.1", + "@noble/curves": "^1.8.1", "buffer": "^6.0.3", - "ethers": "^6.13.4", - "mcl-wasm": "^1.7.0" + "ethers": "^6.13.4" }, "devDependencies": { "@jest/globals": "^29.7.0", + "@typechain/ethers-v6": "^0.5.1", + "@types/dotenv": "^6.1.1", "@types/jest": "^29.5.14", "@types/node": "^22.7.5", + "dotenv": "^16.4.7", "esbuild": "^0.24.0", "jest": "^29.7.0", "ts-jest": "^29.2.5", "ts-node": "^10.9.2", + "typechain": "^8.3.2", "typescript": "^5.6.3", "typescript-eslint": "^8.11.0" }, diff --git a/randomness-solidity b/randomness-solidity index c52b862..e038a3c 160000 --- a/randomness-solidity +++ b/randomness-solidity @@ -1 +1 @@ -Subproject commit c52b86212b84398b094268790a0c605e59bd2ac0 +Subproject commit e038a3c322a5e3a4e09bd150f298db9b1f8800f2 diff --git a/src/bls-bn254.ts b/src/bls-bn254.ts deleted file mode 100644 index 5139ec8..0000000 --- a/src/bls-bn254.ts +++ /dev/null @@ -1,407 +0,0 @@ -// eslint-disable @typescript-eslint/no-unused-vars - -import { - dataSlice, - hexlify, - getBytes, - keccak256, - randomBytes, - solidityPacked, - BytesLike, - isHexString -} from "ethers" -import * as mcl from "mcl-wasm" -import type {G1, G2, Fr, Fp, Fp2} from "mcl-wasm" -import {utf8ToBytes} from "@noble/curves/abstract/utils" - -/** - * Mcl wrapper for BLS operations - * Adapted from: https://github.com/kilic/evmbls - */ -class BlsBn254 { - static readonly FIELD_ORDER = - 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47n - - public readonly G1: G1 - public readonly G2: G2 - - private constructor() { - this.G1 = new mcl.G1() - const g1x: Fp = new mcl.Fp() - const g1y: Fp = new mcl.Fp() - const g1z: Fp = new mcl.Fp() - g1x.setStr("01", 16) - g1y.setStr("02", 16) - g1z.setInt(1) - this.G1.setX(g1x) - this.G1.setY(g1y) - this.G1.setZ(g1z) - this.G2 = new mcl.G2() - const g2x = createFp2( - "0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed", - "0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2", - ) - const g2y = createFp2( - "0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", - "0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b", - ) - const g2z = createFp2("0x01", "0x00") - this.G2.setX(g2x) - this.G2.setY(g2y) - this.G2.setZ(g2z) - } - - public static async create() { - await mcl.init(mcl.BN_SNARK1) - mcl.setETHserialization(true) - mcl.setMapToMode(0) // FT - return new BlsBn254() - } - - public newG1(): G1 { - return new mcl.G1() - } - - public newG2(): G2 { - return new mcl.G2() - } - - public newFp(): Fp { - return new mcl.Fp() - } - - public expandMsg(domain: Uint8Array, msg: Uint8Array, outLen: number): Uint8Array { - if (domain.length > 255) { - throw new Error("bad domain size") - } - - const domainLen = domain.length - if (domainLen > 255) { - throw new Error("InvalidDSTLength") - } - const zpad = new Uint8Array(136) - const b_0 = solidityPacked( - ["bytes", "bytes", "uint8", "uint8", "uint8", "bytes", "uint8"], - [zpad, msg, outLen >> 8, outLen & 0xff, 0, domain, domainLen], - ) - const b0 = keccak256(b_0) - - const b_i = solidityPacked( - ["bytes", "uint8", "bytes", "uint8"], - [b0, 1, domain, domain.length], - ) - let bi = keccak256(b_i) - - const out = new Uint8Array(outLen) - const ell = Math.floor((outLen + 32 - 1) / 32) // keccak256 blksize - for (let i = 1; i < ell; i++) { - const b_i = solidityPacked( - ["bytes32", "uint8", "bytes", "uint8"], - [toHex(BigInt(b0) ^ BigInt(bi)), 1 + i, domain, domain.length], - ) - const bi_bytes = getBytes(bi) - for (let j = 0; j < 32; j++) { - out[(i - 1) * 32 + j] = bi_bytes[j] - } - bi = keccak256(b_i) - } - const bi_bytes = getBytes(bi) - for (let j = 0; j < 32; j++) { - out[(ell - 1) * 32 + j] = bi_bytes[j] - } - return out - } - - public hashToField(domain: Uint8Array, msg: Uint8Array, count: number): bigint[] { - const u = 48 - const _msg = this.expandMsg(domain, msg, count * u) - const els: bigint[] = [] - for (let i = 0; i < count; i++) { - const el = mod(BigInt(hexlify(_msg.slice(i * u, (i + 1) * u))), BlsBn254.FIELD_ORDER) - els.push(el) - } - return els - } - - public hashToPoint(domain: Uint8Array, msg: Uint8Array): G1 { - const hashRes = this.hashToField(domain, msg, 2) - const e0 = hashRes[0] - const e1 = hashRes[1] - const p0 = this.mapToPoint(toHex(e0)) - const p1 = this.mapToPoint(toHex(e1)) - const p = mcl.add(p0, p1) - p.normalize() - - return p - } - - public serialiseFp(p: Fp | Fp2): `0x${string}` { - // NB: big-endian - return ("0x" + - Array.from(p.serialize()) - .reverse() - .map((value) => value.toString(16).padStart(2, "0")) - .join("")) as `0x${string}` - } - - public serialiseG1Point(p: G1): [bigint, bigint] { - p.normalize() - const x = BigInt(this.serialiseFp(p.getX())) - const y = BigInt(this.serialiseFp(p.getY())) - return [x, y] - } - - public serialiseG2Point(p: G2): [bigint, bigint, bigint, bigint] { - const x = this.serialiseFp(p.getX()) - const y = this.serialiseFp(p.getY()) - return [ - BigInt(dataSlice(x, 32)), - BigInt(dataSlice(x, 0, 32)), - BigInt(dataSlice(y, 32)), - BigInt(dataSlice(y, 0, 32)), - ] - } - - public deserialiseFp2([x, y]: [bigint, bigint]): Fp2 { - const xx = new mcl.Fp() - const yy = new mcl.Fp() - xx.setStr(toHex(x), 16) - yy.setStr(toHex(y), 16) - - const out = new mcl.Fp2() - out.set_a(xx) - out.set_b(yy) - - return out - } - - public g1FromEvmHex(input: BytesLike) { - const hex = hexlify(input) - const trimmed = hex.startsWith("0x") ? hex.slice(2) : hex - const x = trimmed.slice(0, trimmed.length / 2) - const y = trimmed.slice(trimmed.length / 2, trimmed.length) - - return this.g1FromEvm(BigInt(`0x${x}`), BigInt(`0x${y}`)) - } - - public g1FromEvm(g1X: bigint, g1Y: bigint) { - const x = toHex(g1X) - const y = toHex(g1Y) - - const Mx = this.newFp() - const My = this.newFp() - const Mz = this.newFp() - Mx.setStr(x, 16) - My.setStr(y, 16) - Mz.setInt(1) - - const M = this.newG1() - M.setX(Mx) - M.setY(My) - M.setZ(Mz) - return M - } - - public g2FromEvm([x1, x2, y1, y2]: [bigint, bigint, bigint, bigint]) { - const out = this.newG2() - out.setX(this.deserialiseFp2([x1, x2])) - out.setY(this.deserialiseFp2([y1, y2])) - // this is swapped because EVM (: - out.setZ(this.deserialiseFp2([1n, 0n])) - return out - } - - public g2From(input: BytesLike): G2 { - const out = this.G2.clone() - out.deserialize(bytes(input)) - return out - } - - public createKeyPair(_secretKey?: `0x${string}`) { - if (!_secretKey) { - _secretKey = hexlify(randomBytes(31)) as `0x${string}` - } - - const secretKey: Fr = new mcl.Fr() - secretKey.setHashOf(_secretKey) - const pubKey: G2 = mcl.mul(this.G2, secretKey) - pubKey.normalize() - return { - secretKey, - _secretKey, - pubKey, - } - } - - public sign(M: G1, secret: Fr) { - const signature: G1 = mcl.mul(M, secret) - signature.normalize() - return { - signature, - M, - } - } - - public verify(h_m: G1, pk: G2, signature: G1): boolean { - return mcl.pairing(h_m, pk).isEqual(mcl.pairing(signature, this.G2)) - } - - public mapToPoint(eHex: `0x${string}`): G1 { - const C2 = 0x183227397098d014dc2822db40c0ac2ecbc0b548b438e5469e10460b6c3e7ea3n - const C3 = 0x16789af3a83522eb353c98fc6b36d713d5d8d1cc5dffffffan - const C4 = 0x10216f7ba065e00de81ac1e7808072c9dd2b2385cd7b438469602eb24829a9bdn - const Z = 1n - const g = this.g.bind(this) - const neg = this.neg.bind(this) - const add = this.add.bind(this) - const sub = this.sub.bind(this) - const mul = this.mul.bind(this) - const inv0 = this.inv0.bind(this) - const sgn0 = this.sgn0.bind(this) - const legendre = this.legendre.bind(this) - const sqrt = this.sqrt.bind(this) - - const u = BigInt(eHex) - - let tv1 = mul(mul(u, u), g(Z)) - const tv2 = add(1n, tv1) - tv1 = sub(1n, tv1) - const tv3 = inv0(mul(tv1, tv2)) - const tv5 = mul(mul(mul(u, tv1), tv3), C3) - const x1 = add(C2, neg(tv5)) - const x2 = add(C2, tv5) - const tv7 = mul(tv2, tv2) - const tv8 = mul(tv7, tv3) - const x3 = add(Z, mul(C4, mul(tv8, tv8))) - - let x - let y - if (legendre(g(x1)) === 1n) { - x = x1 - y = sqrt(g(x1)) - } else if (legendre(g(x2)) === 1n) { - x = x2 - y = sqrt(g(x2)) - } else { - x = x3 - y = sqrt(g(x3)) - } - if (sgn0(u) != sgn0(y)) { - y = neg(y) - } - - const g1x: Fp = new mcl.Fp() - const g1y: Fp = new mcl.Fp() - const g1z: Fp = new mcl.Fp() - g1x.setStr(x.toString(), 10) - g1y.setStr(y.toString(), 10) - g1z.setInt(1) - const point: G1 = new mcl.G1() - point.setX(g1x) - point.setY(g1y) - point.setZ(g1z) - return point - } - - private g(x: bigint): bigint { - const mul = this.mul.bind(this) - const add = this.add.bind(this) - return add(mul(mul(x, x), x), 3n) - } - - private neg(x: bigint) { - return mod(-x, BlsBn254.FIELD_ORDER) - } - - private mul(a: bigint, b: bigint) { - return mod(a * b, BlsBn254.FIELD_ORDER) - } - - private add(a: bigint, b: bigint) { - return mod(a + b, BlsBn254.FIELD_ORDER) - } - - private sub(a: bigint, b: bigint) { - return mod(a - b, BlsBn254.FIELD_ORDER) - } - - private exp(x: bigint, n: bigint): bigint { - const mul = this.mul.bind(this) - let result = 1n - let base = mod(x, BlsBn254.FIELD_ORDER) - let e_prime = n - while (e_prime > 0) { - if (mod(e_prime, 2n) == 1n) { - result = mul(result, base) - } - e_prime = e_prime >> 1n - base = mul(base, base) - } - return result - } - - private sqrt(u: bigint) { - return this.exp(u, 0xc19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f52n) - } - - private sgn0(x: bigint) { - return mod(x, 2n) - } - - private inv0(x: bigint) { - if (x === 0n) { - return 0n - } - return this.exp(x, BlsBn254.FIELD_ORDER - 2n) - } - - private legendre(u: bigint): 1n | 0n | -1n { - const x = this.exp(u, 0x183227397098d014dc2822db40c0ac2ecbc0b548b438e5469e10460b6c3e7ea3n) - if (x === BlsBn254.FIELD_ORDER - 1n) { - return -1n - } - if (x !== 0n && x !== 1n) { - throw Error("Legendre symbol calc failed") - } - return x - } - -} - -function bytes(b: BytesLike): Uint8Array { - if (typeof b === "string" && !isHexString(b)) { - return utf8ToBytes(b) - } - return getBytes(b) -} - -function mod(a: bigint, b: bigint) { - return ((a % b) + b) % b -} - -export function toHex(n: bigint): `0x${string}` { - return ("0x" + n.toString(16).padStart(64, "0")) as `0x${string}` -} - -function createFp2(a: string, b: string) { - const fp2_a: Fp = new mcl.Fp() - const fp2_b: Fp = new mcl.Fp() - fp2_a.setStr(a) - fp2_b.setStr(b) - const fp2: Fp2 = new mcl.Fp2() - fp2.set_a(fp2_a) - fp2.set_b(fp2_b) - return fp2 -} - -function bytesEqual(bytes1: BytesLike, bytes2: BytesLike): boolean { - const arr1 = getBytes(bytes1) - const arr2 = getBytes(bytes2) - if (arr1.length !== arr2.length) { - return false - } - - return arr1.every((value, index) => value === arr2[index]) -} - -export {BlsBn254, bytesEqual} \ No newline at end of file diff --git a/src/generated/IRandomnessReceiver.ts b/src/generated/IRandomnessReceiver.ts deleted file mode 100644 index 4590c15..0000000 --- a/src/generated/IRandomnessReceiver.ts +++ /dev/null @@ -1,99 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import type { - BaseContract, - BigNumberish, - BytesLike, - FunctionFragment, - Result, - Interface, - ContractRunner, - ContractMethod, - Listener, -} from "ethers"; -import type { - TypedContractEvent, - TypedDeferredTopicFilter, - TypedEventLog, - TypedListener, - TypedContractMethod, -} from "./common"; - -export interface IRandomnessReceiverInterface extends Interface { - getFunction(nameOrSignature: "receiveRandomness"): FunctionFragment; - - encodeFunctionData( - functionFragment: "receiveRandomness", - values: [BigNumberish, BytesLike] - ): string; - - decodeFunctionResult( - functionFragment: "receiveRandomness", - data: BytesLike - ): Result; -} - -export interface IRandomnessReceiver extends BaseContract { - connect(runner?: ContractRunner | null): IRandomnessReceiver; - waitForDeployment(): Promise; - - interface: IRandomnessReceiverInterface; - - queryFilter( - event: TCEvent, - fromBlockOrBlockhash?: string | number | undefined, - toBlock?: string | number | undefined - ): Promise>>; - queryFilter( - filter: TypedDeferredTopicFilter, - fromBlockOrBlockhash?: string | number | undefined, - toBlock?: string | number | undefined - ): Promise>>; - - on( - event: TCEvent, - listener: TypedListener - ): Promise; - on( - filter: TypedDeferredTopicFilter, - listener: TypedListener - ): Promise; - - once( - event: TCEvent, - listener: TypedListener - ): Promise; - once( - filter: TypedDeferredTopicFilter, - listener: TypedListener - ): Promise; - - listeners( - event: TCEvent - ): Promise>>; - listeners(eventName?: string): Promise>; - removeAllListeners( - event?: TCEvent - ): Promise; - - receiveRandomness: TypedContractMethod< - [requestID: BigNumberish, randomness: BytesLike], - [void], - "nonpayable" - >; - - getFunction( - key: string | FunctionFragment - ): T; - - getFunction( - nameOrSignature: "receiveRandomness" - ): TypedContractMethod< - [requestID: BigNumberish, randomness: BytesLike], - [void], - "nonpayable" - >; - - filters: {}; -} diff --git a/src/generated/IRandomnessRequester.ts b/src/generated/IRandomnessRequester.ts deleted file mode 100644 index b7ca780..0000000 --- a/src/generated/IRandomnessRequester.ts +++ /dev/null @@ -1,172 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import type { - BaseContract, - BigNumberish, - BytesLike, - FunctionFragment, - Result, - Interface, - AddressLike, - ContractRunner, - ContractMethod, - Listener, -} from "ethers"; -import type { - TypedContractEvent, - TypedDeferredTopicFilter, - TypedEventLog, - TypedListener, - TypedContractMethod, -} from "./common"; - -export declare namespace TypesLib { - export type RandomnessRequestStruct = { - requestID: BigNumberish; - nonce: BigNumberish; - callback: AddressLike; - }; - - export type RandomnessRequestStructOutput = [ - requestID: bigint, - nonce: bigint, - callback: string - ] & { requestID: bigint; nonce: bigint; callback: string }; -} - -export interface IRandomnessRequesterInterface extends Interface { - getFunction( - nameOrSignature: - | "getAllRequests" - | "getRequest" - | "messageFrom" - | "requestRandomness" - ): FunctionFragment; - - encodeFunctionData( - functionFragment: "getAllRequests", - values?: undefined - ): string; - encodeFunctionData( - functionFragment: "getRequest", - values: [BigNumberish] - ): string; - encodeFunctionData( - functionFragment: "messageFrom", - values: [TypesLib.RandomnessRequestStruct] - ): string; - encodeFunctionData( - functionFragment: "requestRandomness", - values?: undefined - ): string; - - decodeFunctionResult( - functionFragment: "getAllRequests", - data: BytesLike - ): Result; - decodeFunctionResult(functionFragment: "getRequest", data: BytesLike): Result; - decodeFunctionResult( - functionFragment: "messageFrom", - data: BytesLike - ): Result; - decodeFunctionResult( - functionFragment: "requestRandomness", - data: BytesLike - ): Result; -} - -export interface IRandomnessRequester extends BaseContract { - connect(runner?: ContractRunner | null): IRandomnessRequester; - waitForDeployment(): Promise; - - interface: IRandomnessRequesterInterface; - - queryFilter( - event: TCEvent, - fromBlockOrBlockhash?: string | number | undefined, - toBlock?: string | number | undefined - ): Promise>>; - queryFilter( - filter: TypedDeferredTopicFilter, - fromBlockOrBlockhash?: string | number | undefined, - toBlock?: string | number | undefined - ): Promise>>; - - on( - event: TCEvent, - listener: TypedListener - ): Promise; - on( - filter: TypedDeferredTopicFilter, - listener: TypedListener - ): Promise; - - once( - event: TCEvent, - listener: TypedListener - ): Promise; - once( - filter: TypedDeferredTopicFilter, - listener: TypedListener - ): Promise; - - listeners( - event: TCEvent - ): Promise>>; - listeners(eventName?: string): Promise>; - removeAllListeners( - event?: TCEvent - ): Promise; - - getAllRequests: TypedContractMethod< - [], - [TypesLib.RandomnessRequestStructOutput[]], - "view" - >; - - getRequest: TypedContractMethod< - [requestId: BigNumberish], - [TypesLib.RandomnessRequestStructOutput], - "view" - >; - - messageFrom: TypedContractMethod< - [r: TypesLib.RandomnessRequestStruct], - [string], - "view" - >; - - requestRandomness: TypedContractMethod<[], [bigint], "nonpayable">; - - getFunction( - key: string | FunctionFragment - ): T; - - getFunction( - nameOrSignature: "getAllRequests" - ): TypedContractMethod< - [], - [TypesLib.RandomnessRequestStructOutput[]], - "view" - >; - getFunction( - nameOrSignature: "getRequest" - ): TypedContractMethod< - [requestId: BigNumberish], - [TypesLib.RandomnessRequestStructOutput], - "view" - >; - getFunction( - nameOrSignature: "messageFrom" - ): TypedContractMethod< - [r: TypesLib.RandomnessRequestStruct], - [string], - "view" - >; - getFunction( - nameOrSignature: "requestRandomness" - ): TypedContractMethod<[], [bigint], "nonpayable">; - - filters: {}; -} diff --git a/src/generated/RandomnessReceiverBase.ts b/src/generated/RandomnessReceiverBase.ts deleted file mode 100644 index 13cc885..0000000 --- a/src/generated/RandomnessReceiverBase.ts +++ /dev/null @@ -1,99 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import type { - BaseContract, - BigNumberish, - BytesLike, - FunctionFragment, - Result, - Interface, - ContractRunner, - ContractMethod, - Listener, -} from "ethers"; -import type { - TypedContractEvent, - TypedDeferredTopicFilter, - TypedEventLog, - TypedListener, - TypedContractMethod, -} from "./common"; - -export interface RandomnessReceiverBaseInterface extends Interface { - getFunction(nameOrSignature: "receiveRandomness"): FunctionFragment; - - encodeFunctionData( - functionFragment: "receiveRandomness", - values: [BigNumberish, BytesLike] - ): string; - - decodeFunctionResult( - functionFragment: "receiveRandomness", - data: BytesLike - ): Result; -} - -export interface RandomnessReceiverBase extends BaseContract { - connect(runner?: ContractRunner | null): RandomnessReceiverBase; - waitForDeployment(): Promise; - - interface: RandomnessReceiverBaseInterface; - - queryFilter( - event: TCEvent, - fromBlockOrBlockhash?: string | number | undefined, - toBlock?: string | number | undefined - ): Promise>>; - queryFilter( - filter: TypedDeferredTopicFilter, - fromBlockOrBlockhash?: string | number | undefined, - toBlock?: string | number | undefined - ): Promise>>; - - on( - event: TCEvent, - listener: TypedListener - ): Promise; - on( - filter: TypedDeferredTopicFilter, - listener: TypedListener - ): Promise; - - once( - event: TCEvent, - listener: TypedListener - ): Promise; - once( - filter: TypedDeferredTopicFilter, - listener: TypedListener - ): Promise; - - listeners( - event: TCEvent - ): Promise>>; - listeners(eventName?: string): Promise>; - removeAllListeners( - event?: TCEvent - ): Promise; - - receiveRandomness: TypedContractMethod< - [requestID: BigNumberish, randomness: BytesLike], - [void], - "nonpayable" - >; - - getFunction( - key: string | FunctionFragment - ): T; - - getFunction( - nameOrSignature: "receiveRandomness" - ): TypedContractMethod< - [requestID: BigNumberish, randomness: BytesLike], - [void], - "nonpayable" - >; - - filters: {}; -} diff --git a/src/generated/RandomnessRequester.ts b/src/generated/RandomnessRequester.ts deleted file mode 100644 index 8417970..0000000 --- a/src/generated/RandomnessRequester.ts +++ /dev/null @@ -1,599 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import type { - BaseContract, - BigNumberish, - BytesLike, - FunctionFragment, - Result, - Interface, - EventFragment, - AddressLike, - ContractRunner, - ContractMethod, - Listener, -} from "ethers"; -import type { - TypedContractEvent, - TypedDeferredTopicFilter, - TypedEventLog, - TypedLogDescription, - TypedListener, - TypedContractMethod, -} from "./common"; - -export declare namespace TypesLib { - export type RandomnessRequestStruct = { - requestID: BigNumberish; - nonce: BigNumberish; - callback: AddressLike; - }; - - export type RandomnessRequestStructOutput = [ - requestID: bigint, - nonce: bigint, - callback: string - ] & { requestID: bigint; nonce: bigint; callback: string }; -} - -export interface RandomnessRequesterInterface extends Interface { - getFunction( - nameOrSignature: - | "DEFAULT_ADMIN_ROLE" - | "DST" - | "getAllRequests" - | "getRequest" - | "getRoleAdmin" - | "grantRole" - | "hasRole" - | "isInFlight" - | "messageFrom" - | "nonce" - | "receiveSignature" - | "renounceRole" - | "requestRandomness" - | "revokeRole" - | "schemeID" - | "supportsInterface" - ): FunctionFragment; - - getEvent( - nameOrSignatureOrTopic: - | "RandomnessCallbackFailed" - | "RandomnessCallbackSuccess" - | "RandomnessRequested" - | "RoleAdminChanged" - | "RoleGranted" - | "RoleRevoked" - ): EventFragment; - - encodeFunctionData( - functionFragment: "DEFAULT_ADMIN_ROLE", - values?: undefined - ): string; - encodeFunctionData(functionFragment: "DST", values?: undefined): string; - encodeFunctionData( - functionFragment: "getAllRequests", - values?: undefined - ): string; - encodeFunctionData( - functionFragment: "getRequest", - values: [BigNumberish] - ): string; - encodeFunctionData( - functionFragment: "getRoleAdmin", - values: [BytesLike] - ): string; - encodeFunctionData( - functionFragment: "grantRole", - values: [BytesLike, AddressLike] - ): string; - encodeFunctionData( - functionFragment: "hasRole", - values: [BytesLike, AddressLike] - ): string; - encodeFunctionData( - functionFragment: "isInFlight", - values: [BigNumberish] - ): string; - encodeFunctionData( - functionFragment: "messageFrom", - values: [TypesLib.RandomnessRequestStruct] - ): string; - encodeFunctionData(functionFragment: "nonce", values?: undefined): string; - encodeFunctionData( - functionFragment: "receiveSignature", - values: [BigNumberish, BytesLike] - ): string; - encodeFunctionData( - functionFragment: "renounceRole", - values: [BytesLike, AddressLike] - ): string; - encodeFunctionData( - functionFragment: "requestRandomness", - values?: undefined - ): string; - encodeFunctionData( - functionFragment: "revokeRole", - values: [BytesLike, AddressLike] - ): string; - encodeFunctionData(functionFragment: "schemeID", values?: undefined): string; - encodeFunctionData( - functionFragment: "supportsInterface", - values: [BytesLike] - ): string; - - decodeFunctionResult( - functionFragment: "DEFAULT_ADMIN_ROLE", - data: BytesLike - ): Result; - decodeFunctionResult(functionFragment: "DST", data: BytesLike): Result; - decodeFunctionResult( - functionFragment: "getAllRequests", - data: BytesLike - ): Result; - decodeFunctionResult(functionFragment: "getRequest", data: BytesLike): Result; - decodeFunctionResult( - functionFragment: "getRoleAdmin", - data: BytesLike - ): Result; - decodeFunctionResult(functionFragment: "grantRole", data: BytesLike): Result; - decodeFunctionResult(functionFragment: "hasRole", data: BytesLike): Result; - decodeFunctionResult(functionFragment: "isInFlight", data: BytesLike): Result; - decodeFunctionResult( - functionFragment: "messageFrom", - data: BytesLike - ): Result; - decodeFunctionResult(functionFragment: "nonce", data: BytesLike): Result; - decodeFunctionResult( - functionFragment: "receiveSignature", - data: BytesLike - ): Result; - decodeFunctionResult( - functionFragment: "renounceRole", - data: BytesLike - ): Result; - decodeFunctionResult( - functionFragment: "requestRandomness", - data: BytesLike - ): Result; - decodeFunctionResult(functionFragment: "revokeRole", data: BytesLike): Result; - decodeFunctionResult(functionFragment: "schemeID", data: BytesLike): Result; - decodeFunctionResult( - functionFragment: "supportsInterface", - data: BytesLike - ): Result; -} - -export namespace RandomnessCallbackFailedEvent { - export type InputTuple = [ - requestID: BigNumberish, - randomness: BytesLike, - signature: BytesLike - ]; - export type OutputTuple = [ - requestID: bigint, - randomness: string, - signature: string - ]; - export interface OutputObject { - requestID: bigint; - randomness: string; - signature: string; - } - export type Event = TypedContractEvent; - export type Filter = TypedDeferredTopicFilter; - export type Log = TypedEventLog; - export type LogDescription = TypedLogDescription; -} - -export namespace RandomnessCallbackSuccessEvent { - export type InputTuple = [ - requestID: BigNumberish, - randomness: BytesLike, - signature: BytesLike - ]; - export type OutputTuple = [ - requestID: bigint, - randomness: string, - signature: string - ]; - export interface OutputObject { - requestID: bigint; - randomness: string; - signature: string; - } - export type Event = TypedContractEvent; - export type Filter = TypedDeferredTopicFilter; - export type Log = TypedEventLog; - export type LogDescription = TypedLogDescription; -} - -export namespace RandomnessRequestedEvent { - export type InputTuple = [ - requestID: BigNumberish, - requester: AddressLike, - requestedAt: BigNumberish - ]; - export type OutputTuple = [ - requestID: bigint, - requester: string, - requestedAt: bigint - ]; - export interface OutputObject { - requestID: bigint; - requester: string; - requestedAt: bigint; - } - export type Event = TypedContractEvent; - export type Filter = TypedDeferredTopicFilter; - export type Log = TypedEventLog; - export type LogDescription = TypedLogDescription; -} - -export namespace RoleAdminChangedEvent { - export type InputTuple = [ - role: BytesLike, - previousAdminRole: BytesLike, - newAdminRole: BytesLike - ]; - export type OutputTuple = [ - role: string, - previousAdminRole: string, - newAdminRole: string - ]; - export interface OutputObject { - role: string; - previousAdminRole: string; - newAdminRole: string; - } - export type Event = TypedContractEvent; - export type Filter = TypedDeferredTopicFilter; - export type Log = TypedEventLog; - export type LogDescription = TypedLogDescription; -} - -export namespace RoleGrantedEvent { - export type InputTuple = [ - role: BytesLike, - account: AddressLike, - sender: AddressLike - ]; - export type OutputTuple = [role: string, account: string, sender: string]; - export interface OutputObject { - role: string; - account: string; - sender: string; - } - export type Event = TypedContractEvent; - export type Filter = TypedDeferredTopicFilter; - export type Log = TypedEventLog; - export type LogDescription = TypedLogDescription; -} - -export namespace RoleRevokedEvent { - export type InputTuple = [ - role: BytesLike, - account: AddressLike, - sender: AddressLike - ]; - export type OutputTuple = [role: string, account: string, sender: string]; - export interface OutputObject { - role: string; - account: string; - sender: string; - } - export type Event = TypedContractEvent; - export type Filter = TypedDeferredTopicFilter; - export type Log = TypedEventLog; - export type LogDescription = TypedLogDescription; -} - -export interface RandomnessRequester extends BaseContract { - connect(runner?: ContractRunner | null): RandomnessRequester; - waitForDeployment(): Promise; - - interface: RandomnessRequesterInterface; - - queryFilter( - event: TCEvent, - fromBlockOrBlockhash?: string | number | undefined, - toBlock?: string | number | undefined - ): Promise>>; - queryFilter( - filter: TypedDeferredTopicFilter, - fromBlockOrBlockhash?: string | number | undefined, - toBlock?: string | number | undefined - ): Promise>>; - - on( - event: TCEvent, - listener: TypedListener - ): Promise; - on( - filter: TypedDeferredTopicFilter, - listener: TypedListener - ): Promise; - - once( - event: TCEvent, - listener: TypedListener - ): Promise; - once( - filter: TypedDeferredTopicFilter, - listener: TypedListener - ): Promise; - - listeners( - event: TCEvent - ): Promise>>; - listeners(eventName?: string): Promise>; - removeAllListeners( - event?: TCEvent - ): Promise; - - DEFAULT_ADMIN_ROLE: TypedContractMethod<[], [string], "view">; - - DST: TypedContractMethod<[], [string], "view">; - - getAllRequests: TypedContractMethod< - [], - [TypesLib.RandomnessRequestStructOutput[]], - "view" - >; - - getRequest: TypedContractMethod< - [requestId: BigNumberish], - [TypesLib.RandomnessRequestStructOutput], - "view" - >; - - getRoleAdmin: TypedContractMethod<[role: BytesLike], [string], "view">; - - grantRole: TypedContractMethod< - [role: BytesLike, account: AddressLike], - [void], - "nonpayable" - >; - - hasRole: TypedContractMethod< - [role: BytesLike, account: AddressLike], - [boolean], - "view" - >; - - isInFlight: TypedContractMethod<[requestID: BigNumberish], [boolean], "view">; - - messageFrom: TypedContractMethod< - [r: TypesLib.RandomnessRequestStruct], - [string], - "view" - >; - - nonce: TypedContractMethod<[], [bigint], "view">; - - receiveSignature: TypedContractMethod< - [requestID: BigNumberish, signature: BytesLike], - [void], - "nonpayable" - >; - - renounceRole: TypedContractMethod< - [role: BytesLike, callerConfirmation: AddressLike], - [void], - "nonpayable" - >; - - requestRandomness: TypedContractMethod<[], [bigint], "nonpayable">; - - revokeRole: TypedContractMethod< - [role: BytesLike, account: AddressLike], - [void], - "nonpayable" - >; - - schemeID: TypedContractMethod<[], [string], "view">; - - supportsInterface: TypedContractMethod< - [interfaceId: BytesLike], - [boolean], - "view" - >; - - getFunction( - key: string | FunctionFragment - ): T; - - getFunction( - nameOrSignature: "DEFAULT_ADMIN_ROLE" - ): TypedContractMethod<[], [string], "view">; - getFunction( - nameOrSignature: "DST" - ): TypedContractMethod<[], [string], "view">; - getFunction( - nameOrSignature: "getAllRequests" - ): TypedContractMethod< - [], - [TypesLib.RandomnessRequestStructOutput[]], - "view" - >; - getFunction( - nameOrSignature: "getRequest" - ): TypedContractMethod< - [requestId: BigNumberish], - [TypesLib.RandomnessRequestStructOutput], - "view" - >; - getFunction( - nameOrSignature: "getRoleAdmin" - ): TypedContractMethod<[role: BytesLike], [string], "view">; - getFunction( - nameOrSignature: "grantRole" - ): TypedContractMethod< - [role: BytesLike, account: AddressLike], - [void], - "nonpayable" - >; - getFunction( - nameOrSignature: "hasRole" - ): TypedContractMethod< - [role: BytesLike, account: AddressLike], - [boolean], - "view" - >; - getFunction( - nameOrSignature: "isInFlight" - ): TypedContractMethod<[requestID: BigNumberish], [boolean], "view">; - getFunction( - nameOrSignature: "messageFrom" - ): TypedContractMethod< - [r: TypesLib.RandomnessRequestStruct], - [string], - "view" - >; - getFunction( - nameOrSignature: "nonce" - ): TypedContractMethod<[], [bigint], "view">; - getFunction( - nameOrSignature: "receiveSignature" - ): TypedContractMethod< - [requestID: BigNumberish, signature: BytesLike], - [void], - "nonpayable" - >; - getFunction( - nameOrSignature: "renounceRole" - ): TypedContractMethod< - [role: BytesLike, callerConfirmation: AddressLike], - [void], - "nonpayable" - >; - getFunction( - nameOrSignature: "requestRandomness" - ): TypedContractMethod<[], [bigint], "nonpayable">; - getFunction( - nameOrSignature: "revokeRole" - ): TypedContractMethod< - [role: BytesLike, account: AddressLike], - [void], - "nonpayable" - >; - getFunction( - nameOrSignature: "schemeID" - ): TypedContractMethod<[], [string], "view">; - getFunction( - nameOrSignature: "supportsInterface" - ): TypedContractMethod<[interfaceId: BytesLike], [boolean], "view">; - - getEvent( - key: "RandomnessCallbackFailed" - ): TypedContractEvent< - RandomnessCallbackFailedEvent.InputTuple, - RandomnessCallbackFailedEvent.OutputTuple, - RandomnessCallbackFailedEvent.OutputObject - >; - getEvent( - key: "RandomnessCallbackSuccess" - ): TypedContractEvent< - RandomnessCallbackSuccessEvent.InputTuple, - RandomnessCallbackSuccessEvent.OutputTuple, - RandomnessCallbackSuccessEvent.OutputObject - >; - getEvent( - key: "RandomnessRequested" - ): TypedContractEvent< - RandomnessRequestedEvent.InputTuple, - RandomnessRequestedEvent.OutputTuple, - RandomnessRequestedEvent.OutputObject - >; - getEvent( - key: "RoleAdminChanged" - ): TypedContractEvent< - RoleAdminChangedEvent.InputTuple, - RoleAdminChangedEvent.OutputTuple, - RoleAdminChangedEvent.OutputObject - >; - getEvent( - key: "RoleGranted" - ): TypedContractEvent< - RoleGrantedEvent.InputTuple, - RoleGrantedEvent.OutputTuple, - RoleGrantedEvent.OutputObject - >; - getEvent( - key: "RoleRevoked" - ): TypedContractEvent< - RoleRevokedEvent.InputTuple, - RoleRevokedEvent.OutputTuple, - RoleRevokedEvent.OutputObject - >; - - filters: { - "RandomnessCallbackFailed(uint256,bytes32,bytes)": TypedContractEvent< - RandomnessCallbackFailedEvent.InputTuple, - RandomnessCallbackFailedEvent.OutputTuple, - RandomnessCallbackFailedEvent.OutputObject - >; - RandomnessCallbackFailed: TypedContractEvent< - RandomnessCallbackFailedEvent.InputTuple, - RandomnessCallbackFailedEvent.OutputTuple, - RandomnessCallbackFailedEvent.OutputObject - >; - - "RandomnessCallbackSuccess(uint256,bytes32,bytes)": TypedContractEvent< - RandomnessCallbackSuccessEvent.InputTuple, - RandomnessCallbackSuccessEvent.OutputTuple, - RandomnessCallbackSuccessEvent.OutputObject - >; - RandomnessCallbackSuccess: TypedContractEvent< - RandomnessCallbackSuccessEvent.InputTuple, - RandomnessCallbackSuccessEvent.OutputTuple, - RandomnessCallbackSuccessEvent.OutputObject - >; - - "RandomnessRequested(uint256,address,uint256)": TypedContractEvent< - RandomnessRequestedEvent.InputTuple, - RandomnessRequestedEvent.OutputTuple, - RandomnessRequestedEvent.OutputObject - >; - RandomnessRequested: TypedContractEvent< - RandomnessRequestedEvent.InputTuple, - RandomnessRequestedEvent.OutputTuple, - RandomnessRequestedEvent.OutputObject - >; - - "RoleAdminChanged(bytes32,bytes32,bytes32)": TypedContractEvent< - RoleAdminChangedEvent.InputTuple, - RoleAdminChangedEvent.OutputTuple, - RoleAdminChangedEvent.OutputObject - >; - RoleAdminChanged: TypedContractEvent< - RoleAdminChangedEvent.InputTuple, - RoleAdminChangedEvent.OutputTuple, - RoleAdminChangedEvent.OutputObject - >; - - "RoleGranted(bytes32,address,address)": TypedContractEvent< - RoleGrantedEvent.InputTuple, - RoleGrantedEvent.OutputTuple, - RoleGrantedEvent.OutputObject - >; - RoleGranted: TypedContractEvent< - RoleGrantedEvent.InputTuple, - RoleGrantedEvent.OutputTuple, - RoleGrantedEvent.OutputObject - >; - - "RoleRevoked(bytes32,address,address)": TypedContractEvent< - RoleRevokedEvent.InputTuple, - RoleRevokedEvent.OutputTuple, - RoleRevokedEvent.OutputObject - >; - RoleRevoked: TypedContractEvent< - RoleRevokedEvent.InputTuple, - RoleRevokedEvent.OutputTuple, - RoleRevokedEvent.OutputObject - >; - }; -} diff --git a/src/generated/RandomnessSender.ts b/src/generated/RandomnessSender.ts deleted file mode 100644 index 5833242..0000000 --- a/src/generated/RandomnessSender.ts +++ /dev/null @@ -1,600 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import type { - BaseContract, - BigNumberish, - BytesLike, - FunctionFragment, - Result, - Interface, - EventFragment, - AddressLike, - ContractRunner, - ContractMethod, - Listener, -} from "ethers"; -import type { - TypedContractEvent, - TypedDeferredTopicFilter, - TypedEventLog, - TypedLogDescription, - TypedListener, - TypedContractMethod, -} from "./common"; - -export declare namespace TypesLib { - export type RandomnessRequestStruct = { - nonce: BigNumberish; - callback: AddressLike; - }; - - export type RandomnessRequestStructOutput = [ - nonce: bigint, - callback: string - ] & { nonce: bigint; callback: string }; -} - -export interface RandomnessSenderInterface extends Interface { - getFunction( - nameOrSignature: - | "DEFAULT_ADMIN_ROLE" - | "DST" - | "getAllRequests" - | "getRequest" - | "getRoleAdmin" - | "grantRole" - | "hasRole" - | "isInFlight" - | "messageFrom" - | "nonce" - | "receiveSignature" - | "renounceRole" - | "requestRandomness" - | "revokeRole" - | "schemeID" - | "supportsInterface" - ): FunctionFragment; - - getEvent( - nameOrSignatureOrTopic: - | "RandomnessCallbackFailed" - | "RandomnessCallbackSuccess" - | "RandomnessRequested" - | "RoleAdminChanged" - | "RoleGranted" - | "RoleRevoked" - ): EventFragment; - - encodeFunctionData( - functionFragment: "DEFAULT_ADMIN_ROLE", - values?: undefined - ): string; - encodeFunctionData(functionFragment: "DST", values?: undefined): string; - encodeFunctionData( - functionFragment: "getAllRequests", - values?: undefined - ): string; - encodeFunctionData( - functionFragment: "getRequest", - values: [BigNumberish] - ): string; - encodeFunctionData( - functionFragment: "getRoleAdmin", - values: [BytesLike] - ): string; - encodeFunctionData( - functionFragment: "grantRole", - values: [BytesLike, AddressLike] - ): string; - encodeFunctionData( - functionFragment: "hasRole", - values: [BytesLike, AddressLike] - ): string; - encodeFunctionData( - functionFragment: "isInFlight", - values: [BigNumberish] - ): string; - encodeFunctionData( - functionFragment: "messageFrom", - values: [TypesLib.RandomnessRequestStruct] - ): string; - encodeFunctionData(functionFragment: "nonce", values?: undefined): string; - encodeFunctionData( - functionFragment: "receiveSignature", - values: [BigNumberish, BytesLike] - ): string; - encodeFunctionData( - functionFragment: "renounceRole", - values: [BytesLike, AddressLike] - ): string; - encodeFunctionData( - functionFragment: "requestRandomness", - values?: undefined - ): string; - encodeFunctionData( - functionFragment: "revokeRole", - values: [BytesLike, AddressLike] - ): string; - encodeFunctionData(functionFragment: "schemeID", values?: undefined): string; - encodeFunctionData( - functionFragment: "supportsInterface", - values: [BytesLike] - ): string; - - decodeFunctionResult( - functionFragment: "DEFAULT_ADMIN_ROLE", - data: BytesLike - ): Result; - decodeFunctionResult(functionFragment: "DST", data: BytesLike): Result; - decodeFunctionResult( - functionFragment: "getAllRequests", - data: BytesLike - ): Result; - decodeFunctionResult(functionFragment: "getRequest", data: BytesLike): Result; - decodeFunctionResult( - functionFragment: "getRoleAdmin", - data: BytesLike - ): Result; - decodeFunctionResult(functionFragment: "grantRole", data: BytesLike): Result; - decodeFunctionResult(functionFragment: "hasRole", data: BytesLike): Result; - decodeFunctionResult(functionFragment: "isInFlight", data: BytesLike): Result; - decodeFunctionResult( - functionFragment: "messageFrom", - data: BytesLike - ): Result; - decodeFunctionResult(functionFragment: "nonce", data: BytesLike): Result; - decodeFunctionResult( - functionFragment: "receiveSignature", - data: BytesLike - ): Result; - decodeFunctionResult( - functionFragment: "renounceRole", - data: BytesLike - ): Result; - decodeFunctionResult( - functionFragment: "requestRandomness", - data: BytesLike - ): Result; - decodeFunctionResult(functionFragment: "revokeRole", data: BytesLike): Result; - decodeFunctionResult(functionFragment: "schemeID", data: BytesLike): Result; - decodeFunctionResult( - functionFragment: "supportsInterface", - data: BytesLike - ): Result; -} - -export namespace RandomnessCallbackFailedEvent { - export type InputTuple = [ - requestID: BigNumberish, - randomness: BytesLike, - signature: BytesLike - ]; - export type OutputTuple = [ - requestID: bigint, - randomness: string, - signature: string - ]; - export interface OutputObject { - requestID: bigint; - randomness: string; - signature: string; - } - export type Event = TypedContractEvent; - export type Filter = TypedDeferredTopicFilter; - export type Log = TypedEventLog; - export type LogDescription = TypedLogDescription; -} - -export namespace RandomnessCallbackSuccessEvent { - export type InputTuple = [ - requestID: BigNumberish, - randomness: BytesLike, - signature: BytesLike - ]; - export type OutputTuple = [ - requestID: bigint, - randomness: string, - signature: string - ]; - export interface OutputObject { - requestID: bigint; - randomness: string; - signature: string; - } - export type Event = TypedContractEvent; - export type Filter = TypedDeferredTopicFilter; - export type Log = TypedEventLog; - export type LogDescription = TypedLogDescription; -} - -export namespace RandomnessRequestedEvent { - export type InputTuple = [ - requestID: BigNumberish, - nonce: BigNumberish, - requester: AddressLike, - requestedAt: BigNumberish - ]; - export type OutputTuple = [ - requestID: bigint, - nonce: bigint, - requester: string, - requestedAt: bigint - ]; - export interface OutputObject { - requestID: bigint; - nonce: bigint; - requester: string; - requestedAt: bigint; - } - export type Event = TypedContractEvent; - export type Filter = TypedDeferredTopicFilter; - export type Log = TypedEventLog; - export type LogDescription = TypedLogDescription; -} - -export namespace RoleAdminChangedEvent { - export type InputTuple = [ - role: BytesLike, - previousAdminRole: BytesLike, - newAdminRole: BytesLike - ]; - export type OutputTuple = [ - role: string, - previousAdminRole: string, - newAdminRole: string - ]; - export interface OutputObject { - role: string; - previousAdminRole: string; - newAdminRole: string; - } - export type Event = TypedContractEvent; - export type Filter = TypedDeferredTopicFilter; - export type Log = TypedEventLog; - export type LogDescription = TypedLogDescription; -} - -export namespace RoleGrantedEvent { - export type InputTuple = [ - role: BytesLike, - account: AddressLike, - sender: AddressLike - ]; - export type OutputTuple = [role: string, account: string, sender: string]; - export interface OutputObject { - role: string; - account: string; - sender: string; - } - export type Event = TypedContractEvent; - export type Filter = TypedDeferredTopicFilter; - export type Log = TypedEventLog; - export type LogDescription = TypedLogDescription; -} - -export namespace RoleRevokedEvent { - export type InputTuple = [ - role: BytesLike, - account: AddressLike, - sender: AddressLike - ]; - export type OutputTuple = [role: string, account: string, sender: string]; - export interface OutputObject { - role: string; - account: string; - sender: string; - } - export type Event = TypedContractEvent; - export type Filter = TypedDeferredTopicFilter; - export type Log = TypedEventLog; - export type LogDescription = TypedLogDescription; -} - -export interface RandomnessSender extends BaseContract { - connect(runner?: ContractRunner | null): RandomnessSender; - waitForDeployment(): Promise; - - interface: RandomnessSenderInterface; - - queryFilter( - event: TCEvent, - fromBlockOrBlockhash?: string | number | undefined, - toBlock?: string | number | undefined - ): Promise>>; - queryFilter( - filter: TypedDeferredTopicFilter, - fromBlockOrBlockhash?: string | number | undefined, - toBlock?: string | number | undefined - ): Promise>>; - - on( - event: TCEvent, - listener: TypedListener - ): Promise; - on( - filter: TypedDeferredTopicFilter, - listener: TypedListener - ): Promise; - - once( - event: TCEvent, - listener: TypedListener - ): Promise; - once( - filter: TypedDeferredTopicFilter, - listener: TypedListener - ): Promise; - - listeners( - event: TCEvent - ): Promise>>; - listeners(eventName?: string): Promise>; - removeAllListeners( - event?: TCEvent - ): Promise; - - DEFAULT_ADMIN_ROLE: TypedContractMethod<[], [string], "view">; - - DST: TypedContractMethod<[], [string], "view">; - - getAllRequests: TypedContractMethod< - [], - [TypesLib.RandomnessRequestStructOutput[]], - "view" - >; - - getRequest: TypedContractMethod< - [requestId: BigNumberish], - [TypesLib.RandomnessRequestStructOutput], - "view" - >; - - getRoleAdmin: TypedContractMethod<[role: BytesLike], [string], "view">; - - grantRole: TypedContractMethod< - [role: BytesLike, account: AddressLike], - [void], - "nonpayable" - >; - - hasRole: TypedContractMethod< - [role: BytesLike, account: AddressLike], - [boolean], - "view" - >; - - isInFlight: TypedContractMethod<[requestID: BigNumberish], [boolean], "view">; - - messageFrom: TypedContractMethod< - [r: TypesLib.RandomnessRequestStruct], - [string], - "view" - >; - - nonce: TypedContractMethod<[], [bigint], "view">; - - receiveSignature: TypedContractMethod< - [requestID: BigNumberish, signature: BytesLike], - [void], - "nonpayable" - >; - - renounceRole: TypedContractMethod< - [role: BytesLike, callerConfirmation: AddressLike], - [void], - "nonpayable" - >; - - requestRandomness: TypedContractMethod<[], [bigint], "nonpayable">; - - revokeRole: TypedContractMethod< - [role: BytesLike, account: AddressLike], - [void], - "nonpayable" - >; - - schemeID: TypedContractMethod<[], [string], "view">; - - supportsInterface: TypedContractMethod< - [interfaceId: BytesLike], - [boolean], - "view" - >; - - getFunction( - key: string | FunctionFragment - ): T; - - getFunction( - nameOrSignature: "DEFAULT_ADMIN_ROLE" - ): TypedContractMethod<[], [string], "view">; - getFunction( - nameOrSignature: "DST" - ): TypedContractMethod<[], [string], "view">; - getFunction( - nameOrSignature: "getAllRequests" - ): TypedContractMethod< - [], - [TypesLib.RandomnessRequestStructOutput[]], - "view" - >; - getFunction( - nameOrSignature: "getRequest" - ): TypedContractMethod< - [requestId: BigNumberish], - [TypesLib.RandomnessRequestStructOutput], - "view" - >; - getFunction( - nameOrSignature: "getRoleAdmin" - ): TypedContractMethod<[role: BytesLike], [string], "view">; - getFunction( - nameOrSignature: "grantRole" - ): TypedContractMethod< - [role: BytesLike, account: AddressLike], - [void], - "nonpayable" - >; - getFunction( - nameOrSignature: "hasRole" - ): TypedContractMethod< - [role: BytesLike, account: AddressLike], - [boolean], - "view" - >; - getFunction( - nameOrSignature: "isInFlight" - ): TypedContractMethod<[requestID: BigNumberish], [boolean], "view">; - getFunction( - nameOrSignature: "messageFrom" - ): TypedContractMethod< - [r: TypesLib.RandomnessRequestStruct], - [string], - "view" - >; - getFunction( - nameOrSignature: "nonce" - ): TypedContractMethod<[], [bigint], "view">; - getFunction( - nameOrSignature: "receiveSignature" - ): TypedContractMethod< - [requestID: BigNumberish, signature: BytesLike], - [void], - "nonpayable" - >; - getFunction( - nameOrSignature: "renounceRole" - ): TypedContractMethod< - [role: BytesLike, callerConfirmation: AddressLike], - [void], - "nonpayable" - >; - getFunction( - nameOrSignature: "requestRandomness" - ): TypedContractMethod<[], [bigint], "nonpayable">; - getFunction( - nameOrSignature: "revokeRole" - ): TypedContractMethod< - [role: BytesLike, account: AddressLike], - [void], - "nonpayable" - >; - getFunction( - nameOrSignature: "schemeID" - ): TypedContractMethod<[], [string], "view">; - getFunction( - nameOrSignature: "supportsInterface" - ): TypedContractMethod<[interfaceId: BytesLike], [boolean], "view">; - - getEvent( - key: "RandomnessCallbackFailed" - ): TypedContractEvent< - RandomnessCallbackFailedEvent.InputTuple, - RandomnessCallbackFailedEvent.OutputTuple, - RandomnessCallbackFailedEvent.OutputObject - >; - getEvent( - key: "RandomnessCallbackSuccess" - ): TypedContractEvent< - RandomnessCallbackSuccessEvent.InputTuple, - RandomnessCallbackSuccessEvent.OutputTuple, - RandomnessCallbackSuccessEvent.OutputObject - >; - getEvent( - key: "RandomnessRequested" - ): TypedContractEvent< - RandomnessRequestedEvent.InputTuple, - RandomnessRequestedEvent.OutputTuple, - RandomnessRequestedEvent.OutputObject - >; - getEvent( - key: "RoleAdminChanged" - ): TypedContractEvent< - RoleAdminChangedEvent.InputTuple, - RoleAdminChangedEvent.OutputTuple, - RoleAdminChangedEvent.OutputObject - >; - getEvent( - key: "RoleGranted" - ): TypedContractEvent< - RoleGrantedEvent.InputTuple, - RoleGrantedEvent.OutputTuple, - RoleGrantedEvent.OutputObject - >; - getEvent( - key: "RoleRevoked" - ): TypedContractEvent< - RoleRevokedEvent.InputTuple, - RoleRevokedEvent.OutputTuple, - RoleRevokedEvent.OutputObject - >; - - filters: { - "RandomnessCallbackFailed(uint256,bytes32,bytes)": TypedContractEvent< - RandomnessCallbackFailedEvent.InputTuple, - RandomnessCallbackFailedEvent.OutputTuple, - RandomnessCallbackFailedEvent.OutputObject - >; - RandomnessCallbackFailed: TypedContractEvent< - RandomnessCallbackFailedEvent.InputTuple, - RandomnessCallbackFailedEvent.OutputTuple, - RandomnessCallbackFailedEvent.OutputObject - >; - - "RandomnessCallbackSuccess(uint256,bytes32,bytes)": TypedContractEvent< - RandomnessCallbackSuccessEvent.InputTuple, - RandomnessCallbackSuccessEvent.OutputTuple, - RandomnessCallbackSuccessEvent.OutputObject - >; - RandomnessCallbackSuccess: TypedContractEvent< - RandomnessCallbackSuccessEvent.InputTuple, - RandomnessCallbackSuccessEvent.OutputTuple, - RandomnessCallbackSuccessEvent.OutputObject - >; - - "RandomnessRequested(uint256,uint256,address,uint256)": TypedContractEvent< - RandomnessRequestedEvent.InputTuple, - RandomnessRequestedEvent.OutputTuple, - RandomnessRequestedEvent.OutputObject - >; - RandomnessRequested: TypedContractEvent< - RandomnessRequestedEvent.InputTuple, - RandomnessRequestedEvent.OutputTuple, - RandomnessRequestedEvent.OutputObject - >; - - "RoleAdminChanged(bytes32,bytes32,bytes32)": TypedContractEvent< - RoleAdminChangedEvent.InputTuple, - RoleAdminChangedEvent.OutputTuple, - RoleAdminChangedEvent.OutputObject - >; - RoleAdminChanged: TypedContractEvent< - RoleAdminChangedEvent.InputTuple, - RoleAdminChangedEvent.OutputTuple, - RoleAdminChangedEvent.OutputObject - >; - - "RoleGranted(bytes32,address,address)": TypedContractEvent< - RoleGrantedEvent.InputTuple, - RoleGrantedEvent.OutputTuple, - RoleGrantedEvent.OutputObject - >; - RoleGranted: TypedContractEvent< - RoleGrantedEvent.InputTuple, - RoleGrantedEvent.OutputTuple, - RoleGrantedEvent.OutputObject - >; - - "RoleRevoked(bytes32,address,address)": TypedContractEvent< - RoleRevokedEvent.InputTuple, - RoleRevokedEvent.OutputTuple, - RoleRevokedEvent.OutputObject - >; - RoleRevoked: TypedContractEvent< - RoleRevokedEvent.InputTuple, - RoleRevokedEvent.OutputTuple, - RoleRevokedEvent.OutputObject - >; - }; -} diff --git a/src/generated/common.ts b/src/generated/common.ts deleted file mode 100644 index 56b5f21..0000000 --- a/src/generated/common.ts +++ /dev/null @@ -1,131 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import type { - FunctionFragment, - Typed, - EventFragment, - ContractTransaction, - ContractTransactionResponse, - DeferredTopicFilter, - EventLog, - TransactionRequest, - LogDescription, -} from "ethers"; - -export interface TypedDeferredTopicFilter<_TCEvent extends TypedContractEvent> - extends DeferredTopicFilter {} - -export interface TypedContractEvent< - InputTuple extends Array = any, - OutputTuple extends Array = any, - OutputObject = any -> { - (...args: Partial): TypedDeferredTopicFilter< - TypedContractEvent - >; - name: string; - fragment: EventFragment; - getFragment(...args: Partial): EventFragment; -} - -type __TypechainAOutputTuple = T extends TypedContractEvent< - infer _U, - infer W -> - ? W - : never; -type __TypechainOutputObject = T extends TypedContractEvent< - infer _U, - infer _W, - infer V -> - ? V - : never; - -export interface TypedEventLog - extends Omit { - args: __TypechainAOutputTuple & __TypechainOutputObject; -} - -export interface TypedLogDescription - extends Omit { - args: __TypechainAOutputTuple & __TypechainOutputObject; -} - -export type TypedListener = ( - ...listenerArg: [ - ...__TypechainAOutputTuple, - TypedEventLog, - ...undefined[] - ] -) => void; - -export type MinEthersFactory = { - deploy(...a: ARGS[]): Promise; -}; - -export type GetContractTypeFromFactory = F extends MinEthersFactory< - infer C, - any -> - ? C - : never; -export type GetARGsTypeFromFactory = F extends MinEthersFactory - ? Parameters - : never; - -export type StateMutability = "nonpayable" | "payable" | "view"; - -export type BaseOverrides = Omit; -export type NonPayableOverrides = Omit< - BaseOverrides, - "value" | "blockTag" | "enableCcipRead" ->; -export type PayableOverrides = Omit< - BaseOverrides, - "blockTag" | "enableCcipRead" ->; -export type ViewOverrides = Omit; -export type Overrides = S extends "nonpayable" - ? NonPayableOverrides - : S extends "payable" - ? PayableOverrides - : ViewOverrides; - -export type PostfixOverrides, S extends StateMutability> = - | A - | [...A, Overrides]; -export type ContractMethodArgs< - A extends Array, - S extends StateMutability -> = PostfixOverrides<{ [I in keyof A]-?: A[I] | Typed }, S>; - -export type DefaultReturnType = R extends Array ? R[0] : R; - -// export interface ContractMethod = Array, R = any, D extends R | ContractTransactionResponse = R | ContractTransactionResponse> { -export interface TypedContractMethod< - A extends Array = Array, - R = any, - S extends StateMutability = "payable" -> { - (...args: ContractMethodArgs): S extends "view" - ? Promise> - : Promise; - - name: string; - - fragment: FunctionFragment; - - getFragment(...args: ContractMethodArgs): FunctionFragment; - - populateTransaction( - ...args: ContractMethodArgs - ): Promise; - staticCall( - ...args: ContractMethodArgs - ): Promise>; - send(...args: ContractMethodArgs): Promise; - estimateGas(...args: ContractMethodArgs): Promise; - staticCallResult(...args: ContractMethodArgs): Promise; -} diff --git a/src/generated/factories/IRandomnessReceiver__factory.ts b/src/generated/factories/IRandomnessReceiver__factory.ts deleted file mode 100644 index 030ed87..0000000 --- a/src/generated/factories/IRandomnessReceiver__factory.ts +++ /dev/null @@ -1,47 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ - -import { Contract, Interface, type ContractRunner } from "ethers"; -import type { - IRandomnessReceiver, - IRandomnessReceiverInterface, -} from "../IRandomnessReceiver"; - -const _abi = [ - { - type: "function", - name: "receiveRandomness", - inputs: [ - { - name: "requestID", - type: "uint256", - internalType: "uint256", - }, - { - name: "randomness", - type: "bytes32", - internalType: "bytes32", - }, - ], - outputs: [], - stateMutability: "nonpayable", - }, -] as const; - -export class IRandomnessReceiver__factory { - static readonly abi = _abi; - static createInterface(): IRandomnessReceiverInterface { - return new Interface(_abi) as IRandomnessReceiverInterface; - } - static connect( - address: string, - runner?: ContractRunner | null - ): IRandomnessReceiver { - return new Contract( - address, - _abi, - runner - ) as unknown as IRandomnessReceiver; - } -} diff --git a/src/generated/factories/IRandomnessRequester__factory.ts b/src/generated/factories/IRandomnessRequester__factory.ts deleted file mode 100644 index 89fb359..0000000 --- a/src/generated/factories/IRandomnessRequester__factory.ts +++ /dev/null @@ -1,140 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ - -import { Contract, Interface, type ContractRunner } from "ethers"; -import type { - IRandomnessRequester, - IRandomnessRequesterInterface, -} from "../IRandomnessRequester"; - -const _abi = [ - { - type: "function", - name: "getAllRequests", - inputs: [], - outputs: [ - { - name: "", - type: "tuple[]", - internalType: "struct TypesLib.RandomnessRequest[]", - components: [ - { - name: "requestID", - type: "uint256", - internalType: "uint256", - }, - { - name: "nonce", - type: "uint256", - internalType: "uint256", - }, - { - name: "callback", - type: "address", - internalType: "address", - }, - ], - }, - ], - stateMutability: "view", - }, - { - type: "function", - name: "getRequest", - inputs: [ - { - name: "requestId", - type: "uint256", - internalType: "uint256", - }, - ], - outputs: [ - { - name: "", - type: "tuple", - internalType: "struct TypesLib.RandomnessRequest", - components: [ - { - name: "requestID", - type: "uint256", - internalType: "uint256", - }, - { - name: "nonce", - type: "uint256", - internalType: "uint256", - }, - { - name: "callback", - type: "address", - internalType: "address", - }, - ], - }, - ], - stateMutability: "view", - }, - { - type: "function", - name: "messageFrom", - inputs: [ - { - name: "r", - type: "tuple", - internalType: "struct TypesLib.RandomnessRequest", - components: [ - { - name: "requestID", - type: "uint256", - internalType: "uint256", - }, - { - name: "nonce", - type: "uint256", - internalType: "uint256", - }, - { - name: "callback", - type: "address", - internalType: "address", - }, - ], - }, - ], - outputs: [ - { - name: "", - type: "bytes", - internalType: "bytes", - }, - ], - stateMutability: "pure", - }, - { - type: "function", - name: "requestRandomness", - inputs: [], - outputs: [ - { - name: "requestID", - type: "uint256", - internalType: "uint256", - }, - ], - stateMutability: "nonpayable", - }, -] as const; - -export class IRandomnessRequester__factory { - static readonly abi = _abi; - static createInterface(): IRandomnessRequesterInterface { - return new Interface(_abi) as IRandomnessRequesterInterface; - } - static connect( - address: string, - runner?: ContractRunner | null - ): IRandomnessRequester { - return new Contract(address, _abi, runner) as unknown as IRandomnessRequester; - } -} diff --git a/src/generated/factories/RandomnessReceiverBase__factory.ts b/src/generated/factories/RandomnessReceiverBase__factory.ts deleted file mode 100644 index 8e9fdbf..0000000 --- a/src/generated/factories/RandomnessReceiverBase__factory.ts +++ /dev/null @@ -1,47 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ - -import { Contract, Interface, type ContractRunner } from "ethers"; -import type { - RandomnessReceiverBase, - RandomnessReceiverBaseInterface, -} from "../RandomnessReceiverBase"; - -const _abi = [ - { - type: "function", - name: "receiveRandomness", - inputs: [ - { - name: "requestID", - type: "uint256", - internalType: "uint256", - }, - { - name: "randomness", - type: "bytes32", - internalType: "bytes32", - }, - ], - outputs: [], - stateMutability: "nonpayable", - }, -] as const; - -export class RandomnessReceiverBase__factory { - static readonly abi = _abi; - static createInterface(): RandomnessReceiverBaseInterface { - return new Interface(_abi) as RandomnessReceiverBaseInterface; - } - static connect( - address: string, - runner?: ContractRunner | null - ): RandomnessReceiverBase { - return new Contract( - address, - _abi, - runner - ) as unknown as RandomnessReceiverBase; - } -} diff --git a/src/generated/factories/RandomnessSender__factory.ts b/src/generated/factories/RandomnessSender__factory.ts deleted file mode 100644 index 4d13c00..0000000 --- a/src/generated/factories/RandomnessSender__factory.ts +++ /dev/null @@ -1,569 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { - Contract, - ContractFactory, - ContractTransactionResponse, - Interface, -} from "ethers"; -import type { - Signer, - AddressLike, - ContractDeployTransaction, - ContractRunner, -} from "ethers"; -import type { NonPayableOverrides } from "../common"; -import type { - RandomnessSender, - RandomnessSenderInterface, -} from "../RandomnessSender"; - -const _abi = [ - { - type: "constructor", - inputs: [ - { - name: "_signatureSender", - type: "address", - internalType: "address", - }, - ], - stateMutability: "nonpayable", - }, - { - type: "function", - name: "DEFAULT_ADMIN_ROLE", - inputs: [], - outputs: [ - { - name: "", - type: "bytes32", - internalType: "bytes32", - }, - ], - stateMutability: "view", - }, - { - type: "function", - name: "DST", - inputs: [], - outputs: [ - { - name: "", - type: "string", - internalType: "string", - }, - ], - stateMutability: "view", - }, - { - type: "function", - name: "getAllRequests", - inputs: [], - outputs: [ - { - name: "", - type: "tuple[]", - internalType: "struct TypesLib.RandomnessRequest[]", - components: [ - { - name: "nonce", - type: "uint256", - internalType: "uint256", - }, - { - name: "callback", - type: "address", - internalType: "address", - }, - ], - }, - ], - stateMutability: "view", - }, - { - type: "function", - name: "getRequest", - inputs: [ - { - name: "requestId", - type: "uint256", - internalType: "uint256", - }, - ], - outputs: [ - { - name: "", - type: "tuple", - internalType: "struct TypesLib.RandomnessRequest", - components: [ - { - name: "nonce", - type: "uint256", - internalType: "uint256", - }, - { - name: "callback", - type: "address", - internalType: "address", - }, - ], - }, - ], - stateMutability: "view", - }, - { - type: "function", - name: "getRoleAdmin", - inputs: [ - { - name: "role", - type: "bytes32", - internalType: "bytes32", - }, - ], - outputs: [ - { - name: "", - type: "bytes32", - internalType: "bytes32", - }, - ], - stateMutability: "view", - }, - { - type: "function", - name: "grantRole", - inputs: [ - { - name: "role", - type: "bytes32", - internalType: "bytes32", - }, - { - name: "account", - type: "address", - internalType: "address", - }, - ], - outputs: [], - stateMutability: "nonpayable", - }, - { - type: "function", - name: "hasRole", - inputs: [ - { - name: "role", - type: "bytes32", - internalType: "bytes32", - }, - { - name: "account", - type: "address", - internalType: "address", - }, - ], - outputs: [ - { - name: "", - type: "bool", - internalType: "bool", - }, - ], - stateMutability: "view", - }, - { - type: "function", - name: "isInFlight", - inputs: [ - { - name: "requestID", - type: "uint256", - internalType: "uint256", - }, - ], - outputs: [ - { - name: "", - type: "bool", - internalType: "bool", - }, - ], - stateMutability: "view", - }, - { - type: "function", - name: "messageFrom", - inputs: [ - { - name: "r", - type: "tuple", - internalType: "struct TypesLib.RandomnessRequest", - components: [ - { - name: "nonce", - type: "uint256", - internalType: "uint256", - }, - { - name: "callback", - type: "address", - internalType: "address", - }, - ], - }, - ], - outputs: [ - { - name: "", - type: "bytes", - internalType: "bytes", - }, - ], - stateMutability: "pure", - }, - { - type: "function", - name: "nonce", - inputs: [], - outputs: [ - { - name: "", - type: "uint256", - internalType: "uint256", - }, - ], - stateMutability: "view", - }, - { - type: "function", - name: "receiveSignature", - inputs: [ - { - name: "requestID", - type: "uint256", - internalType: "uint256", - }, - { - name: "signature", - type: "bytes", - internalType: "bytes", - }, - ], - outputs: [], - stateMutability: "nonpayable", - }, - { - type: "function", - name: "renounceRole", - inputs: [ - { - name: "role", - type: "bytes32", - internalType: "bytes32", - }, - { - name: "callerConfirmation", - type: "address", - internalType: "address", - }, - ], - outputs: [], - stateMutability: "nonpayable", - }, - { - type: "function", - name: "requestRandomness", - inputs: [], - outputs: [ - { - name: "requestID", - type: "uint256", - internalType: "uint256", - }, - ], - stateMutability: "nonpayable", - }, - { - type: "function", - name: "revokeRole", - inputs: [ - { - name: "role", - type: "bytes32", - internalType: "bytes32", - }, - { - name: "account", - type: "address", - internalType: "address", - }, - ], - outputs: [], - stateMutability: "nonpayable", - }, - { - type: "function", - name: "schemeID", - inputs: [], - outputs: [ - { - name: "", - type: "string", - internalType: "string", - }, - ], - stateMutability: "view", - }, - { - type: "function", - name: "supportsInterface", - inputs: [ - { - name: "interfaceId", - type: "bytes4", - internalType: "bytes4", - }, - ], - outputs: [ - { - name: "", - type: "bool", - internalType: "bool", - }, - ], - stateMutability: "view", - }, - { - type: "event", - name: "RandomnessCallbackFailed", - inputs: [ - { - name: "requestID", - type: "uint256", - indexed: true, - internalType: "uint256", - }, - { - name: "randomness", - type: "bytes32", - indexed: false, - internalType: "bytes32", - }, - { - name: "signature", - type: "bytes", - indexed: false, - internalType: "bytes", - }, - ], - anonymous: false, - }, - { - type: "event", - name: "RandomnessCallbackSuccess", - inputs: [ - { - name: "requestID", - type: "uint256", - indexed: true, - internalType: "uint256", - }, - { - name: "randomness", - type: "bytes32", - indexed: false, - internalType: "bytes32", - }, - { - name: "signature", - type: "bytes", - indexed: false, - internalType: "bytes", - }, - ], - anonymous: false, - }, - { - type: "event", - name: "RandomnessRequested", - inputs: [ - { - name: "requestID", - type: "uint256", - indexed: true, - internalType: "uint256", - }, - { - name: "nonce", - type: "uint256", - indexed: false, - internalType: "uint256", - }, - { - name: "requester", - type: "address", - indexed: true, - internalType: "address", - }, - { - name: "requestedAt", - type: "uint256", - indexed: false, - internalType: "uint256", - }, - ], - anonymous: false, - }, - { - type: "event", - name: "RoleAdminChanged", - inputs: [ - { - name: "role", - type: "bytes32", - indexed: true, - internalType: "bytes32", - }, - { - name: "previousAdminRole", - type: "bytes32", - indexed: true, - internalType: "bytes32", - }, - { - name: "newAdminRole", - type: "bytes32", - indexed: true, - internalType: "bytes32", - }, - ], - anonymous: false, - }, - { - type: "event", - name: "RoleGranted", - inputs: [ - { - name: "role", - type: "bytes32", - indexed: true, - internalType: "bytes32", - }, - { - name: "account", - type: "address", - indexed: true, - internalType: "address", - }, - { - name: "sender", - type: "address", - indexed: true, - internalType: "address", - }, - ], - anonymous: false, - }, - { - type: "event", - name: "RoleRevoked", - inputs: [ - { - name: "role", - type: "bytes32", - indexed: true, - internalType: "bytes32", - }, - { - name: "account", - type: "address", - indexed: true, - internalType: "address", - }, - { - name: "sender", - type: "address", - indexed: true, - internalType: "address", - }, - ], - anonymous: false, - }, - { - type: "error", - name: "AccessControlBadConfirmation", - inputs: [], - }, - { - type: "error", - name: "AccessControlUnauthorizedAccount", - inputs: [ - { - name: "account", - type: "address", - internalType: "address", - }, - { - name: "neededRole", - type: "bytes32", - internalType: "bytes32", - }, - ], - }, -] as const; - -const _bytecode = - "0x60a06040525f600155348015610013575f80fd5b5060405161136c38038061136c833981016040819052610032916100b3565b806001600160a01b0381166100a15760405162461bcd60e51b815260206004820152602b60248201527f43616e6e6f7420736574207a65726f2061646472657373206173207369676e6160448201526a3a3ab9329039b2b73232b960a91b606482015260840160405180910390fd5b6001600160a01b0316608052506100e0565b5f602082840312156100c3575f80fd5b81516001600160a01b03811681146100d9575f80fd5b9392505050565b6080516112666101065f395f8181610506015281816105ce015261072701526112665ff3fe608060405234801561000f575f80fd5b50600436106100fa575f3560e01c8063a217fddf11610093578063cd802c9111610063578063cd802c91146102ed578063d547741f14610300578063f8413b0714610313578063fb1a002a1461031b575f80fd5b8063a217fddf1461025d578063affed0e014610264578063c58343ef1461026d578063c8db6582146102da575f80fd5b806336568abe116100ce57806336568abe146101b85780635f7c7522146101cb578063775b839c1461020757806391d148541461021a575f80fd5b8062f7ea77146100fe57806301ffc9a714610150578063248a9ca3146101735780632f2ff15d146101a3575b5f80fd5b61013a6040518060400160405280600581526020017f424e32353400000000000000000000000000000000000000000000000000000081525081565b6040516101479190610e9c565b60405180910390f35b61016361015e366004610eb5565b610330565b6040519015158152602001610147565b610195610181366004610ef4565b5f9081526020819052604090206001015490565b604051908152602001610147565b6101b66101b1366004610f33565b6103c8565b005b6101b66101c6366004610f33565b6103f2565b61013a6040518060400160405280601681526020017f72616e646f6d6e6573733a302e302e313a626e3235340000000000000000000081525081565b61013a610215366004610f5d565b610450565b610163610228366004610f33565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b6101955f81565b61019560015481565b6102cd61027b366004610ef4565b604080518082019091525f8082526020820152505f908152600260209081526040918290208251808401909352805483526001015473ffffffffffffffffffffffffffffffffffffffff169082015290565b6040516101479190610fd4565b6101b66102e8366004611001565b6104ee565b6101636102fb366004610ef4565b61059d565b6101b661030e366004610f33565b61064c565b610195610670565b6103236108b3565b6040516101479190611076565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806103c257507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b5f828152602081905260409020600101546103e281610933565b6103ec8383610940565b50505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610441576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61044b8282610a39565b505050565b60606040518060400160405280601681526020017f72616e646f6d6e6573733a302e302e313a626e32353400000000000000000000815250825f015160405160200161049d9291906110e2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012090830152016040516020818303038152906040529050919050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610592576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4f6e6c79207369676e617475726553656e6465722063616e2063616c6c00000060448201526064015b60405180910390fd5b61044b838383610af2565b6040517fcd802c91000000000000000000000000000000000000000000000000000000008152600481018290525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063cd802c9190602401602060405180830381865afa158015610628573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103c29190611103565b5f8281526020819052604090206001015461066681610933565b6103ec8383610a39565b5f6001805f8282546106829190611122565b90915550506040805180820190915260015481523360208201525f6106a682610450565b60408051602080820183525f825282518084018452600581527f424e3235340000000000000000000000000000000000000000000000000000009181019190915291517f95b8d0730000000000000000000000000000000000000000000000000000000081529293509173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016916395b8d0739161075f91908690869060040161115a565b6020604051808303815f875af115801561077b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061079f919061119c565b5f818152600260208181526040808420885181558883018051600192830180547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff9384161790915560038054808601825598528b517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b989097029788019690965590517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c9096018054909516951694909417909255915481519081524292810192909252919550339186917feee7195b6cee0fa7044c3af0b86fe2febb1d2703d71191f44052ba0d60ffda64910160405180910390a350505090565b60606003805480602002602001604051908101604052809291908181526020015f905b8282101561092a575f84815260209081902060408051808201909152600285029091018054825260019081015473ffffffffffffffffffffffffffffffffffffffff168284015290835290920191016108d6565b50505050905090565b61093d8133610da8565b50565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610a32575f8381526020818152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556109d03390565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016103c2565b505f6103c2565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610a32575f8381526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016103c2565b5f838152600260209081526040918290208251808401909352805480845260019091015473ffffffffffffffffffffffffffffffffffffffff1691830191909152610bbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f726571756573742077697468207468617420726571756573744944206469642060448201527f6e6f7420657869737400000000000000000000000000000000000000000000006064820152608401610589565b5f8383604051610bd09291906111b3565b604051809103902090505f826020015173ffffffffffffffffffffffffffffffffffffffff1663431ac65760e01b8784604051602401610c1a929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051610ca391906111c2565b5f604051808303815f865af19150503d805f8114610cdc576040519150601f19603f3d011682016040523d82523d5f602084013e610ce1565b606091505b5050905080610d2b57857ff633980577a6328cca68fd7b9bd2657bc2dc92af6e2d267d51acd35c933b1cb8838787604051610d1e939291906111dd565b60405180910390a2610d68565b857fb74b3204a538cd8021662d42e794681ddc339924ef675b8fd11e9eaf6aa19eb5838787604051610d5f939291906111dd565b60405180910390a25b5050505f928352505060026020526040812090815560010180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610e2d576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216600482015260248101839052604401610589565b5050565b5f5b83811015610e4b578181015183820152602001610e33565b50505f910152565b5f8151808452610e6a816020860160208601610e31565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f610eae6020830184610e53565b9392505050565b5f60208284031215610ec5575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610eae575f80fd5b5f60208284031215610f04575f80fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610f2e575f80fd5b919050565b5f8060408385031215610f44575f80fd5b82359150610f5460208401610f0b565b90509250929050565b5f60408284031215610f6d575f80fd5b6040516040810181811067ffffffffffffffff82111715610fb5577f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60405282358152610fc860208401610f0b565b60208201529392505050565b8151815260208083015173ffffffffffffffffffffffffffffffffffffffff1690820152604081016103c2565b5f805f60408486031215611013575f80fd5b83359250602084013567ffffffffffffffff80821115611031575f80fd5b818601915086601f830112611044575f80fd5b813581811115611052575f80fd5b876020828501011115611063575f80fd5b6020830194508093505050509250925092565b602080825282518282018190525f919060409081850190868401855b828110156110d5576110c58483518051825260209081015173ffffffffffffffffffffffffffffffffffffffff16910152565b9284019290850190600101611092565b5091979650505050505050565b604081525f6110f46040830185610e53565b90508260208301529392505050565b5f60208284031215611113575f80fd5b81518015158114610eae575f80fd5b808201808211156103c2577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b606081525f61116c6060830186610e53565b828103602084015261117e8186610e53565b905082810360408401526111928185610e53565b9695505050505050565b5f602082840312156111ac575f80fd5b5051919050565b818382375f9101908152919050565b5f82516111d3818460208701610e31565b9190910192915050565b83815260406020820152816040820152818360608301375f818301606090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019291505056fea2646970667358221220a5f1970a0370a163d76712d9c96346460258fb51c569cd5e2095f26b5b776f4d64736f6c63430008180033"; - -type RandomnessSenderConstructorParams = - | [signer?: Signer] - | ConstructorParameters; - -const isSuperArgs = ( - xs: RandomnessSenderConstructorParams -): xs is ConstructorParameters => xs.length > 1; - -export class RandomnessSender__factory extends ContractFactory { - constructor(...args: RandomnessSenderConstructorParams) { - if (isSuperArgs(args)) { - super(...args); - } else { - super(_abi, _bytecode, args[0]); - } - } - - override getDeployTransaction( - _signatureSender: AddressLike, - overrides?: NonPayableOverrides & { from?: string } - ): Promise { - return super.getDeployTransaction(_signatureSender, overrides || {}); - } - override deploy( - _signatureSender: AddressLike, - overrides?: NonPayableOverrides & { from?: string } - ) { - return super.deploy(_signatureSender, overrides || {}) as Promise< - RandomnessSender & { - deploymentTransaction(): ContractTransactionResponse; - } - >; - } - override connect(runner: ContractRunner | null): RandomnessSender__factory { - return super.connect(runner) as RandomnessSender__factory; - } - - static readonly bytecode = _bytecode; - static readonly abi = _abi; - static createInterface(): RandomnessSenderInterface { - return new Interface(_abi) as RandomnessSenderInterface; - } - static connect( - address: string, - runner?: ContractRunner | null - ): RandomnessSender { - return new Contract(address, _abi, runner) as unknown as RandomnessSender; - } -} diff --git a/src/generated/index.ts b/src/generated/index.ts deleted file mode 100644 index ef235f0..0000000 --- a/src/generated/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -export type { IRandomnessReceiver } from "./IRandomnessReceiver"; -export type { IRandomnessRequester } from "./IRandomnessRequester"; -export type { RandomnessReceiverBase } from "./RandomnessReceiverBase"; -export type { RandomnessRequester } from "./RandomnessRequester"; -export { IRandomnessReceiver__factory } from "./factories/IRandomnessReceiver__factory"; -export { IRandomnessRequester__factory } from "./factories/IRandomnessRequester__factory"; -export { RandomnessReceiverBase__factory } from "./factories/RandomnessReceiverBase__factory"; -export { RandomnessSender__factory } from "./factories/RandomnessSender__factory"; diff --git a/src/index.ts b/src/index.ts index 966f7b5..f60f267 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,3 @@ -import {Buffer} from "buffer" import { BytesLike, getBytes, @@ -6,26 +5,23 @@ import { Provider, Signer, } from "ethers" -import {G2} from "mcl-wasm" -import {RandomnessSender__factory} from "./generated" -import { - RandomnessCallbackFailedEvent, - RandomnessCallbackSuccessEvent, - RandomnessSender -} from "./generated/RandomnessSender" -import {BlsBn254, bytesEqual} from "./bls-bn254" +import {bn254} from "@kevincharm/noble-bn254-drand" +import {equalBytes} from "@noble/curves/abstract/utils" import {encodeParams, extractSingleLog} from "./ethers-helpers" import {withTimeout} from "./misc" +import {RandomnessSender__factory} from "./generated" import {TypedContractEvent, TypedListener} from "./generated/common" +import {RandomnessCallbackSuccessEvent, RandomnessSender} from "./generated/RandomnessSender" + +/* addresses of the deployed contracts */ +export const FURNACE_TESTNET_CONTRACT_ADDRESS = "0x6ac6390653d8d75b9baff66401198efc3684e0ec" +export const FILECOIN_CALIBNET_CONTRACT_ADDRESS = "0x9c789bc7F2B5c6619Be1572A39F2C3d6f33001dC" -const defaultContractAddress = "0x9ed5a27a9f18529848d03ae699bdecc2ba8d10fe" -// the verifier's BLS public key arranged as magical bigints to avoid promises in creation -export const VERIFIER_PUBLIC_KEY: [bigint, bigint, bigint, bigint] = [ - 17445541620214498517833872661220947475697073327136585274784354247720096233162n, - 18268991875563357240413244408004758684187086817233527689475815128036446189503n, - 11401601170172090472795479479864222172123705188644469125048759621824127399516n, - 8044854403167346152897273335539146380878155193886184396711544300199836788154n, -] +/* some cryptographic parameters that are also defined in the contracts, but we duplicate here for performance */ +const RANDOMNESS_DST = "randomness:0.0.1:bn254" +const BLS_DST = "BLS_SIG_BN254G1_XMD:KECCAK-256_SVDW_RO_NUL_" + +/* ethers.js magic beans */ const iface = RandomnessSender__factory.createInterface() export type RandomnessVerificationParameters = { @@ -37,14 +33,23 @@ export type RandomnessVerificationParameters = { export class Randomness { private readonly contract: RandomnessSender - private bls: BlsBn254 | undefined - private pk: G2 | undefined + // the format of this public key is _NOT_ the same format as evm-land. + // only the lord himself knows how to convert from one to the other + private readonly pk = bn254.G2.ProjectivePoint.fromHex("00f26a1fbba69685a1606f8104d0f218546a774099d78218e01bf63bf08b94fb0eafa51a62570209e04f66f390f41b7a1dae3d9350af7b413e4c65ffc4ca3a6c0815fe3e100c6f2c9a05f8ac898f9aa5c54164771500426ce54b52c6e0958e52111fa5a435e9d442cf69939a379e25841c65c3be365e851fdd04539e9b2462a1") - constructor(private readonly rpc: Signer | Provider, private readonly contractAddress: string = defaultContractAddress) { + constructor(private readonly rpc: Signer | Provider, private readonly contractAddress: string = FURNACE_TESTNET_CONTRACT_ADDRESS) { console.log(`created randomness-js client with address ${contractAddress}`) this.contract = RandomnessSender__factory.connect(contractAddress, rpc) } + static createFilecoinCalibnet(rpc: Signer | Provider): Randomness { + return new Randomness(rpc, FILECOIN_CALIBNET_CONTRACT_ADDRESS) + } + + static createFurnace(rpc: Signer | Provider): Randomness { + return new Randomness(rpc, FURNACE_TESTNET_CONTRACT_ADDRESS) + } + async requestRandomness(confirmations = 1, timeoutMs = 60000): Promise { if (this.rpc.provider == null) { throw Error("RPC requires a provider to request randomness") @@ -65,15 +70,16 @@ export class Randomness { // lest we miss our fulfilled randomness. We set the listeners first... in case // by some magic our request is fulfilled _between_ the lines const successFilter = this.contract.filters.RandomnessCallbackSuccess(requestID) - const failureFilter = this.contract.filters.RandomnessCallbackFailed(requestID) // how many blocks we're willing to look back - don't really expect it to be more than 1 const blockLookBack = 3 + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let timeout: any = null // cleanup to do once we've managed all the events const cleanup = () => { this.contract.off(successFilter) - this.contract.off(failureFilter) + clearTimeout(timeout) } const randomnessCallback = (result: RandomnessVerificationParameters) => { resolve(result) @@ -81,17 +87,13 @@ export class Randomness { } const randomnessListener = createRandomnessListener(nonce, randomnessCallback) this.contract.once(successFilter, randomnessListener) - this.contract.once(failureFilter, randomnessListener) const randomnessFilter = createRandomnessLogListener(nonce, randomnessCallback) this.contract.queryFilter(successFilter, -blockLookBack) .then(randomnessFilter) .catch(reject) - this.contract.queryFilter(failureFilter, -blockLookBack) - .then(randomnessFilter) - .catch(reject) - setTimeout(() => { + timeout = setTimeout(() => { cleanup() reject(new Error("timed out requesting randomness")) }, timeoutMs) @@ -99,37 +101,26 @@ export class Randomness { } async verify(parameters: RandomnessVerificationParameters): Promise { - if (!this.bls) { - this.bls = await BlsBn254.create() - } - if (!this.pk) { - this.pk = this.bls.g2FromEvm(VERIFIER_PUBLIC_KEY) - } const {randomness, signature, nonce} = parameters - const randDST = "randomness:0.0.1:bn254" - const blsDST = Buffer.from("BLS_SIG_BN254G1_XMD:KECCAK-256_SVDW_RO_NUL_") - if (!bytesEqual(keccak256(signature), randomness)) { + if (!equalBytes(getBytes(keccak256(signature)), getBytes(randomness))) { throw Error("randomness did not match the signature provided") } - const m = keccak256(encodeParams(["string", "uint256"], [randDST, nonce])) - const h_m = this.bls.hashToPoint(blsDST, getBytes(m)) - const s = this.bls.g1FromEvmHex(signature) - - return this.bls.verify(h_m, this.pk, s) + const m = keccak256(encodeParams(["string", "uint256"], [RANDOMNESS_DST, nonce])) + return bn254.verifyShortSignature(getBytes(signature), getBytes(m), this.pk, {DST: BLS_DST}) } } function createRandomnessListener(nonce: bigint, cb: (arg: RandomnessVerificationParameters) => void): TypedListener { - return (log: RandomnessCallbackSuccessEvent.Log | RandomnessCallbackFailedEvent.Log) => { + return (log: RandomnessCallbackSuccessEvent.Log) => { const [requestID, randomness, signature] = log.args cb({requestID, nonce, randomness, signature}) } } function createRandomnessLogListener(nonce: bigint, cb: (arg: RandomnessVerificationParameters) => void) { - return (logs: RandomnessCallbackSuccessEvent.Log[] | RandomnessCallbackFailedEvent.Log[]) => { + return (logs: RandomnessCallbackSuccessEvent.Log[]) => { if (logs.length === 0) { return } @@ -141,5 +132,3 @@ function createRandomnessLogListener(nonce: bigint, cb: (arg: RandomnessVerifica cb({requestID, randomness, signature, nonce}) } } - - diff --git a/src/misc.ts b/src/misc.ts index 4cef3e8..9cc40c4 100644 --- a/src/misc.ts +++ b/src/misc.ts @@ -1,8 +1,10 @@ export function withTimeout(inner: Promise, timeoutMs: number, message = "timed out"): Promise { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let timeout: any = null return Promise.race([ inner, new Promise((_, reject) => - setTimeout(() => reject(message), timeoutMs) + timeout = setTimeout(() => reject(message), timeoutMs) ) - ]) -} \ No newline at end of file + ]).finally(() => clearTimeout(timeout)) +} diff --git a/test/randomness.test.ts b/test/randomness.test.ts index 44a2af9..f652745 100644 --- a/test/randomness.test.ts +++ b/test/randomness.test.ts @@ -1,12 +1,24 @@ -import {describe, it, expect} from "@jest/globals" -import {JsonRpcProvider, NonceManager, Wallet} from "ethers" -import {Randomness} from "../src" +import * as dotenv from "dotenv" +import {describe, it, expect, beforeAll, afterAll} from "@jest/globals" +import {NonceManager, Wallet, WebSocketProvider} from "ethers" +import {FILECOIN_CALIBNET_CONTRACT_ADDRESS, Randomness} from "../src" +// filecoin calibnet might take forever +const TEST_TIMEOUT = 200_000 describe("randomness", () => { - it("class can be constructed", async () => { - const rpc = new JsonRpcProvider("https://furnace.firepit.network") - const wallet = new NonceManager(new Wallet("0x5cb3c5ba25c91d84ef5dabf4152e909795074f9958b091b010644cb9c30e3203", rpc)) - const randomness = new Randomness(wallet) - expect(randomness).not.toEqual(null) + beforeAll(() => { + dotenv.config() }) -}) \ No newline at end of file + + it("can be requested from a testnet and verified", async () => { + const rpc = new WebSocketProvider(process.env.NETWORK_RPC_URL || "") + const wallet = new NonceManager(new Wallet(process.env.NETWORK_PRIVATE_KEY || "", rpc)) + const randomness = new Randomness(wallet, FILECOIN_CALIBNET_CONTRACT_ADDRESS) + expect(randomness).not.toEqual(null) + + const response = await randomness.requestRandomness(1, TEST_TIMEOUT) + await randomness.verify(response) + await rpc.destroy() + }, TEST_TIMEOUT) + +})