From 9bdf57d55095119e753380b90d2552a871b8275e Mon Sep 17 00:00:00 2001 From: zhi Date: Mon, 16 Sep 2024 15:30:50 +0800 Subject: [PATCH 01/22] minter contract --- smartcontracts/contracts/W3bstreamDAO.sol | 34 + smartcontracts/contracts/W3bstreamMinter.sol | 79 + .../contracts/W3bstreamTaskManager.sol | 70 + smartcontracts/package.json | 6 +- smartcontracts/test/W3bstreamMinter.ts | 73 + smartcontracts/yarn.lock | 1499 ++++++----------- 6 files changed, 811 insertions(+), 950 deletions(-) create mode 100644 smartcontracts/contracts/W3bstreamDAO.sol create mode 100644 smartcontracts/contracts/W3bstreamMinter.sol create mode 100644 smartcontracts/contracts/W3bstreamTaskManager.sol create mode 100644 smartcontracts/test/W3bstreamMinter.ts diff --git a/smartcontracts/contracts/W3bstreamDAO.sol b/smartcontracts/contracts/W3bstreamDAO.sol new file mode 100644 index 00000000..85daa680 --- /dev/null +++ b/smartcontracts/contracts/W3bstreamDAO.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; + +contract W3bstreamDAO is OwnableUpgradeable { + struct Block { + bytes32 hash; + uint256 timestamp; + } + event BlockAdded(uint256 indexed num, bytes32 hash, uint256 timestamp); + + Block[] public blocks; + + function initialize(bytes32 genesis) public initializer { + __Ownable_init(); + _mint(genesis, block.timestamp); + } + + function mint(bytes32 hash, uint256 timestamp) public onlyOwner { + _mint(hash, timestamp); + } + + function tip() public view returns (uint256, bytes32, uint256) { + uint256 blocknum = blocks.length - 1; + Block storage tipblock = blocks[blocknum]; + return (blocknum, tipblock.hash, tipblock.timestamp); + } + + function _mint(bytes32 hash, uint256 timestamp) internal { + blocks.push(Block({timestamp: timestamp, hash: hash})); + emit BlockAdded(blocks.length - 1, hash, timestamp); + } +} diff --git a/smartcontracts/contracts/W3bstreamMinter.sol b/smartcontracts/contracts/W3bstreamMinter.sol new file mode 100644 index 00000000..551f7974 --- /dev/null +++ b/smartcontracts/contracts/W3bstreamMinter.sol @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; + +interface IDAO { + function tip() external view returns (uint256, bytes32, uint256); + function mint(bytes32 hash, uint256 timestamp) external; +} + +interface ITaskManager { + function assign(uint64 projectId, uint64 taskId, address prover, uint256 deadline) external; +} + +struct BlockInfo { + bytes4 meta; + bytes32 prevhash; + bytes32 merkleRoot; + bytes4 difficulty; + bytes8 nonce; +} + +struct Sequencer { + address addr; + address operator; + address beneficiary; +} + +struct TaskAssignment { + uint64 projectId; + uint64 taskId; + address prover; +} + +contract W3bstreamMinter is OwnableUpgradeable { + IDAO public dao; + ITaskManager public tm; + + function initialize(IDAO _dao, ITaskManager _tm) public initializer { + __Ownable_init(); + dao = _dao; + tm = _tm; + } + + function mint( + BlockInfo calldata blockinfo, + uint256 timestamp, + Sequencer calldata coinbase, + TaskAssignment[] calldata assignments + ) public { + require(coinbase.operator == msg.sender, "invalid operator"); + (, bytes32 tip, ) = dao.tip(); + require(blockinfo.prevhash == tip, "invalid prevhash"); + // TODO: timestamp is not larger than block.timestamp + require(timestamp > block.timestamp - 1 minutes, "invalid timestamp"); + require(blockinfo.merkleRoot == keccak256(abi.encodePacked(timestamp, coinbase.addr, coinbase.operator, coinbase.beneficiary)), "invalid merkle root"); + // TODO: review difficulty usage + require(sha256(abi.encodePacked(blockinfo.meta, blockinfo.prevhash, blockinfo.merkleRoot, blockinfo.difficulty, blockinfo.nonce)) < blockinfo.difficulty, "invalid proof of work"); + bytes32 hash = keccak256(abi.encode( + blockinfo.meta, + blockinfo.prevhash, + blockinfo.merkleRoot, + blockinfo.difficulty, + blockinfo.nonce, + timestamp, + coinbase.addr, + coinbase.operator, + coinbase.beneficiary, + assignments + )); + uint256 deadline = block.timestamp + 1 hours; + for (uint i = 0; i < assignments.length; i++) { + tm.assign(assignments[i].projectId, assignments[i].taskId, assignments[i].prover, deadline); + } + // TODO: adjust difficulty + dao.mint(hash, timestamp); + // TODO: distribute block reward + } +} diff --git a/smartcontracts/contracts/W3bstreamTaskManager.sol b/smartcontracts/contracts/W3bstreamTaskManager.sol new file mode 100644 index 00000000..d171d782 --- /dev/null +++ b/smartcontracts/contracts/W3bstreamTaskManager.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; + +struct TaskAssignment { + address prover; + uint256 deadline; + bool settled; +} + +contract W3bstreamTaskManager is OwnableUpgradeable { + event TaskAssigned(uint64 indexed projectId, uint64 indexed taskId, address prover, uint256 deadline); + event TaskSettled(uint64 indexed projectId, uint64 indexed taskId, address prover); + event OperatorAdded(address operator); + event OperatorRemoved(address operator); + mapping(uint64 => mapping(uint64 => TaskAssignment)) public assignments; + mapping(address => bool) public operators; + + modifier onlyOperator() { + require(operators[msg.sender], "not operator"); + _; + } + + function initialize() public initializer { + __Ownable_init(); + } + + function addOperator(address operator) public onlyOwner { + require(operator != address(0), "invalid operator"); + require(!operators[operator], "operator already added"); + operators[operator] = true; + emit OperatorAdded(operator); + } + + function removeOperator(address operator) public onlyOwner { + require(operators[operator], "operator not found"); + delete operators[operator]; + emit OperatorRemoved(operator); + } + + function assign( + uint64 projectId, + uint64 taskId, + address prover, + uint256 deadline + ) public onlyOperator{ + require(prover != address(0), "invalid prover"); + TaskAssignment storage assignment = assignments[projectId][taskId]; + require(assignment.settled == false, "task already settled"); + if (assignment.prover != address(0)) { + require(assignment.deadline < block.timestamp, "task already assigned"); + } + assignment.prover = prover; + assignment.deadline = deadline; + emit TaskAssigned(projectId, taskId, prover, deadline); + } + + function settle(uint64 projectId, uint64 taskId, address prover) public onlyOperator { + require(prover != address(0), "invalid prover"); + TaskAssignment storage assignment = assignments[projectId][taskId]; + require(assignment.prover == prover, "invalid prover"); + require(assignment.deadline >= block.timestamp, "task assignement expired"); + require(assignment.settled == false, "task already settled"); + assignment.settled = true; + emit TaskSettled(projectId, taskId, prover); + // TODO: distribute task reward + } + +} diff --git a/smartcontracts/package.json b/smartcontracts/package.json index 43522e84..f1ae2f5a 100644 --- a/smartcontracts/package.json +++ b/smartcontracts/package.json @@ -20,9 +20,9 @@ "@nomicfoundation/hardhat-network-helpers": "^1.0.0", "@nomicfoundation/hardhat-toolbox": "^4.0.0", "@nomicfoundation/hardhat-verify": "^2.0.0", - "@openzeppelin/hardhat-upgrades": "^3.0.3", + "@openzeppelin/hardhat-upgrades": "^3.2.1", "@typechain/ethers-v6": "^0.5.0", - "@typechain/hardhat": "^9.0.0", + "@typechain/hardhat": "^9.1.0", "@types/chai": "^4.2.0", "@types/mocha": ">=9.1.0", "@types/node": ">=16.0.0", @@ -39,7 +39,7 @@ "solidity-coverage": "^0.8.0", "ts-node": ">=8.0.0", "typechain": "^8.3.0", - "typescript": ">=4.5.0" + "typescript": "^5.4.3" }, "dependencies": { "@openzeppelin/contracts": "^4.9.5", diff --git a/smartcontracts/test/W3bstreamMinter.ts b/smartcontracts/test/W3bstreamMinter.ts new file mode 100644 index 00000000..ffa4f8f3 --- /dev/null +++ b/smartcontracts/test/W3bstreamMinter.ts @@ -0,0 +1,73 @@ +import { expect } from 'chai'; +import { keccak256 } from 'ethers'; +import { ethers } from 'hardhat'; + +describe('W3bstream Minter', function () { + let minter; + let dao; + let tm; + const genesis = "0x0000000011111111222222223333333344444444555555556666666677777777"; + beforeEach(async function () { + minter = await ethers.deployContract('W3bstreamMinter'); + dao = await ethers.deployContract('W3bstreamDAO'); + tm = await ethers.deployContract('W3bstreamTaskManager'); + await dao.initialize(genesis); + await tm.initialize(); + await minter.initialize(dao.getAddress(), tm.getAddress()); + await dao.transferOwnership(minter.getAddress()); + await tm.addOperator(minter.getAddress()); + }); + it('mint block', async function () { + const tip = await ethers.provider.getBlock('latest'); + const timestamp = tip.timestamp; + const [owner, sequencer, prover] = await ethers.getSigners(); + const coinbase = { + addr: sequencer.address, + operator: sequencer.address, + beneficiary: sequencer.address, + }; + const merkleRoot = ethers.solidityPackedKeccak256(["uint256", "address", "address", "address"], [timestamp, coinbase.addr, coinbase.operator, coinbase.beneficiary]); + const blockinfo = { + meta: "0x00000000", + prevhash: genesis, + merkleRoot: merkleRoot, + difficulty: "0xffffffff", + nonce: "0x0000000000000000", + }; + let tipinfo = await dao.tip(); + expect(tipinfo[0]).to.equal(0); + expect(tipinfo[1]).to.equal(genesis); + await minter.connect(sequencer).mint( + blockinfo, + timestamp, + coinbase, + [], + ); + tipinfo = await dao.tip(); + // TODO: adjust timestamp & merkle root + expect(tipinfo[0]).to.equal(1); + await expect(minter.connect(sequencer).mint( + blockinfo, + timestamp, + coinbase, + [], + )).to.be.revertedWith("invalid prevhash"); + blockinfo.prevhash = tipinfo[1]; + blockinfo.difficulty = "0x00000001"; + await expect(minter.connect(sequencer).mint( + blockinfo, + timestamp, + coinbase, + [], + )).to.be.revertedWith("invalid proof of work"); + blockinfo.difficulty = "0xffffffff"; + await minter.connect(sequencer).mint( + blockinfo, + timestamp, + coinbase, + [], + ); + tipinfo = await dao.tip(); + expect(tipinfo[0]).to.equal(2); + }); +}); diff --git a/smartcontracts/yarn.lock b/smartcontracts/yarn.lock index a8538f38..f4d724ec 100644 --- a/smartcontracts/yarn.lock +++ b/smartcontracts/yarn.lock @@ -31,11 +31,11 @@ tslib "^1.11.1" "@aws-sdk/types@^3.1.0": - version "3.535.0" - resolved "https://registry.npmjs.org/@aws-sdk/types/-/types-3.535.0.tgz" - integrity sha512-aY4MYfduNj+sRR37U7XxYR8wemfbKP6lx00ze2M2uubn7mZotuVrWYAafbMSXrdEMSToE5JDhr28vArSOoLcSg== + version "3.649.0" + resolved "https://registry.npmjs.org/@aws-sdk/types/-/types-3.649.0.tgz" + integrity sha512-PuPw8RysbhJNlaD2d/PzOTf8sbf4Dsn2b7hwyGh7YVG3S75yTpxSAZxrnhKsz9fStgqFmnw/jUfV/G+uQAeTVw== dependencies: - "@smithy/types" "^2.12.0" + "@smithy/types" "^3.4.0" tslib "^2.6.2" "@aws-sdk/util-utf8-browser@^3.0.0": @@ -121,7 +121,7 @@ ethereum-cryptography "^2.0.0" micro-ftch "^0.3.1" -"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.7.0": +"@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.7.0", "@ethersproject/abi@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz" integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== @@ -136,7 +136,7 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": +"@ethersproject/abstract-provider@^5.7.0", "@ethersproject/abstract-provider@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz" integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== @@ -149,7 +149,7 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/web" "^5.7.0" -"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": +"@ethersproject/abstract-signer@^5.7.0", "@ethersproject/abstract-signer@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz" integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== @@ -160,7 +160,7 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/address@5.7.0", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.7.0": +"@ethersproject/address@^5.0.2", "@ethersproject/address@^5.7.0", "@ethersproject/address@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz" integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== @@ -171,14 +171,14 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/rlp" "^5.7.0" -"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": +"@ethersproject/base64@^5.7.0", "@ethersproject/base64@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz" integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== dependencies: "@ethersproject/bytes" "^5.7.0" -"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": +"@ethersproject/basex@^5.7.0", "@ethersproject/basex@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz" integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== @@ -186,7 +186,7 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": +"@ethersproject/bignumber@^5.7.0", "@ethersproject/bignumber@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz" integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== @@ -195,14 +195,14 @@ "@ethersproject/logger" "^5.7.0" bn.js "^5.2.1" -"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": +"@ethersproject/bytes@^5.7.0", "@ethersproject/bytes@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz" integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": +"@ethersproject/constants@^5.7.0", "@ethersproject/constants@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz" integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== @@ -225,7 +225,7 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/transactions" "^5.7.0" -"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": +"@ethersproject/hash@^5.7.0", "@ethersproject/hash@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz" integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== @@ -240,7 +240,7 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": +"@ethersproject/hdnode@^5.7.0", "@ethersproject/hdnode@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz" integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== @@ -258,7 +258,7 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/wordlists" "^5.7.0" -"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": +"@ethersproject/json-wallets@^5.7.0", "@ethersproject/json-wallets@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz" integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== @@ -277,7 +277,7 @@ aes-js "3.0.0" scrypt-js "3.0.1" -"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": +"@ethersproject/keccak256@^5.7.0", "@ethersproject/keccak256@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz" integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== @@ -285,19 +285,19 @@ "@ethersproject/bytes" "^5.7.0" js-sha3 "0.8.0" -"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": +"@ethersproject/logger@^5.7.0", "@ethersproject/logger@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz" integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== -"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": +"@ethersproject/networks@^5.7.0", "@ethersproject/networks@5.7.1": version "5.7.1" resolved "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz" integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": +"@ethersproject/pbkdf2@^5.7.0", "@ethersproject/pbkdf2@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz" integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== @@ -305,7 +305,7 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/sha2" "^5.7.0" -"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": +"@ethersproject/properties@^5.7.0", "@ethersproject/properties@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz" integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== @@ -338,7 +338,7 @@ bech32 "1.1.4" ws "7.4.6" -"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": +"@ethersproject/random@^5.7.0", "@ethersproject/random@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz" integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== @@ -346,7 +346,7 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": +"@ethersproject/rlp@^5.7.0", "@ethersproject/rlp@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz" integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== @@ -354,7 +354,7 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": +"@ethersproject/sha2@^5.7.0", "@ethersproject/sha2@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz" integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== @@ -363,7 +363,7 @@ "@ethersproject/logger" "^5.7.0" hash.js "1.1.7" -"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": +"@ethersproject/signing-key@^5.7.0", "@ethersproject/signing-key@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz" integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== @@ -387,7 +387,7 @@ "@ethersproject/sha2" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": +"@ethersproject/strings@^5.7.0", "@ethersproject/strings@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz" integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== @@ -396,7 +396,7 @@ "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": +"@ethersproject/transactions@^5.7.0", "@ethersproject/transactions@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz" integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== @@ -441,7 +441,7 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/wordlists" "^5.7.0" -"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": +"@ethersproject/web@^5.7.0", "@ethersproject/web@5.7.1": version "5.7.1" resolved "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz" integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== @@ -452,7 +452,7 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": +"@ethersproject/wordlists@^5.7.0", "@ethersproject/wordlists@5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz" integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== @@ -516,6 +516,13 @@ tweetnacl "^1.0.3" tweetnacl-util "^0.15.1" +"@noble/curves@~1.3.0": + version "1.3.0" + resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.3.0.tgz" + integrity sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA== + dependencies: + "@noble/hashes" "1.3.3" + "@noble/curves@1.2.0": version "1.2.0" resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz" @@ -523,19 +530,19 @@ dependencies: "@noble/hashes" "1.3.2" -"@noble/curves@1.3.0", "@noble/curves@~1.3.0": +"@noble/curves@1.3.0": version "1.3.0" resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.3.0.tgz" integrity sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA== dependencies: "@noble/hashes" "1.3.3" -"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": +"@noble/hashes@~1.2.0", "@noble/hashes@1.2.0": version "1.2.0" resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz" integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== -"@noble/hashes@1.3.2", "@noble/hashes@~1.3.2": +"@noble/hashes@~1.3.2", "@noble/hashes@1.3.2": version "1.3.2" resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz" integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== @@ -545,7 +552,7 @@ resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz" integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== -"@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": +"@noble/secp256k1@~1.7.0", "@noble/secp256k1@1.7.1": version "1.7.1" resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz" integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== @@ -558,7 +565,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -571,65 +578,53 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@nomicfoundation/edr-darwin-arm64@0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.3.2.tgz#be1f696d429aecdf47d292a75958551e7cc34294" - integrity sha512-l6wfSBUUbGJiCENT6272CDI8yoMuf0sZH56H5qz3HnAyVzenkOvmzyF6/lar54m986kdAQqWls4cLvDxiOuLxg== - -"@nomicfoundation/edr-darwin-x64@0.3.2": - version "0.3.2" - resolved "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.3.2.tgz" - integrity sha512-OboExL7vEw+TRJQl3KkaEKU4K7PTdZPTInZ0fxMAtOpcWp7EKR+dQo68vc/iAOusB3xszHKxt7t+WpisItfdcg== - -"@nomicfoundation/edr-linux-arm64-gnu@0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.3.2.tgz#4d7d4f28e13d426b5e3cf9731dbfed573f819245" - integrity sha512-xtEK+1eg++3pHi6405NDXd80S3CGOFEGQIyVGCwjMGQFOLSzBGGCsrb/0GB4J19zd1o/8ftCd/HjZcbVAWWTLQ== - -"@nomicfoundation/edr-linux-arm64-musl@0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.3.2.tgz#10702ae4db386cc21efef9e6276bb56a09581e0a" - integrity sha512-3cIsskJOXQ1yEVsImmCacY7O03tUTiWrmd54F05PnPFrDLkjbzodQ3b2gUWzfbzUZWl67ZTJd1CvVSzpe7XGzw== - -"@nomicfoundation/edr-linux-x64-gnu@0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.3.2.tgz#a29590bea8d490aa2129f2cb7fab1559ec9d25ee" - integrity sha512-ouPdphHNsyO7wqwa4hwahC5WqBglK/fIvMmhR/SXNZ9qruIpsA8ZZKIURaHMOv/2h2BbNGcyTX9uEk6+5rK/MQ== - -"@nomicfoundation/edr-linux-x64-musl@0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.3.2.tgz#fe2b4c282c80c792b3a03e04d517d140a927cf92" - integrity sha512-sRhwhiPbkpJMOUwXW1FZw9ks6xWyQhIhM0E8o3TXEXKSPKTE6whQLEk1R37iFITaI36vb6rSwLKTU1cb32gCoA== - -"@nomicfoundation/edr-win32-arm64-msvc@0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-arm64-msvc/-/edr-win32-arm64-msvc-0.3.2.tgz#6f09cf20f7e7be3ea70f61888cde238d924ec369" - integrity sha512-IEwVealKfumu1HSSnama26yPuQC/uthRPK5IWtFsQUOGwOXaS1r9Bu7cGYH2jBHl3IT/JbxD4xzPq/2pM9uK0A== - -"@nomicfoundation/edr-win32-ia32-msvc@0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-ia32-msvc/-/edr-win32-ia32-msvc-0.3.2.tgz#ba4cd9744d95f491329efdfbefb527a8c9f5f31d" - integrity sha512-jYMnf6SFgguqROswwdsjJ1wvneD/5c16pVu9OD4DxNqhKNP5bHEw6L2N4DcJ89tpXMpJ6AlOpc0QuwzddiZ3tA== - -"@nomicfoundation/edr-win32-x64-msvc@0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.3.2.tgz#331e3cea1618134e8d9f4ccb999086af6362a3af" - integrity sha512-Byn4QuWczRy/DUUQM3WjglgX/jGVUURVFaUsmIhnGg//MPlCLawubBGRqsrMuvaYedlIIJ4I2rgKvZlxdgHrqg== - -"@nomicfoundation/edr@^0.3.1": - version "0.3.2" - resolved "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.3.2.tgz" - integrity sha512-HGWtjibAK1mo4I2A7nJ/fXqe/J9G54OrSPJnnkY2K8TiXotYLShGd9GvHkae3PuFjTJKm6ZgBy7tveJj5yrCfw== - optionalDependencies: - "@nomicfoundation/edr-darwin-arm64" "0.3.2" - "@nomicfoundation/edr-darwin-x64" "0.3.2" - "@nomicfoundation/edr-linux-arm64-gnu" "0.3.2" - "@nomicfoundation/edr-linux-arm64-musl" "0.3.2" - "@nomicfoundation/edr-linux-x64-gnu" "0.3.2" - "@nomicfoundation/edr-linux-x64-musl" "0.3.2" - "@nomicfoundation/edr-win32-arm64-msvc" "0.3.2" - "@nomicfoundation/edr-win32-ia32-msvc" "0.3.2" - "@nomicfoundation/edr-win32-x64-msvc" "0.3.2" +"@nomicfoundation/edr-darwin-arm64@0.5.2": + version "0.5.2" + resolved "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.5.2.tgz" + integrity sha512-Gm4wOPKhbDjGTIRyFA2QUAPfCXA1AHxYOKt3yLSGJkQkdy9a5WW+qtqKeEKHc/+4wpJSLtsGQfpzyIzggFfo/A== + +"@nomicfoundation/edr-darwin-x64@0.5.2": + version "0.5.2" + resolved "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.5.2.tgz" + integrity sha512-ClyABq2dFCsrYEED3/UIO0c7p4H1/4vvlswFlqUyBpOkJccr75qIYvahOSJRM62WgUFRhbSS0OJXFRwc/PwmVg== + +"@nomicfoundation/edr-linux-arm64-gnu@0.5.2": + version "0.5.2" + resolved "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.5.2.tgz" + integrity sha512-HWMTVk1iOabfvU2RvrKLDgtFjJZTC42CpHiw2h6rfpsgRqMahvIlx2jdjWYzFNy1jZKPTN1AStQ/91MRrg5KnA== + +"@nomicfoundation/edr-linux-arm64-musl@0.5.2": + version "0.5.2" + resolved "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.5.2.tgz" + integrity sha512-CwsQ10xFx/QAD5y3/g5alm9+jFVuhc7uYMhrZAu9UVF+KtVjeCvafj0PaVsZ8qyijjqVuVsJ8hD1x5ob7SMcGg== + +"@nomicfoundation/edr-linux-x64-gnu@0.5.2": + version "0.5.2" + resolved "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.5.2.tgz" + integrity sha512-CWVCEdhWJ3fmUpzWHCRnC0/VLBDbqtqTGTR6yyY1Ep3S3BOrHEAvt7h5gx85r2vLcztisu2vlDq51auie4IU1A== + +"@nomicfoundation/edr-linux-x64-musl@0.5.2": + version "0.5.2" + resolved "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.5.2.tgz" + integrity sha512-+aJDfwhkddy2pP5u1ISg3IZVAm0dO836tRlDTFWtvvSMQ5hRGqPcWwlsbobhDQsIxhPJyT7phL0orCg5W3WMeA== + +"@nomicfoundation/edr-win32-x64-msvc@0.5.2": + version "0.5.2" + resolved "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.5.2.tgz" + integrity sha512-CcvvuA3sAv7liFNPsIR/68YlH6rrybKzYttLlMr80d4GKJjwJ5OKb3YgE6FdZZnOfP19HEHhsLcE0DPLtY3r0w== + +"@nomicfoundation/edr@^0.5.2": + version "0.5.2" + resolved "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.5.2.tgz" + integrity sha512-hW/iLvUQZNTVjFyX/I40rtKvvDOqUEyIi96T28YaLfmPL+3LW2lxmYLUXEJ6MI14HzqxDqrLyhf6IbjAa2r3Dw== + dependencies: + "@nomicfoundation/edr-darwin-arm64" "0.5.2" + "@nomicfoundation/edr-darwin-x64" "0.5.2" + "@nomicfoundation/edr-linux-arm64-gnu" "0.5.2" + "@nomicfoundation/edr-linux-arm64-musl" "0.5.2" + "@nomicfoundation/edr-linux-x64-gnu" "0.5.2" + "@nomicfoundation/edr-linux-x64-musl" "0.5.2" + "@nomicfoundation/edr-win32-x64-msvc" "0.5.2" "@nomicfoundation/ethereumjs-common@4.0.4": version "4.0.4" @@ -662,9 +657,9 @@ ethereum-cryptography "0.1.3" "@nomicfoundation/hardhat-chai-matchers@^2.0.0": - version "2.0.6" - resolved "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.6.tgz" - integrity sha512-Te1Uyo9oJcTCF0Jy9dztaLpshmlpjLf2yPtWXlXuLjMt3RRSmJLm/+rKVTW6gfadAEs12U/it6D0ZRnnRGiICQ== + version "2.0.7" + resolved "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.7.tgz" + integrity sha512-RQfsiTwdf0SP+DtuNYvm4921X6VirCQq0Xyh+mnuGlTwEFSPZ/o27oQC+l+3Y/l48DDU7+ZcYBR+Fp+Rp94LfQ== dependencies: "@types/chai-as-promised" "^7.1.3" chai-as-promised "^7.1.1" @@ -692,9 +687,9 @@ integrity sha512-jhcWHp0aHaL0aDYj8IJl80v4SZXWMS1A2XxXa1CA6pBiFfJKuZinCkO6wb+POAt0LIfXB3gA3AgdcOccrcwBwA== "@nomicfoundation/hardhat-verify@^2.0.0": - version "2.0.5" - resolved "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.5.tgz" - integrity sha512-Tg4zu8RkWpyADSFIgF4FlJIUEI4VkxcvELsmbJn2OokbvH2SnUrqKmw0BBfDrtvP0hhmx8wsnrRKP5DV/oTyTA== + version "2.0.10" + resolved "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.10.tgz" + integrity sha512-3zoTZGQhpeOm6piJDdsGb6euzZAd7N5Tk0zPQvGnfKQ0+AoxKz/7i4if12goi8IDTuUGElAUuZyQB8PMQoXA5g== dependencies: "@ethersproject/abi" "^5.1.2" "@ethersproject/address" "^5.0.2" @@ -706,55 +701,70 @@ table "^6.8.0" undici "^5.14.0" -"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz#4c858096b1c17fe58a474fe81b46815f93645c15" - integrity sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w== +"@nomicfoundation/slang-darwin-arm64@0.17.0": + version "0.17.0" + resolved "https://registry.npmjs.org/@nomicfoundation/slang-darwin-arm64/-/slang-darwin-arm64-0.17.0.tgz" + integrity sha512-O0q94EUtoWy9A5kOTOa9/khtxXDYnLqmuda9pQELurSiwbQEVCPQL8kb34VbOW+ifdre66JM/05Xw9JWhIZ9sA== -"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1": - version "0.1.1" - resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz" - integrity sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA== +"@nomicfoundation/slang-darwin-x64@0.17.0": + version "0.17.0" + resolved "https://registry.npmjs.org/@nomicfoundation/slang-darwin-x64/-/slang-darwin-x64-0.17.0.tgz" + integrity sha512-IaDbHzvT08sBK2HyGzonWhq1uu8IxdjmTqAWHr25Oh/PYnamdi8u4qchZXXYKz/DHLoYN3vIpBXoqLQIomhD/g== -"@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz#0a224ea50317139caeebcdedd435c28a039d169c" - integrity sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA== +"@nomicfoundation/slang-linux-arm64-gnu@0.17.0": + version "0.17.0" + resolved "https://registry.npmjs.org/@nomicfoundation/slang-linux-arm64-gnu/-/slang-linux-arm64-gnu-0.17.0.tgz" + integrity sha512-Lj4anvOsQZxs1SycG8VyT2Rl2oqIhyLSUCgGepTt3CiJ/bM+8r8bLJIgh8vKkki4BWz49YsYIgaJB2IPv8FFTw== -"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz#dfa085d9ffab9efb2e7b383aed3f557f7687ac2b" - integrity sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg== +"@nomicfoundation/slang-linux-arm64-musl@0.17.0": + version "0.17.0" + resolved "https://registry.npmjs.org/@nomicfoundation/slang-linux-arm64-musl/-/slang-linux-arm64-musl-0.17.0.tgz" + integrity sha512-/xkTCa9d5SIWUBQE3BmLqDFfJRr4yUBwbl4ynPiGUpRXrD69cs6pWKkwjwz/FdBpXqVo36I+zY95qzoTj/YhOA== -"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz#c9e06b5d513dd3ab02a7ac069c160051675889a4" - integrity sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w== +"@nomicfoundation/slang-linux-x64-gnu@0.17.0": + version "0.17.0" + resolved "https://registry.npmjs.org/@nomicfoundation/slang-linux-x64-gnu/-/slang-linux-x64-gnu-0.17.0.tgz" + integrity sha512-oe5IO5vntOqYvTd67deCHPIWuSuWm6aYtT2/0Kqz2/VLtGz4ClEulBSRwfnNzBVtw2nksWipE1w8BzhImI7Syg== -"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz#8d328d16839e52571f72f2998c81e46bf320f893" - integrity sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA== +"@nomicfoundation/slang-linux-x64-musl@0.17.0": + version "0.17.0" + resolved "https://registry.npmjs.org/@nomicfoundation/slang-linux-x64-musl/-/slang-linux-x64-musl-0.17.0.tgz" + integrity sha512-PpYCI5K/kgLAMXaPY0V4VST5gCDprEOh7z/47tbI8kJQumI5odjsj/Cs8MpTo7/uRH6flKYbVNgUzcocWVYrAQ== -"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz#9b49d0634b5976bb5ed1604a1e1b736f390959bb" - integrity sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w== +"@nomicfoundation/slang-win32-arm64-msvc@0.17.0": + version "0.17.0" + resolved "https://registry.npmjs.org/@nomicfoundation/slang-win32-arm64-msvc/-/slang-win32-arm64-msvc-0.17.0.tgz" + integrity sha512-u/Mkf7OjokdBilP7QOJj6QYJU4/mjkbKnTX21wLyCIzeVWS7yafRPYpBycKIBj2pRRZ6ceAY5EqRpb0aiCq+0Q== -"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz#e2867af7264ebbcc3131ef837878955dd6a3676f" - integrity sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg== +"@nomicfoundation/slang-win32-ia32-msvc@0.17.0": + version "0.17.0" + resolved "https://registry.npmjs.org/@nomicfoundation/slang-win32-ia32-msvc/-/slang-win32-ia32-msvc-0.17.0.tgz" + integrity sha512-XJBVQfNnZQUv0tP2JSJ573S+pmgrLWgqSZOGaMllnB/TL1gRci4Z7dYRJUF2s82GlRJE+FHSI2Ro6JISKmlXCg== -"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz#0685f78608dd516c8cdfb4896ed451317e559585" - integrity sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ== +"@nomicfoundation/slang-win32-x64-msvc@0.17.0": + version "0.17.0" + resolved "https://registry.npmjs.org/@nomicfoundation/slang-win32-x64-msvc/-/slang-win32-x64-msvc-0.17.0.tgz" + integrity sha512-zPGsAeiTfqfPNYHD8BfrahQmYzA78ZraoHKTGraq/1xwJwzBK4bu/NtvVA4pJjBV+B4L6DCxVhSbpn40q26JQA== + +"@nomicfoundation/slang@^0.17.0": + version "0.17.0" + resolved "https://registry.npmjs.org/@nomicfoundation/slang/-/slang-0.17.0.tgz" + integrity sha512-1GlkGRcGpVnjFw9Z1vvDKOKo2mzparFt7qrl2pDxWp+jrVtlvej98yCMX52pVyrYE7ZeOSZFnx/DtsSgoukStQ== + dependencies: + "@nomicfoundation/slang-darwin-arm64" "0.17.0" + "@nomicfoundation/slang-darwin-x64" "0.17.0" + "@nomicfoundation/slang-linux-arm64-gnu" "0.17.0" + "@nomicfoundation/slang-linux-arm64-musl" "0.17.0" + "@nomicfoundation/slang-linux-x64-gnu" "0.17.0" + "@nomicfoundation/slang-linux-x64-musl" "0.17.0" + "@nomicfoundation/slang-win32-arm64-msvc" "0.17.0" + "@nomicfoundation/slang-win32-ia32-msvc" "0.17.0" + "@nomicfoundation/slang-win32-x64-msvc" "0.17.0" -"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1": +"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1": version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz#c9a44f7108646f083b82e851486e0f6aeb785836" - integrity sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw== + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz" + integrity sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA== "@nomicfoundation/solidity-analyzer@^0.1.0": version "0.1.1" @@ -773,90 +783,68 @@ "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.1" "@openzeppelin/contracts-upgradeable@^4.9.5": - version "4.9.5" - resolved "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.5.tgz" - integrity sha512-f7L1//4sLlflAN7fVzJLoRedrf5Na3Oal5PZfIq55NFcVZ90EpV1q5xOvL4lFvg3MNICSDr2hH0JUBxwlxcoPg== + version "4.9.6" + resolved "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.6.tgz" + integrity sha512-m4iHazOsOCv1DgM7eD7GupTJ+NFVujRZt1wzddDPSVGpWdKq1SKkla5htKG7+IS4d2XOCtzkUNwRZ7Vq5aEUMA== "@openzeppelin/contracts@^4.9.5": - version "4.9.5" - resolved "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.5.tgz" - integrity sha512-ZK+W5mVhRppff9BE6YdR8CC52C8zAvsVAiWhEtQ5+oNxFE6h1WdeWo+FJSF8KKvtxxVYZ7MTP/5KoVpAU3aSWg== - -"@openzeppelin/defender-admin-client@^1.52.0": - version "1.54.1" - resolved "https://registry.npmjs.org/@openzeppelin/defender-admin-client/-/defender-admin-client-1.54.1.tgz" - integrity sha512-kRpSUdTsnSqntp4FOXIm95t+6VKHc8CUY2Si71VDuxs0q7HSPZkdpRPSntcolwEzWy9L4a8NS/QMwDF5NJ4X1g== - dependencies: - "@openzeppelin/defender-base-client" "1.54.1" - axios "^1.4.0" - ethers "^5.7.2" - lodash "^4.17.19" - node-fetch "^2.6.0" - -"@openzeppelin/defender-base-client@1.54.1", "@openzeppelin/defender-base-client@^1.52.0": - version "1.54.1" - resolved "https://registry.npmjs.org/@openzeppelin/defender-base-client/-/defender-base-client-1.54.1.tgz" - integrity sha512-DRGz/7KN3ZQwu28YWMOaojrC7jjPkz/uCwkC8/C8B11qwZhA5qIVvyhYHhhFOCl0J84+E3TNdvkPD2q3p2WaJw== - dependencies: - amazon-cognito-identity-js "^6.0.1" - async-retry "^1.3.3" - axios "^1.4.0" - lodash "^4.17.19" - node-fetch "^2.6.0" + version "4.9.6" + resolved "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.6.tgz" + integrity sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA== -"@openzeppelin/defender-sdk-base-client@^1.10.0", "@openzeppelin/defender-sdk-base-client@^1.11.0": - version "1.11.0" - resolved "https://registry.npmjs.org/@openzeppelin/defender-sdk-base-client/-/defender-sdk-base-client-1.11.0.tgz" - integrity sha512-HNcbRhbcMZZM5Ri5IfUwJaiJZGIrc0yboRZRlXJfG2aFS/EMfUFnQHC0tyyXtCOAoAZcn+iMlsSj5h8CoUeCfw== +"@openzeppelin/defender-sdk-base-client@^1.10.0", "@openzeppelin/defender-sdk-base-client@^1.14.4": + version "1.14.4" + resolved "https://registry.npmjs.org/@openzeppelin/defender-sdk-base-client/-/defender-sdk-base-client-1.14.4.tgz" + integrity sha512-tOePVQLKpqfGQ1GMzHvSBNd2psPYd86LDNpvdl5gjD0Y2kW/zNh5qBXy29RraGtk/qc8zs9hzS5pAOh0vhGkGQ== dependencies: amazon-cognito-identity-js "^6.3.6" async-retry "^1.3.3" "@openzeppelin/defender-sdk-deploy-client@^1.10.0": - version "1.11.0" - resolved "https://registry.npmjs.org/@openzeppelin/defender-sdk-deploy-client/-/defender-sdk-deploy-client-1.11.0.tgz" - integrity sha512-ELYVihsrTOlH7Sy5C/+Yf64hV3ICeTY2OcczOWVQ/o6rHBWKSnHSZCE/oB1cfOpyg/gCrCLXozs4NyrS5z3GUw== + version "1.14.4" + resolved "https://registry.npmjs.org/@openzeppelin/defender-sdk-deploy-client/-/defender-sdk-deploy-client-1.14.4.tgz" + integrity sha512-+diSoz1zid37LMsY2RDxI+uAsYx9Eryg8Vz+yfvuyd56fXrzjQEln7BBtYQw+2zp9yvyAByOL5XSQdrQga9OBQ== dependencies: - "@openzeppelin/defender-sdk-base-client" "^1.11.0" - axios "^1.6.7" + "@openzeppelin/defender-sdk-base-client" "^1.14.4" + axios "^1.7.2" lodash "^4.17.21" "@openzeppelin/defender-sdk-network-client@^1.10.0": - version "1.11.0" - resolved "https://registry.npmjs.org/@openzeppelin/defender-sdk-network-client/-/defender-sdk-network-client-1.11.0.tgz" - integrity sha512-CPy1TA6RyFYtACbvXZJhJpsYW2u4yxTSNU8cVIw1lH/9iArXzfWuJ2p8Deidc0sJBbMeJYkv1AvqTBJNifjKMg== + version "1.14.4" + resolved "https://registry.npmjs.org/@openzeppelin/defender-sdk-network-client/-/defender-sdk-network-client-1.14.4.tgz" + integrity sha512-OS0H5b0vgYacJcwkvUFJUaRuyUaXhIRl916W5xLvGia5H6i/qn3dP8MZ7oLcPwKc8jB+ucRytO4H/AHsea0aVA== dependencies: - "@openzeppelin/defender-sdk-base-client" "^1.11.0" - axios "^1.6.7" + "@openzeppelin/defender-sdk-base-client" "^1.14.4" + axios "^1.7.2" lodash "^4.17.21" -"@openzeppelin/hardhat-upgrades@^3.0.3": - version "3.0.5" - resolved "https://registry.npmjs.org/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-3.0.5.tgz" - integrity sha512-7Klg1B6fH45+7Zxzr6d9mLqudrL9Uk6CUG5AeG5NckPfP4ZlQRo1squcQ8yJPwqDS8rQjfChiqKDelp4LTjyZQ== +"@openzeppelin/hardhat-upgrades@^3.2.1": + version "3.2.1" + resolved "https://registry.npmjs.org/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-3.2.1.tgz" + integrity sha512-Zy5M3QhkzwGdpzQmk+xbWdYOGJWjoTvwbBKYLhctu9B91DoprlhDRaZUwCtunwTdynkTDGdVfGr0kIkvycyKjw== dependencies: - "@openzeppelin/defender-admin-client" "^1.52.0" - "@openzeppelin/defender-base-client" "^1.52.0" "@openzeppelin/defender-sdk-base-client" "^1.10.0" "@openzeppelin/defender-sdk-deploy-client" "^1.10.0" "@openzeppelin/defender-sdk-network-client" "^1.10.0" - "@openzeppelin/upgrades-core" "^1.32.0" + "@openzeppelin/upgrades-core" "^1.35.0" chalk "^4.1.0" debug "^4.1.1" ethereumjs-util "^7.1.5" proper-lockfile "^4.1.1" - undici "^6.0.0" + undici "^6.11.1" -"@openzeppelin/upgrades-core@^1.32.0": - version "1.32.5" - resolved "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.32.5.tgz" - integrity sha512-R0wprsyJ4xWiRW05kaTfZZkRVpG2g0af3/hpjE7t2mX0Eb2n40MQLokTwqIk4LDzpp910JfLSpB0vBuZ6WNPog== +"@openzeppelin/upgrades-core@^1.35.0": + version "1.37.1" + resolved "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.37.1.tgz" + integrity sha512-dMQPDoMn1OUZXsCHT1thnAmkZ14v0FNlst5Ej8MIfujOv0k74kUok5XeuNF42fYewnNUYMkkz3PhXU1OIwSeyg== dependencies: + "@nomicfoundation/slang" "^0.17.0" cbor "^9.0.0" chalk "^4.1.0" compare-versions "^6.0.0" debug "^4.1.1" ethereumjs-util "^7.0.3" + minimatch "^9.0.5" minimist "^1.2.7" proper-lockfile "^4.1.1" solidity-ast "^0.4.51" @@ -994,10 +982,10 @@ resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz" integrity sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g== -"@smithy/types@^2.12.0": - version "2.12.0" - resolved "https://registry.npmjs.org/@smithy/types/-/types-2.12.0.tgz" - integrity sha512-QwYgloJ0sVNBeBuBs65cIkTbfzV/Q6ZNPCJ99EICFEdJYG50nGIY/uYXp+TbsdJReIuPr0a0kXmCvren3MbRRw== +"@smithy/types@^3.4.0": + version "3.4.2" + resolved "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz" + integrity sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w== dependencies: tslib "^2.6.2" @@ -1045,7 +1033,7 @@ resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== -"@typechain/ethers-v6@^0.5.0": +"@typechain/ethers-v6@^0.5.0", "@typechain/ethers-v6@^0.5.1": version "0.5.1" resolved "https://registry.npmjs.org/@typechain/ethers-v6/-/ethers-v6-0.5.1.tgz" integrity sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA== @@ -1053,7 +1041,7 @@ lodash "^4.17.15" ts-essentials "^7.0.1" -"@typechain/hardhat@^9.0.0": +"@typechain/hardhat@^9.0.0", "@typechain/hardhat@^9.1.0": version "9.1.0" resolved "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-9.1.0.tgz" integrity sha512-mtaUlzLlkqTlfPwB3FORdejqBskSnh+Jl8AIJGjXNAQfRQ4ofHADPl1+oU7Z3pAJzmZbUXII8MhOLQltcHgKnA== @@ -1135,11 +1123,6 @@ dependencies: undici-types "~5.26.4" -"@types/node@18.15.13": - version "18.15.13" - resolved "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz" - integrity sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q== - "@types/node@^10.0.3": version "10.17.60" resolved "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz" @@ -1150,6 +1133,11 @@ resolved "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz" integrity sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw== +"@types/node@18.15.13": + version "18.15.13" + resolved "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz" + integrity sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q== + "@types/pbkdf2@^3.0.0": version "3.1.2" resolved "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz" @@ -1194,7 +1182,7 @@ acorn-walk@^8.1.1: resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz" integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== -acorn@^8.4.1, acorn@^8.9.0: +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.4.1, acorn@^8.9.0: version "8.11.3" resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== @@ -1249,7 +1237,7 @@ ajv@^8.0.1: require-from-string "^2.0.2" uri-js "^4.2.2" -amazon-cognito-identity-js@^6.0.1, amazon-cognito-identity-js@^6.3.6: +amazon-cognito-identity-js@^6.3.6: version "6.3.12" resolved "https://registry.npmjs.org/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.3.12.tgz" integrity sha512-s7NKDZgx336cp+oDeUtB2ZzT8jWJp/v2LWuYl+LQtMEODe22RF1IJ4nRiDATp+rp1pTffCZcm44Quw4jx2bqNg== @@ -1272,16 +1260,16 @@ ansi-align@^3.0.0: dependencies: string-width "^4.1.0" -ansi-colors@4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== - ansi-colors@^4.1.1: version "4.1.3" resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + ansi-escapes@^4.3.0: version "4.3.2" resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" @@ -1306,7 +1294,14 @@ ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0, ansi-styles@^4.1.0: +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== @@ -1353,18 +1348,15 @@ array-back@^3.0.1, array-back@^3.1.0: resolved "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz" integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== -array-back@^4.0.1, array-back@^4.0.2: +array-back@^4.0.1: version "4.0.2" resolved "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz" integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== -array-buffer-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz" - integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== - dependencies: - call-bind "^1.0.5" - is-array-buffer "^3.0.4" +array-back@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz" + integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== array-union@^2.1.0: version "2.1.0" @@ -1376,32 +1368,6 @@ array-uniq@1.0.3: resolved "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz" integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== -array.prototype.findlast@^1.2.2: - version "1.2.5" - resolved "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz" - integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-shim-unscopables "^1.0.2" - -arraybuffer.prototype.slice@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz" - integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== - dependencies: - array-buffer-byte-length "^1.0.1" - call-bind "^1.0.5" - define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.2.1" - get-intrinsic "^1.2.3" - is-array-buffer "^3.0.4" - is-shared-array-buffer "^1.0.2" - asap@~2.0.6: version "2.0.6" resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" @@ -1444,17 +1410,10 @@ at-least-node@^1.0.0: resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -available-typed-arrays@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" - integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== - dependencies: - possible-typed-array-names "^1.0.0" - -axios@^1.4.0, axios@^1.5.1, axios@^1.6.7: - version "1.6.8" - resolved "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz" - integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ== +axios@^1.5.1, axios@^1.7.2: + version "1.7.7" + resolved "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz" + integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q== dependencies: follow-redirects "^1.15.6" form-data "^4.0.0" @@ -1492,12 +1451,12 @@ blakejs@^1.1.0: resolved "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz" integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== -bn.js@4.11.6: - version "4.11.6" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz" - integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== +bn.js@^4.11.0, bn.js@^4.11.8: + version "4.12.0" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9: +bn.js@^4.11.9: version "4.12.0" resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== @@ -1507,6 +1466,11 @@ bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== +bn.js@4.11.6: + version "4.11.6" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz" + integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== + boxen@^5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz" @@ -1536,12 +1500,12 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" brorand@^1.1.0: version "1.1.0" @@ -1623,7 +1587,7 @@ cacheable-request@^10.2.8: normalize-url "^8.0.0" responselike "^3.0.0" -call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: +call-bind@^1.0.7: version "1.0.7" resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz" integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== @@ -1670,7 +1634,7 @@ chai-as-promised@^7.1.1: dependencies: check-error "^1.0.2" -chai@^4.2.0: +chai@^4.2.0, "chai@>= 2.1.2 < 5": version "4.4.1" resolved "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz" integrity sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g== @@ -1692,7 +1656,23 @@ chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -1712,10 +1692,10 @@ check-error@^1.0.2, check-error@^1.0.3: dependencies: get-func-name "^2.0.2" -chokidar@3.5.3: - version "3.5.3" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== +chokidar@^3.4.0: + version "3.6.0" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" braces "~3.0.2" @@ -1727,10 +1707,10 @@ chokidar@3.5.3: optionalDependencies: fsevents "~2.3.2" -chokidar@^3.4.0: - version "3.6.0" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== +chokidar@3.5.3: + version "3.5.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: anymatch "~3.1.2" braces "~3.0.2" @@ -1798,17 +1778,17 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -colors@1.4.0, colors@^1.1.2: +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +colors@^1.1.2, colors@1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== @@ -1845,20 +1825,20 @@ command-line-usage@^6.1.0: table-layout "^1.0.2" typical "^5.2.0" -commander@3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz" - integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== - commander@^10.0.0: version "10.0.1" resolved "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz" integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== +commander@^8.1.0: + version "8.3.0" + resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + compare-versions@^6.0.0: - version "6.1.0" - resolved "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.0.tgz" - integrity sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg== + version "6.1.1" + resolved "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz" + integrity sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg== concat-map@0.0.1: version "0.0.1" @@ -1945,39 +1925,12 @@ cross-spawn@^7.0.2: resolved "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz" integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== -data-view-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz" - integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz" - integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz" - integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - death@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/death/-/death-1.1.0.tgz" integrity sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w== -debug@4, debug@4.3.4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2: +debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@4, debug@4.3.4: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -2018,7 +1971,7 @@ defer-to-connect@^2.0.1: resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz" integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== -define-data-property@^1.0.1, define-data-property@^1.1.4: +define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== @@ -2027,15 +1980,6 @@ define-data-property@^1.0.1, define-data-property@^1.1.4: es-errors "^1.3.0" gopd "^1.0.1" -define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" @@ -2046,16 +1990,16 @@ depd@2.0.0: resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -diff@5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz" - integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== - diff@^4.0.1: version "4.0.2" resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== +diff@5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + difflib@^0.2.4: version "0.2.4" resolved "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz" @@ -2082,7 +2026,7 @@ dotenv@^16.4.1: resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz" integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== -elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: +elliptic@^6.5.2, elliptic@^6.5.4, elliptic@6.5.4: version "6.5.4" resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== @@ -2120,58 +2064,6 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2: - version "1.23.2" - resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.2.tgz" - integrity sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w== - dependencies: - array-buffer-byte-length "^1.0.1" - arraybuffer.prototype.slice "^1.0.3" - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - data-view-buffer "^1.0.1" - data-view-byte-length "^1.0.1" - data-view-byte-offset "^1.0.0" - es-define-property "^1.0.0" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-set-tostringtag "^2.0.3" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.6" - get-intrinsic "^1.2.4" - get-symbol-description "^1.0.2" - globalthis "^1.0.3" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - has-proto "^1.0.3" - has-symbols "^1.0.3" - hasown "^2.0.2" - internal-slot "^1.0.7" - is-array-buffer "^3.0.4" - is-callable "^1.2.7" - is-data-view "^1.0.1" - is-negative-zero "^2.0.3" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.3" - is-string "^1.0.7" - is-typed-array "^1.1.13" - is-weakref "^1.0.2" - object-inspect "^1.13.1" - object-keys "^1.1.1" - object.assign "^4.1.5" - regexp.prototype.flags "^1.5.2" - safe-array-concat "^1.1.2" - safe-regex-test "^1.0.3" - string.prototype.trim "^1.2.9" - string.prototype.trimend "^1.0.8" - string.prototype.trimstart "^1.0.7" - typed-array-buffer "^1.0.2" - typed-array-byte-length "^1.0.1" - typed-array-byte-offset "^1.0.2" - typed-array-length "^1.0.5" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.15" - es-define-property@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz" @@ -2179,58 +2071,31 @@ es-define-property@^1.0.0: dependencies: get-intrinsic "^1.2.4" -es-errors@^1.2.1, es-errors@^1.3.0: +es-errors@^1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== -es-object-atoms@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz" - integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== - dependencies: - es-errors "^1.3.0" - -es-set-tostringtag@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz" - integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== - dependencies: - get-intrinsic "^1.2.4" - has-tostringtag "^1.0.2" - hasown "^2.0.1" - -es-shim-unscopables@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz" - integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== - dependencies: - hasown "^2.0.0" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - escalade@^3.1.1: version "3.1.2" resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz" integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== -escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + escodegen@1.8.x: version "1.8.1" resolved "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz" @@ -2261,7 +2126,7 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@^8.56.0: +"eslint@^6.0.0 || ^7.0.0 || >=8.0.0", eslint@^8.56.0, eslint@>=7.0.0: version "8.57.0" resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz" integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== @@ -2314,7 +2179,7 @@ espree@^9.6.0, espree@^9.6.1: acorn-jsx "^5.3.2" eslint-visitor-keys "^3.4.1" -esprima@2.7.x, esprima@^2.7.1: +esprima@^2.7.1, esprima@2.7.x: version "2.7.3" resolved "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz" integrity sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A== @@ -2379,7 +2244,7 @@ ethereum-bloom-filters@^1.0.6: dependencies: js-sha3 "^0.8.0" -ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: +ethereum-cryptography@^0.1.3, ethereum-cryptography@0.1.3: version "0.1.3" resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz" integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== @@ -2410,7 +2275,17 @@ ethereum-cryptography@^1.0.3: "@scure/bip32" "1.1.5" "@scure/bip39" "1.1.1" -ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2: +ethereum-cryptography@^2.0.0: + version "2.1.3" + resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.3.tgz" + integrity sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA== + dependencies: + "@noble/curves" "1.3.0" + "@noble/hashes" "1.3.3" + "@scure/bip32" "1.3.3" + "@scure/bip39" "1.2.2" + +ethereum-cryptography@^2.1.2: version "2.1.3" resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.3.tgz" integrity sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA== @@ -2428,7 +2303,20 @@ ethereumjs-abi@^0.6.8: bn.js "^4.11.8" ethereumjs-util "^6.0.0" -ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: +ethereumjs-util@^6.0.0: + version "6.2.1" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz" + integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== + dependencies: + "@types/bn.js" "^4.11.3" + bn.js "^4.11.0" + create-hash "^1.1.2" + elliptic "^6.5.2" + ethereum-cryptography "^0.1.3" + ethjs-util "0.1.6" + rlp "^2.2.3" + +ethereumjs-util@^6.2.1: version "6.2.1" resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz" integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== @@ -2488,10 +2376,10 @@ ethers@^5.7.2: "@ethersproject/web" "5.7.1" "@ethersproject/wordlists" "5.7.0" -ethers@^6.4.0: - version "6.11.1" - resolved "https://registry.npmjs.org/ethers/-/ethers-6.11.1.tgz" - integrity sha512-mxTAE6wqJQAbp5QAe/+o+rXOID7Nw91OZXvgpjDa1r4fAbq2Nu314oEZSbjoRLacuCzs7kUC3clEvkCQowffGg== +ethers@^6.1.0, ethers@^6.4.0, ethers@^6.6.0, ethers@6.x: + version "6.13.2" + resolved "https://registry.npmjs.org/ethers/-/ethers-6.13.2.tgz" + integrity sha512-9VkriTTed+/27BGuY1s0hf441kqwHJ1wtN2edksEtiRvXx+soxRX3iSXTfFqq2+YwrOqbDoTHjIhQnjJRlzKmg== dependencies: "@adraffy/ens-normalize" "1.10.1" "@noble/curves" "1.2.0" @@ -2499,7 +2387,7 @@ ethers@^6.4.0: "@types/node" "18.15.13" aes-js "4.0.0-beta.5" tslib "2.4.0" - ws "8.5.0" + ws "8.17.1" ethjs-unit@0.1.6: version "0.1.6" @@ -2509,7 +2397,7 @@ ethjs-unit@0.1.6: bn.js "4.11.6" number-to-bn "1.7.0" -ethjs-util@0.1.6, ethjs-util@^0.1.6: +ethjs-util@^0.1.6, ethjs-util@0.1.6: version "0.1.6" resolved "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz" integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== @@ -2575,10 +2463,10 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" @@ -2589,14 +2477,6 @@ find-replace@^3.0.0: dependencies: array-back "^3.0.1" -find-up@5.0.0, find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - find-up@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz" @@ -2604,6 +2484,14 @@ find-up@^2.1.0: dependencies: locate-path "^2.0.0" +find-up@^5.0.0, find-up@5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + flat-cache@^3.0.4: version "3.2.0" resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz" @@ -2628,13 +2516,6 @@ follow-redirects@^1.12.1, follow-redirects@^1.15.6: resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz" integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - form-data-encoder@^2.1.2: version "2.1.4" resolved "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz" @@ -2658,23 +2539,21 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" -fp-ts@1.19.3, fp-ts@^1.0.0: +fp-ts@^1.0.0, fp-ts@1.19.3: version "1.19.3" resolved "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz" integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg== -fs-extra@^0.30.0: - version "0.30.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz" - integrity sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA== +fs-extra@^7.0.0: + version "7.0.1" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== dependencies: graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - path-is-absolute "^1.0.0" - rimraf "^2.2.8" + jsonfile "^4.0.0" + universalify "^0.1.0" -fs-extra@^7.0.0, fs-extra@^7.0.1: +fs-extra@^7.0.1: version "7.0.1" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz" integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== @@ -2722,21 +2601,6 @@ function-bind@^1.1.2: resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -function.prototype.name@^1.1.6: - version "1.1.6" - resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz" - integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - functions-have-names "^1.2.3" - -functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" @@ -2747,7 +2611,7 @@ get-func-name@^2.0.1, get-func-name@^2.0.2: resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz" integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== -get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: +get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz" integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== @@ -2768,15 +2632,6 @@ get-stream@^6.0.1: resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -get-symbol-description@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz" - integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== - dependencies: - call-bind "^1.0.5" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - ghost-testrpc@^0.0.2: version "0.0.2" resolved "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz" @@ -2785,7 +2640,7 @@ ghost-testrpc@^0.0.2: chalk "^2.4.2" node-emoji "^1.10.0" -glob-parent@^5.1.2, glob-parent@~5.1.2: +glob-parent@^5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -2799,19 +2654,25 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob@7.1.7: - version "7.1.7" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@^5.0.15: + version "5.0.15" + resolved "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz" + integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== dependencies: - fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "2 || 3" once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.2.0, glob@^7.0.0, glob@^7.1.3: +glob@^7.0.0, glob@^7.1.3, glob@7.2.0: version "7.2.0" resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== @@ -2823,7 +2684,7 @@ glob@7.2.0, glob@^7.0.0, glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -glob@8.1.0, glob@^8.0.3: +glob@^8.0.3: version "8.1.0" resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== @@ -2834,17 +2695,29 @@ glob@8.1.0, glob@^8.0.3: minimatch "^5.0.1" once "^1.3.0" -glob@^5.0.15: - version "5.0.15" - resolved "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz" - integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== +glob@7.1.7: + version "7.1.7" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== dependencies: + fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "2 || 3" + minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" +glob@8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + global-modules@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz" @@ -2868,13 +2741,6 @@ globals@^13.19.0: dependencies: type-fest "^0.20.2" -globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== - dependencies: - define-properties "^1.1.3" - globby@^10.0.1: version "10.0.2" resolved "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz" @@ -2913,16 +2779,16 @@ got@^12.1.0: p-cancelable "^3.0.0" responselike "^3.0.0" +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: + version "4.2.11" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + graceful-fs@4.2.10: version "4.2.10" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4: - version "4.2.11" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - graphemer@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" @@ -2949,14 +2815,14 @@ hardhat-gas-reporter@^1.0.8: eth-gas-reporter "^0.2.25" sha1 "^1.1.1" -hardhat@^2.19.5: - version "2.22.2" - resolved "https://registry.npmjs.org/hardhat/-/hardhat-2.22.2.tgz" - integrity sha512-0xZ7MdCZ5sJem4MrvpQWLR3R3zGDoHw5lsR+pBFimqwagimIOn3bWuZv69KA+veXClwI1s/zpqgwPwiFrd4Dxw== +hardhat@^2.0.0, hardhat@^2.0.2, hardhat@^2.0.4, hardhat@^2.11.0, hardhat@^2.19.5, hardhat@^2.9.4, hardhat@^2.9.5, hardhat@^2.9.9: + version "2.22.10" + resolved "https://registry.npmjs.org/hardhat/-/hardhat-2.22.10.tgz" + integrity sha512-JRUDdiystjniAvBGFmJRsiIZSOP2/6s++8xRDe3TzLeQXlWWHsXBrd9wd3JWFyKXvgMqMeLL5Sz/oNxXKYw9vg== dependencies: "@ethersproject/abi" "^5.1.2" "@metamask/eth-sig-util" "^4.0.0" - "@nomicfoundation/edr" "^0.3.1" + "@nomicfoundation/edr" "^0.5.2" "@nomicfoundation/ethereumjs-common" "4.0.4" "@nomicfoundation/ethereumjs-tx" "5.0.4" "@nomicfoundation/ethereumjs-util" "9.0.4" @@ -2990,7 +2856,7 @@ hardhat@^2.19.5: raw-body "^2.4.1" resolve "1.17.0" semver "^6.3.0" - solc "0.7.3" + solc "0.8.26" source-map-support "^0.5.13" stacktrace-parser "^0.1.10" tsort "0.0.1" @@ -2998,11 +2864,6 @@ hardhat@^2.19.5: uuid "^8.3.2" ws "^7.4.6" -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - has-flag@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" @@ -3018,30 +2879,23 @@ has-flag@^4.0.0: resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: +has-property-descriptors@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: es-define-property "^1.0.0" -has-proto@^1.0.1, has-proto@^1.0.3: +has-proto@^1.0.1: version "1.0.3" resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz" integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== -has-symbols@^1.0.2, has-symbols@^1.0.3: +has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - hash-base@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz" @@ -3051,7 +2905,7 @@ hash-base@^3.0.0: readable-stream "^3.6.0" safe-buffer "^5.2.0" -hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: +hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7, hash.js@1.1.7: version "1.1.7" resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== @@ -3059,7 +2913,7 @@ hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: inherits "^2.0.3" minimalistic-assert "^1.0.1" -hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: +hasown@^2.0.0: version "2.0.2" resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== @@ -3182,7 +3036,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: +inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@2, inherits@2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -3192,15 +3046,6 @@ ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -internal-slot@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz" - integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== - dependencies: - es-errors "^1.3.0" - hasown "^2.0.0" - side-channel "^1.0.4" - interpret@^1.0.0: version "1.4.0" resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" @@ -3213,26 +3058,11 @@ io-ts@1.10.4: dependencies: fp-ts "^1.0.0" -is-array-buffer@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz" - integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" @@ -3240,33 +3070,6 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-data-view@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz" - integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== - dependencies: - is-typed-array "^1.1.13" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" @@ -3294,18 +3097,6 @@ is-hex-prefixed@1.0.0: resolved "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz" integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== -is-negative-zero@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz" - integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - is-number@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" @@ -3321,64 +3112,16 @@ is-plain-obj@^2.1.0: resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz" - integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== - dependencies: - call-bind "^1.0.7" - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.13: - version "1.1.13" - resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz" - integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== - dependencies: - which-typed-array "^1.1.14" - is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - isexe@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" @@ -3397,7 +3140,7 @@ js-cookie@^2.2.1: resolved "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz" integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== -js-sha3@0.8.0, js-sha3@^0.8.0: +js-sha3@^0.8.0, js-sha3@0.8.0: version "0.8.0" resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== @@ -3407,6 +3150,13 @@ js-tokens@^4.0.0: resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-yaml@^4.1.0, js-yaml@4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + js-yaml@3.x: version "3.14.1" resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" @@ -3415,13 +3165,6 @@ js-yaml@3.x: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@4.1.0, js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - json-buffer@3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" @@ -3447,13 +3190,6 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -jsonfile@^2.1.0: - version "2.4.0" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz" - integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw== - optionalDependencies: - graceful-fs "^4.1.6" - jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" @@ -3496,13 +3232,6 @@ kind-of@^6.0.2: resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -klaw@^1.0.0: - version "1.3.1" - resolved "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz" - integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== - optionalDependencies: - graceful-fs "^4.1.9" - latest-version@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz" @@ -3571,7 +3300,7 @@ lodash.truncate@^4.4.2: resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz" integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21: +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -3596,6 +3325,11 @@ lowercase-keys@^3.0.0: resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz" integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== +lru_map@^0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz" + integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== + lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" @@ -3603,11 +3337,6 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lru_map@^0.3.3: - version "0.3.3" - resolved "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz" - integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== - make-error@^1.1.1: version "1.3.6" resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" @@ -3643,11 +3372,11 @@ micro-ftch@^0.3.1: integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg== micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + version "4.0.8" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: - braces "^3.0.2" + braces "^3.0.3" picomatch "^2.3.1" mime-db@1.52.0: @@ -3682,25 +3411,37 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== -"minimatch@2 || 3", minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.2: +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.2, "minimatch@2 || 3": version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimatch@5.0.1, minimatch@^5.0.1: +minimatch@^5.0.1, minimatch@5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz" integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== dependencies: brace-expansion "^2.0.1" +minimatch@^9.0.5: + version "9.0.5" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.7: version "1.2.8" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + mkdirp@0.5.x: version "0.5.6" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" @@ -3708,11 +3449,6 @@ mkdirp@0.5.x: dependencies: minimist "^1.2.6" -mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - mnemonist@^0.38.0: version "0.38.5" resolved "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz" @@ -3778,7 +3514,7 @@ node-emoji@^1.10.0: dependencies: lodash "^4.17.21" -node-fetch@^2.6.0, node-fetch@^2.6.1: +node-fetch@^2.6.1: version "2.7.0" resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== @@ -3830,27 +3566,12 @@ object-inspect@^1.13.1: resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz" integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.5: - version "4.1.5" - resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz" - integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== - dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - has-symbols "^1.0.3" - object-keys "^1.1.1" - obliterator@^2.0.0: version "2.0.4" resolved "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz" integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== -once@1.x, once@^1.3.0: +once@^1.3.0, once@1.x: version "1.4.0" resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -4034,11 +3755,6 @@ pluralize@^8.0.0: resolved "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== -possible-typed-array-names@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz" - integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== - prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" @@ -4058,12 +3774,17 @@ prettier-plugin-solidity@^1.3.1: semver "^7.5.4" solidity-comments-extractor "^0.0.8" -prettier@^2.3.1, prettier@^2.8.3: +prettier@^2.3.1: version "2.8.8" resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== -prettier@^3.2.5: +prettier@^2.8.3: + version "2.8.8" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + +prettier@^3.2.5, prettier@>=2.3.0: version "3.2.5" resolved "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz" integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== @@ -4196,16 +3917,6 @@ reduce-flatten@^2.0.0: resolved "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz" integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== -regexp.prototype.flags@^1.5.2: - version "1.5.2" - resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz" - integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== - dependencies: - call-bind "^1.0.6" - define-properties "^1.2.1" - es-errors "^1.3.0" - set-function-name "^2.0.1" - registry-auth-token@^5.0.1: version "5.0.2" resolved "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz" @@ -4239,7 +3950,7 @@ require-directory@^2.1.1: resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== -require-from-string@^2.0.0, require-from-string@^2.0.2: +require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== @@ -4259,18 +3970,18 @@ resolve-from@^4.0.0: resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve@1.1.x: - version "1.1.7" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" - integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== - -resolve@1.17.0, resolve@^1.1.6: +resolve@^1.1.6, resolve@1.17.0: version "1.17.0" resolved "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz" integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== dependencies: path-parse "^1.0.6" +resolve@1.1.x: + version "1.1.7" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" + integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== + responselike@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz" @@ -4278,28 +3989,21 @@ responselike@^3.0.0: dependencies: lowercase-keys "^3.0.0" -retry@0.13.1: - version "0.13.1" - resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - retry@^0.12.0: version "0.12.0" resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz" integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== +retry@0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + reusify@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@^2.2.8: - version "2.7.1" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - rimraf@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" @@ -4329,16 +4033,6 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -safe-array-concat@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz" - integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== - dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" - has-symbols "^1.0.3" - isarray "^2.0.5" - safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" @@ -4349,15 +4043,6 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-regex-test@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz" - integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-regex "^1.1.4" - "safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" @@ -4383,7 +4068,7 @@ sc-istanbul@^0.4.5: which "^1.1.1" wordwrap "^1.0.0" -scrypt-js@3.0.1, scrypt-js@^3.0.0: +scrypt-js@^3.0.0, scrypt-js@3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== @@ -4407,7 +4092,28 @@ semver@^6.3.0: resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.4, semver@^7.3.7, semver@^7.5.2, semver@^7.5.4: +semver@^7.3.4: + version "7.6.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + +semver@^7.3.7: + version "7.6.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + +semver@^7.5.2: + version "7.6.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + +semver@^7.5.4: version "7.6.0" resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz" integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== @@ -4433,16 +4139,6 @@ set-function-length@^1.2.1: gopd "^1.0.1" has-property-descriptors "^1.0.2" -set-function-name@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz" - integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.2" - setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" @@ -4490,7 +4186,7 @@ shelljs@^0.8.3: interpret "^1.0.0" rechoir "^0.6.2" -side-channel@^1.0.4, side-channel@^1.0.6: +side-channel@^1.0.6: version "1.0.6" resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz" integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== @@ -4519,18 +4215,16 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" -solc@0.7.3: - version "0.7.3" - resolved "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz" - integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== +solc@0.8.26: + version "0.8.26" + resolved "https://registry.npmjs.org/solc/-/solc-0.8.26.tgz" + integrity sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g== dependencies: command-exists "^1.2.8" - commander "3.0.2" + commander "^8.1.0" follow-redirects "^1.12.1" - fs-extra "^0.30.0" js-sha3 "0.8.0" memorystream "^0.3.1" - require-from-string "^2.0.0" semver "^5.5.0" tmp "0.0.33" @@ -4561,21 +4255,19 @@ solhint@^4.1.1: prettier "^2.8.3" solidity-ast@^0.4.51: - version "0.4.56" - resolved "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.56.tgz" - integrity sha512-HgmsA/Gfklm/M8GFbCX/J1qkVH0spXHgALCNZ8fA8x5X+MFdn/8CP2gr5OVyXjXw6RZTPC/Sxl2RUDQOXyNMeA== - dependencies: - array.prototype.findlast "^1.2.2" + version "0.4.59" + resolved "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.59.tgz" + integrity sha512-I+CX0wrYUN9jDfYtcgWSe+OAowaXy8/1YQy7NS4ni5IBDmIYBq7ZzaP/7QqouLjzZapmQtvGLqCaYgoUWqBo5g== solidity-comments-extractor@^0.0.8: version "0.0.8" resolved "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.8.tgz" integrity sha512-htM7Vn6LhHreR+EglVMd2s+sZhcXAirB1Zlyrv5zBuTxieCvjfnRpd7iZk75m/u6NOlEyQ94C6TWbBn2cY7w8g== -solidity-coverage@^0.8.0: - version "0.8.11" - resolved "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.11.tgz" - integrity sha512-yy0Yk+olovBbXn0Me8BWULmmv7A69ZKkP5aTOJGOO8u61Tu2zS989erfjtFlUjDnfWtxRAVkd8BsQD704yLWHw== +solidity-coverage@^0.8.0, solidity-coverage@^0.8.1: + version "0.8.13" + resolved "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.13.tgz" + integrity sha512-RiBoI+kF94V3Rv0+iwOj3HQVSqNzA9qm/qDP1ZDXK5IX0Cvho1qiz8hAXTsAo6KOIUeP73jfscq0KlLqVxzGWA== dependencies: "@ethersproject/abi" "^5.0.9" "@solidity-parser/parser" "^0.18.0" @@ -4587,7 +4279,7 @@ solidity-coverage@^0.8.0: global-modules "^2.0.0" globby "^10.0.1" jsonschema "^1.2.4" - lodash "^4.17.15" + lodash "^4.17.21" mocha "^10.2.0" node-emoji "^1.10.0" pify "^4.0.1" @@ -4605,7 +4297,12 @@ source-map-support@^0.5.13: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0, source-map@^0.6.1: +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -4634,6 +4331,20 @@ statuses@2.0.1: resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + string-format@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz" @@ -4656,48 +4367,6 @@ string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2 is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string.prototype.trim@^1.2.9: - version "1.2.9" - resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz" - integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.0" - es-object-atoms "^1.0.0" - -string.prototype.trimend@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz" - integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string.prototype.trimstart@^1.0.7: - version "1.0.8" - resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz" - integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" @@ -4719,7 +4388,7 @@ strip-hex-prefix@1.0.0: dependencies: is-hex-prefixed "1.0.0" -strip-json-comments@3.1.1, strip-json-comments@^3.1.1: +strip-json-comments@^3.1.1, strip-json-comments@3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -4729,13 +4398,6 @@ strip-json-comments@~2.0.1: resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -supports-color@8.1.1: - version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - supports-color@^3.1.0: version "3.2.3" resolved "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" @@ -4757,6 +4419,13 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + sync-request@^6.0.0: version "6.1.0" resolved "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz" @@ -4855,7 +4524,7 @@ ts-essentials@^7.0.1: resolved "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz" integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ== -ts-node@>=8.0.0: +ts-node@*, ts-node@>=8.0.0: version "10.9.2" resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz" integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== @@ -4874,20 +4543,25 @@ ts-node@>=8.0.0: v8-compile-cache-lib "^3.0.1" yn "3.1.1" -tslib@2.4.0: - version "2.4.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== - tslib@^1.11.1, tslib@^1.9.3: version "1.14.1" resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.3.1, tslib@^2.6.2: - version "2.6.2" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +tslib@^2.3.1: + version "2.7.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz" + integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== + +tslib@^2.6.2: + version "2.7.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz" + integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== + +tslib@2.4.0: + version "2.4.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== tsort@0.0.1: version "0.0.1" @@ -4938,7 +4612,7 @@ type-fest@^0.7.1: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== -typechain@^8.3.0: +typechain@^8.3.0, typechain@^8.3.2: version "8.3.2" resolved "https://registry.npmjs.org/typechain/-/typechain-8.3.2.tgz" integrity sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q== @@ -4954,56 +4628,12 @@ typechain@^8.3.0: ts-command-line-args "^2.2.0" ts-essentials "^7.0.1" -typed-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz" - integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-typed-array "^1.1.13" - -typed-array-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz" - integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-byte-offset@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz" - integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-length@^1.0.5: - version "1.0.6" - resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz" - integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - possible-typed-array-names "^1.0.0" - typedarray@^0.0.6: version "0.0.6" resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typescript@>=4.5.0: +typescript@*, typescript@^5.4.3, typescript@>=2.7, typescript@>=3.7.0, typescript@>=4.3.0, typescript@>=4.5.0, typescript@>=4.7.0, typescript@>=4.9.5: version "5.4.3" resolved "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz" integrity sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg== @@ -5023,32 +4653,22 @@ uglify-js@^3.1.4: resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz" integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - undici-types@~5.26.4: version "5.26.5" resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== undici@^5.14.0: - version "5.28.3" - resolved "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz" - integrity sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA== + version "5.28.4" + resolved "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz" + integrity sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g== dependencies: "@fastify/busboy" "^2.0.0" -undici@^6.0.0: - version "6.10.1" - resolved "https://registry.npmjs.org/undici/-/undici-6.10.1.tgz" - integrity sha512-kSzmWrOx3XBKTgPm4Tal8Hyl3yf+hzlA00SAf4goxv8LZYafKmS6gJD/7Fe5HH/DMNiFTRXvkwhLo7mUn5fuQQ== +undici@^6.11.1: + version "6.19.8" + resolved "https://registry.npmjs.org/undici/-/undici-6.19.8.tgz" + integrity sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g== unfetch@^4.2.0: version "4.2.0" @@ -5124,29 +4744,14 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-typed-array@^1.1.14, which-typed-array@^1.1.15: - version "1.1.15" - resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz" - integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== +which@^1.1.1: + version "1.3.1" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.2" + isexe "^2.0.0" -which@^1.1.1, which@^1.3.1: +which@^1.3.1: version "1.3.1" resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -5204,20 +4809,20 @@ wrappy@1: resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +ws@^7.4.6: + version "7.5.9" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + ws@7.4.6: version "7.4.6" resolved "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== -ws@8.5.0: - version "8.5.0" - resolved "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz" - integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== - -ws@^7.4.6: - version "7.5.9" - resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== +ws@8.17.1: + version "8.17.1" + resolved "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz" + integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== y18n@^5.0.5: version "5.0.8" @@ -5229,7 +4834,7 @@ yallist@^4.0.0: resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yargs-parser@20.2.4, yargs-parser@^20.2.2: +yargs-parser@^20.2.2, yargs-parser@20.2.4: version "20.2.4" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz" integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== From 1856138bffe9fa977a7a4ccd4eaadd6ea72f02e8 Mon Sep 17 00:00:00 2001 From: zhi Date: Tue, 17 Sep 2024 15:52:17 +0800 Subject: [PATCH 02/22] add events and address some TODOs --- smartcontracts/contracts/W3bstreamDAO.sol | 2 +- smartcontracts/contracts/W3bstreamMinter.sol | 101 +++++++++++++++++-- smartcontracts/test/W3bstreamMinter.ts | 17 ++-- 3 files changed, 99 insertions(+), 21 deletions(-) diff --git a/smartcontracts/contracts/W3bstreamDAO.sol b/smartcontracts/contracts/W3bstreamDAO.sol index 85daa680..69b37e30 100644 --- a/smartcontracts/contracts/W3bstreamDAO.sol +++ b/smartcontracts/contracts/W3bstreamDAO.sol @@ -14,7 +14,7 @@ contract W3bstreamDAO is OwnableUpgradeable { function initialize(bytes32 genesis) public initializer { __Ownable_init(); - _mint(genesis, block.timestamp); + _mint(genesis, block.number); } function mint(bytes32 hash, uint256 timestamp) public onlyOwner { diff --git a/smartcontracts/contracts/W3bstreamMinter.sol b/smartcontracts/contracts/W3bstreamMinter.sol index 551f7974..52f543c2 100644 --- a/smartcontracts/contracts/W3bstreamMinter.sol +++ b/smartcontracts/contracts/W3bstreamMinter.sol @@ -33,27 +33,49 @@ struct TaskAssignment { } contract W3bstreamMinter is OwnableUpgradeable { + event TaskAllowanceSet(uint256 allowance); + event TargetDurationSet(uint256 duration); + event DifficultySet(bytes8 difficulty); + IDAO public dao; ITaskManager public tm; + uint256 public taskAllowance; + uint256 public targetDuration; + bytes4 public adhocDifficulty; + bytes4 public currentDifficulty; + + bytes4 public constant UPPER_BOUND = 0xffffffff; + bytes4 public constant LOWER_BOUND = 0x00000001; + + uint256[10] private durations; + uint256 private durationSum; + uint256 private durationNum; + uint256 private durationIndex; function initialize(IDAO _dao, ITaskManager _tm) public initializer { __Ownable_init(); dao = _dao; tm = _tm; + _setTaskAllowance(720); + _setTargetDuration(12); + _setAdhocDifficulty(0x0fffffff); } function mint( BlockInfo calldata blockinfo, - uint256 timestamp, Sequencer calldata coinbase, TaskAssignment[] calldata assignments ) public { require(coinbase.operator == msg.sender, "invalid operator"); - (, bytes32 tip, ) = dao.tip(); - require(blockinfo.prevhash == tip, "invalid prevhash"); - // TODO: timestamp is not larger than block.timestamp - require(timestamp > block.timestamp - 1 minutes, "invalid timestamp"); - require(blockinfo.merkleRoot == keccak256(abi.encodePacked(timestamp, coinbase.addr, coinbase.operator, coinbase.beneficiary)), "invalid merkle root"); + if (adhocDifficulty != 0) { + require(blockinfo.difficulty == adhocDifficulty, "invalid difficulty"); + } else { + require(blockinfo.difficulty == currentDifficulty, "invalid difficulty"); + } + (, bytes32 tiphash, uint256 tipTimestamp) = dao.tip(); + require(tipTimestamp != block.number); + require(blockinfo.prevhash == tiphash, "invalid prevhash"); + require(blockinfo.merkleRoot == keccak256(abi.encodePacked(coinbase.addr, coinbase.operator, coinbase.beneficiary)), "invalid merkle root"); // TODO: review difficulty usage require(sha256(abi.encodePacked(blockinfo.meta, blockinfo.prevhash, blockinfo.merkleRoot, blockinfo.difficulty, blockinfo.nonce)) < blockinfo.difficulty, "invalid proof of work"); bytes32 hash = keccak256(abi.encode( @@ -62,18 +84,77 @@ contract W3bstreamMinter is OwnableUpgradeable { blockinfo.merkleRoot, blockinfo.difficulty, blockinfo.nonce, - timestamp, coinbase.addr, coinbase.operator, coinbase.beneficiary, assignments )); - uint256 deadline = block.timestamp + 1 hours; + uint256 deadline = block.number + taskAllowance; for (uint i = 0; i < assignments.length; i++) { tm.assign(assignments[i].projectId, assignments[i].taskId, assignments[i].prover, deadline); } - // TODO: adjust difficulty - dao.mint(hash, timestamp); + _updateDifficulty(tipTimestamp); + dao.mint(hash, block.number); // TODO: distribute block reward } + + function setTaskAllowance(uint256 allowance) public onlyOwner { + _setTaskAllowance(allowance); + } + + function _setTaskAllowance(uint256 allowance) internal { + taskAllowance = allowance; + emit TaskAllowanceSet(allowance); + } + + function setTargetDuration(uint256 duration) public onlyOwner { + _setTargetDuration(duration); + } + + function _setTargetDuration(uint256 duration) internal { + targetDuration = duration; + emit TargetDurationSet(duration); + } + + function setAdhocDifficulty(bytes4 difficulty) public onlyOwner { + _setAdhocDifficulty(difficulty); + } + + function _setAdhocDifficulty(bytes4 difficulty) internal { + if (difficulty != 0) { + _setDifficulty(difficulty); + } + adhocDifficulty = difficulty; + } + + function _updateDifficulty(uint256 tipTimestamp) internal { + uint256 duration = block.number - tipTimestamp; + durationSum += duration - durations[durationIndex]; + durations[durationIndex] = duration; + durationIndex = (durationIndex + 1) % durations.length; + if (durationNum < durations.length) { + durationNum++; + } else { + uint32 curr = uint32(currentDifficulty); + uint40 difficulty = curr; + if (targetDuration * durationNum < durationSum) { + difficulty /= 2; + } else if (targetDuration * durationNum > durationSum) { + difficulty *= 2; + } + if (difficulty < uint32(LOWER_BOUND)) { + difficulty = uint32(LOWER_BOUND); + } else if (difficulty > uint32(UPPER_BOUND)) { + difficulty = uint32(UPPER_BOUND); + } + if (adhocDifficulty == 0 && difficulty != curr) { + _setDifficulty(bytes4(uint32(difficulty))); + } + } + } + + function _setDifficulty(bytes4 difficulty) internal { + currentDifficulty = difficulty; + emit DifficultySet(difficulty); + } } diff --git a/smartcontracts/test/W3bstreamMinter.ts b/smartcontracts/test/W3bstreamMinter.ts index ffa4f8f3..93b5dace 100644 --- a/smartcontracts/test/W3bstreamMinter.ts +++ b/smartcontracts/test/W3bstreamMinter.ts @@ -19,36 +19,35 @@ describe('W3bstream Minter', function () { }); it('mint block', async function () { const tip = await ethers.provider.getBlock('latest'); - const timestamp = tip.timestamp; const [owner, sequencer, prover] = await ethers.getSigners(); const coinbase = { addr: sequencer.address, operator: sequencer.address, beneficiary: sequencer.address, }; - const merkleRoot = ethers.solidityPackedKeccak256(["uint256", "address", "address", "address"], [timestamp, coinbase.addr, coinbase.operator, coinbase.beneficiary]); + await minter.connect(owner).setAdhocDifficulty("0xffffffff"); + let currentDifficulty = await minter.currentDifficulty(); + const merkleRoot = ethers.solidityPackedKeccak256(["address", "address", "address"], [coinbase.addr, coinbase.operator, coinbase.beneficiary]); const blockinfo = { meta: "0x00000000", prevhash: genesis, merkleRoot: merkleRoot, - difficulty: "0xffffffff", + difficulty: currentDifficulty, nonce: "0x0000000000000000", }; let tipinfo = await dao.tip(); expect(tipinfo[0]).to.equal(0); expect(tipinfo[1]).to.equal(genesis); + console.log({tipinfo, blockinfo, currentDifficulty}) await minter.connect(sequencer).mint( blockinfo, - timestamp, coinbase, [], ); tipinfo = await dao.tip(); - // TODO: adjust timestamp & merkle root expect(tipinfo[0]).to.equal(1); await expect(minter.connect(sequencer).mint( blockinfo, - timestamp, coinbase, [], )).to.be.revertedWith("invalid prevhash"); @@ -56,14 +55,12 @@ describe('W3bstream Minter', function () { blockinfo.difficulty = "0x00000001"; await expect(minter.connect(sequencer).mint( blockinfo, - timestamp, coinbase, [], - )).to.be.revertedWith("invalid proof of work"); - blockinfo.difficulty = "0xffffffff"; + )).to.be.revertedWith("invalid difficulty"); + blockinfo.difficulty = currentDifficulty; await minter.connect(sequencer).mint( blockinfo, - timestamp, coinbase, [], ); From d69b36290d6d2cc9ce058e31c4ca4881cf8f0674 Mon Sep 17 00:00:00 2001 From: zhi Date: Tue, 17 Sep 2024 16:40:57 +0800 Subject: [PATCH 03/22] assign tasks in batch --- smartcontracts/contracts/W3bstreamMinter.sol | 7 +-- .../contracts/W3bstreamTaskManager.sol | 52 +++++++++++++------ 2 files changed, 39 insertions(+), 20 deletions(-) diff --git a/smartcontracts/contracts/W3bstreamMinter.sol b/smartcontracts/contracts/W3bstreamMinter.sol index 52f543c2..d55fe0a4 100644 --- a/smartcontracts/contracts/W3bstreamMinter.sol +++ b/smartcontracts/contracts/W3bstreamMinter.sol @@ -9,7 +9,7 @@ interface IDAO { } interface ITaskManager { - function assign(uint64 projectId, uint64 taskId, address prover, uint256 deadline) external; + function assign(TaskAssignment[] calldata assignments, uint256 deadline) external; } struct BlockInfo { @@ -89,10 +89,7 @@ contract W3bstreamMinter is OwnableUpgradeable { coinbase.beneficiary, assignments )); - uint256 deadline = block.number + taskAllowance; - for (uint i = 0; i < assignments.length; i++) { - tm.assign(assignments[i].projectId, assignments[i].taskId, assignments[i].prover, deadline); - } + tm.assign(assignments, block.number + taskAllowance); _updateDifficulty(tipTimestamp); dao.mint(hash, block.number); // TODO: distribute block reward diff --git a/smartcontracts/contracts/W3bstreamTaskManager.sol b/smartcontracts/contracts/W3bstreamTaskManager.sol index d171d782..2a9c55c2 100644 --- a/smartcontracts/contracts/W3bstreamTaskManager.sol +++ b/smartcontracts/contracts/W3bstreamTaskManager.sol @@ -3,18 +3,24 @@ pragma solidity ^0.8.19; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; -struct TaskAssignment { +struct Record { address prover; uint256 deadline; bool settled; } +struct TaskAssignment { + uint64 projectId; + uint64 taskId; + address prover; +} + contract W3bstreamTaskManager is OwnableUpgradeable { event TaskAssigned(uint64 indexed projectId, uint64 indexed taskId, address prover, uint256 deadline); event TaskSettled(uint64 indexed projectId, uint64 indexed taskId, address prover); event OperatorAdded(address operator); event OperatorRemoved(address operator); - mapping(uint64 => mapping(uint64 => TaskAssignment)) public assignments; + mapping(uint64 => mapping(uint64 => Record)) public records; mapping(address => bool) public operators; modifier onlyOperator() { @@ -39,30 +45,46 @@ contract W3bstreamTaskManager is OwnableUpgradeable { emit OperatorRemoved(operator); } - function assign( + function _assign( uint64 projectId, uint64 taskId, address prover, uint256 deadline - ) public onlyOperator{ + ) internal { require(prover != address(0), "invalid prover"); - TaskAssignment storage assignment = assignments[projectId][taskId]; - require(assignment.settled == false, "task already settled"); - if (assignment.prover != address(0)) { - require(assignment.deadline < block.timestamp, "task already assigned"); + Record storage record = records[projectId][taskId]; + require(record.settled == false, "task already settled"); + if (record.prover != address(0)) { + require(record.deadline < block.timestamp, "task already assigned"); } - assignment.prover = prover; - assignment.deadline = deadline; + record.prover = prover; + record.deadline = deadline; emit TaskAssigned(projectId, taskId, prover, deadline); } + function assign( + TaskAssignment calldata assignment, + uint256 deadline + ) public onlyOperator { + _assign(assignment.projectId, assignment.taskId, assignment.prover, deadline); + } + + function assign( + TaskAssignment[] calldata taskAssignments, + uint256 deadline + ) public onlyOperator { + for (uint256 i = 0; i < taskAssignments.length; i++) { + _assign(taskAssignments[i].projectId, taskAssignments[i].taskId, taskAssignments[i].prover, deadline); + } + } + function settle(uint64 projectId, uint64 taskId, address prover) public onlyOperator { require(prover != address(0), "invalid prover"); - TaskAssignment storage assignment = assignments[projectId][taskId]; - require(assignment.prover == prover, "invalid prover"); - require(assignment.deadline >= block.timestamp, "task assignement expired"); - require(assignment.settled == false, "task already settled"); - assignment.settled = true; + Record storage record = records[projectId][taskId]; + require(record.prover == prover, "invalid prover"); + require(record.deadline >= block.timestamp, "task assignement expired"); + require(record.settled == false, "task already settled"); + record.settled = true; emit TaskSettled(projectId, taskId, prover); // TODO: distribute task reward } From 8414755e0e45020b244a5006550b4ebb42ae5021 Mon Sep 17 00:00:00 2001 From: zhi Date: Tue, 17 Sep 2024 17:02:23 +0800 Subject: [PATCH 04/22] fix difficulty update bug --- smartcontracts/contracts/W3bstreamMinter.sol | 40 +++++++++++--------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/smartcontracts/contracts/W3bstreamMinter.sol b/smartcontracts/contracts/W3bstreamMinter.sol index d55fe0a4..81685456 100644 --- a/smartcontracts/contracts/W3bstreamMinter.sol +++ b/smartcontracts/contracts/W3bstreamMinter.sol @@ -44,8 +44,8 @@ contract W3bstreamMinter is OwnableUpgradeable { bytes4 public adhocDifficulty; bytes4 public currentDifficulty; - bytes4 public constant UPPER_BOUND = 0xffffffff; - bytes4 public constant LOWER_BOUND = 0x00000001; + uint32 private constant UPPER_BOUND = 0xffffffff; + uint32 private constant LOWER_BOUND = 0x00000001; uint256[10] private durations; uint256 private durationSum; @@ -131,22 +131,28 @@ contract W3bstreamMinter is OwnableUpgradeable { durationIndex = (durationIndex + 1) % durations.length; if (durationNum < durations.length) { durationNum++; + return; + } + if (adhocDifficulty != 0) { + return; + } + uint32 curr = uint32(currentDifficulty); + uint40 next = curr; + uint256 expectedSum = targetDuration * durationNum; + if (durationSum * 5 > expectedSum * 6) { + next *= 2; + } else if (expectedSum * 4 > durationSum * 5) { + next /= 2; } else { - uint32 curr = uint32(currentDifficulty); - uint40 difficulty = curr; - if (targetDuration * durationNum < durationSum) { - difficulty /= 2; - } else if (targetDuration * durationNum > durationSum) { - difficulty *= 2; - } - if (difficulty < uint32(LOWER_BOUND)) { - difficulty = uint32(LOWER_BOUND); - } else if (difficulty > uint32(UPPER_BOUND)) { - difficulty = uint32(UPPER_BOUND); - } - if (adhocDifficulty == 0 && difficulty != curr) { - _setDifficulty(bytes4(uint32(difficulty))); - } + return; + } + if (next < LOWER_BOUND) { + next = LOWER_BOUND; + } else if (next > UPPER_BOUND) { + next = UPPER_BOUND; + } + if (next != curr) { + _setDifficulty(bytes4(uint32(next))); } } From 73f4d0123a15c6ffde2a493e8dbfe595cfb7e539 Mon Sep 17 00:00:00 2001 From: huangzhiran Date: Wed, 18 Sep 2024 16:14:42 +0800 Subject: [PATCH 05/22] change taskID type from uint64 to byte32 --- smartcontracts/contracts/W3bstreamMinter.sol | 3 +-- .../contracts/W3bstreamTaskManager.sol | 26 +++++++++---------- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/smartcontracts/contracts/W3bstreamMinter.sol b/smartcontracts/contracts/W3bstreamMinter.sol index 81685456..e42881c0 100644 --- a/smartcontracts/contracts/W3bstreamMinter.sol +++ b/smartcontracts/contracts/W3bstreamMinter.sol @@ -27,8 +27,7 @@ struct Sequencer { } struct TaskAssignment { - uint64 projectId; - uint64 taskId; + bytes32 taskId; address prover; } diff --git a/smartcontracts/contracts/W3bstreamTaskManager.sol b/smartcontracts/contracts/W3bstreamTaskManager.sol index 2a9c55c2..2787a705 100644 --- a/smartcontracts/contracts/W3bstreamTaskManager.sol +++ b/smartcontracts/contracts/W3bstreamTaskManager.sol @@ -10,17 +10,16 @@ struct Record { } struct TaskAssignment { - uint64 projectId; - uint64 taskId; + bytes32 taskId; address prover; } contract W3bstreamTaskManager is OwnableUpgradeable { - event TaskAssigned(uint64 indexed projectId, uint64 indexed taskId, address prover, uint256 deadline); - event TaskSettled(uint64 indexed projectId, uint64 indexed taskId, address prover); + event TaskAssigned(bytes32 indexed taskId, address prover, uint256 deadline); + event TaskSettled(bytes32 indexed taskId, address prover); event OperatorAdded(address operator); event OperatorRemoved(address operator); - mapping(uint64 => mapping(uint64 => Record)) public records; + mapping(bytes32 => Record) public records; mapping(address => bool) public operators; modifier onlyOperator() { @@ -46,27 +45,26 @@ contract W3bstreamTaskManager is OwnableUpgradeable { } function _assign( - uint64 projectId, - uint64 taskId, + bytes32 taskId, address prover, uint256 deadline ) internal { require(prover != address(0), "invalid prover"); - Record storage record = records[projectId][taskId]; + Record storage record = records[taskId]; require(record.settled == false, "task already settled"); if (record.prover != address(0)) { require(record.deadline < block.timestamp, "task already assigned"); } record.prover = prover; record.deadline = deadline; - emit TaskAssigned(projectId, taskId, prover, deadline); + emit TaskAssigned(taskId, prover, deadline); } function assign( TaskAssignment calldata assignment, uint256 deadline ) public onlyOperator { - _assign(assignment.projectId, assignment.taskId, assignment.prover, deadline); + _assign(assignment.taskId, assignment.prover, deadline); } function assign( @@ -74,18 +72,18 @@ contract W3bstreamTaskManager is OwnableUpgradeable { uint256 deadline ) public onlyOperator { for (uint256 i = 0; i < taskAssignments.length; i++) { - _assign(taskAssignments[i].projectId, taskAssignments[i].taskId, taskAssignments[i].prover, deadline); + _assign(taskAssignments[i].taskId, taskAssignments[i].prover, deadline); } } - function settle(uint64 projectId, uint64 taskId, address prover) public onlyOperator { + function settle(bytes32 taskId, address prover) public onlyOperator { require(prover != address(0), "invalid prover"); - Record storage record = records[projectId][taskId]; + Record storage record = records[taskId]; require(record.prover == prover, "invalid prover"); require(record.deadline >= block.timestamp, "task assignement expired"); require(record.settled == false, "task already settled"); record.settled = true; - emit TaskSettled(projectId, taskId, prover); + emit TaskSettled(taskId, prover); // TODO: distribute task reward } From ed333cb83ae70f5302aa962cb50658239b27a29f Mon Sep 17 00:00:00 2001 From: huangzhiran Date: Wed, 18 Sep 2024 16:53:02 +0800 Subject: [PATCH 06/22] add DAO,TaskManager,Minter deploy script --- smartcontracts/scripts/deploy.ts | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/smartcontracts/scripts/deploy.ts b/smartcontracts/scripts/deploy.ts index 36eca610..d761780b 100644 --- a/smartcontracts/scripts/deploy.ts +++ b/smartcontracts/scripts/deploy.ts @@ -109,6 +109,27 @@ async function main() { }); await vmtype.waitForDeployment(); console.log(`W3bstreamVMType deployed to ${vmtype.target}`); + + const W3bstreamDAO = await ethers.getContractFactory('W3bstreamDAO'); + const dao = await upgrades.deployProxy(W3bstreamDAO, ['0x0000000000000000000000000000000000000000000000000000000000000000'], { + initializer: 'initialize', + }); + await dao.waitForDeployment(); + console.log(`W3bstreamDAO deployed to ${dao.target}`); + + const W3bstreamTaskManager = await ethers.getContractFactory('W3bstreamTaskManager'); + const taskManager = await upgrades.deployProxy(W3bstreamTaskManager, [], { + initializer: 'initialize', + }); + await taskManager.waitForDeployment(); + console.log(`W3bstreamTaskManager deployed to ${taskManager.target}`); + + const W3bstreamMinter = await ethers.getContractFactory('W3bstreamMinter'); + const minter = await upgrades.deployProxy(W3bstreamMinter, [dao.target, taskManager.target], { + initializer: 'initialize', + }); + await minter.waitForDeployment(); + console.log(`W3bstreamMinter deployed to ${minter.target}`); } main().catch(err => { From 21b1cc4083bd5644ede4f23b47b5c1c2719285b1 Mon Sep 17 00:00:00 2001 From: zhi Date: Thu, 19 Sep 2024 10:01:26 +0800 Subject: [PATCH 07/22] add back project id and fix a few bugs --- smartcontracts/contracts/W3bstreamMinter.sol | 5 +++-- .../contracts/W3bstreamTaskManager.sol | 22 ++++++++++--------- smartcontracts/scripts/deploy.ts | 3 +++ smartcontracts/test/W3bstreamMinter.ts | 2 +- 4 files changed, 19 insertions(+), 13 deletions(-) diff --git a/smartcontracts/contracts/W3bstreamMinter.sol b/smartcontracts/contracts/W3bstreamMinter.sol index e42881c0..58885994 100644 --- a/smartcontracts/contracts/W3bstreamMinter.sol +++ b/smartcontracts/contracts/W3bstreamMinter.sol @@ -27,6 +27,7 @@ struct Sequencer { } struct TaskAssignment { + uint256 projectId; bytes32 taskId; address prover; } @@ -34,7 +35,7 @@ struct TaskAssignment { contract W3bstreamMinter is OwnableUpgradeable { event TaskAllowanceSet(uint256 allowance); event TargetDurationSet(uint256 duration); - event DifficultySet(bytes8 difficulty); + event DifficultySet(bytes4 difficulty); IDAO public dao; ITaskManager public tm; @@ -76,7 +77,7 @@ contract W3bstreamMinter is OwnableUpgradeable { require(blockinfo.prevhash == tiphash, "invalid prevhash"); require(blockinfo.merkleRoot == keccak256(abi.encodePacked(coinbase.addr, coinbase.operator, coinbase.beneficiary)), "invalid merkle root"); // TODO: review difficulty usage - require(sha256(abi.encodePacked(blockinfo.meta, blockinfo.prevhash, blockinfo.merkleRoot, blockinfo.difficulty, blockinfo.nonce)) < blockinfo.difficulty, "invalid proof of work"); + require(bytes4(sha256(abi.encodePacked(blockinfo.meta, blockinfo.prevhash, blockinfo.merkleRoot, blockinfo.difficulty, blockinfo.nonce))) < blockinfo.difficulty, "invalid proof of work"); bytes32 hash = keccak256(abi.encode( blockinfo.meta, blockinfo.prevhash, diff --git a/smartcontracts/contracts/W3bstreamTaskManager.sol b/smartcontracts/contracts/W3bstreamTaskManager.sol index 2787a705..fafb4bc5 100644 --- a/smartcontracts/contracts/W3bstreamTaskManager.sol +++ b/smartcontracts/contracts/W3bstreamTaskManager.sol @@ -10,16 +10,17 @@ struct Record { } struct TaskAssignment { + uint256 projectId; bytes32 taskId; address prover; } contract W3bstreamTaskManager is OwnableUpgradeable { - event TaskAssigned(bytes32 indexed taskId, address prover, uint256 deadline); - event TaskSettled(bytes32 indexed taskId, address prover); + event TaskAssigned(uint256 indexed projectId, bytes32 indexed taskId, address prover, uint256 deadline); + event TaskSettled(uint256 indexed projectId, bytes32 indexed taskId, address prover); event OperatorAdded(address operator); event OperatorRemoved(address operator); - mapping(bytes32 => Record) public records; + mapping(uint256 => mapping(bytes32 => Record)) public records; mapping(address => bool) public operators; modifier onlyOperator() { @@ -45,26 +46,27 @@ contract W3bstreamTaskManager is OwnableUpgradeable { } function _assign( + uint256 projectId, bytes32 taskId, address prover, uint256 deadline ) internal { require(prover != address(0), "invalid prover"); - Record storage record = records[taskId]; + Record storage record = records[projectId][taskId]; require(record.settled == false, "task already settled"); if (record.prover != address(0)) { require(record.deadline < block.timestamp, "task already assigned"); } record.prover = prover; record.deadline = deadline; - emit TaskAssigned(taskId, prover, deadline); + emit TaskAssigned(projectId, taskId, prover, deadline); } function assign( TaskAssignment calldata assignment, uint256 deadline ) public onlyOperator { - _assign(assignment.taskId, assignment.prover, deadline); + _assign(assignment.projectId, assignment.taskId, assignment.prover, deadline); } function assign( @@ -72,18 +74,18 @@ contract W3bstreamTaskManager is OwnableUpgradeable { uint256 deadline ) public onlyOperator { for (uint256 i = 0; i < taskAssignments.length; i++) { - _assign(taskAssignments[i].taskId, taskAssignments[i].prover, deadline); + _assign(taskAssignments[i].projectId, taskAssignments[i].taskId, taskAssignments[i].prover, deadline); } } - function settle(bytes32 taskId, address prover) public onlyOperator { + function settle(uint256 projectId, bytes32 taskId, address prover) public onlyOperator { require(prover != address(0), "invalid prover"); - Record storage record = records[taskId]; + Record storage record = records[projectId][taskId]; require(record.prover == prover, "invalid prover"); require(record.deadline >= block.timestamp, "task assignement expired"); require(record.settled == false, "task already settled"); record.settled = true; - emit TaskSettled(taskId, prover); + emit TaskSettled(projectId, taskId, prover); // TODO: distribute task reward } diff --git a/smartcontracts/scripts/deploy.ts b/smartcontracts/scripts/deploy.ts index d761780b..a61dda30 100644 --- a/smartcontracts/scripts/deploy.ts +++ b/smartcontracts/scripts/deploy.ts @@ -130,6 +130,9 @@ async function main() { }); await minter.waitForDeployment(); console.log(`W3bstreamMinter deployed to ${minter.target}`); + tx = await dao.transferOwnership(minter.target); + await tx.wait(); + console.log(`W3bstreamDAO ownership transferred to ${minter.target}`); } main().catch(err => { diff --git a/smartcontracts/test/W3bstreamMinter.ts b/smartcontracts/test/W3bstreamMinter.ts index 93b5dace..eeebf2f0 100644 --- a/smartcontracts/test/W3bstreamMinter.ts +++ b/smartcontracts/test/W3bstreamMinter.ts @@ -38,7 +38,6 @@ describe('W3bstream Minter', function () { let tipinfo = await dao.tip(); expect(tipinfo[0]).to.equal(0); expect(tipinfo[1]).to.equal(genesis); - console.log({tipinfo, blockinfo, currentDifficulty}) await minter.connect(sequencer).mint( blockinfo, coinbase, @@ -58,6 +57,7 @@ describe('W3bstream Minter', function () { coinbase, [], )).to.be.revertedWith("invalid difficulty"); + currentDifficulty = await minter.currentDifficulty(); blockinfo.difficulty = currentDifficulty; await minter.connect(sequencer).mint( blockinfo, From 82afc515a77772e45a10291ef70442b779540253 Mon Sep 17 00:00:00 2001 From: zhi Date: Thu, 19 Sep 2024 22:27:28 +0800 Subject: [PATCH 08/22] change difficulty to nbits --- smartcontracts/contracts/W3bstreamMinter.sol | 126 ++++++++++--------- smartcontracts/test/W3bstreamMinter.ts | 45 ++++--- 2 files changed, 98 insertions(+), 73 deletions(-) diff --git a/smartcontracts/contracts/W3bstreamMinter.sol b/smartcontracts/contracts/W3bstreamMinter.sol index 58885994..19a2eaae 100644 --- a/smartcontracts/contracts/W3bstreamMinter.sol +++ b/smartcontracts/contracts/W3bstreamMinter.sol @@ -16,7 +16,7 @@ struct BlockInfo { bytes4 meta; bytes32 prevhash; bytes32 merkleRoot; - bytes4 difficulty; + uint32 nbits; bytes8 nonce; } @@ -35,18 +35,21 @@ struct TaskAssignment { contract W3bstreamMinter is OwnableUpgradeable { event TaskAllowanceSet(uint256 allowance); event TargetDurationSet(uint256 duration); - event DifficultySet(bytes4 difficulty); + event NBitsSet(uint32 nbits); IDAO public dao; ITaskManager public tm; uint256 public taskAllowance; uint256 public targetDuration; - bytes4 public adhocDifficulty; - bytes4 public currentDifficulty; - - uint32 private constant UPPER_BOUND = 0xffffffff; - uint32 private constant LOWER_BOUND = 0x00000001; - + bool public useAdhocNBits; + uint32 public currentNBits; + uint256 public currentTarget; + + uint32 private constant MAX_EXPONENT = 0x1c; + uint32 private constant UPPER_BOUND = 0xffff00; + uint32 private constant LOWER_BOUND = 0x8000; + uint256 private constant MAX_TARGET = 0x00000000ffff0000000000000000000000000000000000000000000000000000; + uint256[10] private durations; uint256 private durationSum; uint256 private durationNum; @@ -58,7 +61,7 @@ contract W3bstreamMinter is OwnableUpgradeable { tm = _tm; _setTaskAllowance(720); _setTargetDuration(12); - _setAdhocDifficulty(0x0fffffff); + _setAdhocNBits(0x0f7fffff); } function mint( @@ -67,31 +70,19 @@ contract W3bstreamMinter is OwnableUpgradeable { TaskAssignment[] calldata assignments ) public { require(coinbase.operator == msg.sender, "invalid operator"); - if (adhocDifficulty != 0) { - require(blockinfo.difficulty == adhocDifficulty, "invalid difficulty"); - } else { - require(blockinfo.difficulty == currentDifficulty, "invalid difficulty"); - } + uint256 target = nbitsToTarget(blockinfo.nbits); + require(target == currentTarget, "invalid nbits"); (, bytes32 tiphash, uint256 tipTimestamp) = dao.tip(); require(tipTimestamp != block.number); require(blockinfo.prevhash == tiphash, "invalid prevhash"); require(blockinfo.merkleRoot == keccak256(abi.encodePacked(coinbase.addr, coinbase.operator, coinbase.beneficiary)), "invalid merkle root"); - // TODO: review difficulty usage - require(bytes4(sha256(abi.encodePacked(blockinfo.meta, blockinfo.prevhash, blockinfo.merkleRoot, blockinfo.difficulty, blockinfo.nonce))) < blockinfo.difficulty, "invalid proof of work"); - bytes32 hash = keccak256(abi.encode( - blockinfo.meta, - blockinfo.prevhash, - blockinfo.merkleRoot, - blockinfo.difficulty, - blockinfo.nonce, - coinbase.addr, - coinbase.operator, - coinbase.beneficiary, - assignments - )); + // TODO: review target usage + bytes memory header = abi.encodePacked(blockinfo.meta, blockinfo.prevhash, blockinfo.merkleRoot, blockinfo.nbits, blockinfo.nonce); + require(uint256(sha256(header)) < target, "invalid proof of work"); + bytes32 h = keccak256(abi.encode(header, assignments)); tm.assign(assignments, block.number + taskAllowance); - _updateDifficulty(tipTimestamp); - dao.mint(hash, block.number); + _updateTarget(tipTimestamp); + dao.mint(h, block.number); // TODO: distribute block reward } @@ -113,18 +104,20 @@ contract W3bstreamMinter is OwnableUpgradeable { emit TargetDurationSet(duration); } - function setAdhocDifficulty(bytes4 difficulty) public onlyOwner { - _setAdhocDifficulty(difficulty); + function setAdhocNBits(uint32 nbits) public onlyOwner { + _setAdhocNBits(nbits); } - function _setAdhocDifficulty(bytes4 difficulty) internal { - if (difficulty != 0) { - _setDifficulty(difficulty); + function _setAdhocNBits(uint32 nbits) internal { + if (nbits == 0) { + useAdhocNBits = false; + return; } - adhocDifficulty = difficulty; + _setNBits(nbits); + useAdhocNBits = true; } - function _updateDifficulty(uint256 tipTimestamp) internal { + function _updateTarget(uint256 tipTimestamp) internal { uint256 duration = block.number - tipTimestamp; durationSum += duration - durations[durationIndex]; durations[durationIndex] = duration; @@ -133,31 +126,52 @@ contract W3bstreamMinter is OwnableUpgradeable { durationNum++; return; } - if (adhocDifficulty != 0) { - return; - } - uint32 curr = uint32(currentDifficulty); - uint40 next = curr; - uint256 expectedSum = targetDuration * durationNum; - if (durationSum * 5 > expectedSum * 6) { - next *= 2; - } else if (expectedSum * 4 > durationSum * 5) { - next /= 2; - } else { + if (useAdhocNBits) { return; } - if (next < LOWER_BOUND) { - next = LOWER_BOUND; - } else if (next > UPPER_BOUND) { - next = UPPER_BOUND; + uint32 nbits = uint32(currentNBits); + uint32 next = nextNBits(nbits, targetDuration * durationNum, durationSum); + if (next != nbits) { + _setNBits(next); } - if (next != curr) { - _setDifficulty(bytes4(uint32(next))); + } + + function nextNBits(uint32 nbits, uint256 expectedSum, uint256 sum) internal pure returns (uint32) { + if (sum * 5 > expectedSum * 6) { + (uint32 exponent, uint32 coefficient) = decodeNBits(nbits); + if (coefficient < UPPER_BOUND) { + return (exponent << 24) | uint32(coefficient + 1); + } + if (exponent < MAX_EXPONENT) { + return ((exponent + 1) << 24) | LOWER_BOUND; + } + } else if (expectedSum * 4 > sum * 5) { + (uint32 exponent, uint32 coefficient) = decodeNBits(nbits); + if (coefficient > LOWER_BOUND) { + return (exponent << 24) | uint32(coefficient - 1); + } + if (exponent > 0) { + return ((exponent - 1) << 24) | UPPER_BOUND; + } } + return nbits; + } + + function _setNBits(uint32 nbits) internal { + uint256 target = nbitsToTarget(nbits); + currentNBits = nbits; + currentTarget = target; + emit NBitsSet(nbits); + } + + function decodeNBits(uint32 nbits) internal pure returns (uint32, uint32) { + return (nbits >> 24, nbits & 0x00ffffff); } - function _setDifficulty(bytes4 difficulty) internal { - currentDifficulty = difficulty; - emit DifficultySet(difficulty); + function nbitsToTarget(uint32 nbits) internal pure returns (uint256) { + (uint32 exponent, uint256 coefficient) = decodeNBits(nbits); + require(exponent <= MAX_EXPONENT, "invalid nbits"); + require(coefficient >= LOWER_BOUND && coefficient <= UPPER_BOUND, "invalid nbits"); + return coefficient << (8 * (exponent - 3)); } } diff --git a/smartcontracts/test/W3bstreamMinter.ts b/smartcontracts/test/W3bstreamMinter.ts index eeebf2f0..d457b165 100644 --- a/smartcontracts/test/W3bstreamMinter.ts +++ b/smartcontracts/test/W3bstreamMinter.ts @@ -25,24 +25,35 @@ describe('W3bstream Minter', function () { operator: sequencer.address, beneficiary: sequencer.address, }; - await minter.connect(owner).setAdhocDifficulty("0xffffffff"); - let currentDifficulty = await minter.currentDifficulty(); + await minter.connect(owner).setAdhocNBits("0x1cffff00"); + let currentNBits = await minter.currentNBits(); const merkleRoot = ethers.solidityPackedKeccak256(["address", "address", "address"], [coinbase.addr, coinbase.operator, coinbase.beneficiary]); - const blockinfo = { + let tipinfo = await dao.tip(); + expect(tipinfo[0]).to.equal(0); + expect(tipinfo[1]).to.equal(genesis); + let blockinfo = { meta: "0x00000000", prevhash: genesis, merkleRoot: merkleRoot, - difficulty: currentDifficulty, - nonce: "0x0000000000000000", + nbits: currentNBits, }; - let tipinfo = await dao.tip(); - expect(tipinfo[0]).to.equal(0); - expect(tipinfo[1]).to.equal(genesis); - await minter.connect(sequencer).mint( - blockinfo, - coinbase, - [], - ); + const currentTarget = await minter.currentTarget(); + for (let nonce = ethers.toBigInt("0x00000000013fbfd3"); nonce < ethers.toBigInt("0x0000010000000000"); nonce++) { + let n = nonce.toString(16); + while (n.length < 16) { + n = "0" + n; + } + const h = ethers.toBigInt(ethers.solidityPackedSha256(["bytes4", "bytes32", "bytes32", "uint32", "bytes8"], [blockinfo.meta, blockinfo.prevhash, blockinfo.merkleRoot, blockinfo.nbits, "0x" + n])); + if (h < currentTarget) { + blockinfo.nonce = "0x" + n; + await minter.connect(sequencer).mint( + blockinfo, + coinbase, + [], + ); + break; + } + } tipinfo = await dao.tip(); expect(tipinfo[0]).to.equal(1); await expect(minter.connect(sequencer).mint( @@ -51,14 +62,14 @@ describe('W3bstream Minter', function () { [], )).to.be.revertedWith("invalid prevhash"); blockinfo.prevhash = tipinfo[1]; - blockinfo.difficulty = "0x00000001"; + blockinfo.nbits = "0x00008000"; await expect(minter.connect(sequencer).mint( blockinfo, coinbase, [], - )).to.be.revertedWith("invalid difficulty"); - currentDifficulty = await minter.currentDifficulty(); - blockinfo.difficulty = currentDifficulty; + )).to.be.revertedWith("invalid nbits"); + currentNBits = await minter.currentNBits(); + blockinfo.nbits = currentNBits; await minter.connect(sequencer).mint( blockinfo, coinbase, From 3b1bd730b85f3e3b5bb8ab2b71e851f1d429e325 Mon Sep 17 00:00:00 2001 From: huangzhiran Date: Fri, 20 Sep 2024 14:34:39 +0800 Subject: [PATCH 09/22] task manager add minter as operator --- smartcontracts/scripts/deploy.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/smartcontracts/scripts/deploy.ts b/smartcontracts/scripts/deploy.ts index a61dda30..b52369ce 100644 --- a/smartcontracts/scripts/deploy.ts +++ b/smartcontracts/scripts/deploy.ts @@ -130,9 +130,14 @@ async function main() { }); await minter.waitForDeployment(); console.log(`W3bstreamMinter deployed to ${minter.target}`); + tx = await dao.transferOwnership(minter.target); await tx.wait(); console.log(`W3bstreamDAO ownership transferred to ${minter.target}`); + + tx = await taskManager.addOperator(minter.target); + await tx.wait(); + console.log(`W3bstreamTaskManager add operator to ${minter.target}`); } main().catch(err => { From dfaa6f14d4f3b41d56fe9225d0109757812ea02b Mon Sep 17 00:00:00 2001 From: zhi Date: Wed, 25 Sep 2024 12:04:32 +0800 Subject: [PATCH 10/22] add block reward distributor and update block minter --- .../contracts/W3bstreamBlockMinter.sol | 465 ++++++++++++++++++ .../W3bstreamBlockRewardDistributor.sol | 26 + smartcontracts/contracts/W3bstreamDebits.sol | 91 ++++ smartcontracts/contracts/W3bstreamMinter.sol | 177 ------- .../contracts/W3bstreamTaskManager.sol | 26 +- smartcontracts/scripts/deploy.ts | 14 +- ...treamMinter.ts => W3bstreamBlockMinter.ts} | 13 +- 7 files changed, 624 insertions(+), 188 deletions(-) create mode 100644 smartcontracts/contracts/W3bstreamBlockMinter.sol create mode 100644 smartcontracts/contracts/W3bstreamBlockRewardDistributor.sol create mode 100644 smartcontracts/contracts/W3bstreamDebits.sol delete mode 100644 smartcontracts/contracts/W3bstreamMinter.sol rename smartcontracts/test/{W3bstreamMinter.ts => W3bstreamBlockMinter.ts} (81%) diff --git a/smartcontracts/contracts/W3bstreamBlockMinter.sol b/smartcontracts/contracts/W3bstreamBlockMinter.sol new file mode 100644 index 00000000..536d3a12 --- /dev/null +++ b/smartcontracts/contracts/W3bstreamBlockMinter.sol @@ -0,0 +1,465 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; + +interface IDAO { + function tip() external view returns (uint256, bytes32, uint256); + function mint(bytes32 hash, uint256 timestamp) external; +} + +interface ITaskManager { + function assign(TaskAssignment[] calldata assignments, address sequencer, uint256 deadline) external; +} + +interface IBlockRewardDistributor { + function distribute(address recipient, uint256 amount) external; +} + +struct BlockInfo { + bytes4 meta; + bytes32 prevhash; + bytes32 merkleRoot; + uint32 nbits; + bytes8 nonce; +} + +struct Sequencer { + address addr; + address operator; + address beneficiary; +} + +struct TaskAssignment { + uint256 projectId; + bytes32 taskId; + address prover; +} + +contract W3bstreamBlockMinter is OwnableUpgradeable { + event BlockRewardfSet(uint256 reward); + event TaskAllowanceSet(uint256 allowance); + event TargetDurationSet(uint256 duration); + event NBitsSet(uint32 nbits); + + IDAO public dao; + ITaskManager public taskManager; + IBlockRewardDistributor public distributor; + + uint256 public blockReward; + uint256 public taskAllowance; + uint256 public targetDuration; + bool public useAdhocNBits; + uint32 public currentNBits; + + uint32 private constant MAX_EXPONENT = 0x1c; + uint32 private constant UPPER_BOUND = 0xffff00; + uint32 private constant LOWER_BOUND = 0x8000; + uint256 private constant MAX_TARGET = 0x00000000ffff0000000000000000000000000000000000000000000000000000; + + uint256 private _currentTarget; + uint256[10] private _durations; + uint256 private _durationSum; + uint256 private _durationNum; + uint256 private _durationIndex; + + function initialize(IDAO _dao, ITaskManager _taskManager, IBlockRewardDistributor _distributor) public initializer { + __Ownable_init(); + dao = _dao; + taskManager = _taskManager; + distributor = _distributor; + _setBlockReward(1000000000000000000); + _setTaskAllowance(720); + _setTargetDuration(12); + _setAdhocNBits(0x0f7fffff); + } + + function mint( + BlockInfo calldata blockinfo, + Sequencer calldata coinbase, + TaskAssignment[] calldata assignments + ) public { + require(coinbase.operator == msg.sender, "invalid operator"); + uint256 target = nbitsToTarget(blockinfo.nbits); + require(target == _currentTarget, "invalid nbits"); + (, bytes32 tiphash, uint256 tipTimestamp) = dao.tip(); + require(tipTimestamp != block.number); + require(blockinfo.prevhash == tiphash, "invalid prevhash"); + require(blockinfo.merkleRoot == keccak256(abi.encodePacked(coinbase.addr, coinbase.operator, coinbase.beneficiary)), "invalid merkle root"); + // TODO: review target usage + bytes memory header = abi.encodePacked(blockinfo.meta, blockinfo.prevhash, blockinfo.merkleRoot, blockinfo.nbits, blockinfo.nonce); + require(uint256(sha256(header)) < target, "invalid proof of work"); + bytes32 h = keccak256(abi.encode(header, assignments)); + taskManager.assign(assignments, coinbase.beneficiary, block.number + taskAllowance); + _updateTarget(tipTimestamp); + dao.mint(h, block.number); + distributor.distribute(coinbase.beneficiary, blockReward); + } +/* + function scrypt(bytes calldata x) public pure returns (bytes32) { + require(x.length == 80, "invalid length"); + uint64 keyLen = 32; + bytes memory b = pbkdf2(x, x, 128); + // bytes memory b = pbkdf2_Key(x, x, 1, 128); + smix(b); + uint32 value = uint32(uint8(b[0])) << 24 | uint32(uint8(b[1])) << 16 | uint32(uint8(b[2])) << 8 | uint32(uint8(b[3])); + uint32 addend = 0xe0; + uint32 newValue = value + addend; + uint32 high17 = newValue >> 15; + uint32 low15 = newValue & 0x7fff; + uint32 result = (high17 << 15) | low15; + b[0] = bytes1(uint8(result >> 24)); + b[1] = bytes1(uint8(result >> 16)); + b[2] = bytes1(uint8(result >> 8)); + b[3] = bytes1(uint8(result)); + + // return reverseArray(pbkdf2_Key(x, b, 1, keyLen)); + bytes memory reverse = reverseArray(pbkdf2(x, b, keyLen)); + bytes32 retval; + assembly { + retval := mload(add(reverse, 32)) + } + return retval; + } +*/ + function reverseArray(bytes memory b) public pure returns (bytes memory) { + bytes1 tmp; + for (uint i = 0; i < b.length / 2; i++) { + tmp = b[i]; + b[i] = b[b.length - i - 1]; + b[b.length - i - 1] = tmp; + } + return b; + } +/* + function pbkdf2_Key(bytes calldata x, bytes calldata salt, uint64 iter, uint64 keyLen) public pure returns (bytes memory) { + bytes32 h = sha256(x); + uint32 hashLen = 32; + uint64 numBlocks = 4; + bytes memory buf = new bytes(4); + bytes memory dk = new bytes(128); + for (uint i = 1; i <= numBlocks; i++) { + h = 0x6A09E667BB67AE853C6EF372A54FF53A510E527F9B05688C1F83D9AB5BE0CD19; + // h.Write(salt); + buf[0] = bytes1(uint8(i >> 24)); + buf[1] = bytes1(uint8(i >> 16)); + buf[2] = bytes1(uint8(i >> 8)); + buf[3] = bytes1(uint8(i)); + // h.Write(buf[:4]); + // dk = h.Sum(dk); + for (uint j = 0; j < iter; j++) { + // h.Reset(); + // h.Write(dk); + // dk = h.Sum(dk); + } + for (uint j = 0; j < hashLen; j++) { + dk[i * hashLen + j] = dk[j]; + } + // buf = sha256(abi.encodePacked(h, y)); + // dk[i] = buf; + } + bytes memory retval = new bytes(keyLen); + for (uint i = 0; i < keyLen; i++) { + retval[i] = dk[i]; + } + return retval; + } +*/ + function setBlockReward(uint256 reward) public onlyOwner { + _setBlockReward(reward); + } + + function _setBlockReward(uint256 reward) internal { + blockReward = reward; + emit BlockRewardfSet(reward); + } + + function setTaskAllowance(uint256 allowance) public onlyOwner { + _setTaskAllowance(allowance); + } + + function _setTaskAllowance(uint256 allowance) internal { + taskAllowance = allowance; + emit TaskAllowanceSet(allowance); + } + + function setTargetDuration(uint256 duration) public onlyOwner { + _setTargetDuration(duration); + } + + function _setTargetDuration(uint256 duration) internal { + targetDuration = duration; + emit TargetDurationSet(duration); + } + + function setAdhocNBits(uint32 nbits) public onlyOwner { + _setAdhocNBits(nbits); + } + + function _setAdhocNBits(uint32 nbits) internal { + if (nbits == 0) { + useAdhocNBits = false; + return; + } + _setNBits(nbits); + useAdhocNBits = true; + } + + function _updateTarget(uint256 tipTimestamp) internal { + uint256 duration = block.number - tipTimestamp; + _durationSum += duration - _durations[_durationIndex]; + _durations[_durationIndex] = duration; + _durationIndex = (_durationIndex + 1) % _durations.length; + if (_durationNum < _durations.length) { + _durationNum++; + return; + } + if (useAdhocNBits) { + return; + } + uint32 nbits = uint32(currentNBits); + uint32 next = _nextNBits(nbits, targetDuration * _durationNum, _durationSum); + if (next != nbits) { + _setNBits(next); + } + } + + function _nextNBits(uint32 nbits, uint256 expectedSum, uint256 sum) internal pure returns (uint32) { + if (sum * 5 > expectedSum * 6) { + (uint32 exponent, uint32 coefficient) = decodeNBits(nbits); + if (coefficient < UPPER_BOUND) { + return (exponent << 24) | uint32(coefficient + 1); + } + if (exponent < MAX_EXPONENT) { + return ((exponent + 1) << 24) | LOWER_BOUND; + } + } else if (expectedSum * 4 > sum * 5) { + (uint32 exponent, uint32 coefficient) = decodeNBits(nbits); + if (coefficient > LOWER_BOUND) { + return (exponent << 24) | uint32(coefficient - 1); + } + if (exponent > 0) { + return ((exponent - 1) << 24) | UPPER_BOUND; + } + } + return nbits; + } + + function _setNBits(uint32 nbits) internal { + uint256 target = nbitsToTarget(nbits); + currentNBits = nbits; + _currentTarget = target; + emit NBitsSet(nbits); + } + + function decodeNBits(uint32 nbits) internal pure returns (uint32, uint32) { + return (nbits >> 24, nbits & 0x00ffffff); + } + + function nbitsToTarget(uint32 nbits) public pure returns (uint256) { + (uint32 exponent, uint256 coefficient) = decodeNBits(nbits); + require(exponent <= MAX_EXPONENT, "invalid nbits"); + require(coefficient >= LOWER_BOUND && coefficient <= UPPER_BOUND, "invalid nbits"); + return coefficient << (8 * (exponent - 3)); + } + +/* + function blockXOR(uint32[] memory dst, uint32[] memory src, uint256 offset, uint64 len) pure internal returns (uint32[] memory) { + for (uint i = 0; i < len; i++) { + dst[i] ^= src[i + offset]; + } + return dst; + } + + function integer(uint32[] memory b) pure internal returns (uint64) { + return uint64(b[16]) | uint64(b[17]) << 32; + } + + function salsaXOR(uint32[16] memory tmp, uint32[] memory input, uint offset) pure internal returns (uint32[16] memory output) { + uint32[16] memory z; + uint32[16] memory x; + for (uint i = 0; i < 16; i++) { + z[i] = tmp[i] ^ input[offset + i]; + x[i] = z[i]; + } + for (uint i = 0; i < 8; i += 2) { + unchecked { + uint32 u = x[0] + x[12]; + x[4] ^= u << 7 | u >> 25; + u = x[4] + x[0]; + x[8] ^= u << 9 | u >> 23; + u = x[8] + x[4]; + x[12] ^= u << 13 | u >> 19; + u = x[12] + x[8]; + x[0] ^= u << 18 | u >> 14; + + u = x[5] + x[1]; + x[9] ^= u << 7 | u >> 25; + u = x[9] + x[5]; + x[13] ^= u << 9 | u >> 23; + u = x[13] + x[9]; + x[1] ^= u << 13 | u >> 19; + u = x[1] + x[13]; + x[5] ^= u << 18 | u >> 14; + + u = x[10] + x[6]; + x[14] ^= u << 7 | u >> 25; + u = x[14] + x[10]; + x[2] ^= u << 9 | u >> 23; + u = x[2] + x[14]; + x[6] ^= u << 13 | u >> 19; + u = x[6] + x[2]; + x[10] ^= u << 18 | u >> 14; + + u = x[15] + x[11]; + x[3] ^= u << 7 | u >> 25; + u = x[3] + x[15]; + x[7] ^= u << 9 | u >> 23; + u = x[7] + x[3]; + x[11] ^= u << 13 | u >> 19; + u = x[11] + x[7]; + x[15] ^= u << 18 | u >> 14; + + u = x[0] + x[3]; + x[1] ^= u << 7 | u >> 25; + u = x[1] + x[0]; + x[2] ^= u << 9 | u >> 23; + u = x[2] + x[1]; + x[3] ^= u << 13 | u >> 19; + u = x[3] + x[2]; + x[0] ^= u << 18 | u >> 14; + + u = x[5] + x[4]; + x[6] ^= u << 7 | u >> 25; + u = x[6] + x[5]; + x[7] ^= u << 9 | u >> 23; + u = x[7] + x[6]; + x[4] ^= u << 13 | u >> 19; + u = x[4] + x[7]; + x[5] ^= u << 18 | u >> 14; + + u = x[10] + x[9]; + x[11] ^= u << 7 | u >> 25; + u = x[11] + x[10]; + x[8] ^= u << 9 | u >> 23; + u = x[8] + x[11]; + x[9] ^= u << 13 | u >> 19; + u = x[9] + x[8]; + x[10] ^= u << 18 | u >> 14; + + u = x[15] + x[14]; + x[12] ^= u << 7 | u >> 25; + u = x[12] + x[15]; + x[13] ^= u << 9 | u >> 23; + u = x[13] + x[12]; + x[14] ^= u << 13 | u >> 19; + u = x[14] + x[13]; + x[15] ^= u << 18 | u >> 14; + } + } + unchecked { + for (uint i = 0; i < 16; i++) { + x[i] += z[i]; + } + } + for (uint i = 0; i < 16; i++) { + output[i] = x[i]; + } + } + + function blockMix(uint32[16] memory tmp, uint32[] memory x) pure internal returns (uint32[16] memory, uint32[] memory) { + for (uint i = 0; i < 16; i++) { + tmp[i] = x[16 + i]; + } + uint32[] memory output = new uint32[](32); + uint32[16] memory v = salsaXOR(tmp, x, 0); + for (uint i = 0; i < 16; i++) { + tmp[i] = output[i]; + output[i] = v[i]; + } + + v = salsaXOR(tmp, x, 16); + for (uint i = 0; i < 16; i++) { + tmp[i] = output[16 + i]; + output[16 + i] = v[i]; + } + + return (tmp, output); + } + + function smix(bytes memory b) pure internal returns (bytes memory) { + uint32[16] memory tmp; + uint32[] memory x = new uint32[](32); + uint32[] memory y = new uint32[](32); + uint32[] memory v = new uint32[](32 * 1024); + + uint j = 0; + for (uint i = 0; i < 32; i++) { + x[i] = uint32(uint8(b[j])) | uint32(uint8(b[j+1]))<<8 | uint32(uint8(b[j+2]))<<16 | uint32(uint8(b[j+3]))<<24; + j += 4; + } + for (uint i = 0; i < 1024; i += 2) { + for (uint k = 0; k < 32; k++) { + v[i * 32 + k] = x[k]; + } + (tmp, y) = blockMix(tmp, x); + for (uint k = 0; k < 32; k++) { + v[(i + 1) * 32 + k] = y[k]; + } + (tmp, x) = blockMix(tmp, y); + } + for (uint i = 0; i < 1024; i += 2) { + j = uint32(integer(x) & uint64(1023)); + blockXOR(x, v, j * 32, 32); + (tmp, y) = blockMix(tmp, x); + j = uint32(integer(y) & uint64(1023)); + blockXOR(y, v, j * 32, 32); + (tmp, x) = blockMix(tmp, y); + } + j = 0; + for (uint i = 0; i < 32; i++) { + b[j + 0] = bytes1(uint8(x[i] >> 0)); + b[j + 1] = bytes1(uint8(x[i] >> 8)); + b[j + 2] = bytes1(uint8(x[i] >> 16)); + b[j + 3] = bytes1(uint8(x[i] >> 24)); + j += 4; + } + + return b; + } + + function hmacsha256(bytes calldata key, bytes memory message) pure public returns (bytes32) { + bytes32 keyl; + bytes32 keyr; + uint i; + if (key.length > 64) { + keyl = sha256(key); + } else { + for (i = 0; i < key.length && i < 32; i++) + keyl |= bytes32(uint256(uint8(key[i])) * 2**(8 * (31 - i))); + for (i = 32; i < key.length && i < 64; i++) + keyr |= bytes32(uint256(uint8(key[i])) * 2**(8 * (63 - i))); + } + bytes32 threesix = 0x3636363636363636363636363636363636363636363636363636363636363636; + bytes32 fivec = 0x5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c; + return sha256(abi.encode(fivec ^ keyl, fivec ^ keyr, sha256(abi.encode(threesix ^ keyl, threesix ^ keyr, message)))); + } + + function pbkdf2(bytes calldata k, bytes memory salt, uint dklen) public pure returns (bytes memory) { + bytes memory m = new bytes(salt.length + 4); + for (uint i = 0; i < salt.length; i++) { + m[i] = salt[i]; + } + bytes32[4] memory r; + for (uint i = 0; i * 32 < dklen; i++) { + m[m.length - 1] = bytes1(uint8(i + 1)); + r[i] = hmacsha256(k, m); + } + bytes memory retval = new bytes(dklen); + for (uint i = 0; i < dklen; i++) { + retval[i] = r[i / 32][i % 32]; + } + return retval; + } +*/ +} diff --git a/smartcontracts/contracts/W3bstreamBlockRewardDistributor.sol b/smartcontracts/contracts/W3bstreamBlockRewardDistributor.sol new file mode 100644 index 00000000..b99c8cb3 --- /dev/null +++ b/smartcontracts/contracts/W3bstreamBlockRewardDistributor.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; + +contract W3bstreamBlockRewardDistributor is OwnableUpgradeable { + address public operator; + + modifier onlyOperator() { + require(msg.sender == operator, "not operator"); + _; + } + + function initialize() public initializer { + __Ownable_init(); + } + + function setOperator(address _operator) public onlyOwner { + operator = _operator; + } + + function distribute(address recipient, uint256 amount) public onlyOperator { + (bool success, ) = recipient.call{value: amount}(""); + require(success, "transfer failed"); + } +} diff --git a/smartcontracts/contracts/W3bstreamDebits.sol b/smartcontracts/contracts/W3bstreamDebits.sol new file mode 100644 index 00000000..1c69f706 --- /dev/null +++ b/smartcontracts/contracts/W3bstreamDebits.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +contract W3bstreamDebits is OwnableUpgradeable { + event OperatorSet(uint256 indexed id, address indexed operator); + event RewardTokenSet(uint256 indexed id, address indexed rewardToken); + event Deposited(address indexed token, address indexed owner, uint256 amount); + event Withheld(address indexed token, address indexed owner, uint256 amount); + event Distributed(address indexed token, address indexed owner, address[] recipients, uint256[] amounts); + event Redeemed(address indexed token, address indexed owner, uint256 amount); + event Withdrawn(address indexed token, address indexed owner, uint256 amount); + + address public operator; + + mapping(uint256 => address) _rewardTokens; + mapping(address => mapping(address => uint256)) _balances; + mapping(address => mapping(address => uint256)) _withholdings; + + modifier onlyOperator() { + require(msg.sender == operator, "not operator"); + _; + } + + function initialize() public initializer { + __Ownable_init(); + } + + function rewardToken(uint256 _id) external view returns (address) { + return _rewardTokens[_id]; + } + + function setRewardToken(uint256 _id, address _rewardToken) external onlyOwner { + require(_rewardToken != address(0), "zero address"); + require(_rewardTokens[_id] == address(0), "already set"); + _rewardTokens[_id] = _rewardToken; + emit RewardTokenSet(_id, _rewardToken); + } + + function deposit(uint256 _id, uint256 _amount) external { + address token = _rewardTokens[_id]; + require(token != address(0), "reward token not set"); + bool success = IERC20(token).transferFrom(msg.sender, address(this), _amount); + require(success, "transfer failed"); + _balances[token][msg.sender] += _amount; + emit Deposited(token, msg.sender, _amount); + } + + function withhold(uint256 _id, address _owner, uint256 _amount) external { + address token = _rewardTokens[_id]; + require(token != address(0), "reward token not set"); + require(_balances[token][_owner] - _withholdings[token][_owner] >= _amount, "insufficient balance"); + _withholdings[token][_owner] += _amount; + _balances[token][_owner] -= _amount; + emit Withheld(token, _owner, _amount); + } + + function distribute(uint256 _id, address _owner, address[] calldata _recipients, uint256[] calldata _amounts) external onlyOperator { + address token = _rewardTokens[_id]; + require(token != address(0), "reward token not set"); + require(_recipients.length == _amounts.length, "length mismatch"); + for (uint256 i = 0; i < _recipients.length; i++) { + require(_withholdings[token][_owner] >= _amounts[i], "insufficient balance"); + _withholdings[token][_owner] -= _amounts[i]; + bool success = IERC20(token).transfer(_recipients[i], _amounts[i]); + require(success, "transfer failed"); + } + emit Distributed(token, _owner, _recipients, _amounts); + } + + function redeem(uint256 _id, address _owner, uint256 _amount) external onlyOperator { + address token = _rewardTokens[_id]; + require(token != address(0), "reward token not set"); + require(_withholdings[token][_owner] >= _amount, "insufficient balance"); + _withholdings[token][_owner] -= _amount; + _balances[token][_owner] += _amount; + emit Redeemed(token, _owner, _amount); + } + + function withdraw(address _token, uint256 _amount) external { + address sender = msg.sender; + require(_token != address(0), "zero address"); + require(_balances[_token][sender] >= _amount, "insufficient balance"); + _balances[_token][sender] -= _amount; + bool success = IERC20(_token).transfer(sender, _amount); + require(success, "transfer failed"); + emit Withdrawn(_token, sender, _amount); + } +} diff --git a/smartcontracts/contracts/W3bstreamMinter.sol b/smartcontracts/contracts/W3bstreamMinter.sol deleted file mode 100644 index 19a2eaae..00000000 --- a/smartcontracts/contracts/W3bstreamMinter.sol +++ /dev/null @@ -1,177 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.19; - -import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; - -interface IDAO { - function tip() external view returns (uint256, bytes32, uint256); - function mint(bytes32 hash, uint256 timestamp) external; -} - -interface ITaskManager { - function assign(TaskAssignment[] calldata assignments, uint256 deadline) external; -} - -struct BlockInfo { - bytes4 meta; - bytes32 prevhash; - bytes32 merkleRoot; - uint32 nbits; - bytes8 nonce; -} - -struct Sequencer { - address addr; - address operator; - address beneficiary; -} - -struct TaskAssignment { - uint256 projectId; - bytes32 taskId; - address prover; -} - -contract W3bstreamMinter is OwnableUpgradeable { - event TaskAllowanceSet(uint256 allowance); - event TargetDurationSet(uint256 duration); - event NBitsSet(uint32 nbits); - - IDAO public dao; - ITaskManager public tm; - uint256 public taskAllowance; - uint256 public targetDuration; - bool public useAdhocNBits; - uint32 public currentNBits; - uint256 public currentTarget; - - uint32 private constant MAX_EXPONENT = 0x1c; - uint32 private constant UPPER_BOUND = 0xffff00; - uint32 private constant LOWER_BOUND = 0x8000; - uint256 private constant MAX_TARGET = 0x00000000ffff0000000000000000000000000000000000000000000000000000; - - uint256[10] private durations; - uint256 private durationSum; - uint256 private durationNum; - uint256 private durationIndex; - - function initialize(IDAO _dao, ITaskManager _tm) public initializer { - __Ownable_init(); - dao = _dao; - tm = _tm; - _setTaskAllowance(720); - _setTargetDuration(12); - _setAdhocNBits(0x0f7fffff); - } - - function mint( - BlockInfo calldata blockinfo, - Sequencer calldata coinbase, - TaskAssignment[] calldata assignments - ) public { - require(coinbase.operator == msg.sender, "invalid operator"); - uint256 target = nbitsToTarget(blockinfo.nbits); - require(target == currentTarget, "invalid nbits"); - (, bytes32 tiphash, uint256 tipTimestamp) = dao.tip(); - require(tipTimestamp != block.number); - require(blockinfo.prevhash == tiphash, "invalid prevhash"); - require(blockinfo.merkleRoot == keccak256(abi.encodePacked(coinbase.addr, coinbase.operator, coinbase.beneficiary)), "invalid merkle root"); - // TODO: review target usage - bytes memory header = abi.encodePacked(blockinfo.meta, blockinfo.prevhash, blockinfo.merkleRoot, blockinfo.nbits, blockinfo.nonce); - require(uint256(sha256(header)) < target, "invalid proof of work"); - bytes32 h = keccak256(abi.encode(header, assignments)); - tm.assign(assignments, block.number + taskAllowance); - _updateTarget(tipTimestamp); - dao.mint(h, block.number); - // TODO: distribute block reward - } - - function setTaskAllowance(uint256 allowance) public onlyOwner { - _setTaskAllowance(allowance); - } - - function _setTaskAllowance(uint256 allowance) internal { - taskAllowance = allowance; - emit TaskAllowanceSet(allowance); - } - - function setTargetDuration(uint256 duration) public onlyOwner { - _setTargetDuration(duration); - } - - function _setTargetDuration(uint256 duration) internal { - targetDuration = duration; - emit TargetDurationSet(duration); - } - - function setAdhocNBits(uint32 nbits) public onlyOwner { - _setAdhocNBits(nbits); - } - - function _setAdhocNBits(uint32 nbits) internal { - if (nbits == 0) { - useAdhocNBits = false; - return; - } - _setNBits(nbits); - useAdhocNBits = true; - } - - function _updateTarget(uint256 tipTimestamp) internal { - uint256 duration = block.number - tipTimestamp; - durationSum += duration - durations[durationIndex]; - durations[durationIndex] = duration; - durationIndex = (durationIndex + 1) % durations.length; - if (durationNum < durations.length) { - durationNum++; - return; - } - if (useAdhocNBits) { - return; - } - uint32 nbits = uint32(currentNBits); - uint32 next = nextNBits(nbits, targetDuration * durationNum, durationSum); - if (next != nbits) { - _setNBits(next); - } - } - - function nextNBits(uint32 nbits, uint256 expectedSum, uint256 sum) internal pure returns (uint32) { - if (sum * 5 > expectedSum * 6) { - (uint32 exponent, uint32 coefficient) = decodeNBits(nbits); - if (coefficient < UPPER_BOUND) { - return (exponent << 24) | uint32(coefficient + 1); - } - if (exponent < MAX_EXPONENT) { - return ((exponent + 1) << 24) | LOWER_BOUND; - } - } else if (expectedSum * 4 > sum * 5) { - (uint32 exponent, uint32 coefficient) = decodeNBits(nbits); - if (coefficient > LOWER_BOUND) { - return (exponent << 24) | uint32(coefficient - 1); - } - if (exponent > 0) { - return ((exponent - 1) << 24) | UPPER_BOUND; - } - } - return nbits; - } - - function _setNBits(uint32 nbits) internal { - uint256 target = nbitsToTarget(nbits); - currentNBits = nbits; - currentTarget = target; - emit NBitsSet(nbits); - } - - function decodeNBits(uint32 nbits) internal pure returns (uint32, uint32) { - return (nbits >> 24, nbits & 0x00ffffff); - } - - function nbitsToTarget(uint32 nbits) internal pure returns (uint256) { - (uint32 exponent, uint256 coefficient) = decodeNBits(nbits); - require(exponent <= MAX_EXPONENT, "invalid nbits"); - require(coefficient >= LOWER_BOUND && coefficient <= UPPER_BOUND, "invalid nbits"); - return coefficient << (8 * (exponent - 3)); - } -} diff --git a/smartcontracts/contracts/W3bstreamTaskManager.sol b/smartcontracts/contracts/W3bstreamTaskManager.sol index fafb4bc5..72c84f34 100644 --- a/smartcontracts/contracts/W3bstreamTaskManager.sol +++ b/smartcontracts/contracts/W3bstreamTaskManager.sol @@ -4,7 +4,11 @@ pragma solidity ^0.8.19; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; struct Record { + bytes32 hash; + address sequencer; address prover; + uint256 rewardForProver; + uint256 rewardForSequencer; uint256 deadline; bool settled; } @@ -12,11 +16,19 @@ struct Record { struct TaskAssignment { uint256 projectId; bytes32 taskId; + bytes32 hash; address prover; } +/* +interface IDebits { + function withhold(uint256 id, address owner, uint256 amount) external; + function redeem(uint256 id, address owner, uint256 amount) external; + function distribute(uint256 id, address owner, address[] calldata recipients, uint256[] calldata amounts) external; +} +*/ contract W3bstreamTaskManager is OwnableUpgradeable { - event TaskAssigned(uint256 indexed projectId, bytes32 indexed taskId, address prover, uint256 deadline); + event TaskAssigned(uint256 indexed projectId, bytes32 indexed taskId, address indexed prover, uint256 deadline); event TaskSettled(uint256 indexed projectId, bytes32 indexed taskId, address prover); event OperatorAdded(address operator); event OperatorRemoved(address operator); @@ -48,8 +60,10 @@ contract W3bstreamTaskManager is OwnableUpgradeable { function _assign( uint256 projectId, bytes32 taskId, + bytes32 hash, address prover, - uint256 deadline + uint256 deadline, + address sequencer ) internal { require(prover != address(0), "invalid prover"); Record storage record = records[projectId][taskId]; @@ -57,24 +71,28 @@ contract W3bstreamTaskManager is OwnableUpgradeable { if (record.prover != address(0)) { require(record.deadline < block.timestamp, "task already assigned"); } + record.hash = hash; record.prover = prover; record.deadline = deadline; + record.sequencer = sequencer; emit TaskAssigned(projectId, taskId, prover, deadline); } function assign( TaskAssignment calldata assignment, + address sequencer, uint256 deadline ) public onlyOperator { - _assign(assignment.projectId, assignment.taskId, assignment.prover, deadline); + _assign(assignment.projectId, assignment.taskId, assignment.hash, assignment.prover, deadline, sequencer); } function assign( TaskAssignment[] calldata taskAssignments, + address sequencer, uint256 deadline ) public onlyOperator { for (uint256 i = 0; i < taskAssignments.length; i++) { - _assign(taskAssignments[i].projectId, taskAssignments[i].taskId, taskAssignments[i].prover, deadline); + _assign(taskAssignments[i].projectId, taskAssignments[i].taskId, taskAssignments[i].hash, taskAssignments[i].prover, deadline, sequencer); } } diff --git a/smartcontracts/scripts/deploy.ts b/smartcontracts/scripts/deploy.ts index b52369ce..2973c8e1 100644 --- a/smartcontracts/scripts/deploy.ts +++ b/smartcontracts/scripts/deploy.ts @@ -124,13 +124,19 @@ async function main() { await taskManager.waitForDeployment(); console.log(`W3bstreamTaskManager deployed to ${taskManager.target}`); - const W3bstreamMinter = await ethers.getContractFactory('W3bstreamMinter'); - const minter = await upgrades.deployProxy(W3bstreamMinter, [dao.target, taskManager.target], { + const W3bstreamBlockRewardDistributor = await ethers.getContractFactory('W3bstreamBlockRewardDistributor'); + const distributor = await upgrades.deployProxy(W3bstreamBlockRewardDistributor, [], { initializer: 'initialize', }); - await minter.waitForDeployment(); - console.log(`W3bstreamMinter deployed to ${minter.target}`); + await distributor.waitForDeployment(); + console.log(`W3bstreamBlockRewardDistributor deployed to ${distributor.target}`); + const W3bstreamBlockMinter = await ethers.getContractFactory('W3bstreamBlockMinter'); + const minter = await upgrades.deployProxy(W3bstreamBlockMinter, [dao.target, taskManager.target, distributor.target], { + initializer: 'initialize', + }); + await minter.waitForDeployment(); + console.log(`W3bstreamBlockMinter deployed to ${minter.target}`); tx = await dao.transferOwnership(minter.target); await tx.wait(); console.log(`W3bstreamDAO ownership transferred to ${minter.target}`); diff --git a/smartcontracts/test/W3bstreamMinter.ts b/smartcontracts/test/W3bstreamBlockMinter.ts similarity index 81% rename from smartcontracts/test/W3bstreamMinter.ts rename to smartcontracts/test/W3bstreamBlockMinter.ts index d457b165..3a900316 100644 --- a/smartcontracts/test/W3bstreamMinter.ts +++ b/smartcontracts/test/W3bstreamBlockMinter.ts @@ -6,14 +6,20 @@ describe('W3bstream Minter', function () { let minter; let dao; let tm; + let brd; const genesis = "0x0000000011111111222222223333333344444444555555556666666677777777"; beforeEach(async function () { - minter = await ethers.deployContract('W3bstreamMinter'); + minter = await ethers.deployContract('W3bstreamBlockMinter'); dao = await ethers.deployContract('W3bstreamDAO'); tm = await ethers.deployContract('W3bstreamTaskManager'); + brd = await ethers.deployContract('W3bstreamBlockRewardDistributor'); await dao.initialize(genesis); await tm.initialize(); - await minter.initialize(dao.getAddress(), tm.getAddress()); + await brd.initialize(); + await minter.initialize(dao.getAddress(), tm.getAddress(), brd.getAddress()); + // let tx = await minter.scrypt("0x000000020000000000000000000000000000000000000000000000000000000000000000ab04ea90eb7d931cbbaa94a11cb3907809c13262dd37acc526e4b4a628e43b111c7fffff00000089929df805"); + // console.log(tx); + // exit(0); await dao.transferOwnership(minter.getAddress()); await tm.addOperator(minter.getAddress()); }); @@ -37,7 +43,8 @@ describe('W3bstream Minter', function () { merkleRoot: merkleRoot, nbits: currentNBits, }; - const currentTarget = await minter.currentTarget(); + const nbits = await minter.currentNBits(); + const currentTarget = await minter.nbitsToTarget(nbits); for (let nonce = ethers.toBigInt("0x00000000013fbfd3"); nonce < ethers.toBigInt("0x0000010000000000"); nonce++) { let n = nonce.toString(16); while (n.length < 16) { From b886818c7ab5f2ba2f0fce219ca0f7092890c604 Mon Sep 17 00:00:00 2001 From: zhi Date: Thu, 26 Sep 2024 17:55:03 +0800 Subject: [PATCH 11/22] introduce scrypt hash --- smartcontracts/contracts/Scrypt.sol | 26 ++ .../contracts/W3bstreamBlockMinter.sol | 288 ++---------------- smartcontracts/scripts/deploy.ts | 6 +- smartcontracts/test/W3bstreamBlockMinter.ts | 28 +- 4 files changed, 59 insertions(+), 289 deletions(-) create mode 100644 smartcontracts/contracts/Scrypt.sol diff --git a/smartcontracts/contracts/Scrypt.sol b/smartcontracts/contracts/Scrypt.sol new file mode 100644 index 00000000..565488dd --- /dev/null +++ b/smartcontracts/contracts/Scrypt.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +contract Scrypt { + function hash( + bytes calldata password, + bytes calldata salt, + uint64 N, + uint32 r, + uint32 p, + uint32 keyLen, + uint32 mode + ) external view returns (bytes memory retval) { + bytes memory input = abi.encode(password, salt, N, r, p, keyLen, mode); + uint length = input.length; + retval = new bytes(keyLen); + assembly { + // free memory pointer + let success := staticcall(gas(), 0x8002, input, length, retval, keyLen) + switch success + case 0 { + revert(0x0, 0x0) + } + } + } +} \ No newline at end of file diff --git a/smartcontracts/contracts/W3bstreamBlockMinter.sol b/smartcontracts/contracts/W3bstreamBlockMinter.sol index 536d3a12..a6767bfa 100644 --- a/smartcontracts/contracts/W3bstreamBlockMinter.sol +++ b/smartcontracts/contracts/W3bstreamBlockMinter.sol @@ -16,6 +16,18 @@ interface IBlockRewardDistributor { function distribute(address recipient, uint256 amount) external; } +interface IScrypt { + function hash( + bytes calldata password, + bytes calldata salt, + uint64 N, + uint32 r, + uint32 p, + uint32 keyLen, + uint32 mode + ) external view returns (bytes memory); +} + struct BlockInfo { bytes4 meta; bytes32 prevhash; @@ -45,6 +57,7 @@ contract W3bstreamBlockMinter is OwnableUpgradeable { IDAO public dao; ITaskManager public taskManager; IBlockRewardDistributor public distributor; + IScrypt scrypt; uint256 public blockReward; uint256 public taskAllowance; @@ -63,11 +76,12 @@ contract W3bstreamBlockMinter is OwnableUpgradeable { uint256 private _durationNum; uint256 private _durationIndex; - function initialize(IDAO _dao, ITaskManager _taskManager, IBlockRewardDistributor _distributor) public initializer { + function initialize(IDAO _dao, ITaskManager _taskManager, IBlockRewardDistributor _distributor, IScrypt _scrypt) public initializer { __Ownable_init(); dao = _dao; taskManager = _taskManager; distributor = _distributor; + scrypt = _scrypt; _setBlockReward(1000000000000000000); _setTaskAllowance(720); _setTargetDuration(12); @@ -88,83 +102,16 @@ contract W3bstreamBlockMinter is OwnableUpgradeable { require(blockinfo.merkleRoot == keccak256(abi.encodePacked(coinbase.addr, coinbase.operator, coinbase.beneficiary)), "invalid merkle root"); // TODO: review target usage bytes memory header = abi.encodePacked(blockinfo.meta, blockinfo.prevhash, blockinfo.merkleRoot, blockinfo.nbits, blockinfo.nonce); - require(uint256(sha256(header)) < target, "invalid proof of work"); + bytes memory headerHash = scrypt.hash(header, header, 1024, 1, 1, 32, 224); + require(headerHash.length == 32, "invalid header hash"); + require(uint256(bytes32(headerHash)) <= target, "invalid proof of work"); bytes32 h = keccak256(abi.encode(header, assignments)); taskManager.assign(assignments, coinbase.beneficiary, block.number + taskAllowance); _updateTarget(tipTimestamp); dao.mint(h, block.number); distributor.distribute(coinbase.beneficiary, blockReward); } -/* - function scrypt(bytes calldata x) public pure returns (bytes32) { - require(x.length == 80, "invalid length"); - uint64 keyLen = 32; - bytes memory b = pbkdf2(x, x, 128); - // bytes memory b = pbkdf2_Key(x, x, 1, 128); - smix(b); - uint32 value = uint32(uint8(b[0])) << 24 | uint32(uint8(b[1])) << 16 | uint32(uint8(b[2])) << 8 | uint32(uint8(b[3])); - uint32 addend = 0xe0; - uint32 newValue = value + addend; - uint32 high17 = newValue >> 15; - uint32 low15 = newValue & 0x7fff; - uint32 result = (high17 << 15) | low15; - b[0] = bytes1(uint8(result >> 24)); - b[1] = bytes1(uint8(result >> 16)); - b[2] = bytes1(uint8(result >> 8)); - b[3] = bytes1(uint8(result)); - // return reverseArray(pbkdf2_Key(x, b, 1, keyLen)); - bytes memory reverse = reverseArray(pbkdf2(x, b, keyLen)); - bytes32 retval; - assembly { - retval := mload(add(reverse, 32)) - } - return retval; - } -*/ - function reverseArray(bytes memory b) public pure returns (bytes memory) { - bytes1 tmp; - for (uint i = 0; i < b.length / 2; i++) { - tmp = b[i]; - b[i] = b[b.length - i - 1]; - b[b.length - i - 1] = tmp; - } - return b; - } -/* - function pbkdf2_Key(bytes calldata x, bytes calldata salt, uint64 iter, uint64 keyLen) public pure returns (bytes memory) { - bytes32 h = sha256(x); - uint32 hashLen = 32; - uint64 numBlocks = 4; - bytes memory buf = new bytes(4); - bytes memory dk = new bytes(128); - for (uint i = 1; i <= numBlocks; i++) { - h = 0x6A09E667BB67AE853C6EF372A54FF53A510E527F9B05688C1F83D9AB5BE0CD19; - // h.Write(salt); - buf[0] = bytes1(uint8(i >> 24)); - buf[1] = bytes1(uint8(i >> 16)); - buf[2] = bytes1(uint8(i >> 8)); - buf[3] = bytes1(uint8(i)); - // h.Write(buf[:4]); - // dk = h.Sum(dk); - for (uint j = 0; j < iter; j++) { - // h.Reset(); - // h.Write(dk); - // dk = h.Sum(dk); - } - for (uint j = 0; j < hashLen; j++) { - dk[i * hashLen + j] = dk[j]; - } - // buf = sha256(abi.encodePacked(h, y)); - // dk[i] = buf; - } - bytes memory retval = new bytes(keyLen); - for (uint i = 0; i < keyLen; i++) { - retval[i] = dk[i]; - } - return retval; - } -*/ function setBlockReward(uint256 reward) public onlyOwner { _setBlockReward(reward); } @@ -263,203 +210,4 @@ contract W3bstreamBlockMinter is OwnableUpgradeable { return coefficient << (8 * (exponent - 3)); } -/* - function blockXOR(uint32[] memory dst, uint32[] memory src, uint256 offset, uint64 len) pure internal returns (uint32[] memory) { - for (uint i = 0; i < len; i++) { - dst[i] ^= src[i + offset]; - } - return dst; - } - - function integer(uint32[] memory b) pure internal returns (uint64) { - return uint64(b[16]) | uint64(b[17]) << 32; - } - - function salsaXOR(uint32[16] memory tmp, uint32[] memory input, uint offset) pure internal returns (uint32[16] memory output) { - uint32[16] memory z; - uint32[16] memory x; - for (uint i = 0; i < 16; i++) { - z[i] = tmp[i] ^ input[offset + i]; - x[i] = z[i]; - } - for (uint i = 0; i < 8; i += 2) { - unchecked { - uint32 u = x[0] + x[12]; - x[4] ^= u << 7 | u >> 25; - u = x[4] + x[0]; - x[8] ^= u << 9 | u >> 23; - u = x[8] + x[4]; - x[12] ^= u << 13 | u >> 19; - u = x[12] + x[8]; - x[0] ^= u << 18 | u >> 14; - - u = x[5] + x[1]; - x[9] ^= u << 7 | u >> 25; - u = x[9] + x[5]; - x[13] ^= u << 9 | u >> 23; - u = x[13] + x[9]; - x[1] ^= u << 13 | u >> 19; - u = x[1] + x[13]; - x[5] ^= u << 18 | u >> 14; - - u = x[10] + x[6]; - x[14] ^= u << 7 | u >> 25; - u = x[14] + x[10]; - x[2] ^= u << 9 | u >> 23; - u = x[2] + x[14]; - x[6] ^= u << 13 | u >> 19; - u = x[6] + x[2]; - x[10] ^= u << 18 | u >> 14; - - u = x[15] + x[11]; - x[3] ^= u << 7 | u >> 25; - u = x[3] + x[15]; - x[7] ^= u << 9 | u >> 23; - u = x[7] + x[3]; - x[11] ^= u << 13 | u >> 19; - u = x[11] + x[7]; - x[15] ^= u << 18 | u >> 14; - - u = x[0] + x[3]; - x[1] ^= u << 7 | u >> 25; - u = x[1] + x[0]; - x[2] ^= u << 9 | u >> 23; - u = x[2] + x[1]; - x[3] ^= u << 13 | u >> 19; - u = x[3] + x[2]; - x[0] ^= u << 18 | u >> 14; - - u = x[5] + x[4]; - x[6] ^= u << 7 | u >> 25; - u = x[6] + x[5]; - x[7] ^= u << 9 | u >> 23; - u = x[7] + x[6]; - x[4] ^= u << 13 | u >> 19; - u = x[4] + x[7]; - x[5] ^= u << 18 | u >> 14; - - u = x[10] + x[9]; - x[11] ^= u << 7 | u >> 25; - u = x[11] + x[10]; - x[8] ^= u << 9 | u >> 23; - u = x[8] + x[11]; - x[9] ^= u << 13 | u >> 19; - u = x[9] + x[8]; - x[10] ^= u << 18 | u >> 14; - - u = x[15] + x[14]; - x[12] ^= u << 7 | u >> 25; - u = x[12] + x[15]; - x[13] ^= u << 9 | u >> 23; - u = x[13] + x[12]; - x[14] ^= u << 13 | u >> 19; - u = x[14] + x[13]; - x[15] ^= u << 18 | u >> 14; - } - } - unchecked { - for (uint i = 0; i < 16; i++) { - x[i] += z[i]; - } - } - for (uint i = 0; i < 16; i++) { - output[i] = x[i]; - } - } - - function blockMix(uint32[16] memory tmp, uint32[] memory x) pure internal returns (uint32[16] memory, uint32[] memory) { - for (uint i = 0; i < 16; i++) { - tmp[i] = x[16 + i]; - } - uint32[] memory output = new uint32[](32); - uint32[16] memory v = salsaXOR(tmp, x, 0); - for (uint i = 0; i < 16; i++) { - tmp[i] = output[i]; - output[i] = v[i]; - } - - v = salsaXOR(tmp, x, 16); - for (uint i = 0; i < 16; i++) { - tmp[i] = output[16 + i]; - output[16 + i] = v[i]; - } - - return (tmp, output); - } - - function smix(bytes memory b) pure internal returns (bytes memory) { - uint32[16] memory tmp; - uint32[] memory x = new uint32[](32); - uint32[] memory y = new uint32[](32); - uint32[] memory v = new uint32[](32 * 1024); - - uint j = 0; - for (uint i = 0; i < 32; i++) { - x[i] = uint32(uint8(b[j])) | uint32(uint8(b[j+1]))<<8 | uint32(uint8(b[j+2]))<<16 | uint32(uint8(b[j+3]))<<24; - j += 4; - } - for (uint i = 0; i < 1024; i += 2) { - for (uint k = 0; k < 32; k++) { - v[i * 32 + k] = x[k]; - } - (tmp, y) = blockMix(tmp, x); - for (uint k = 0; k < 32; k++) { - v[(i + 1) * 32 + k] = y[k]; - } - (tmp, x) = blockMix(tmp, y); - } - for (uint i = 0; i < 1024; i += 2) { - j = uint32(integer(x) & uint64(1023)); - blockXOR(x, v, j * 32, 32); - (tmp, y) = blockMix(tmp, x); - j = uint32(integer(y) & uint64(1023)); - blockXOR(y, v, j * 32, 32); - (tmp, x) = blockMix(tmp, y); - } - j = 0; - for (uint i = 0; i < 32; i++) { - b[j + 0] = bytes1(uint8(x[i] >> 0)); - b[j + 1] = bytes1(uint8(x[i] >> 8)); - b[j + 2] = bytes1(uint8(x[i] >> 16)); - b[j + 3] = bytes1(uint8(x[i] >> 24)); - j += 4; - } - - return b; - } - - function hmacsha256(bytes calldata key, bytes memory message) pure public returns (bytes32) { - bytes32 keyl; - bytes32 keyr; - uint i; - if (key.length > 64) { - keyl = sha256(key); - } else { - for (i = 0; i < key.length && i < 32; i++) - keyl |= bytes32(uint256(uint8(key[i])) * 2**(8 * (31 - i))); - for (i = 32; i < key.length && i < 64; i++) - keyr |= bytes32(uint256(uint8(key[i])) * 2**(8 * (63 - i))); - } - bytes32 threesix = 0x3636363636363636363636363636363636363636363636363636363636363636; - bytes32 fivec = 0x5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c; - return sha256(abi.encode(fivec ^ keyl, fivec ^ keyr, sha256(abi.encode(threesix ^ keyl, threesix ^ keyr, message)))); - } - - function pbkdf2(bytes calldata k, bytes memory salt, uint dklen) public pure returns (bytes memory) { - bytes memory m = new bytes(salt.length + 4); - for (uint i = 0; i < salt.length; i++) { - m[i] = salt[i]; - } - bytes32[4] memory r; - for (uint i = 0; i * 32 < dklen; i++) { - m[m.length - 1] = bytes1(uint8(i + 1)); - r[i] = hmacsha256(k, m); - } - bytes memory retval = new bytes(dklen); - for (uint i = 0; i < dklen; i++) { - retval[i] = r[i / 32][i % 32]; - } - return retval; - } -*/ } diff --git a/smartcontracts/scripts/deploy.ts b/smartcontracts/scripts/deploy.ts index 2973c8e1..249140c8 100644 --- a/smartcontracts/scripts/deploy.ts +++ b/smartcontracts/scripts/deploy.ts @@ -131,8 +131,12 @@ async function main() { await distributor.waitForDeployment(); console.log(`W3bstreamBlockRewardDistributor deployed to ${distributor.target}`); + const scrypt = await ethers.deployContract('Scrypt'); + await scrypt.waitForDeployment(); + console.log(`Scrypt deployed to ${scrypt.target}`); + const W3bstreamBlockMinter = await ethers.getContractFactory('W3bstreamBlockMinter'); - const minter = await upgrades.deployProxy(W3bstreamBlockMinter, [dao.target, taskManager.target, distributor.target], { + const minter = await upgrades.deployProxy(W3bstreamBlockMinter, [dao.target, taskManager.target, distributor.target, scrypt.target], { initializer: 'initialize', }); await minter.waitForDeployment(); diff --git a/smartcontracts/test/W3bstreamBlockMinter.ts b/smartcontracts/test/W3bstreamBlockMinter.ts index 3a900316..64367d53 100644 --- a/smartcontracts/test/W3bstreamBlockMinter.ts +++ b/smartcontracts/test/W3bstreamBlockMinter.ts @@ -7,16 +7,18 @@ describe('W3bstream Minter', function () { let dao; let tm; let brd; - const genesis = "0x0000000011111111222222223333333344444444555555556666666677777777"; + let scrypt; + const genesis = "0x0000000000000000000000000000000000000000000000000000000000000000"; beforeEach(async function () { minter = await ethers.deployContract('W3bstreamBlockMinter'); dao = await ethers.deployContract('W3bstreamDAO'); tm = await ethers.deployContract('W3bstreamTaskManager'); brd = await ethers.deployContract('W3bstreamBlockRewardDistributor'); + scrypt = await ethers.deployContract('Scrypt'); await dao.initialize(genesis); await tm.initialize(); await brd.initialize(); - await minter.initialize(dao.getAddress(), tm.getAddress(), brd.getAddress()); + await minter.initialize(dao.getAddress(), tm.getAddress(), brd.getAddress(), scrypt.getAddress()); // let tx = await minter.scrypt("0x000000020000000000000000000000000000000000000000000000000000000000000000ab04ea90eb7d931cbbaa94a11cb3907809c13262dd37acc526e4b4a628e43b111c7fffff00000089929df805"); // console.log(tx); // exit(0); @@ -42,25 +44,15 @@ describe('W3bstream Minter', function () { prevhash: genesis, merkleRoot: merkleRoot, nbits: currentNBits, + nonce: "0x0000000000000000", }; const nbits = await minter.currentNBits(); const currentTarget = await minter.nbitsToTarget(nbits); - for (let nonce = ethers.toBigInt("0x00000000013fbfd3"); nonce < ethers.toBigInt("0x0000010000000000"); nonce++) { - let n = nonce.toString(16); - while (n.length < 16) { - n = "0" + n; - } - const h = ethers.toBigInt(ethers.solidityPackedSha256(["bytes4", "bytes32", "bytes32", "uint32", "bytes8"], [blockinfo.meta, blockinfo.prevhash, blockinfo.merkleRoot, blockinfo.nbits, "0x" + n])); - if (h < currentTarget) { - blockinfo.nonce = "0x" + n; - await minter.connect(sequencer).mint( - blockinfo, - coinbase, - [], - ); - break; - } - } + await minter.connect(sequencer).mint( + blockinfo, + coinbase, + [], + ); tipinfo = await dao.tip(); expect(tipinfo[0]).to.equal(1); await expect(minter.connect(sequencer).mint( From adb0046b50fcb229d0cf51bf6f46f73c8314ce6b Mon Sep 17 00:00:00 2001 From: zhi Date: Fri, 27 Sep 2024 10:27:55 +0800 Subject: [PATCH 12/22] implement scrypt precompiled contract --- smartcontracts/contracts/Scrypt.sol | 15 ++++++++++----- smartcontracts/contracts/W3bstreamBlockMinter.sol | 4 ++-- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/smartcontracts/contracts/Scrypt.sol b/smartcontracts/contracts/Scrypt.sol index 565488dd..4fe42036 100644 --- a/smartcontracts/contracts/Scrypt.sol +++ b/smartcontracts/contracts/Scrypt.sol @@ -13,14 +13,19 @@ contract Scrypt { ) external view returns (bytes memory retval) { bytes memory input = abi.encode(password, salt, N, r, p, keyLen, mode); uint length = input.length; - retval = new bytes(keyLen); assembly { - // free memory pointer - let success := staticcall(gas(), 0x8002, input, length, retval, keyLen) - switch success - case 0 { + if iszero(staticcall(gas(), 0x8002, add(input, 0x20), length, 0, 0)) { revert(0x0, 0x0) } + if iszero(eq(returndatasize(), keyLen)) { + revert(0x0, 0x0) + } + mstore(retval, returndatasize()) // Store the length. + let o := add(retval, 0x20) + returndatacopy(o, 0x00, returndatasize()) // Copy the returndata. + mstore(0x40, add(o, returndatasize())) // Allocate the memory. } + + return retval; } } \ No newline at end of file diff --git a/smartcontracts/contracts/W3bstreamBlockMinter.sol b/smartcontracts/contracts/W3bstreamBlockMinter.sol index a6767bfa..223e4ef5 100644 --- a/smartcontracts/contracts/W3bstreamBlockMinter.sol +++ b/smartcontracts/contracts/W3bstreamBlockMinter.sol @@ -99,9 +99,9 @@ contract W3bstreamBlockMinter is OwnableUpgradeable { (, bytes32 tiphash, uint256 tipTimestamp) = dao.tip(); require(tipTimestamp != block.number); require(blockinfo.prevhash == tiphash, "invalid prevhash"); - require(blockinfo.merkleRoot == keccak256(abi.encodePacked(coinbase.addr, coinbase.operator, coinbase.beneficiary)), "invalid merkle root"); + require(blockinfo.merkleRoot == keccak256(abi.encode(coinbase.addr, coinbase.operator, coinbase.beneficiary)), "invalid merkle root"); // TODO: review target usage - bytes memory header = abi.encodePacked(blockinfo.meta, blockinfo.prevhash, blockinfo.merkleRoot, blockinfo.nbits, blockinfo.nonce); + bytes memory header = abi.encode(blockinfo.meta, blockinfo.prevhash, blockinfo.merkleRoot, blockinfo.nbits, blockinfo.nonce); bytes memory headerHash = scrypt.hash(header, header, 1024, 1, 1, 32, 224); require(headerHash.length == 32, "invalid header hash"); require(uint256(bytes32(headerHash)) <= target, "invalid proof of work"); From ed4209b87cb1168d106f9eddae7ca442ab5a49c1 Mon Sep 17 00:00:00 2001 From: zhi Date: Fri, 27 Sep 2024 15:30:04 +0800 Subject: [PATCH 13/22] emit events and receive coin --- .../contracts/W3bstreamBlockRewardDistributor.sol | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/smartcontracts/contracts/W3bstreamBlockRewardDistributor.sol b/smartcontracts/contracts/W3bstreamBlockRewardDistributor.sol index b99c8cb3..398cd0e8 100644 --- a/smartcontracts/contracts/W3bstreamBlockRewardDistributor.sol +++ b/smartcontracts/contracts/W3bstreamBlockRewardDistributor.sol @@ -4,6 +4,9 @@ pragma solidity ^0.8.19; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; contract W3bstreamBlockRewardDistributor is OwnableUpgradeable { + event Distributed(address indexed recipient, uint256 amount); + event OperatorSet(address indexed operator); + event Topup(uint256 amount); address public operator; modifier onlyOperator() { @@ -11,16 +14,28 @@ contract W3bstreamBlockRewardDistributor is OwnableUpgradeable { _; } + receive() external payable { + emit Topup(msg.value); + } + function initialize() public initializer { __Ownable_init(); } function setOperator(address _operator) public onlyOwner { operator = _operator; + emit OperatorSet(_operator); } function distribute(address recipient, uint256 amount) public onlyOperator { + if (amount == 0) { + return; + } + if (amount > address(this).balance) { + revert("insufficient balance"); + } (bool success, ) = recipient.call{value: amount}(""); require(success, "transfer failed"); + emit Distributed(recipient, amount); } } From 399e1b7956158de6da62beb7d75e3c874617cc45 Mon Sep 17 00:00:00 2001 From: zhi Date: Fri, 27 Sep 2024 15:35:18 +0800 Subject: [PATCH 14/22] allow owner to withdraw --- .../contracts/W3bstreamBlockRewardDistributor.sol | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/smartcontracts/contracts/W3bstreamBlockRewardDistributor.sol b/smartcontracts/contracts/W3bstreamBlockRewardDistributor.sol index 398cd0e8..0ecc74a9 100644 --- a/smartcontracts/contracts/W3bstreamBlockRewardDistributor.sol +++ b/smartcontracts/contracts/W3bstreamBlockRewardDistributor.sol @@ -5,6 +5,7 @@ import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/Own contract W3bstreamBlockRewardDistributor is OwnableUpgradeable { event Distributed(address indexed recipient, uint256 amount); + event Withdrawn(uint256 amount); event OperatorSet(address indexed operator); event Topup(uint256 amount); address public operator; @@ -38,4 +39,11 @@ contract W3bstreamBlockRewardDistributor is OwnableUpgradeable { require(success, "transfer failed"); emit Distributed(recipient, amount); } + + function withdraw(uint256 amount) public onlyOwner { + require(amount <= address(this).balance, "insufficient balance"); + (bool success, ) = msg.sender.call{value: amount}(""); + require(success, "transfer failed"); + emit Withdrawn(amount); + } } From 8aa6d1258bfcaf5e8a62e65f7e854037878663d0 Mon Sep 17 00:00:00 2001 From: zhi Date: Mon, 30 Sep 2024 10:46:45 +0800 Subject: [PATCH 15/22] fix encode bug --- smartcontracts/contracts/W3bstreamBlockMinter.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smartcontracts/contracts/W3bstreamBlockMinter.sol b/smartcontracts/contracts/W3bstreamBlockMinter.sol index 223e4ef5..88d19711 100644 --- a/smartcontracts/contracts/W3bstreamBlockMinter.sol +++ b/smartcontracts/contracts/W3bstreamBlockMinter.sol @@ -101,7 +101,7 @@ contract W3bstreamBlockMinter is OwnableUpgradeable { require(blockinfo.prevhash == tiphash, "invalid prevhash"); require(blockinfo.merkleRoot == keccak256(abi.encode(coinbase.addr, coinbase.operator, coinbase.beneficiary)), "invalid merkle root"); // TODO: review target usage - bytes memory header = abi.encode(blockinfo.meta, blockinfo.prevhash, blockinfo.merkleRoot, blockinfo.nbits, blockinfo.nonce); + bytes memory header = abi.encodePacked(blockinfo.meta, blockinfo.prevhash, blockinfo.merkleRoot, blockinfo.nbits, blockinfo.nonce); bytes memory headerHash = scrypt.hash(header, header, 1024, 1, 1, 32, 224); require(headerHash.length == 32, "invalid header hash"); require(uint256(bytes32(headerHash)) <= target, "invalid proof of work"); From fa85c49f85c3e69f031422cec36c311b6924ed8b Mon Sep 17 00:00:00 2001 From: zhi Date: Mon, 30 Sep 2024 10:48:37 +0800 Subject: [PATCH 16/22] update default nbits --- smartcontracts/contracts/W3bstreamBlockMinter.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smartcontracts/contracts/W3bstreamBlockMinter.sol b/smartcontracts/contracts/W3bstreamBlockMinter.sol index 88d19711..9f6c860e 100644 --- a/smartcontracts/contracts/W3bstreamBlockMinter.sol +++ b/smartcontracts/contracts/W3bstreamBlockMinter.sol @@ -85,7 +85,7 @@ contract W3bstreamBlockMinter is OwnableUpgradeable { _setBlockReward(1000000000000000000); _setTaskAllowance(720); _setTargetDuration(12); - _setAdhocNBits(0x0f7fffff); + _setAdhocNBits(0x1c7fffff); } function mint( From 832d54d4b85ae69add208d1524eada111bb328ec Mon Sep 17 00:00:00 2001 From: huangzhiran Date: Mon, 30 Sep 2024 18:11:10 +0800 Subject: [PATCH 17/22] fix taskManager type, set distributor operator, set blockReward --- smartcontracts/contracts/W3bstreamBlockMinter.sol | 1 + smartcontracts/hardhat.config.ts | 4 ++++ smartcontracts/scripts/deploy.ts | 8 ++++++++ 3 files changed, 13 insertions(+) diff --git a/smartcontracts/contracts/W3bstreamBlockMinter.sol b/smartcontracts/contracts/W3bstreamBlockMinter.sol index 9f6c860e..df295a2a 100644 --- a/smartcontracts/contracts/W3bstreamBlockMinter.sol +++ b/smartcontracts/contracts/W3bstreamBlockMinter.sol @@ -45,6 +45,7 @@ struct Sequencer { struct TaskAssignment { uint256 projectId; bytes32 taskId; + bytes32 hash; address prover; } diff --git a/smartcontracts/hardhat.config.ts b/smartcontracts/hardhat.config.ts index d0692ba5..20be3f68 100644 --- a/smartcontracts/hardhat.config.ts +++ b/smartcontracts/hardhat.config.ts @@ -17,6 +17,10 @@ const config: HardhatUserConfig = { url: 'http://127.0.0.1:8545', accounts: accounts, }, + nightly: { + url: 'https://babel-nightly.iotex.io', + accounts: accounts, + }, mainnet: { url: 'https://babel-api.mainnet.iotex.io/', accounts: accounts, diff --git a/smartcontracts/scripts/deploy.ts b/smartcontracts/scripts/deploy.ts index 249140c8..d66f6a7b 100644 --- a/smartcontracts/scripts/deploy.ts +++ b/smartcontracts/scripts/deploy.ts @@ -148,6 +148,14 @@ async function main() { tx = await taskManager.addOperator(minter.target); await tx.wait(); console.log(`W3bstreamTaskManager add operator to ${minter.target}`); + + tx = await distributor.setOperator(minter.target); + await tx.wait(); + console.log(`W3bstreamBlockRewardDistributor set operator to ${minter.target}`); + + tx = await minter.setBlockReward(0); + await tx.wait(); + console.log(`W3bstreamBlockMinter set block reward to 0`); } main().catch(err => { From b2dbab9b6153faa25b994081b7cd9320833aaf6c Mon Sep 17 00:00:00 2001 From: zhi Date: Tue, 1 Oct 2024 23:16:58 +0800 Subject: [PATCH 18/22] add block header validator and fix unit test --- .../W3bstreamBlockHeaderValidator.sol | 128 ++++++++++++++ .../contracts/W3bstreamBlockMinter.sol | 160 ++---------------- .../contracts/W3bstreamTaskManager.sol | 10 +- .../interfaces/IBlockHeaderValidator.sol | 27 +++ .../contracts/interfaces/ITaskManager.sol | 13 ++ smartcontracts/contracts/test/MockScrypt.sol | 24 +++ smartcontracts/scripts/deploy.ts | 14 +- smartcontracts/test/W3bstreamBlockMinter.ts | 29 ++-- 8 files changed, 238 insertions(+), 167 deletions(-) create mode 100644 smartcontracts/contracts/W3bstreamBlockHeaderValidator.sol create mode 100644 smartcontracts/contracts/interfaces/IBlockHeaderValidator.sol create mode 100644 smartcontracts/contracts/interfaces/ITaskManager.sol create mode 100644 smartcontracts/contracts/test/MockScrypt.sol diff --git a/smartcontracts/contracts/W3bstreamBlockHeaderValidator.sol b/smartcontracts/contracts/W3bstreamBlockHeaderValidator.sol new file mode 100644 index 00000000..dff1c55e --- /dev/null +++ b/smartcontracts/contracts/W3bstreamBlockHeaderValidator.sol @@ -0,0 +1,128 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; +import {BlockHeader, IBlockHeaderValidator, IScrypt} from "./interfaces/IBlockHeaderValidator.sol"; + +contract W3bstreamBlockHeaderValidator is IBlockHeaderValidator, Ownable { + event OperatorSet(address operator); + event TargetDurationSet(uint256 duration); + event NBitsSet(uint32 nbits); + + uint32 public constant MAX_EXPONENT = 0x1c; + uint32 public constant UPPER_BOUND = 0xffff00; + uint32 public constant LOWER_BOUND = 0x8000; + // uint256 public constant MAX_TARGET = 0x00000000ffff0000000000000000000000000000000000000000000000000000; + + address public operator; + IScrypt public scrypt; + uint256 public targetDuration; + uint32 public currentNBits; + bool public useAdhocNBits; + + uint256 private _currentTarget; + uint256[10] private _durations; + uint256 private _durationSum; + uint256 private _durationNum; + uint256 private _durationIndex; + + constructor(IScrypt _scrypt) Ownable() { + scrypt = _scrypt; + _setTargetDuration(12); + _setAdhocNBits(0x1c7fffff); + } + + function validate(BlockHeader calldata header) public view returns (bytes memory) { + require(header.nbits == currentNBits, "invalid nbits"); + bytes memory encodedHeader = abi.encodePacked(header.meta, header.prevhash, header.merkleRoot, header.nbits, header.nonce); + bytes memory headerHash = scrypt.hash(encodedHeader, encodedHeader, 1024, 1, 1, 32, 224); + require(headerHash.length == 32, "invalid header hash length"); + require(uint256(bytes32(headerHash)) <= _currentTarget, "invalid proof of work"); + return encodedHeader; + } + + function setOperator(address _operator) public onlyOwner { + operator = _operator; + emit OperatorSet(_operator); + } + + function setTargetDuration(uint256 duration) public onlyOwner { + _setTargetDuration(duration); + } + + function _setTargetDuration(uint256 duration) internal { + targetDuration = duration; + emit TargetDurationSet(duration); + } + + function setAdhocNBits(uint32 nbits) public onlyOwner { + _setAdhocNBits(nbits); + } + + function _setAdhocNBits(uint32 nbits) internal { + if (nbits == 0) { + useAdhocNBits = false; + return; + } + _setNBits(nbits); + useAdhocNBits = true; + } + + function updateDuration(uint256 duration) public { + require(msg.sender == operator, "not operator"); + _durationSum += duration - _durations[_durationIndex]; + _durations[_durationIndex] = duration; + _durationIndex = (_durationIndex + 1) % _durations.length; + if (_durationNum < _durations.length) { + _durationNum++; + return; + } + if (useAdhocNBits) { + return; + } + uint32 nbits = uint32(currentNBits); + uint32 next = _nextNBits(nbits, targetDuration * _durationNum, _durationSum); + if (next != nbits) { + _setNBits(next); + } + } + + function _nextNBits(uint32 nbits, uint256 expectedSum, uint256 sum) internal pure returns (uint32) { + if (sum * 5 > expectedSum * 6) { + (uint32 exponent, uint32 coefficient) = decodeNBits(nbits); + if (coefficient < UPPER_BOUND) { + return (exponent << 24) | uint32(coefficient + 1); + } + if (exponent < MAX_EXPONENT) { + return ((exponent + 1) << 24) | LOWER_BOUND; + } + } else if (expectedSum * 4 > sum * 5) { + (uint32 exponent, uint32 coefficient) = decodeNBits(nbits); + if (coefficient > LOWER_BOUND) { + return (exponent << 24) | uint32(coefficient - 1); + } + if (exponent > 0) { + return ((exponent - 1) << 24) | UPPER_BOUND; + } + } + return nbits; + } + + function _setNBits(uint32 nbits) internal { + uint256 target = nbitsToTarget(nbits); + currentNBits = nbits; + _currentTarget = target; + emit NBitsSet(nbits); + } + + function decodeNBits(uint32 nbits) internal pure returns (uint32, uint32) { + return (nbits >> 24, nbits & 0x00ffffff); + } + + function nbitsToTarget(uint32 nbits) public pure returns (uint256) { + (uint32 exponent, uint256 coefficient) = decodeNBits(nbits); + require(exponent <= MAX_EXPONENT, "invalid nbits"); + require(coefficient >= LOWER_BOUND && coefficient <= UPPER_BOUND, "invalid nbits"); + return coefficient << (8 * (exponent - 3)); + } +} diff --git a/smartcontracts/contracts/W3bstreamBlockMinter.sol b/smartcontracts/contracts/W3bstreamBlockMinter.sol index df295a2a..4cad88ce 100644 --- a/smartcontracts/contracts/W3bstreamBlockMinter.sol +++ b/smartcontracts/contracts/W3bstreamBlockMinter.sol @@ -2,55 +2,26 @@ pragma solidity ^0.8.19; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import {BlockHeader, IBlockHeaderValidator} from "./interfaces/IBlockHeaderValidator.sol"; +import {ITaskManager, TaskAssignment} from "./interfaces/ITaskManager.sol"; interface IDAO { function tip() external view returns (uint256, bytes32, uint256); function mint(bytes32 hash, uint256 timestamp) external; } -interface ITaskManager { - function assign(TaskAssignment[] calldata assignments, address sequencer, uint256 deadline) external; -} - interface IBlockRewardDistributor { function distribute(address recipient, uint256 amount) external; } -interface IScrypt { - function hash( - bytes calldata password, - bytes calldata salt, - uint64 N, - uint32 r, - uint32 p, - uint32 keyLen, - uint32 mode - ) external view returns (bytes memory); -} - -struct BlockInfo { - bytes4 meta; - bytes32 prevhash; - bytes32 merkleRoot; - uint32 nbits; - bytes8 nonce; -} - struct Sequencer { address addr; address operator; address beneficiary; } -struct TaskAssignment { - uint256 projectId; - bytes32 taskId; - bytes32 hash; - address prover; -} - contract W3bstreamBlockMinter is OwnableUpgradeable { - event BlockRewardfSet(uint256 reward); + event BlockRewardSet(uint256 reward); event TaskAllowanceSet(uint256 allowance); event TargetDurationSet(uint256 duration); event NBitsSet(uint32 nbits); @@ -58,58 +29,36 @@ contract W3bstreamBlockMinter is OwnableUpgradeable { IDAO public dao; ITaskManager public taskManager; IBlockRewardDistributor public distributor; - IScrypt scrypt; + IBlockHeaderValidator public headerValidator; uint256 public blockReward; uint256 public taskAllowance; - uint256 public targetDuration; - bool public useAdhocNBits; - uint32 public currentNBits; - - uint32 private constant MAX_EXPONENT = 0x1c; - uint32 private constant UPPER_BOUND = 0xffff00; - uint32 private constant LOWER_BOUND = 0x8000; - uint256 private constant MAX_TARGET = 0x00000000ffff0000000000000000000000000000000000000000000000000000; - - uint256 private _currentTarget; - uint256[10] private _durations; - uint256 private _durationSum; - uint256 private _durationNum; - uint256 private _durationIndex; - function initialize(IDAO _dao, ITaskManager _taskManager, IBlockRewardDistributor _distributor, IScrypt _scrypt) public initializer { + function initialize(IDAO _dao, ITaskManager _taskManager, IBlockRewardDistributor _distributor, IBlockHeaderValidator _headerValidator) public initializer { __Ownable_init(); dao = _dao; taskManager = _taskManager; distributor = _distributor; - scrypt = _scrypt; + headerValidator = _headerValidator; _setBlockReward(1000000000000000000); _setTaskAllowance(720); - _setTargetDuration(12); - _setAdhocNBits(0x1c7fffff); } function mint( - BlockInfo calldata blockinfo, + BlockHeader calldata header, Sequencer calldata coinbase, TaskAssignment[] calldata assignments ) public { require(coinbase.operator == msg.sender, "invalid operator"); - uint256 target = nbitsToTarget(blockinfo.nbits); - require(target == _currentTarget, "invalid nbits"); (, bytes32 tiphash, uint256 tipTimestamp) = dao.tip(); require(tipTimestamp != block.number); - require(blockinfo.prevhash == tiphash, "invalid prevhash"); - require(blockinfo.merkleRoot == keccak256(abi.encode(coinbase.addr, coinbase.operator, coinbase.beneficiary)), "invalid merkle root"); - // TODO: review target usage - bytes memory header = abi.encodePacked(blockinfo.meta, blockinfo.prevhash, blockinfo.merkleRoot, blockinfo.nbits, blockinfo.nonce); - bytes memory headerHash = scrypt.hash(header, header, 1024, 1, 1, 32, 224); - require(headerHash.length == 32, "invalid header hash"); - require(uint256(bytes32(headerHash)) <= target, "invalid proof of work"); - bytes32 h = keccak256(abi.encode(header, assignments)); + require(header.prevhash == tiphash, "invalid prevhash"); + require(header.merkleRoot == keccak256(abi.encode(coinbase.addr, coinbase.operator, coinbase.beneficiary)), "invalid merkle root"); + bytes memory encodedHeader = headerValidator.validate(header); + bytes32 blockHash = keccak256(abi.encode(encodedHeader, assignments)); taskManager.assign(assignments, coinbase.beneficiary, block.number + taskAllowance); - _updateTarget(tipTimestamp); - dao.mint(h, block.number); + headerValidator.updateDuration(block.number - tipTimestamp); + dao.mint(blockHash, block.number); distributor.distribute(coinbase.beneficiary, blockReward); } @@ -119,7 +68,7 @@ contract W3bstreamBlockMinter is OwnableUpgradeable { function _setBlockReward(uint256 reward) internal { blockReward = reward; - emit BlockRewardfSet(reward); + emit BlockRewardSet(reward); } function setTaskAllowance(uint256 allowance) public onlyOwner { @@ -130,85 +79,4 @@ contract W3bstreamBlockMinter is OwnableUpgradeable { taskAllowance = allowance; emit TaskAllowanceSet(allowance); } - - function setTargetDuration(uint256 duration) public onlyOwner { - _setTargetDuration(duration); - } - - function _setTargetDuration(uint256 duration) internal { - targetDuration = duration; - emit TargetDurationSet(duration); - } - - function setAdhocNBits(uint32 nbits) public onlyOwner { - _setAdhocNBits(nbits); - } - - function _setAdhocNBits(uint32 nbits) internal { - if (nbits == 0) { - useAdhocNBits = false; - return; - } - _setNBits(nbits); - useAdhocNBits = true; - } - - function _updateTarget(uint256 tipTimestamp) internal { - uint256 duration = block.number - tipTimestamp; - _durationSum += duration - _durations[_durationIndex]; - _durations[_durationIndex] = duration; - _durationIndex = (_durationIndex + 1) % _durations.length; - if (_durationNum < _durations.length) { - _durationNum++; - return; - } - if (useAdhocNBits) { - return; - } - uint32 nbits = uint32(currentNBits); - uint32 next = _nextNBits(nbits, targetDuration * _durationNum, _durationSum); - if (next != nbits) { - _setNBits(next); - } - } - - function _nextNBits(uint32 nbits, uint256 expectedSum, uint256 sum) internal pure returns (uint32) { - if (sum * 5 > expectedSum * 6) { - (uint32 exponent, uint32 coefficient) = decodeNBits(nbits); - if (coefficient < UPPER_BOUND) { - return (exponent << 24) | uint32(coefficient + 1); - } - if (exponent < MAX_EXPONENT) { - return ((exponent + 1) << 24) | LOWER_BOUND; - } - } else if (expectedSum * 4 > sum * 5) { - (uint32 exponent, uint32 coefficient) = decodeNBits(nbits); - if (coefficient > LOWER_BOUND) { - return (exponent << 24) | uint32(coefficient - 1); - } - if (exponent > 0) { - return ((exponent - 1) << 24) | UPPER_BOUND; - } - } - return nbits; - } - - function _setNBits(uint32 nbits) internal { - uint256 target = nbitsToTarget(nbits); - currentNBits = nbits; - _currentTarget = target; - emit NBitsSet(nbits); - } - - function decodeNBits(uint32 nbits) internal pure returns (uint32, uint32) { - return (nbits >> 24, nbits & 0x00ffffff); - } - - function nbitsToTarget(uint32 nbits) public pure returns (uint256) { - (uint32 exponent, uint256 coefficient) = decodeNBits(nbits); - require(exponent <= MAX_EXPONENT, "invalid nbits"); - require(coefficient >= LOWER_BOUND && coefficient <= UPPER_BOUND, "invalid nbits"); - return coefficient << (8 * (exponent - 3)); - } - } diff --git a/smartcontracts/contracts/W3bstreamTaskManager.sol b/smartcontracts/contracts/W3bstreamTaskManager.sol index 72c84f34..289654c9 100644 --- a/smartcontracts/contracts/W3bstreamTaskManager.sol +++ b/smartcontracts/contracts/W3bstreamTaskManager.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.19; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import {ITaskManager, TaskAssignment} from "./interfaces/ITaskManager.sol"; struct Record { bytes32 hash; @@ -13,13 +14,6 @@ struct Record { bool settled; } -struct TaskAssignment { - uint256 projectId; - bytes32 taskId; - bytes32 hash; - address prover; -} - /* interface IDebits { function withhold(uint256 id, address owner, uint256 amount) external; @@ -27,7 +21,7 @@ interface IDebits { function distribute(uint256 id, address owner, address[] calldata recipients, uint256[] calldata amounts) external; } */ -contract W3bstreamTaskManager is OwnableUpgradeable { +contract W3bstreamTaskManager is OwnableUpgradeable, ITaskManager { event TaskAssigned(uint256 indexed projectId, bytes32 indexed taskId, address indexed prover, uint256 deadline); event TaskSettled(uint256 indexed projectId, bytes32 indexed taskId, address prover); event OperatorAdded(address operator); diff --git a/smartcontracts/contracts/interfaces/IBlockHeaderValidator.sol b/smartcontracts/contracts/interfaces/IBlockHeaderValidator.sol new file mode 100644 index 00000000..f77e1e8a --- /dev/null +++ b/smartcontracts/contracts/interfaces/IBlockHeaderValidator.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +interface IBlockHeaderValidator { + function validate(BlockHeader calldata header) external view returns (bytes memory); + function updateDuration(uint256 duration) external; +} + +interface IScrypt { + function hash( + bytes calldata password, + bytes calldata salt, + uint64 N, + uint32 r, + uint32 p, + uint32 keyLen, + uint32 mode + ) external view returns (bytes memory); +} + +struct BlockHeader { + bytes4 meta; + bytes32 prevhash; + bytes32 merkleRoot; + uint32 nbits; + bytes8 nonce; +} diff --git a/smartcontracts/contracts/interfaces/ITaskManager.sol b/smartcontracts/contracts/interfaces/ITaskManager.sol new file mode 100644 index 00000000..bf356c56 --- /dev/null +++ b/smartcontracts/contracts/interfaces/ITaskManager.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +interface ITaskManager { + function assign(TaskAssignment[] calldata assignments, address sequencer, uint256 deadline) external; +} + +struct TaskAssignment { + uint256 projectId; + bytes32 taskId; + bytes32 hash; + address prover; +} diff --git a/smartcontracts/contracts/test/MockScrypt.sol b/smartcontracts/contracts/test/MockScrypt.sol new file mode 100644 index 00000000..ba68afe4 --- /dev/null +++ b/smartcontracts/contracts/test/MockScrypt.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import {IScrypt} from "../interfaces/IBlockHeaderValidator.sol"; + +contract MockScrypt { + bytes public _hashValue; + + function setHash(bytes memory _hash) public { + _hashValue = _hash; + } + + function hash( + bytes calldata, + bytes calldata, + uint64, + uint32, + uint32, + uint32, + uint32 + ) external view returns (bytes memory retval) { + return _hashValue; + } +} \ No newline at end of file diff --git a/smartcontracts/scripts/deploy.ts b/smartcontracts/scripts/deploy.ts index d66f6a7b..eb777385 100644 --- a/smartcontracts/scripts/deploy.ts +++ b/smartcontracts/scripts/deploy.ts @@ -135,8 +135,12 @@ async function main() { await scrypt.waitForDeployment(); console.log(`Scrypt deployed to ${scrypt.target}`); + const headerValidator = await ethers.deployContract('W3bstreamBlockHeaderValidator', [scrypt.target]); + await headerValidator.waitForDeployment(); + console.log(`W3bstreamBlockHeaderValidator deployed to ${headerValidator.target}`); + const W3bstreamBlockMinter = await ethers.getContractFactory('W3bstreamBlockMinter'); - const minter = await upgrades.deployProxy(W3bstreamBlockMinter, [dao.target, taskManager.target, distributor.target, scrypt.target], { + const minter = await upgrades.deployProxy(W3bstreamBlockMinter, [dao.target, taskManager.target, distributor.target, headerValidator.target], { initializer: 'initialize', }); await minter.waitForDeployment(); @@ -145,6 +149,14 @@ async function main() { await tx.wait(); console.log(`W3bstreamDAO ownership transferred to ${minter.target}`); + tx = await headerValidator.setOperator(minter.target); + await tx.wait(); + console.log(`W3bstreamBlockHeaderValidator add operator to ${minter.target}`); + + tx = await distributor.setOperator(minter.target); + await tx.wait(); + console.log(`W3bstreamBlockRewardDistributor add operator to ${minter.target}`); + tx = await taskManager.addOperator(minter.target); await tx.wait(); console.log(`W3bstreamTaskManager add operator to ${minter.target}`); diff --git a/smartcontracts/test/W3bstreamBlockMinter.ts b/smartcontracts/test/W3bstreamBlockMinter.ts index 64367d53..22428694 100644 --- a/smartcontracts/test/W3bstreamBlockMinter.ts +++ b/smartcontracts/test/W3bstreamBlockMinter.ts @@ -1,5 +1,4 @@ import { expect } from 'chai'; -import { keccak256 } from 'ethers'; import { ethers } from 'hardhat'; describe('W3bstream Minter', function () { @@ -7,6 +6,7 @@ describe('W3bstream Minter', function () { let dao; let tm; let brd; + let bhv; let scrypt; const genesis = "0x0000000000000000000000000000000000000000000000000000000000000000"; beforeEach(async function () { @@ -14,16 +14,17 @@ describe('W3bstream Minter', function () { dao = await ethers.deployContract('W3bstreamDAO'); tm = await ethers.deployContract('W3bstreamTaskManager'); brd = await ethers.deployContract('W3bstreamBlockRewardDistributor'); - scrypt = await ethers.deployContract('Scrypt'); + scrypt = await ethers.deployContract('MockScrypt'); + bhv = await ethers.deployContract('W3bstreamBlockHeaderValidator', [scrypt.getAddress()]); await dao.initialize(genesis); await tm.initialize(); await brd.initialize(); - await minter.initialize(dao.getAddress(), tm.getAddress(), brd.getAddress(), scrypt.getAddress()); - // let tx = await minter.scrypt("0x000000020000000000000000000000000000000000000000000000000000000000000000ab04ea90eb7d931cbbaa94a11cb3907809c13262dd37acc526e4b4a628e43b111c7fffff00000089929df805"); - // console.log(tx); - // exit(0); + await minter.initialize(dao.getAddress(), tm.getAddress(), brd.getAddress(), bhv.getAddress()); await dao.transferOwnership(minter.getAddress()); await tm.addOperator(minter.getAddress()); + await brd.setOperator(minter.getAddress()); + await bhv.setOperator(minter.getAddress()); + await minter.setBlockReward(0); }); it('mint block', async function () { const tip = await ethers.provider.getBlock('latest'); @@ -33,12 +34,16 @@ describe('W3bstream Minter', function () { operator: sequencer.address, beneficiary: sequencer.address, }; - await minter.connect(owner).setAdhocNBits("0x1cffff00"); - let currentNBits = await minter.currentNBits(); - const merkleRoot = ethers.solidityPackedKeccak256(["address", "address", "address"], [coinbase.addr, coinbase.operator, coinbase.beneficiary]); + await bhv.connect(owner).setAdhocNBits("0x1cffff00"); + let currentNBits = await bhv.currentNBits(); + const merkleRoot = ethers.keccak256(ethers.AbiCoder.defaultAbiCoder().encode( + ["address", "address", "address"], + [coinbase.addr, coinbase.operator, coinbase.beneficiary] + )); let tipinfo = await dao.tip(); expect(tipinfo[0]).to.equal(0); expect(tipinfo[1]).to.equal(genesis); + await scrypt.setHash("0x00000000ffff0000000000000000000000000000000000000000000000000000"); let blockinfo = { meta: "0x00000000", prevhash: genesis, @@ -46,8 +51,8 @@ describe('W3bstream Minter', function () { nbits: currentNBits, nonce: "0x0000000000000000", }; - const nbits = await minter.currentNBits(); - const currentTarget = await minter.nbitsToTarget(nbits); + const nbits = await bhv.currentNBits(); + const currentTarget = await bhv.nbitsToTarget(nbits); await minter.connect(sequencer).mint( blockinfo, coinbase, @@ -67,7 +72,7 @@ describe('W3bstream Minter', function () { coinbase, [], )).to.be.revertedWith("invalid nbits"); - currentNBits = await minter.currentNBits(); + currentNBits = await bhv.currentNBits(); blockinfo.nbits = currentNBits; await minter.connect(sequencer).mint( blockinfo, From 68727278e9fc33d56b456658f8e52a26eac541ea Mon Sep 17 00:00:00 2001 From: zhi Date: Thu, 3 Oct 2024 00:28:57 +0800 Subject: [PATCH 19/22] update w3bstream task manager --- smartcontracts/contracts/W3bstreamDebits.sol | 72 +++++++++---------- .../contracts/W3bstreamProjectReward.sol | 55 ++++++++++++++ .../contracts/W3bstreamTaskManager.sol | 69 +++++++++++++++--- .../contracts/interfaces/ITaskManager.sol | 1 + .../contracts/test/MockTaskManager.sol | 8 +++ smartcontracts/test/W3bstreamBlockMinter.ts | 4 +- 6 files changed, 159 insertions(+), 50 deletions(-) create mode 100644 smartcontracts/contracts/W3bstreamProjectReward.sol create mode 100644 smartcontracts/contracts/test/MockTaskManager.sol diff --git a/smartcontracts/contracts/W3bstreamDebits.sol b/smartcontracts/contracts/W3bstreamDebits.sol index 1c69f706..6ce8dd7b 100644 --- a/smartcontracts/contracts/W3bstreamDebits.sol +++ b/smartcontracts/contracts/W3bstreamDebits.sol @@ -5,8 +5,7 @@ import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/Own import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; contract W3bstreamDebits is OwnableUpgradeable { - event OperatorSet(uint256 indexed id, address indexed operator); - event RewardTokenSet(uint256 indexed id, address indexed rewardToken); + event OperatorSet(address indexed operator); event Deposited(address indexed token, address indexed owner, uint256 amount); event Withheld(address indexed token, address indexed owner, uint256 amount); event Distributed(address indexed token, address indexed owner, address[] recipients, uint256[] amounts); @@ -15,9 +14,8 @@ contract W3bstreamDebits is OwnableUpgradeable { address public operator; - mapping(uint256 => address) _rewardTokens; - mapping(address => mapping(address => uint256)) _balances; - mapping(address => mapping(address => uint256)) _withholdings; + mapping(address => mapping(address => uint256)) balances; + mapping(address => mapping(address => uint256)) withholdings; modifier onlyOperator() { require(msg.sender == operator, "not operator"); @@ -28,64 +26,62 @@ contract W3bstreamDebits is OwnableUpgradeable { __Ownable_init(); } - function rewardToken(uint256 _id) external view returns (address) { - return _rewardTokens[_id]; + function setOperator(address _operator) external onlyOwner { + operator = _operator; + emit OperatorSet(_operator); } - function setRewardToken(uint256 _id, address _rewardToken) external onlyOwner { - require(_rewardToken != address(0), "zero address"); - require(_rewardTokens[_id] == address(0), "already set"); - _rewardTokens[_id] = _rewardToken; - emit RewardTokenSet(_id, _rewardToken); - } - - function deposit(uint256 _id, uint256 _amount) external { - address token = _rewardTokens[_id]; - require(token != address(0), "reward token not set"); - bool success = IERC20(token).transferFrom(msg.sender, address(this), _amount); + function deposit(address token, uint256 amount) external { + require(token != address(0), "invalid token"); + bool success = IERC20(token).transferFrom(msg.sender, address(this), amount); require(success, "transfer failed"); - _balances[token][msg.sender] += _amount; - emit Deposited(token, msg.sender, _amount); + balances[token][msg.sender] += amount; + emit Deposited(token, msg.sender, amount); } - function withhold(uint256 _id, address _owner, uint256 _amount) external { - address token = _rewardTokens[_id]; + function withhold(address token, address owner, uint256 amount) external onlyOperator { require(token != address(0), "reward token not set"); - require(_balances[token][_owner] - _withholdings[token][_owner] >= _amount, "insufficient balance"); - _withholdings[token][_owner] += _amount; - _balances[token][_owner] -= _amount; - emit Withheld(token, _owner, _amount); + require(balances[token][owner] - withholdings[token][owner] >= amount, "insufficient balance"); + withholdings[token][owner] += amount; + balances[token][owner] -= amount; + emit Withheld(token, owner, amount); } - function distribute(uint256 _id, address _owner, address[] calldata _recipients, uint256[] calldata _amounts) external onlyOperator { - address token = _rewardTokens[_id]; + function distribute(address token, address _owner, address[] calldata _recipients, uint256[] calldata _amounts) external onlyOperator { require(token != address(0), "reward token not set"); require(_recipients.length == _amounts.length, "length mismatch"); for (uint256 i = 0; i < _recipients.length; i++) { - require(_withholdings[token][_owner] >= _amounts[i], "insufficient balance"); - _withholdings[token][_owner] -= _amounts[i]; + require(withholdings[token][_owner] >= _amounts[i], "insufficient balance"); + withholdings[token][_owner] -= _amounts[i]; bool success = IERC20(token).transfer(_recipients[i], _amounts[i]); require(success, "transfer failed"); } emit Distributed(token, _owner, _recipients, _amounts); } - function redeem(uint256 _id, address _owner, uint256 _amount) external onlyOperator { - address token = _rewardTokens[_id]; - require(token != address(0), "reward token not set"); - require(_withholdings[token][_owner] >= _amount, "insufficient balance"); - _withholdings[token][_owner] -= _amount; - _balances[token][_owner] += _amount; + function redeem(address token, address _owner, uint256 _amount) external onlyOperator { + require(token != address(0), "invalid token"); + require(withholdings[token][_owner] >= _amount, "insufficient balance"); + withholdings[token][_owner] -= _amount; + balances[token][_owner] += _amount; emit Redeemed(token, _owner, _amount); } function withdraw(address _token, uint256 _amount) external { address sender = msg.sender; require(_token != address(0), "zero address"); - require(_balances[_token][sender] >= _amount, "insufficient balance"); - _balances[_token][sender] -= _amount; + require(balances[_token][sender] >= _amount, "insufficient balance"); + balances[_token][sender] -= _amount; bool success = IERC20(_token).transfer(sender, _amount); require(success, "transfer failed"); emit Withdrawn(_token, sender, _amount); } + + function balanceOf(address token, address owner) external view returns (uint256) { + return balances[token][owner]; + } + + function withholdingOf(address token, address owner) external view returns (uint256) { + return withholdings[token][owner]; + } } diff --git a/smartcontracts/contracts/W3bstreamProjectReward.sol b/smartcontracts/contracts/W3bstreamProjectReward.sol new file mode 100644 index 00000000..459017c5 --- /dev/null +++ b/smartcontracts/contracts/W3bstreamProjectReward.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +interface IProject { + function ownerOf(uint256 _projectId) external view returns (address); + function isPaused(uint256 _projectId) external view returns (bool); +} + +contract W3bstreamDebits is OwnableUpgradeable { + event OperatorSet(address indexed operator); + event RewardTokenSet(uint256 indexed id, address indexed rewardToken); + event RewardAmountSet(address indexed owner, uint256 indexed id, uint256 amount); + + address public operator; + address public project; + + mapping(uint256 => address) _rewardTokens; + mapping(address => mapping(uint256 => uint256)) _rewardAmounts; + + modifier onlyOperator() { + require(msg.sender == operator, "not operator"); + _; + } + + function initialize(address _project) public initializer { + __Ownable_init(); + project = _project; + } + + function rewardToken(uint256 _id) external view returns (address) { + return _rewardTokens[_id]; + } + + function isPaused(uint256 _projectId) external view returns (bool) { + return IProject(project).isPaused(_projectId); + } + + function setRewardToken(uint256 _id, address _rewardToken) external { + require(IProject(project).ownerOf(_id) != msg.sender, "invalid project"); + require(_rewardToken != address(0), "zero address"); + require(_rewardTokens[_id] == address(0), "already set"); + _rewardTokens[_id] = _rewardToken; + emit RewardTokenSet(_id, _rewardToken); + } + + function setReward(uint256 _id, uint256 _amount) external { + address sender = msg.sender; + _rewardAmounts[sender][_id] = _amount; + emit RewardAmountSet(sender, _id, _amount); + } + +} diff --git a/smartcontracts/contracts/W3bstreamTaskManager.sol b/smartcontracts/contracts/W3bstreamTaskManager.sol index 289654c9..6e814223 100644 --- a/smartcontracts/contracts/W3bstreamTaskManager.sol +++ b/smartcontracts/contracts/W3bstreamTaskManager.sol @@ -3,9 +3,11 @@ pragma solidity ^0.8.19; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import {ITaskManager, TaskAssignment} from "./interfaces/ITaskManager.sol"; +import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; struct Record { bytes32 hash; + address owner; address sequencer; address prover; uint256 rewardForProver; @@ -14,28 +16,45 @@ struct Record { bool settled; } -/* interface IDebits { - function withhold(uint256 id, address owner, uint256 amount) external; - function redeem(uint256 id, address owner, uint256 amount) external; - function distribute(uint256 id, address owner, address[] calldata recipients, uint256[] calldata amounts) external; + function withhold(address token, address owner, uint256 amount) external; + function redeem(address token, address owner, uint256 amount) external; + function distribute(address token, address owner, address[] calldata recipients, uint256[] calldata amounts) external; } -*/ + +interface IProjectReward { + function isPaused(uint256 _id) external view returns (bool); + function rewardToken(uint256 _id) external view returns (address); + function rewardAmount(address owner, uint256 id) external view returns (uint256); +} + +interface IProverStore { + function isPaused(address prover) external view returns (bool); + function rebateRatio(address prover) external view returns (uint16); + function beneficiary(address prover) external view returns (address); +} + contract W3bstreamTaskManager is OwnableUpgradeable, ITaskManager { + using ECDSA for bytes32; event TaskAssigned(uint256 indexed projectId, bytes32 indexed taskId, address indexed prover, uint256 deadline); event TaskSettled(uint256 indexed projectId, bytes32 indexed taskId, address prover); event OperatorAdded(address operator); event OperatorRemoved(address operator); mapping(uint256 => mapping(bytes32 => Record)) public records; mapping(address => bool) public operators; + address public debits; + address public projectReward; + address public proverStore; modifier onlyOperator() { require(operators[msg.sender], "not operator"); _; } - function initialize() public initializer { + function initialize(address _debits, address _projectReward) public initializer { __Ownable_init(); + debits = _debits; + projectReward = _projectReward; } function addOperator(address operator) public onlyOwner { @@ -55,10 +74,21 @@ contract W3bstreamTaskManager is OwnableUpgradeable, ITaskManager { uint256 projectId, bytes32 taskId, bytes32 hash, + bytes memory signature, address prover, uint256 deadline, address sequencer ) internal { + IProverStore ps = IProverStore(proverStore); + require(!ps.isPaused(prover), "prover paused"); + uint16 rebateRatio = ps.rebateRatio(prover); + require(rebateRatio <= 10000, "invalid rebate ratio"); + IProjectReward pr = IProjectReward(projectReward); + require(!pr.isPaused(projectId), "project paused"); + address taskOwner = hash.recover(signature); + uint256 rewardAmount = pr.rewardAmount(taskOwner, projectId); + address rewardToken = pr.rewardToken(projectId); + IDebits(debits).withhold(rewardToken, taskOwner, rewardAmount); require(prover != address(0), "invalid prover"); Record storage record = records[projectId][taskId]; require(record.settled == false, "task already settled"); @@ -66,9 +96,12 @@ contract W3bstreamTaskManager is OwnableUpgradeable, ITaskManager { require(record.deadline < block.timestamp, "task already assigned"); } record.hash = hash; + record.owner = taskOwner; record.prover = prover; record.deadline = deadline; record.sequencer = sequencer; + record.rewardForSequencer = rewardAmount * rebateRatio / 10000; + record.rewardForProver = rewardAmount - record.rewardForSequencer; emit TaskAssigned(projectId, taskId, prover, deadline); } @@ -77,7 +110,7 @@ contract W3bstreamTaskManager is OwnableUpgradeable, ITaskManager { address sequencer, uint256 deadline ) public onlyOperator { - _assign(assignment.projectId, assignment.taskId, assignment.hash, assignment.prover, deadline, sequencer); + _assign(assignment.projectId, assignment.taskId, assignment.hash, assignment.signature, assignment.prover, deadline, sequencer); } function assign( @@ -86,7 +119,7 @@ contract W3bstreamTaskManager is OwnableUpgradeable, ITaskManager { uint256 deadline ) public onlyOperator { for (uint256 i = 0; i < taskAssignments.length; i++) { - _assign(taskAssignments[i].projectId, taskAssignments[i].taskId, taskAssignments[i].hash, taskAssignments[i].prover, deadline, sequencer); + _assign(taskAssignments[i].projectId, taskAssignments[i].taskId, taskAssignments[i].hash, taskAssignments[i].signature, taskAssignments[i].prover, deadline, sequencer); } } @@ -98,7 +131,25 @@ contract W3bstreamTaskManager is OwnableUpgradeable, ITaskManager { require(record.settled == false, "task already settled"); record.settled = true; emit TaskSettled(projectId, taskId, prover); - // TODO: distribute task reward + address[] memory recipients = new address[](2); + uint256[] memory amounts = new uint256[](2); + recipients[0] = IProverStore(proverStore).beneficiary(record.prover); + amounts[0] = record.rewardForProver; + recipients[1] = record.sequencer; + amounts[1] = record.rewardForSequencer; + address rewardToken = IProjectReward(projectReward).rewardToken(projectId); + IDebits(debits).distribute(rewardToken, record.owner, recipients, amounts); + } + + function recall(uint256 projectId, bytes32 taskId) public { + Record storage record = records[projectId][taskId]; + require(record.owner == msg.sender, "not owner"); + require(record.settled == false, "task already settled"); + require(record.deadline < block.number, "task assignement not expired"); + record.prover = address(0); + record.deadline = 0; + address rewardToken = IProjectReward(projectReward).rewardToken(projectId); + IDebits(debits).redeem(rewardToken, record.owner, record.rewardForProver + record.rewardForSequencer); } } diff --git a/smartcontracts/contracts/interfaces/ITaskManager.sol b/smartcontracts/contracts/interfaces/ITaskManager.sol index bf356c56..31cf1d6d 100644 --- a/smartcontracts/contracts/interfaces/ITaskManager.sol +++ b/smartcontracts/contracts/interfaces/ITaskManager.sol @@ -9,5 +9,6 @@ struct TaskAssignment { uint256 projectId; bytes32 taskId; bytes32 hash; + bytes signature; address prover; } diff --git a/smartcontracts/contracts/test/MockTaskManager.sol b/smartcontracts/contracts/test/MockTaskManager.sol new file mode 100644 index 00000000..fe68f375 --- /dev/null +++ b/smartcontracts/contracts/test/MockTaskManager.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import {ITaskManager, TaskAssignment} from "../interfaces/ITaskManager.sol"; + +contract MockTaskManager is ITaskManager { + function assign(TaskAssignment[] calldata assignments, address, uint256) external override {} +} diff --git a/smartcontracts/test/W3bstreamBlockMinter.ts b/smartcontracts/test/W3bstreamBlockMinter.ts index 22428694..9030d9bc 100644 --- a/smartcontracts/test/W3bstreamBlockMinter.ts +++ b/smartcontracts/test/W3bstreamBlockMinter.ts @@ -12,16 +12,14 @@ describe('W3bstream Minter', function () { beforeEach(async function () { minter = await ethers.deployContract('W3bstreamBlockMinter'); dao = await ethers.deployContract('W3bstreamDAO'); - tm = await ethers.deployContract('W3bstreamTaskManager'); + tm = await ethers.deployContract('MockTaskManager'); brd = await ethers.deployContract('W3bstreamBlockRewardDistributor'); scrypt = await ethers.deployContract('MockScrypt'); bhv = await ethers.deployContract('W3bstreamBlockHeaderValidator', [scrypt.getAddress()]); await dao.initialize(genesis); - await tm.initialize(); await brd.initialize(); await minter.initialize(dao.getAddress(), tm.getAddress(), brd.getAddress(), bhv.getAddress()); await dao.transferOwnership(minter.getAddress()); - await tm.addOperator(minter.getAddress()); await brd.setOperator(minter.getAddress()); await bhv.setOperator(minter.getAddress()); await minter.setBlockReward(0); From 506cfd132f1a6eb24d2853f102dd45eb96833457 Mon Sep 17 00:00:00 2001 From: zhi Date: Thu, 3 Oct 2024 10:08:06 +0800 Subject: [PATCH 20/22] new prover contract which removes erc721 --- smartcontracts/contracts/W3bstreamProver2.sol | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 smartcontracts/contracts/W3bstreamProver2.sol diff --git a/smartcontracts/contracts/W3bstreamProver2.sol b/smartcontracts/contracts/W3bstreamProver2.sol new file mode 100644 index 00000000..8d337dda --- /dev/null +++ b/smartcontracts/contracts/W3bstreamProver2.sol @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; + +contract W3bstreamProver2 is OwnableUpgradeable { + event BeneficiarySet(address indexed prover, address indexed beneficiary); + event VMTypeAdded(address indexed prover, uint256 typ); + event VMTypeDeleted(address indexed prover, uint256 typ); + event ProverPaused(address indexed prover); + event ProverResumed(address indexed prover); + event RebateRatioSet(address indexed prover, uint16 ratio); + + mapping(address => mapping(uint256 => bool)) vmTypes; + mapping(address => uint16) rebateRatios; + mapping(address => address) beneficiaries; + mapping(address => bool) paused; + + function initialize() public initializer { + __Ownable_init(); + } + + function isVMTypeSupported(address _prover, uint256 _type) external view returns (bool) { + return vmTypes[_prover][_type]; + } + + function beneficiary(address _prover) external view returns (address) { + return beneficiaries[_prover]; + } + + function isPaused(address _prover) external view returns (bool) { + return paused[_prover]; + } + + function rebateRatio(address _prover) external view returns (uint16) { + return rebateRatios[_prover]; + } + + function register() external { + address sender = msg.sender; + require(beneficiaries[sender] == address(0), "already registered"); + beneficiaries[sender] = sender; + emit BeneficiarySet(sender, sender); + } + + function setRebateRatio(uint16 _ratio) external { + address sender = msg.sender; + rebateRatios[sender] = _ratio; + emit RebateRatioSet(sender, _ratio); + } + + function addVMType(uint256 _type) external { + address sender = msg.sender; + vmTypes[sender][_type] = true; + emit VMTypeAdded(sender, _type); + } + + function delVMType(uint256 _type) external { + address sender = msg.sender; + vmTypes[sender][_type] = false; + emit VMTypeDeleted(sender, _type); + } + + function changeBeneficiary(address _beneficiary) external { + address sender = msg.sender; + require(_beneficiary != address(0), "zero address"); + beneficiaries[sender] = _beneficiary; + emit BeneficiarySet(sender, _beneficiary); + } + + function pause() external { + address sender = msg.sender; + require(!paused[sender], "already paused"); + + paused[sender] = true; + emit ProverPaused(sender); + } + + function resume() external { + address sender = msg.sender; + require(paused[sender], "already actived"); + + paused[sender] = false; + emit ProverResumed(sender); + } +} From 6a0cf05e6e23ee5bd6c166048d3399793cf54927 Mon Sep 17 00:00:00 2001 From: zhi Date: Thu, 3 Oct 2024 10:13:38 +0800 Subject: [PATCH 21/22] update balance instead of sending erc20 tokens --- smartcontracts/contracts/W3bstreamDebits.sol | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/smartcontracts/contracts/W3bstreamDebits.sol b/smartcontracts/contracts/W3bstreamDebits.sol index 6ce8dd7b..cbca4d74 100644 --- a/smartcontracts/contracts/W3bstreamDebits.sol +++ b/smartcontracts/contracts/W3bstreamDebits.sol @@ -51,10 +51,8 @@ contract W3bstreamDebits is OwnableUpgradeable { require(token != address(0), "reward token not set"); require(_recipients.length == _amounts.length, "length mismatch"); for (uint256 i = 0; i < _recipients.length; i++) { - require(withholdings[token][_owner] >= _amounts[i], "insufficient balance"); - withholdings[token][_owner] -= _amounts[i]; - bool success = IERC20(token).transfer(_recipients[i], _amounts[i]); - require(success, "transfer failed"); + withholdings[token][_owner] -= _amounts[i]; // overflow protected + balances[token][_recipients[i]] += _amounts[i]; } emit Distributed(token, _owner, _recipients, _amounts); } From 8d845191bef237f80bcd96e358cafe952eb972c3 Mon Sep 17 00:00:00 2001 From: zhi Date: Wed, 9 Oct 2024 18:21:35 +0800 Subject: [PATCH 22/22] address comment --- smartcontracts/contracts/W3bstreamDebits.sol | 2 +- smartcontracts/contracts/W3bstreamProjectReward.sol | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/smartcontracts/contracts/W3bstreamDebits.sol b/smartcontracts/contracts/W3bstreamDebits.sol index cbca4d74..49894436 100644 --- a/smartcontracts/contracts/W3bstreamDebits.sol +++ b/smartcontracts/contracts/W3bstreamDebits.sol @@ -41,7 +41,7 @@ contract W3bstreamDebits is OwnableUpgradeable { function withhold(address token, address owner, uint256 amount) external onlyOperator { require(token != address(0), "reward token not set"); - require(balances[token][owner] - withholdings[token][owner] >= amount, "insufficient balance"); + require(balances[token][owner] >= amount, "insufficient balance"); withholdings[token][owner] += amount; balances[token][owner] -= amount; emit Withheld(token, owner, amount); diff --git a/smartcontracts/contracts/W3bstreamProjectReward.sol b/smartcontracts/contracts/W3bstreamProjectReward.sol index 459017c5..7252718c 100644 --- a/smartcontracts/contracts/W3bstreamProjectReward.sol +++ b/smartcontracts/contracts/W3bstreamProjectReward.sol @@ -39,7 +39,7 @@ contract W3bstreamDebits is OwnableUpgradeable { } function setRewardToken(uint256 _id, address _rewardToken) external { - require(IProject(project).ownerOf(_id) != msg.sender, "invalid project"); + require(IProject(project).ownerOf(_id) == msg.sender, "invalid project"); require(_rewardToken != address(0), "zero address"); require(_rewardTokens[_id] == address(0), "already set"); _rewardTokens[_id] = _rewardToken;